renamedClassesDataCollector = $renamedClassesDataCollector; $this->classRenamer = $classRenamer; } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Replaces defined classes by new ones.', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' namespace App; use SomeOldClass; function someFunction(SomeOldClass $someOldClass): SomeOldClass { if ($someOldClass instanceof SomeOldClass) { return new SomeOldClass; } } CODE_SAMPLE , <<<'CODE_SAMPLE' namespace App; use SomeNewClass; function someFunction(SomeNewClass $someOldClass): SomeNewClass { if ($someOldClass instanceof SomeNewClass) { return new SomeNewClass; } } CODE_SAMPLE , ['App\\SomeOldClass' => 'App\\SomeNewClass'])]); } /** * @return array> */ public function getNodeTypes() : array { return [FullyQualified::class, Property::class, FunctionLike::class, Expression::class, ClassLike::class, If_::class]; } /** * @param FunctionLike|FullyQualified|ClassLike|Expression|Namespace_|Property|If_ $node */ public function refactor(Node $node) : ?Node { $oldToNewClasses = $this->renamedClassesDataCollector->getOldToNewClasses(); if ($oldToNewClasses !== []) { $scope = $node->getAttribute(AttributeKey::SCOPE); return $this->classRenamer->renameNode($node, $oldToNewClasses, $scope); } return null; } /** * @param mixed[] $configuration */ public function configure(array $configuration) : void { Assert::allString($configuration); Assert::allString(\array_keys($configuration)); $this->renamedClassesDataCollector->addOldToNewClasses($configuration); } }