phpDocTagRemover = $phpDocTagRemover; $this->docBlockUpdater = $docBlockUpdater; $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Remove annotation by names', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' /** * @method getName() */ final class SomeClass { } CODE_SAMPLE , <<<'CODE_SAMPLE' final class SomeClass { } CODE_SAMPLE , ['method'])]); } /** * @return array> */ public function getNodeTypes() : array { return [ClassLike::class, FunctionLike::class, Property::class, ClassConst::class]; } /** * @param ClassLike|FunctionLike|Property|ClassConst $node */ public function refactor(Node $node) : ?Node { Assert::notEmpty($this->annotationsToRemove); $phpDocInfo = $this->phpDocInfoFactory->createFromNode($node); if (!$phpDocInfo instanceof PhpDocInfo) { return null; } $hasChanged = \false; foreach ($this->annotationsToRemove as $annotationToRemove) { $namedHasChanged = $this->phpDocTagRemover->removeByName($phpDocInfo, $annotationToRemove); if ($namedHasChanged) { $hasChanged = \true; } if (!\is_a($annotationToRemove, PhpDocTagValueNode::class, \true)) { continue; } $typedHasChanged = $phpDocInfo->removeByType($annotationToRemove); if ($typedHasChanged) { $hasChanged = \true; } } if ($hasChanged) { $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); return $node; } return null; } /** * @param mixed[] $configuration */ public function configure(array $configuration) : void { Assert::allString($configuration); $this->annotationsToRemove = $configuration; } }