diff --git a/phpstan.dist.neon b/phpstan.dist.neon index 2998407dd5d..c0cca8b0baa 100644 --- a/phpstan.dist.neon +++ b/phpstan.dist.neon @@ -21,6 +21,6 @@ parameters: - message: '#^Method PhpCsFixer\\Tests\\.+::provide.+Cases\(\) return type has no value type specified in iterable type iterable\.$#' path: tests - count: 1021 + count: 1020 tipsOfTheDay: false tmpDir: dev-tools/phpstan/cache diff --git a/src/Tokenizer/TokensAnalyzer.php b/src/Tokenizer/TokensAnalyzer.php index 2a12934111e..b7f1d52f43e 100644 --- a/src/Tokenizer/TokensAnalyzer.php +++ b/src/Tokenizer/TokensAnalyzer.php @@ -554,6 +554,7 @@ public function isUnaryPredecessorOperator(int $index): bool ';', '{', '}', + [T_DOUBLE_ARROW], [T_FN], [T_FUNCTION], [T_OPEN_TAG], diff --git a/tests/Fixer/Operator/UnaryOperatorSpacesFixerTest.php b/tests/Fixer/Operator/UnaryOperatorSpacesFixerTest.php index a74bb107d76..ef747048c7b 100644 --- a/tests/Fixer/Operator/UnaryOperatorSpacesFixerTest.php +++ b/tests/Fixer/Operator/UnaryOperatorSpacesFixerTest.php @@ -152,5 +152,9 @@ public static function provideFixCases(): iterable ' true], ]; + + yield [ + ' 8 === ($t->flags & 8);', + ]; } } diff --git a/tests/Tokenizer/TokensAnalyzerTest.php b/tests/Tokenizer/TokensAnalyzerTest.php index c22518a47ac..1be54baeeb3 100644 --- a/tests/Tokenizer/TokensAnalyzerTest.php +++ b/tests/Tokenizer/TokensAnalyzerTest.php @@ -1575,20 +1575,33 @@ public static function provideIsUnarySuccessorOperatorCases(): iterable } /** - * @param array $expected + * @param list $expected * * @dataProvider provideIsUnaryPredecessorOperatorCases */ public function testIsUnaryPredecessorOperator(array $expected, string $source): void { + $tokens = Tokens::fromCode($source); $tokensAnalyzer = new TokensAnalyzer(Tokens::fromCode($source)); - foreach ($expected as $index => $isUnary) { - self::assertSame($isUnary, $tokensAnalyzer->isUnaryPredecessorOperator($index)); + foreach ($tokens as $index => $token) { + $expect = \in_array($index, $expected, true); - if ($isUnary) { - self::assertFalse($tokensAnalyzer->isUnarySuccessorOperator($index)); - self::assertFalse($tokensAnalyzer->isBinaryOperator($index)); + self::assertSame( + $expect, + $tokensAnalyzer->isUnaryPredecessorOperator($index), + sprintf('Expected %sunary predecessor operator, got @ %d "%s".', $expect ? '' : 'no ', $index, var_export($token, true)) + ); + + if ($expect) { + self::assertFalse( + $tokensAnalyzer->isUnarySuccessorOperator($index), + sprintf('Expected no unary successor operator, got @ %d "%s".', $index, var_export($token, true)) + ); + self::assertFalse( + $tokensAnalyzer->isBinaryOperator($index), + sprintf('Expected no binary operator, got @ %d "%s".', $index, var_export($token, true)) + ); } } } @@ -1596,106 +1609,124 @@ public function testIsUnaryPredecessorOperator(array $expected, string $source): public static function provideIsUnaryPredecessorOperatorCases(): iterable { yield [ - [1 => true], + [1], ' true], + [1], ' true], + [1], ' false, 5 => true], + [5], ' true, 2 => true], + [1, 2], ' true], + [5], ' true], + [3], ' true], + [1], ' true, 8 => true], + [3, 8], ' true, 11 => true, 17 => true], + [5, 11, 17], ' true], + [8], ' true, 6 => true], + [5, 6], ' true], + [7], ' true], + [7], ' true], + [10], ' true], + [9], ' true], + [9], ' null;', ]; + + yield [ + [], + ' A_CONSTANT & $object->property;', + ]; } /** - * @param array $expected + * @param list $expected * * @dataProvider provideIsBinaryOperatorCases */ public function testIsBinaryOperator(array $expected, string $source): void { + $tokens = Tokens::fromCode($source); $tokensAnalyzer = new TokensAnalyzer(Tokens::fromCode($source)); - foreach ($expected as $index => $isBinary) { - self::assertSame($isBinary, $tokensAnalyzer->isBinaryOperator($index)); + foreach ($tokens as $index => $token) { + $expect = \in_array($index, $expected, true); - if ($isBinary) { - self::assertFalse($tokensAnalyzer->isUnarySuccessorOperator($index)); - self::assertFalse($tokensAnalyzer->isUnaryPredecessorOperator($index)); + self::assertSame( + $expect, + $tokensAnalyzer->isBinaryOperator($index), + sprintf('Expected %sbinary operator, got @ %d "%s".', $expect ? '' : 'no ', $index, var_export($token, true)) + ); + + if ($expect) { + self::assertFalse( + $tokensAnalyzer->isUnarySuccessorOperator($index), + sprintf('Expected no unary successor operator, got @ %d "%s".', $index, var_export($token, true)) + ); + self::assertFalse( + $tokensAnalyzer->isUnaryPredecessorOperator($index), + sprintf('Expected no unary predecessor operator, got @ %d "%s".', $index, var_export($token, true)) + ); } } } @@ -1703,159 +1734,159 @@ public function testIsBinaryOperator(array $expected, string $source): void public static function provideIsBinaryOperatorCases(): iterable { yield [ - [8 => true], + [8], ' true], + [8], ' true], + [3], '', ]; yield [ - [3 => true], + [3], '', ]; yield [ - [3 => true], + [3], ' true], + [3], ' true], + [3], ' true], + [4], ' true], + [3], ' true], + [3], ' true], + [3], ' true], + [6], ' true], + [3], ' true], + [5], ' true], + [6], ' true], + [2], ' true], + [5], ' true], + [3], ' true], + [3], ' true, 9 => true, 12 => false], + [3, 9], ' "c", );', ]; yield [ - [3 => true, 5 => false], + [3], ' true, 5 => false, 8 => true, 10 => false], + [3, 8], ' true, 5 => false], + [3, 5 => false], ' false, 4 => true], + [4], ' true], + [3, 7], ' true], + [3], ' true], + [5], ' true], + [3], ' true], + [3], ' false], + [3], ' false], + [], '-', ]; @@ -1866,20 +1897,35 @@ public static function provideIsBinaryOperatorCases(): iterable foreach ($operators as $operator) { yield [ - [3 => true], + [3], ' true], + [3], ' $b;', ]; yield [ - [3 => true], + [3], ' $object->property & A_CONSTANT;', + ]; } /** @@ -1996,38 +2042,6 @@ public static function provideIsArray71Cases(): iterable ]; } - /** - * @param array $expected - * - * @dataProvider provideIsBinaryOperator71Cases - */ - public function testIsBinaryOperator71(array $expected, string $source): void - { - $tokensAnalyzer = new TokensAnalyzer(Tokens::fromCode($source)); - - foreach ($expected as $index => $isBinary) { - self::assertSame($isBinary, $tokensAnalyzer->isBinaryOperator($index)); - - if ($isBinary) { - self::assertFalse($tokensAnalyzer->isUnarySuccessorOperator($index)); - self::assertFalse($tokensAnalyzer->isUnaryPredecessorOperator($index)); - } - } - } - - public static function provideIsBinaryOperator71Cases(): iterable - { - yield [ - [11 => false], - ' true], - ' $expected *