diff --git a/src/Tokenizer/Transformer/UseTransformer.php b/src/Tokenizer/Transformer/UseTransformer.php index b5d69c760f4..f2e3ce0b0e7 100644 --- a/src/Tokenizer/Transformer/UseTransformer.php +++ b/src/Tokenizer/Transformer/UseTransformer.php @@ -61,11 +61,17 @@ public function process(Tokens $tokens, Token $token, int $index): void // Only search inside class/trait body for `T_USE` for traits. // Cannot import traits inside interfaces or anywhere else - if (!$token->isGivenKind([T_CLASS, T_TRAIT])) { - return; + $classTypes = [T_TRAIT]; + + if (\defined('T_ENUM')) { // @TODO: drop condition when PHP 8.1+ is required + $classTypes[] = T_ENUM; } - if ($tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_DOUBLE_COLON)) { + if ($token->isGivenKind(T_CLASS)) { + if ($tokens[$tokens->getPrevMeaningfulToken($index)]->isGivenKind(T_DOUBLE_COLON)) { + return; + } + } elseif (!$token->isGivenKind($classTypes)) { return; } diff --git a/tests/Fixer/Import/NoUnusedImportsFixerTest.php b/tests/Fixer/Import/NoUnusedImportsFixerTest.php index 446d0180f69..dcaa64b54ad 100644 --- a/tests/Fixer/Import/NoUnusedImportsFixerTest.php +++ b/tests/Fixer/Import/NoUnusedImportsFixerTest.php @@ -1482,4 +1482,27 @@ function test2($param = (new Foo6)) {} ', ]; } + + /** + * @requires PHP 8.1 + * @dataProvider provideFixPhp81Cases + */ + public function testFixPhp81(string $expected): void + { + $this->doTest($expected); + } + + public function provideFixPhp81Cases(): iterable + { + yield [ + ' T_USE, - ], + 1 => T_USE, ], + ]; + + yield [ + ' CT::T_USE_LAMBDA, - ], + 9 => CT::T_USE_LAMBDA, ], + ]; + + yield [ + ' CT::T_USE_TRAIT, - ], + 7 => CT::T_USE_TRAIT, ], + ]; + + yield [ + ' T_USE, - 17 => CT::T_USE_TRAIT, - 42 => CT::T_USE_LAMBDA, - ], + 6 => T_USE, + 17 => CT::T_USE_TRAIT, + 42 => CT::T_USE_LAMBDA, ], + ]; + + yield [ + ' T_USE, - ], + 30 => T_USE, ], + ]; + + yield [ + ' T_USE, - ], + 1 => T_USE, ], - 'nested anonymous classes' => [ - ' [ + 'test(); - $a(); - } +public function __construct($bar) +{ + $a = $bar->test(); + $a(); +} }; ', - [ - 38 => CT::T_USE_LAMBDA, - 76 => CT::T_USE_TRAIT, - ], - ], [ - ' CT::T_USE_LAMBDA, + 76 => CT::T_USE_TRAIT, + ], + ]; + + yield [ + ' T_USE, - 11 => T_USE, - 18 => T_USE, - ], + [ + 1 => T_USE, + 11 => T_USE, + 18 => T_USE, + ], + ]; + } + + /** + * @param array $expectedTokens index => kind + * + * @requires PHP 8.1 + * @dataProvider provideProcessPhp81Cases + */ + public function testProcessPhp81(string $source, array $expectedTokens = []): void + { + $this->doTest($source, $expectedTokens, [CT::T_USE_TRAIT]); + } + + public function provideProcessPhp81Cases(): iterable + { + yield [ + ' CT::T_USE_TRAIT, ], ]; }