mirror of
https://github.com/rectorphp/rector.git
synced 2025-02-22 18:54:39 +01:00
85 lines
3.4 KiB
PHP
85 lines
3.4 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Rector\BetterPhpDocParser;
|
|
|
|
use PHPStan\PhpDocParser\Ast\Node;
|
|
use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
|
|
use PHPStan\PhpDocParser\Ast\PhpDoc\TemplateTagValueNode;
|
|
use PHPStan\PhpDocParser\Ast\Type\ArrayShapeItemNode;
|
|
use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode;
|
|
use PHPStan\PhpDocParser\Ast\Type\CallableTypeNode;
|
|
use PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode;
|
|
use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode;
|
|
use Rector\BetterPhpDocParser\ValueObject\PhpDoc\SpacingAwareTemplateTagValueNode;
|
|
use Rector\BetterPhpDocParser\ValueObject\PhpDoc\VariadicAwareParamTagValueNode;
|
|
use Rector\BetterPhpDocParser\ValueObject\Type\BracketsAwareIntersectionTypeNode;
|
|
use Rector\BetterPhpDocParser\ValueObject\Type\BracketsAwareUnionTypeNode;
|
|
use Rector\BetterPhpDocParser\ValueObject\Type\SpacingAwareArrayShapeItemNode;
|
|
use Rector\BetterPhpDocParser\ValueObject\Type\SpacingAwareArrayTypeNode;
|
|
use Rector\BetterPhpDocParser\ValueObject\Type\SpacingAwareCallableTypeNode;
|
|
use Symplify\SimplePhpDocParser\PhpDocNodeTraverser;
|
|
|
|
/**
|
|
* @see \Rector\Tests\BetterPhpDocParser\PhpDocNodeMapperTest
|
|
*/
|
|
final class PhpDocNodeMapper
|
|
{
|
|
/**
|
|
* @var PhpDocNodeTraverser
|
|
*/
|
|
private $phpDocNodeTraverser;
|
|
|
|
public function __construct(PhpDocNodeTraverser $phpDocNodeTraverser)
|
|
{
|
|
$this->phpDocNodeTraverser = $phpDocNodeTraverser;
|
|
}
|
|
|
|
/**
|
|
* @template T of \PHPStan\PhpDocParser\Ast\Node
|
|
* @param T $node
|
|
* @return T
|
|
*/
|
|
public function transform(Node $node, string $docContent): Node
|
|
{
|
|
$transformingCallable = function (Node $node, string $docContent): Node {
|
|
if ($node instanceof IntersectionTypeNode && ! $node instanceof BracketsAwareIntersectionTypeNode) {
|
|
return new BracketsAwareIntersectionTypeNode($node->types);
|
|
}
|
|
|
|
if ($node instanceof ArrayTypeNode && ! $node instanceof SpacingAwareArrayTypeNode) {
|
|
return new SpacingAwareArrayTypeNode($node->type);
|
|
}
|
|
|
|
if ($node instanceof CallableTypeNode && ! $node instanceof SpacingAwareCallableTypeNode) {
|
|
return new SpacingAwareCallableTypeNode($node->identifier, $node->parameters, $node->returnType);
|
|
}
|
|
|
|
if ($node instanceof UnionTypeNode && ! $node instanceof BracketsAwareUnionTypeNode) {
|
|
return new BracketsAwareUnionTypeNode($node->types, $docContent);
|
|
}
|
|
|
|
if ($node instanceof ArrayShapeItemNode && ! $node instanceof SpacingAwareArrayShapeItemNode) {
|
|
return new SpacingAwareArrayShapeItemNode(
|
|
$node->keyName, $node->optional, $node->valueType, $docContent
|
|
);
|
|
}
|
|
|
|
if ($node instanceof TemplateTagValueNode && ! $node instanceof SpacingAwareTemplateTagValueNode) {
|
|
return new SpacingAwareTemplateTagValueNode($node->name, $node->bound, $node->description, $docContent);
|
|
}
|
|
|
|
if ($node instanceof ParamTagValueNode && ! $node instanceof VariadicAwareParamTagValueNode) {
|
|
return new VariadicAwareParamTagValueNode(
|
|
$node->type, $node->isVariadic, $node->parameterName, $node->description
|
|
);
|
|
}
|
|
|
|
return $node;
|
|
};
|
|
|
|
return $this->phpDocNodeTraverser->traverseWithCallable($node, $docContent, $transformingCallable);
|
|
}
|
|
}
|