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

bug #4823 ReturnAssignmentFixer - repeat fix (SpacePossum)

This PR was merged into the 2.15 branch.

Discussion
----------

ReturnAssignmentFixer - repeat fix

fixes one the cases from here https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues/4816

Commits
-------

81dc827c ReturnAssignmentFixer - repeat fix
SpacePossum 5 лет назад
Родитель
Сommit
9e8b7cf4d0

+ 13 - 8
src/Fixer/ReturnNotation/ReturnAssignmentFixer.php

@@ -74,16 +74,21 @@ final class ReturnAssignmentFixer extends AbstractFixer
             }
 
             $functionCloseIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $functionOpenIndex);
+            $totalTokensAdded = 0;
 
-            $tokensAdded = $this->fixFunction(
-                $tokens,
-                $index,
-                $functionOpenIndex,
-                $functionCloseIndex
-            );
+            do {
+                $tokensAdded = $this->fixFunction(
+                    $tokens,
+                    $index,
+                    $functionOpenIndex,
+                    $functionCloseIndex
+                );
+
+                $totalTokensAdded += $tokensAdded;
+            } while ($tokensAdded > 0);
 
-            $index = $functionCloseIndex + $tokensAdded;
-            $tokenCount += $tokensAdded;
+            $index = $functionCloseIndex + $totalTokensAdded;
+            $tokenCount += $totalTokensAdded;
         }
     }
 

+ 57 - 0
tests/Fixer/ReturnNotation/ReturnAssignmentFixerTest.php

@@ -736,4 +736,61 @@ var_dump($a); // $a = 2 here _╯°□°╯︵┻━┻
             ],
         ];
     }
+
+    /**
+     * @dataProvider provideRepetitiveFixCases
+     *
+     * @param string      $expected
+     * @param null|string $input
+     */
+    public function testRepetitiveFix($expected, $input = null)
+    {
+        $this->doTest(
+            $expected,
+            $input
+        );
+    }
+
+    public function provideRepetitiveFixCases()
+    {
+        yield [
+            '<?php
+
+function foo() {
+    return bar();
+}
+',
+            '<?php
+
+function foo() {
+    $a = bar();
+    $b = $a;
+
+    return $b;
+}
+',
+        ];
+
+        yield [
+            '<?php
+
+function foo(&$c) {
+    $a = $c;
+    $b = $a;
+
+    return $b;
+}
+',
+        ];
+
+        $expected = "<?php\n";
+        $input = "<?php\n";
+
+        for ($i = 0; $i < 10; ++$i) {
+            $expected .= sprintf("\nfunction foo%d() {\n\treturn bar();\n}", $i);
+            $input .= sprintf("\nfunction foo%d() {\n\t\$a = bar();\n\t\$b = \$a;\n\nreturn \$b;\n}", $i);
+        }
+
+        yield [$expected, $input];
+    }
 }