nodeNameResolver = $nodeNameResolver; $this->phpDocInfoFactory = $phpDocInfoFactory; $this->builderFactory = $builderFactory; } public function createFromClass(\PhpParser\Node\Stmt\Class_ $class) : \PhpParser\Node\Stmt\Enum_ { $shortClassName = $this->nodeNameResolver->getShortName($class); $enum = new \PhpParser\Node\Stmt\Enum_($shortClassName); // constant to cases foreach ($class->getConstants() as $classConst) { $enum->stmts[] = $this->createEnumCaseFromConst($classConst); } return $enum; } public function createFromSpatieClass(\PhpParser\Node\Stmt\Class_ $class) : \PhpParser\Node\Stmt\Enum_ { $shortClassName = $this->nodeNameResolver->getShortName($class); $enum = new \PhpParser\Node\Stmt\Enum_($shortClassName); // constant to cases $classDocInfo = $this->phpDocInfoFactory->createFromNode($class); $docBlockMethods = ($classDocInfo2 = $classDocInfo) ? $classDocInfo2->getTagsByName('@method') : null; if ($docBlockMethods !== null) { foreach ($docBlockMethods as $docBlockMethod) { $enum->stmts[] = $this->createEnumCaseFromDocComment($docBlockMethod); } } return $enum; } private function createEnumCaseFromConst(\PhpParser\Node\Stmt\ClassConst $classConst) : \PhpParser\Node\Stmt\EnumCase { $constConst = $classConst->consts[0]; $enumCase = new \PhpParser\Node\Stmt\EnumCase($constConst->name, $constConst->value); // mirror comments $enumCase->setAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::PHP_DOC_INFO, $classConst->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::PHP_DOC_INFO)); $enumCase->setAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::COMMENTS, $classConst->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::COMMENTS)); return $enumCase; } private function createEnumCaseFromDocComment(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode $docTagNode) : \PhpParser\Node\Stmt\EnumCase { /** * @var MethodTagValueNode $nodeValue */ $nodeValue = $docTagNode->value; return new \PhpParser\Node\Stmt\EnumCase($nodeValue->methodName, $this->builderFactory->val($nodeValue->methodName)); } }