Browse Source

TypeAlternationTransformer - fix for "array" type in type alternation

Kuba Werłos 3 years ago
parent
commit
e3624355a6

+ 4 - 3
src/Tokenizer/Transformer/TypeAlternationTransformer.php

@@ -18,7 +18,8 @@ use PhpCsFixer\Tokenizer\Token;
 use PhpCsFixer\Tokenizer\Tokens;
 
 /**
- * Transform `|` operator into CT::T_TYPE_ALTERNATION in `} catch (ExceptionType1 | ExceptionType2 $e) {`.
+ * Transform `|` operator into CT::T_TYPE_ALTERNATION in `function foo(Type1 | Type2 $x) {`
+ *                                                    or `} catch (ExceptionType1 | ExceptionType2 $e) {`.
  *
  * @author Dariusz Rumiński <dariusz.ruminski@gmail.com>
  *
@@ -31,7 +32,7 @@ final class TypeAlternationTransformer extends AbstractTransformer
      */
     public function getPriority()
     {
-        // needs to run after TypeColonTransformer
+        // needs to run after ArrayTypehintTransformer and TypeColonTransformer
         return -15;
     }
 
@@ -54,7 +55,7 @@ final class TypeAlternationTransformer extends AbstractTransformer
 
         $prevIndex = $tokens->getPrevMeaningfulToken($index);
 
-        if (!$tokens[$prevIndex]->isGivenKind(T_STRING)) {
+        if (!$tokens[$prevIndex]->isGivenKind([T_STRING, CT::T_ARRAY_TYPEHINT])) {
             return;
         }
 

+ 13 - 0
tests/Fixer/ClassNotation/VisibilityRequiredFixerTest.php

@@ -849,5 +849,18 @@ AB# <- this is the name
         yield [
             '<?php class Foo { private int | /* or empty */ null $foo; }',
         ];
+
+        yield [
+            '<?php class Foo { private array|null $foo; }',
+        ];
+
+        yield [
+            '<?php class Foo { private null|array $foo; }',
+        ];
+
+        yield [
+            '<?php class Foo { public static null|array $foo; }',
+            '<?php class Foo { static null|array $foo; }',
+        ];
     }
 }

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

@@ -226,5 +226,29 @@ class Number
                 35 => CT::T_TYPE_ALTERNATION,
             ],
         ];
+
+        yield 'array as first element of types' => [
+            '<?php function foo(array|bool|null $foo) {}',
+            [
+                6 => CT::T_TYPE_ALTERNATION,
+                8 => CT::T_TYPE_ALTERNATION,
+            ],
+        ];
+
+        yield 'array as middle element of types' => [
+            '<?php function foo(null|array|bool $foo) {}',
+            [
+                6 => CT::T_TYPE_ALTERNATION,
+                8 => CT::T_TYPE_ALTERNATION,
+            ],
+        ];
+
+        yield 'array as last element of types' => [
+            '<?php function foo(null|bool|array $foo) {}',
+            [
+                6 => CT::T_TYPE_ALTERNATION,
+                8 => CT::T_TYPE_ALTERNATION,
+            ],
+        ];
     }
 }