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 [Class_::class]; } /** * @param Class_ $node */ public function refactor(Node $node) : ?Node { if (!$node->isFinal()) { return null; } $hasChanged = \false; foreach ($node->getConstants() as $classConst) { if (!$classConst->isFinal()) { continue; } $this->visibilityManipulator->removeFinal($classConst); $hasChanged = \true; } if ($hasChanged) { return $node; } return null; } public function provideMinPhpVersion() : int { return PhpVersionFeature::FINAL_CLASS_CONSTANTS; } }