Browse Source

bug #6159 ImportTransformer - fix for grouped constant and function imports (kubawerlos)

This PR was squashed before being merged into the master branch.

Discussion
----------

ImportTransformer - fix for grouped constant and function imports

Commits
-------

bf323653d ImportTransformer - fix for grouped constant and function imports
Dariusz Ruminski 3 years ago
parent
commit
12e3ae9631

+ 2 - 2
src/Fixer/Import/SingleImportPerStatementFixer.php

@@ -147,10 +147,10 @@ final class SingleImportPerStatementFixer extends AbstractFixer implements White
                 if ($tokens[$j]->equals([T_AS])) {
                     $statement .= ' as ';
                     $i += 2;
-                } elseif ($tokens[$j]->equals([T_FUNCTION])) {
+                } elseif ($tokens[$j]->isGivenKind(CT::T_FUNCTION_IMPORT)) {
                     $statement = ' function'.$statement;
                     $i += 2;
-                } elseif ($tokens[$j]->equals([T_CONST])) {
+                } elseif ($tokens[$j]->isGivenKind(CT::T_CONST_IMPORT)) {
                     $statement = ' const'.$statement;
                     $i += 2;
                 }

+ 20 - 5
src/Tokenizer/Transformer/ImportTransformer.php

@@ -32,6 +32,15 @@ use PhpCsFixer\Tokenizer\Tokens;
  */
 final class ImportTransformer extends AbstractTransformer
 {
+    /**
+     * {@inheritdoc}
+     */
+    public function getPriority(): int
+    {
+        // Should run after CurlyBraceTransformer and ReturnRefTransformer
+        return -1;
+    }
+
     /**
      * {@inheritdoc}
      */
@@ -51,12 +60,18 @@ final class ImportTransformer extends AbstractTransformer
 
         $prevToken = $tokens[$tokens->getPrevMeaningfulToken($index)];
 
-        if ($prevToken->isGivenKind(T_USE)) {
-            $tokens[$index] = new Token([
-                $token->isGivenKind(T_FUNCTION) ? CT::T_FUNCTION_IMPORT : CT::T_CONST_IMPORT,
-                $token->getContent(),
-            ]);
+        if (!$prevToken->isGivenKind(T_USE)) {
+            $nextToken = $tokens[$tokens->getNextTokenOfKind($index, ['=', '(', [CT::T_RETURN_REF], [CT::T_GROUP_IMPORT_BRACE_CLOSE]])];
+
+            if (!$nextToken->isGivenKind(CT::T_GROUP_IMPORT_BRACE_CLOSE)) {
+                return;
+            }
         }
+
+        $tokens[$index] = new Token([
+            $token->isGivenKind(T_FUNCTION) ? CT::T_FUNCTION_IMPORT : CT::T_CONST_IMPORT,
+            $token->getContent(),
+        ]);
     }
 
     /**

+ 2 - 0
tests/AutoReview/TransformerTest.php

@@ -81,8 +81,10 @@ final class TransformerTest extends TestCase
             [$transformers['attribute'], $transformers['curly_brace']],
             [$transformers['attribute'], $transformers['square_brace']],
             [$transformers['curly_brace'], $transformers['brace_class_instantiation']],
+            [$transformers['curly_brace'], $transformers['import']],
             [$transformers['curly_brace'], $transformers['use']],
             [$transformers['name_qualified'], $transformers['namespace_operator']],
+            [$transformers['return_ref'], $transformers['import']],
             [$transformers['return_ref'], $transformers['type_colon']],
             [$transformers['square_brace'], $transformers['brace_class_instantiation']],
             [$transformers['type_colon'], $transformers['named_argument']],

+ 1 - 0
tests/Fixer/FunctionNotation/VoidReturnFixerTest.php

@@ -49,6 +49,7 @@ final class VoidReturnFixerTest extends AbstractFixerTestCase
             ['<?php interface Test { public function foo($param); }'],
             ['<?php function foo($param) { return function($a) use ($param): string {}; }'],
             ['<?php abstract class Test { abstract public function foo($param); }'],
+            ['<?php use Foo\ { function Bar }; function test() { return Bar(); }'],
             ['<?php
                 /**
                  * @return array

+ 30 - 0
tests/Tokenizer/Transformer/ImportTransformerTest.php

@@ -88,12 +88,42 @@ final class ImportTransformerTest extends AbstractTransformerTestCase
                     7 => T_FUNCTION,
                 ],
             ],
+            [
+                '<?php function & foo() {}',
+                [
+                    1 => T_FUNCTION,
+                ],
+            ],
             [
                 '<?php use function Foo\\bar;',
                 [
                     3 => CT::T_FUNCTION_IMPORT,
                 ],
             ],
+            [
+                '<?php use Foo\ { function Bar };',
+                [
+                    8 => CT::T_FUNCTION_IMPORT,
+                ],
+            ],
+            [
+                '<?php use Foo\ {
+                    function F1,
+                    const Constants\C1,
+                    function Functions\F2,
+                    const C2,
+                    function F3,
+                    const C3,
+                };',
+                [
+                    8 => CT::T_FUNCTION_IMPORT,
+                    13 => CT::T_CONST_IMPORT,
+                    20 => CT::T_FUNCTION_IMPORT,
+                    27 => CT::T_CONST_IMPORT,
+                    32 => CT::T_FUNCTION_IMPORT,
+                    37 => CT::T_CONST_IMPORT,
+                ],
+            ],
         ];
     }
 }