Skip to content

Commit

Permalink
fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! add Pa…
Browse files Browse the repository at this point in the history
…ramPhpDocNodeVisitor
  • Loading branch information
TomasVotruba committed Apr 6, 2021
1 parent 3d95544 commit 1789478
Show file tree
Hide file tree
Showing 9 changed files with 234 additions and 70 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ final class CurrentTokenIteratorProvider
*/
private $betterTokenIterator;

public function setBetterTokenIterator(BetterTokenIterator $betterTokenIterator)
public function setBetterTokenIterator(BetterTokenIterator $betterTokenIterator): void
{
$this->betterTokenIterator = $betterTokenIterator;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode;
use PHPStan\PhpDocParser\Lexer\Lexer;
use PHPStan\PhpDocParser\Parser\PhpDocParser;
use PHPStan\PhpDocParser\Parser\TokenIterator;
use Rector\BetterPhpDocParser\Annotation\AnnotationNaming;
use Rector\BetterPhpDocParser\Attributes\Attribute\Attribute;
use Rector\BetterPhpDocParser\Contract\PhpDocNodeFactoryInterface;
Expand Down
71 changes: 2 additions & 69 deletions packages/BetterPhpDocParser/PhpDocNodeMapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -76,82 +76,15 @@ public function __construct(
*/
public function transform(PhpDocNode $phpDocNode, array $tokens): void
{
$this->parentNodeTraverser->transform($phpDocNode);
$this->currentTokenIteratorProvider->setBetterTokenIterator(new BetterTokenIterator($tokens));

$this->parentNodeTraverser->transform($phpDocNode);

$phpDocNodeTraverser = new PhpDocNodeTraverser();
foreach ($this->phpDocNodeVisitors as $phpDocNodeVisitor) {
$phpDocNodeTraverser->addPhpDocNodeVisitor($phpDocNodeVisitor);
}

$phpDocNodeTraverser->traverse($phpDocNode);

// $betterTokenIterator = $this->tokenIteratorFactory->create($docContent);
//
// // connect parent types with children types
// $transformingCallable = function (Node $node, string $docContent) /*use ($betterTokenIterator)*/: Node {
// // narrow to node-specific doc content
// $startAndEnd = $node->getAttribute(StartAndEnd::class);
// if ($startAndEnd instanceof StartAndEnd) {
// $parentTypeNode = $node->getAttribute('parent');
// if ($parentTypeNode instanceof ArrayTypeNode) {
// $docContent = $betterTokenIterator->printFromTo(
// $startAndEnd->getStart() - 1,
// $startAndEnd->getEnd() + 1
// );
// } else {
// $docContent = $betterTokenIterator->printFromTo($startAndEnd->getStart(), $startAndEnd->getEnd());
// }
// }
//
// if ($node instanceof IntersectionTypeNode && ! $node instanceof BracketsAwareIntersectionTypeNode) {
// $bracketsAwareIntersectionTypeNode = new BracketsAwareIntersectionTypeNode($node->types);
//
// $this->mirrorAttributes($node, $bracketsAwareIntersectionTypeNode);
// return $bracketsAwareIntersectionTypeNode;
// }
//
// if ($node instanceof ArrayTypeNode && ! $node instanceof SpacingAwareArrayTypeNode) {
// $spacingAwareArrayTypeNode = new SpacingAwareArrayTypeNode($node->type);
//
// $this->mirrorAttributes($node, $spacingAwareArrayTypeNode);
// return $spacingAwareArrayTypeNode;
// }
//
// if ($node instanceof CallableTypeNode && ! $node instanceof SpacingAwareCallableTypeNode) {
// $spacingAwareCallableTypeNode = new SpacingAwareCallableTypeNode(
// $node->identifier,
// $node->parameters,
// $node->returnType
// );
//
// $this->mirrorAttributes($node, $spacingAwareCallableTypeNode);
// return $spacingAwareCallableTypeNode;
// }
//
// if ($node instanceof UnionTypeNode && ! $node instanceof BracketsAwareUnionTypeNode) {
// // if has parent of array, widen the type
// $bracketsAwareUnionTypeNode = new BracketsAwareUnionTypeNode($node->types, $docContent);
//
// $this->mirrorAttributes($node, $bracketsAwareUnionTypeNode);
// return $bracketsAwareUnionTypeNode;
// }
//
// if ($node instanceof ArrayShapeItemNode && ! $node instanceof SpacingAwareArrayShapeItemNode) {
// $spacingAwareArrayShapeItemNode = new SpacingAwareArrayShapeItemNode(
// $node->keyName, $node->optional, $node->valueType, $docContent
// );
//
// $this->mirrorAttributes($node, $spacingAwareArrayShapeItemNode);
// return $spacingAwareArrayShapeItemNode;
// }
//
// return $node;
// };
}

// private function mirrorAttributes(Node $oldNode, Node $newNode): void
// {
// $newNode->setAttribute(StartAndEnd::class, $oldNode->getAttribute(StartAndEnd::class));
// }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?php

declare(strict_types=1);

namespace Rector\BetterPhpDocParser\PhpDocNodeVisitor;

use PHPStan\PhpDocParser\Ast\Node;
use PHPStan\PhpDocParser\Ast\Type\ArrayShapeItemNode;
use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode;
use Rector\BetterPhpDocParser\DataProvider\CurrentTokenIteratorProvider;
use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey;
use Rector\BetterPhpDocParser\ValueObject\StartAndEnd;
use Rector\BetterPhpDocParser\ValueObject\Type\SpacingAwareArrayShapeItemNode;
use Rector\BetterPhpDocParser\ValueObject\Type\SpacingAwareArrayTypeNode;
use Rector\Core\Exception\ShouldNotHappenException;
use Symplify\SimplePhpDocParser\PhpDocNodeVisitor\AbstractPhpDocNodeVisitor;

final class ArrayShapeItemNodePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor
{
/**
* @var CurrentTokenIteratorProvider
*/
private $currentTokenIteratorProvider;

public function __construct(CurrentTokenIteratorProvider $currentTokenIteratorProvider)
{
$this->currentTokenIteratorProvider = $currentTokenIteratorProvider;
}

public function enterNode(Node $node): ?Node
{
if (! $node instanceof ArrayShapeItemNode) {
return null;
}

if ($node instanceof SpacingAwareArrayShapeItemNode) {
return null;
}

$betterTokenIterator = $this->currentTokenIteratorProvider->provide();
$startAndEnd = $node->getAttribute(PhpDocAttributeKey::START_AND_END);
if (! $startAndEnd instanceof StartAndEnd) {
throw new ShouldNotHappenException();
}

$docContent = $betterTokenIterator->printFromTo($startAndEnd->getStart(), $startAndEnd->getEnd());
$spacingAwareArrayShapeItemNode = new SpacingAwareArrayShapeItemNode(
$node->keyName, $node->optional, $node->valueType, $docContent
);

$parent = $node->getAttribute(PhpDocAttributeKey::PARENT);
$spacingAwareArrayShapeItemNode->setAttribute(PhpDocAttributeKey::PARENT, $parent);

return $spacingAwareArrayShapeItemNode;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

declare(strict_types=1);

namespace Rector\BetterPhpDocParser\PhpDocNodeVisitor;

use PHPStan\PhpDocParser\Ast\Node;
use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode;
use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey;
use Rector\BetterPhpDocParser\ValueObject\Type\SpacingAwareArrayTypeNode;
use Symplify\SimplePhpDocParser\PhpDocNodeVisitor\AbstractPhpDocNodeVisitor;

final class ArrayTypePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor
{
public function enterNode(Node $node): ?Node
{
if (! $node instanceof ArrayTypeNode) {
return null;
}

if ($node instanceof SpacingAwareArrayTypeNode) {
return null;
}

$spacingAwareArrayTypeNode = new SpacingAwareArrayTypeNode($node->type);

$parent = $node->getAttribute(PhpDocAttributeKey::PARENT);
$spacingAwareArrayTypeNode->setAttribute(PhpDocAttributeKey::PARENT, $parent);

return $spacingAwareArrayTypeNode;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

declare(strict_types=1);

namespace Rector\BetterPhpDocParser\PhpDocNodeVisitor;

use PHPStan\PhpDocParser\Ast\Node;
use PHPStan\PhpDocParser\Ast\Type\CallableTypeNode;
use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey;
use Rector\BetterPhpDocParser\ValueObject\Type\SpacingAwareCallableTypeNode;
use Symplify\SimplePhpDocParser\PhpDocNodeVisitor\AbstractPhpDocNodeVisitor;

final class CallableTypePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor
{
public function enterNode(Node $node): ?Node
{
if (! $node instanceof CallableTypeNode) {
return null;
}

if ($node instanceof SpacingAwareCallableTypeNode) {
return null;
}

$spacingAwareCallableTypeNode = new SpacingAwareCallableTypeNode(
$node->identifier,
$node->parameters,
$node->returnType
);

$parent = $node->getAttribute(PhpDocAttributeKey::PARENT);
$spacingAwareCallableTypeNode->setAttribute(PhpDocAttributeKey::PARENT, $parent);

return $spacingAwareCallableTypeNode;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

declare(strict_types=1);

namespace Rector\BetterPhpDocParser\PhpDocNodeVisitor;

use PHPStan\PhpDocParser\Ast\Node;
use PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode;
use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey;
use Rector\BetterPhpDocParser\ValueObject\Type\BracketsAwareIntersectionTypeNode;
use Symplify\SimplePhpDocParser\PhpDocNodeVisitor\AbstractPhpDocNodeVisitor;

final class IntersectionTypeNodePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor
{
public function enterNode(Node $node): ?Node
{
if (! $node instanceof IntersectionTypeNode) {
return null;
}

if ($node instanceof BracketsAwareIntersectionTypeNode) {
return null;
}

$bracketsAwareUnionTypeNode = new BracketsAwareIntersectionTypeNode($node->types);

$parent = $node->getAttribute(PhpDocAttributeKey::PARENT);
$bracketsAwareUnionTypeNode->setAttribute(PhpDocAttributeKey::PARENT, $parent);

return $bracketsAwareUnionTypeNode;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?php

declare(strict_types=1);

namespace Rector\BetterPhpDocParser\PhpDocNodeVisitor;

use PHPStan\PhpDocParser\Ast\Node;
use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode;
use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode;
use Rector\BetterPhpDocParser\DataProvider\CurrentTokenIteratorProvider;
use Rector\BetterPhpDocParser\ValueObject\Parser\BetterTokenIterator;
use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey;
use Rector\BetterPhpDocParser\ValueObject\StartAndEnd;
use Rector\BetterPhpDocParser\ValueObject\Type\BracketsAwareUnionTypeNode;
use Rector\Core\Exception\ShouldNotHappenException;
use Symplify\SimplePhpDocParser\PhpDocNodeVisitor\AbstractPhpDocNodeVisitor;

final class UnionTypeNodePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor
{
/**
* @var CurrentTokenIteratorProvider
*/
private $currentTokenIteratorProvider;

public function __construct(CurrentTokenIteratorProvider $currentTokenIteratorProvider)
{
$this->currentTokenIteratorProvider = $currentTokenIteratorProvider;
}

public function enterNode(Node $node): ?Node
{
if (! $node instanceof UnionTypeNode) {
return null;
}

if ($node instanceof BracketsAwareUnionTypeNode) {
return null;
}

// unwrap with parent array type...
$startAndEnd = $node->getAttribute(PhpDocAttributeKey::START_AND_END);
if (! $startAndEnd instanceof StartAndEnd) {
throw new ShouldNotHappenException();
}

$betterTokenProvider = $this->currentTokenIteratorProvider->provide();
$parent = $node->getAttribute(PhpDocAttributeKey::PARENT);

$docContent = $this->resolveDocContent($parent, $betterTokenProvider, $startAndEnd);
$bracketsAwareUnionTypeNode = new BracketsAwareUnionTypeNode($node->types, $docContent);
$bracketsAwareUnionTypeNode->setAttribute(PhpDocAttributeKey::PARENT, $parent);

return $bracketsAwareUnionTypeNode;
}

private function resolveDocContent(Node $parentNode, BetterTokenIterator $betterTokenProvider, StartAndEnd $startAndEnd): string
{
if ($parentNode instanceof ArrayTypeNode) {
$arrayTypeNodeStartAndEnd = $parentNode->getAttribute(PhpDocAttributeKey::START_AND_END);
if ($arrayTypeNodeStartAndEnd instanceof StartAndEnd) {
return $betterTokenProvider->printFromTo(
$arrayTypeNodeStartAndEnd->getStart(),
$arrayTypeNodeStartAndEnd->getEnd()
);
}
}

return $betterTokenProvider->printFromTo($startAndEnd->getStart(), $startAndEnd->getEnd());
}
}
4 changes: 4 additions & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -558,3 +558,7 @@ parameters:
-
message: '#Do not inherit from abstract class, better use composition#'
path: packages/BetterPhpDocParser/PhpDocNodeVisitor/ParamPhpDocNodeVisitor.php

-
message: '#Do not inherit from abstract class, better use composition#'
path: packages/BetterPhpDocParser/PhpDocNodeVisitor/*PhpDocNodeVisitor.php

0 comments on commit 1789478

Please sign in to comment.