File manager - Edit - /var/www/payraty/helpdesk/vendor/rector/rector/vendor/rector/rector-nette/src/Kdyby/NodeFactory/EventValueObjectClassFactory.php
Back
<?php declare (strict_types=1); namespace Rector\Nette\Kdyby\NodeFactory; use RectorPrefix202208\Nette\Utils\Strings; use PhpParser\Node\Arg; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Param; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Namespace_; use PhpParser\NodeTraverser; use PhpParser\NodeVisitor\NameResolver; use Rector\CodingStyle\Naming\ClassNaming; use Rector\Core\Exception\ShouldNotHappenException; use Rector\Core\PhpParser\Node\NodeFactory; use Rector\Core\ValueObject\MethodName; use Rector\Nette\Kdyby\BlueprintFactory\VariableWithTypesFactory; use Rector\Nette\Kdyby\ValueObject\VariableWithType; use Rector\NodeNameResolver\NodeNameResolver; use RectorPrefix202208\Symplify\Astral\ValueObject\NodeBuilder\ClassBuilder; use RectorPrefix202208\Symplify\Astral\ValueObject\NodeBuilder\MethodBuilder; use RectorPrefix202208\Symplify\Astral\ValueObject\NodeBuilder\NamespaceBuilder; /** * @todo decouple to generic object factory for better re-use, e.g. this is just value object pattern */ final class EventValueObjectClassFactory { /** * @readonly * @var \Rector\CodingStyle\Naming\ClassNaming */ private $classNaming; /** * @readonly * @var \Rector\Core\PhpParser\Node\NodeFactory */ private $nodeFactory; /** * @readonly * @var \Rector\NodeNameResolver\NodeNameResolver */ private $nodeNameResolver; /** * @readonly * @var \Rector\Nette\Kdyby\BlueprintFactory\VariableWithTypesFactory */ private $variableWithTypesFactory; public function __construct(ClassNaming $classNaming, NodeFactory $nodeFactory, NodeNameResolver $nodeNameResolver, VariableWithTypesFactory $variableWithTypesFactory) { $this->classNaming = $classNaming; $this->nodeFactory = $nodeFactory; $this->nodeNameResolver = $nodeNameResolver; $this->variableWithTypesFactory = $variableWithTypesFactory; } /** * @param Arg[] $args */ public function create(string $className, array $args) : Namespace_ { $classBuilder = $this->createEventClassBuilder($className); $this->decorateWithConstructorIfHasArgs($classBuilder, $args); $class = $classBuilder->getNode(); // traverse with node name resolver, to to comply with PHPStan default parser $nameResolver = new NameResolver(null, ['replaceNodes' => \false, 'preserveOriginalNames' => \true]); $nodeTraverser = new NodeTraverser(); $nodeTraverser->addVisitor($nameResolver); $nodeTraverser->traverse([$class]); return $this->wrapClassToNamespace($className, $class); } private function createEventClassBuilder(string $className) : ClassBuilder { $shortClassName = $this->classNaming->getShortName($className); $classBuilder = new ClassBuilder($shortClassName); $classBuilder->makeFinal(); $classBuilder->extend(new FullyQualified('Symfony\\Contracts\\EventDispatcher\\Event')); return $classBuilder; } /** * @param Arg[] $args */ private function decorateWithConstructorIfHasArgs(ClassBuilder $classBuilder, array $args) : void { if ($args === []) { return; } $variablesWithTypes = $this->variableWithTypesFactory->createVariablesWithTypesFromArgs($args); $this->ensureVariablesAreUnique($variablesWithTypes, $classBuilder); $classMethod = $this->createConstructClassMethod($variablesWithTypes); $classBuilder->addStmt($classMethod); // add properties foreach ($variablesWithTypes as $variableWithType) { $property = $this->nodeFactory->createPrivatePropertyFromNameAndType($variableWithType->getName(), $variableWithType->getType()); $classBuilder->addStmt($property); } // add getters foreach ($variablesWithTypes as $variableWithType) { $getterClassMethod = $this->nodeFactory->createGetterClassMethod($variableWithType->getName(), $variableWithType->getType()); $classBuilder->addStmt($getterClassMethod); } } private function wrapClassToNamespace(string $className, Class_ $class) : Namespace_ { $namespace = Strings::before($className, '\\', -1); $namespaceBuilder = new NamespaceBuilder($namespace); $namespaceBuilder->addStmt($class); return $namespaceBuilder->getNode(); } /** * @param VariableWithType[] $variablesWithTypes */ private function ensureVariablesAreUnique(array $variablesWithTypes, ClassBuilder $classBuilder) : void { $usedVariableNames = []; foreach ($variablesWithTypes as $variablesWithType) { if (\in_array($variablesWithType->getName(), $usedVariableNames, \true)) { $className = $this->nodeNameResolver->getName($classBuilder->getNode()); $message = \sprintf('Variable "$%s" is duplicated in to be created "%s" class', $variablesWithType->getName(), $className); throw new ShouldNotHappenException($message); } $usedVariableNames[] = $variablesWithType->getName(); } } /** * @param VariableWithType[] $variableWithTypes */ private function createConstructClassMethod(array $variableWithTypes) : ClassMethod { $methodBuilder = new MethodBuilder(MethodName::CONSTRUCT); $methodBuilder->makePublic(); foreach ($variableWithTypes as $variableWithType) { $param = new Param(new Variable($variableWithType->getName())); if ($variableWithType->getPhpParserTypeNode() !== null) { $param->type = $variableWithType->getPhpParserTypeNode(); } $methodBuilder->addParam($param); $assign = $this->nodeFactory->createPropertyAssignment($variableWithType->getName()); $methodBuilder->addStmt($assign); } return $methodBuilder->getNode(); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.30 | Generation time: 0 |
proxy
|
phpinfo
|
Settings