returnTagRemover = $returnTagRemover; $this->docBlockUpdater = $docBlockUpdater; $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Remove @return docblock with same type as defined in PHP', [new CodeSample(<<<'CODE_SAMPLE' use stdClass; class SomeClass { /** * @return stdClass */ public function foo(): stdClass { } } CODE_SAMPLE , <<<'CODE_SAMPLE' use stdClass; class SomeClass { public function foo(): stdClass { } } CODE_SAMPLE )]); } /** * @return array> */ public function getNodeTypes() : array { return [ClassMethod::class, Function_::class]; } /** * @param ClassMethod|Function_ $node */ public function refactor(Node $node) : ?Node { $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); $hasChanged = $this->returnTagRemover->removeReturnTagIfUseless($phpDocInfo, $node); if (!$hasChanged) { return null; } $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); return $node; } }