diff --git a/src/Fixable/NewClassNamesVisitor.php b/src/Fixable/NewClassNamesVisitor.php index e114f107c59..e5ce5dd24b1 100644 --- a/src/Fixable/NewClassNamesVisitor.php +++ b/src/Fixable/NewClassNamesVisitor.php @@ -376,10 +376,22 @@ private function parsePhpDoc(Doc $doc): PhpDocNode /** * Function and constant names are not class names, + * a use statement imports a name as it is written, * and `self` is not valid PHP everywhere a class name is. */ private function markNames(Node $node): void { + if ($node instanceof Stmt\Use_) { + foreach ($node->uses as $useItem) { + if (!$useItem->name instanceof FullyQualified || $useItem->name->getAttribute('origNode') !== null) { + continue; + } + + $useItem->name = new Name($useItem->name->toString()); + } + return; + } + if ($node instanceof Node\Expr\FuncCall || $node instanceof Node\Expr\ConstFetch) { $node->name->setAttribute(self::SKIP_ATTRIBUTE, true); return; diff --git a/tests/PHPStan/Fixable/RenameUseRule.php b/tests/PHPStan/Fixable/RenameUseRule.php new file mode 100644 index 00000000000..83356e5f5d9 --- /dev/null +++ b/tests/PHPStan/Fixable/RenameUseRule.php @@ -0,0 +1,41 @@ + + */ +final class RenameUseRule implements Rule +{ + + public function getNodeType(): string + { + return Node\Stmt\Use_::class; + } + + public function processNode(Node $node, Scope $scope): array + { + if ($node->uses[0]->name->toString() !== 'RenameUseOther\Foo') { + return []; + } + + return [ + RuleErrorBuilder::message('Import RenameUseOther\Bar.') + ->identifier('tests.renameUse') + ->fixNode($node, static function (Node\Stmt\Use_ $use): Node\Stmt\Use_ { + $use->uses[0]->name = new FullyQualified('RenameUseOther\Bar'); + return $use; + }) + ->build(), + ]; + } + +} diff --git a/tests/PHPStan/Fixable/RenameUseRuleTest.php b/tests/PHPStan/Fixable/RenameUseRuleTest.php new file mode 100644 index 00000000000..d53d8074434 --- /dev/null +++ b/tests/PHPStan/Fixable/RenameUseRuleTest.php @@ -0,0 +1,24 @@ + + */ +class RenameUseRuleTest extends RuleTestCase +{ + + protected function getRule(): Rule + { + return new RenameUseRule(); + } + + public function testFix(): void + { + $this->fix(__DIR__ . '/data/rename-use.php', __DIR__ . '/data/rename-use.php.fixed'); + } + +} diff --git a/tests/PHPStan/Fixable/data/rename-use.php b/tests/PHPStan/Fixable/data/rename-use.php new file mode 100644 index 00000000000..85924d19fb9 --- /dev/null +++ b/tests/PHPStan/Fixable/data/rename-use.php @@ -0,0 +1,10 @@ +