Browse Source

VoidReturnFixer - handle functions containing anonymous functions/classes

Dariusz Ruminski 7 years ago
parent
commit
89538af207

+ 15 - 0
src/Fixer/FunctionNotation/VoidReturnFixer.php

@@ -21,6 +21,7 @@ use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample;
 use PhpCsFixer\Tokenizer\CT;
 use PhpCsFixer\Tokenizer\Token;
 use PhpCsFixer\Tokenizer\Tokens;
+use PhpCsFixer\Tokenizer\TokensAnalyzer;
 
 /**
  * @author Mark Nielsen
@@ -184,7 +185,21 @@ final class VoidReturnFixer extends AbstractFixer
      */
     private function hasVoidReturn(Tokens $tokens, $startIndex, $endIndex)
     {
+        $tokensAnalyzer = new TokensAnalyzer($tokens);
+
         for ($i = $startIndex; $i < $endIndex; ++$i) {
+            if (
+                // skip anonymous classes
+                ($tokens[$i]->isGivenKind(T_CLASS) && $tokensAnalyzer->isAnonymousClass($i)) ||
+                 // skip lambda functions
+                ($tokens[$i]->isGivenKind(T_FUNCTION) && $tokensAnalyzer->isLambda($i))
+            ) {
+                $i = $tokens->getNextTokenOfKind($i, ['{']);
+                $i = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $i);
+
+                continue;
+            }
+
             if ($tokens[$i]->isGivenKind(T_YIELD)) {
                 return false; // Generators cannot return void.
             }

+ 52 - 2
tests/Fixer/FunctionNotation/VoidReturnFixerTest.php

@@ -112,8 +112,58 @@ final class VoidReturnFixerTest extends AbstractFixerTestCase
                 '<?php function foo() { usort([], new class { public function __invoke($a, $b) {} }); }',
             ],
             [
-                '<?php function foo(): void { (function () {return 1;})(); return; }',
-                '<?php function foo() { (function () {return 1;})(); return; }',
+                '<?php
+                function foo(): void {
+                    $a = function (): void {};
+                }',
+                '<?php
+                function foo() {
+                    $a = function () {};
+                }',
+            ],
+            [
+                '<?php
+                function foo(): void {
+                    (function (): void {
+                        return;
+                    })();
+                }',
+                '<?php
+                function foo() {
+                    (function () {
+                        return;
+                    })();
+                }',
+            ],
+            [
+                '<?php
+                function foo(): void {
+                    (function () {
+                        return 1;
+                    })();
+                }',
+                '<?php
+                function foo() {
+                    (function () {
+                        return 1;
+                    })();
+                }',
+            ],
+            [
+                '<?php
+                function foo(): void {
+                    $b = new class {
+                        public function b1(): void {}
+                        public function b2() { return 2; }
+                    };
+                }',
+                '<?php
+                function foo() {
+                    $b = new class {
+                        public function b1() {}
+                        public function b2() { return 2; }
+                    };
+                }',
             ],
             [
                 '<?php