visibilityManipulator = $visibilityManipulator; } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Remove final from constants in classes defined as final', [new CodeSample(<<<'CODE_SAMPLE' final class SomeClass { final public const NAME = 'value'; } CODE_SAMPLE , <<<'CODE_SAMPLE' final class SomeClass { public const NAME = 'value'; } CODE_SAMPLE )]); } /** * @return array> */ public function getNodeTypes() : array { return [ClassConst::class]; } /** * @param ClassConst $node */ public function refactor(Node $node) : ?Node { $parentClass = $this->betterNodeFinder->findParentType($node, Class_::class); if (!$parentClass instanceof Class_) { return null; } if ($parentClass->isFinal() && $node->isFinal()) { $this->visibilityManipulator->removeFinal($node); return $node; } return null; } public function provideMinPhpVersion() : int { return PhpVersionFeature::FINAL_CLASS_CONSTANTS; } }