Browse Source

fix: enum-case mistaken for const invocation (#8190)

SpacePossum 6 months ago
parent
commit
e34ba047a3

+ 17 - 1
src/Tokenizer/TokensAnalyzer.php

@@ -375,10 +375,26 @@ final class TokensAnalyzer
 
         $prevIndex = $this->tokens->getPrevMeaningfulToken($index);
 
-        if ($this->tokens[$prevIndex]->isGivenKind([T_AS, T_CLASS, T_CONST, T_DOUBLE_COLON, T_FUNCTION, T_GOTO, CT::T_GROUP_IMPORT_BRACE_OPEN, T_INTERFACE, T_TRAIT, CT::T_TYPE_COLON, CT::T_TYPE_ALTERNATION, CT::T_TYPE_INTERSECTION]) || $this->tokens[$prevIndex]->isObjectOperator()) {
+        if ($this->tokens[$prevIndex]->isGivenKind(Token::getClassyTokenKinds())) {
             return false;
         }
 
+        if ($this->tokens[$prevIndex]->isGivenKind([T_AS, T_CONST, T_DOUBLE_COLON, T_FUNCTION, T_GOTO, CT::T_GROUP_IMPORT_BRACE_OPEN, CT::T_TYPE_COLON, CT::T_TYPE_ALTERNATION, CT::T_TYPE_INTERSECTION]) || $this->tokens[$prevIndex]->isObjectOperator()) {
+            return false;
+        }
+
+        if (
+            $this->tokens[$prevIndex]->isGivenKind(T_CASE)
+            && \defined('T_ENUM')
+            && $this->tokens->isAllTokenKindsFound([T_ENUM])
+        ) {
+            $enumSwitchIndex = $this->tokens->getPrevTokenOfKind($index, [[T_SWITCH], [T_ENUM]]);
+
+            if (!$this->tokens[$enumSwitchIndex]->isGivenKind(T_SWITCH)) {
+                return false;
+            }
+        }
+
         while ($this->tokens[$prevIndex]->isGivenKind([CT::T_NAMESPACE_OPERATOR, T_NS_SEPARATOR, T_STRING, CT::T_ARRAY_TYPEHINT])) {
             $prevIndex = $this->tokens->getPrevMeaningfulToken($prevIndex);
         }

+ 24 - 0
tests/Fixer/ConstantNotation/NativeConstantInvocationFixerTest.php

@@ -580,6 +580,30 @@ echo M_PI;
         yield ['<?php try { foo(); } catch(\InvalidArgumentException|\LogicException) {}'];
     }
 
+    /**
+     * @dataProvider provideFixPhp81Cases
+     *
+     * @requires PHP 8.1
+     */
+    public function testFixPhp81(string $expected): void
+    {
+        $this->fixer->configure(['strict' => true]);
+        $this->doTest($expected);
+    }
+
+    /**
+     * @return iterable<array{string}>
+     */
+    public static function provideFixPhp81Cases(): iterable
+    {
+        yield [
+            '<?php enum someEnum: int
+                {
+                    case E_ALL = 123;
+                }',
+        ];
+    }
+
     /**
      * @dataProvider provideFixPhp82Cases
      *

+ 8 - 0
tests/Tokenizer/TokensAnalyzerTest.php

@@ -1474,6 +1474,14 @@ abstract class Baz
             [3 => false, 8 => false, 10 => false, 14 => false, 17 => false, 20 => false, 22 => false, 25 => false, 28 => false, 30 => false, 32 => false, 36 => false, 39 => false, 41 => false],
             '<?php function foo ((\A&B)|(C&\D)|E\F|\G|(A&H\I)|(A&\J\K) $var) {}',
         ];
+
+        yield [
+            [3 => false, 6 => false, 12 => false],
+            '<?php enum someEnum: int
+                {
+                    case E_ERROR = 123;
+                }',
+        ];
     }
 
     /**