Просмотр исходного кода

TypeAlternationTransformer - fix for "callable" type

Kuba Werłos 3 лет назад
Родитель
Сommit
62455be671

+ 1 - 1
src/Tokenizer/Transformer/TypeAlternationTransformer.php

@@ -55,7 +55,7 @@ final class TypeAlternationTransformer extends AbstractTransformer
             return;
             return;
         }
         }
 
 
-        $prevIndex = $tokens->getTokenNotOfKindsSibling($index, -1, [T_NS_SEPARATOR, T_STRING, CT::T_ARRAY_TYPEHINT, T_WHITESPACE, T_COMMENT, T_DOC_COMMENT]);
+        $prevIndex = $tokens->getTokenNotOfKindsSibling($index, -1, [T_CALLABLE, T_NS_SEPARATOR, T_STRING, CT::T_ARRAY_TYPEHINT, T_WHITESPACE, T_COMMENT, T_DOC_COMMENT]);
 
 
         /** @var Token $prevToken */
         /** @var Token $prevToken */
         $prevToken = $tokens[$prevIndex];
         $prevToken = $tokens[$prevIndex];

+ 4 - 0
tests/Fixer/Operator/BinaryOperatorSpacesFixerTest.php

@@ -2052,6 +2052,10 @@ $a = $ae?? $b;
                 public function bar(TypeA | TypeB|TypeC $x): TypeA|TypeB | TypeC|TypeD
                 public function bar(TypeA | TypeB|TypeC $x): TypeA|TypeB | TypeC|TypeD
                 {
                 {
                 }
                 }
+                public function baz(
+                    callable|array $a,
+                    array|callable $b,
+                ) {}
             }'
             }'
         );
         );
     }
     }

+ 37 - 0
tests/Tokenizer/TokensAnalyzerTest.php

@@ -1505,6 +1505,43 @@ $b;',
         ];
         ];
     }
     }
 
 
+    /**
+     * @dataProvider provideIsBinaryOperator80Cases
+     * @requires PHP 8.0
+     */
+    public function testIsBinaryOperator80(string $source, array $expected): void
+    {
+        $tokensAnalyzer = new TokensAnalyzer(Tokens::fromCode($source));
+
+        foreach ($expected as $index => $isBinary) {
+            static::assertSame($isBinary, $tokensAnalyzer->isBinaryOperator($index));
+            if ($isBinary) {
+                static::assertFalse($tokensAnalyzer->isUnarySuccessorOperator($index));
+                static::assertFalse($tokensAnalyzer->isUnaryPredecessorOperator($index));
+            }
+        }
+    }
+
+    public static function provideIsBinaryOperator80Cases(): iterable
+    {
+        yield [
+            '<?php function foo(array|string $x) {}',
+            [6 => false],
+        ];
+        yield [
+            '<?php function foo(string|array $x) {}',
+            [6 => false],
+        ];
+        yield [
+            '<?php function foo(int|callable $x) {}',
+            [6 => false],
+        ];
+        yield [
+            '<?php function foo(callable|int $x) {}',
+            [6 => false],
+        ];
+    }
+
     /**
     /**
      * @dataProvider provideArrayExceptionsCases
      * @dataProvider provideArrayExceptionsCases
      */
      */

+ 15 - 0
tests/Tokenizer/Transformer/TypeAlternationTransformerTest.php

@@ -282,5 +282,20 @@ class Number
                 66 => CT::T_TYPE_ALTERNATION,
                 66 => CT::T_TYPE_ALTERNATION,
             ],
             ],
         ];
         ];
+
+        yield 'callable type' => [
+            '<?php
+                function f1(array|callable $x) {};
+                function f2(callable|array $x) {};
+                function f3(string|callable $x) {};
+                function f4(callable|string $x) {};
+            ',
+            [
+                7 => CT::T_TYPE_ALTERNATION,
+                22 => CT::T_TYPE_ALTERNATION,
+                37 => CT::T_TYPE_ALTERNATION,
+                52 => CT::T_TYPE_ALTERNATION,
+            ],
+        ];
     }
     }
 }
 }