From 162b97da87bb5b8fcde6f3ecf76aef6608268429 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Fri, 27 Jan 2023 08:27:34 +0000 Subject: [PATCH] Updated Rector to commit 33527d4e8d3b58bfebbac94330fd59f5be08b2b2 https://github.com/rectorphp/rector-src/commit/33527d4e8d3b58bfebbac94330fd59f5be08b2b2 [Printer] Move handle mix php+html to BetterStandardPrinter (#3310) --- .../Rector/NodeAddingPostRector.php | 13 +-- src/Application/VersionResolver.php | 4 +- src/NodeDecorator/MixPhpHtmlDecorator.php | 95 ++++++------------- .../Printer/BetterStandardPrinter.php | 27 ++++-- src/Rector/AbstractRector.php | 20 +--- vendor/autoload.php | 2 +- vendor/composer/autoload_real.php | 10 +- vendor/composer/autoload_static.php | 8 +- 8 files changed, 68 insertions(+), 111 deletions(-) diff --git a/packages/PostRector/Rector/NodeAddingPostRector.php b/packages/PostRector/Rector/NodeAddingPostRector.php index 6ffaddbaa0c..121abd8d583 100644 --- a/packages/PostRector/Rector/NodeAddingPostRector.php +++ b/packages/PostRector/Rector/NodeAddingPostRector.php @@ -4,8 +4,6 @@ declare (strict_types=1); namespace Rector\PostRector\Rector; use PhpParser\Node; -use Rector\Core\NodeDecorator\MixPhpHtmlDecorator; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PostRector\Collector\NodesToAddCollector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -27,15 +25,9 @@ final class NodeAddingPostRector extends \Rector\PostRector\Rector\AbstractPostR * @var \Rector\PostRector\Collector\NodesToAddCollector */ private $nodesToAddCollector; - /** - * @readonly - * @var \Rector\Core\NodeDecorator\MixPhpHtmlDecorator - */ - private $mixPhpHtmlDecorator; - public function __construct(NodesToAddCollector $nodesToAddCollector, MixPhpHtmlDecorator $mixPhpHtmlDecorator) + public function __construct(NodesToAddCollector $nodesToAddCollector) { $this->nodesToAddCollector = $nodesToAddCollector; - $this->mixPhpHtmlDecorator = $mixPhpHtmlDecorator; } public function getPriority() : int { @@ -51,14 +43,11 @@ final class NodeAddingPostRector extends \Rector\PostRector\Rector\AbstractPostR if ($nodesToAddAfter !== []) { $this->nodesToAddCollector->clearNodesToAddAfter($node); $newNodes = \array_merge($newNodes, $nodesToAddAfter); - $this->mixPhpHtmlDecorator->decorateAfter($node, \array_merge([$node], \is_array($nodesToAddAfter) ? $nodesToAddAfter : \iterator_to_array($nodesToAddAfter))); } $nodesToAddBefore = $this->nodesToAddCollector->getNodesToAddBeforeNode($node); if ($nodesToAddBefore !== []) { $this->nodesToAddCollector->clearNodesToAddBefore($node); $newNodes = \array_merge($nodesToAddBefore, $newNodes); - $previousNode = $node->getAttribute(AttributeKey::PREVIOUS_NODE); - $this->mixPhpHtmlDecorator->decorateBefore($node, $previousNode); } if ($newNodes === [$node]) { return $node; diff --git a/src/Application/VersionResolver.php b/src/Application/VersionResolver.php index df8cf3b0176..7ed3dac2807 100644 --- a/src/Application/VersionResolver.php +++ b/src/Application/VersionResolver.php @@ -19,12 +19,12 @@ final class VersionResolver * @api * @var string */ - public const PACKAGE_VERSION = 'dda7cdb03aa2b273af0ce35e1b195e03d0e3d3d2'; + public const PACKAGE_VERSION = '33527d4e8d3b58bfebbac94330fd59f5be08b2b2'; /** * @api * @var string */ - public const RELEASE_DATE = '2023-01-27 00:11:30'; + public const RELEASE_DATE = '2023-01-27 15:22:36'; /** * @var int */ diff --git a/src/NodeDecorator/MixPhpHtmlDecorator.php b/src/NodeDecorator/MixPhpHtmlDecorator.php index 6392d1d74c5..ad34ebfed8a 100644 --- a/src/NodeDecorator/MixPhpHtmlDecorator.php +++ b/src/NodeDecorator/MixPhpHtmlDecorator.php @@ -6,114 +6,77 @@ namespace Rector\Core\NodeDecorator; use PhpParser\Comment; use PhpParser\Comment\Doc; use PhpParser\Node; +use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\InlineHTML; use PhpParser\Node\Stmt\Nop; -use Rector\Core\PhpParser\Comparing\NodeComparator; use Rector\NodeRemoval\NodeRemover; use Rector\NodeTypeResolver\Node\AttributeKey; -/** - * Mix PHP+HTML decorator, which require reprint the InlineHTML - * which is the safe way to make next/prev Node has open and close php tag - */ +use RectorPrefix202301\Symfony\Contracts\Service\Attribute\Required; final class MixPhpHtmlDecorator { /** - * @readonly * @var \Rector\NodeRemoval\NodeRemover */ private $nodeRemover; /** - * @readonly - * @var \Rector\Core\PhpParser\Comparing\NodeComparator + * @required */ - private $nodeComparator; - public function __construct(NodeRemover $nodeRemover, NodeComparator $nodeComparator) + public function autowire(NodeRemover $nodeRemover) : void { $this->nodeRemover = $nodeRemover; - $this->nodeComparator = $nodeComparator; } /** - * @param Node[] $nodes + * @param array $nodes */ - public function decorateNextNodesInlineHTML(array $nodes) : void + public function decorateInlineHTML(InlineHTML $inlineHTML, int $key, array $nodes) : void { - foreach ($nodes as $key => $subNode) { - if ($subNode instanceof InlineHTML) { - continue; - } - if ($subNode->getStartTokenPos() >= 0) { - return; - } - if (!isset($nodes[$key + 1])) { - // already last one, nothing to do - return; - } - if ($nodes[$key + 1] instanceof InlineHTML) { - // No token end? Just added - $nodes[$key + 1]->setAttribute(AttributeKey::ORIGINAL_NODE, null); - return; - } + if (isset($nodes[$key - 1]) && !$nodes[$key - 1] instanceof InlineHTML && $nodes[$key - 1] instanceof Stmt) { + $this->rePrintInlineHTML($inlineHTML, $nodes[$key - 1]); } - } - public function decorateBefore(Node $node, Node $previousNode = null) : void - { - if ($previousNode instanceof InlineHTML && !$node instanceof InlineHTML) { - $previousNode->setAttribute(AttributeKey::ORIGINAL_NODE, null); + if (!isset($nodes[$key + 1])) { return; } - if ($node instanceof InlineHTML && !$previousNode instanceof Node) { - $node->setAttribute(AttributeKey::ORIGINAL_NODE, null); + if ($nodes[$key + 1] instanceof InlineHTML) { + return; } + if (!$nodes[$key + 1] instanceof Stmt) { + return; + } + $this->rePrintInlineHTML($inlineHTML, $nodes[$key + 1]); } /** - * @param Node[] $nodes + * @param array $nodes */ - public function decorateAfter(Node $node, array $nodes) : void + public function decorateAfterNop(Nop $nop, array $nodes) : void { - if (!$node instanceof Nop) { + if (!isset($nodes[1]) || $nodes[1] instanceof InlineHTML) { return; } - $firstNodeAfterNode = $node->getAttribute(AttributeKey::NEXT_NODE); - if (!$firstNodeAfterNode instanceof Node) { + if (!$nodes[1] instanceof Stmt) { return; } - if (!$firstNodeAfterNode instanceof InlineHTML) { - return; - } - $stmt = $this->resolveAppendAfterNode($node, $nodes); - if (!$stmt instanceof Node) { - return; - } - if ($stmt instanceof InlineHTML) { + $firstNodeAfterNop = $nodes[1]; + if ($firstNodeAfterNop->getStartTokenPos() >= 0) { return; } + // Token start = -1, just added $nodeComments = []; - foreach ($node->getComments() as $comment) { + foreach ($nop->getComments() as $comment) { if ($comment instanceof Doc) { $nodeComments[] = new Comment($comment->getText(), $comment->getStartLine(), $comment->getStartFilePos(), $comment->getStartTokenPos(), $comment->getEndLine(), $comment->getEndFilePos(), $comment->getEndTokenPos()); continue; } $nodeComments[] = $comment; } - $stmt->setAttribute(AttributeKey::COMMENTS, $nodeComments); - $firstNodeAfterNode->setAttribute(AttributeKey::ORIGINAL_NODE, null); + $firstNodeAfterNop->setAttribute(AttributeKey::COMMENTS, $nodeComments); // remove Nop is marked as comment of Next Node - $this->nodeRemover->removeNode($node); + $this->nodeRemover->removeNode($nop); } - /** - * @param Node[] $nodes - */ - private function resolveAppendAfterNode(Nop $nop, array $nodes) : ?Node + private function rePrintInlineHTML(InlineHTML $inlineHTML, Stmt $stmt) : void { - foreach ($nodes as $key => $subNode) { - if (!$this->nodeComparator->areSameNode($subNode, $nop)) { - continue; - } - if (!isset($nodes[$key + 1])) { - continue; - } - return $nodes[$key + 1]; + // Token start = -1, just added + if ($stmt->getStartTokenPos() < 0) { + $inlineHTML->setAttribute(AttributeKey::ORIGINAL_NODE, null); } - return null; } } diff --git a/src/PhpParser/Printer/BetterStandardPrinter.php b/src/PhpParser/Printer/BetterStandardPrinter.php index 515a4f3854d..9a9eba04c16 100644 --- a/src/PhpParser/Printer/BetterStandardPrinter.php +++ b/src/PhpParser/Printer/BetterStandardPrinter.php @@ -30,6 +30,7 @@ use PhpParser\PrettyPrinter\Standard; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Configuration\RectorConfigProvider; use Rector\Core\Contract\PhpParser\NodePrinterInterface; +use Rector\Core\NodeDecorator\MixPhpHtmlDecorator; use Rector\Core\PhpParser\Node\CustomNode\FileWithoutNamespace; use Rector\Core\Provider\CurrentFileProvider; use Rector\Core\Util\StringUtils; @@ -89,14 +90,20 @@ final class BetterStandardPrinter extends Standard implements NodePrinterInterfa * @var \Rector\Core\Provider\CurrentFileProvider */ private $currentFileProvider; + /** + * @readonly + * @var \Rector\Core\NodeDecorator\MixPhpHtmlDecorator + */ + private $mixPhpHtmlDecorator; /** * @param mixed[] $options */ - public function __construct(DocBlockUpdater $docBlockUpdater, RectorConfigProvider $rectorConfigProvider, CurrentFileProvider $currentFileProvider, array $options = []) + public function __construct(DocBlockUpdater $docBlockUpdater, RectorConfigProvider $rectorConfigProvider, CurrentFileProvider $currentFileProvider, MixPhpHtmlDecorator $mixPhpHtmlDecorator, array $options = []) { $this->docBlockUpdater = $docBlockUpdater; $this->rectorConfigProvider = $rectorConfigProvider; $this->currentFileProvider = $currentFileProvider; + $this->mixPhpHtmlDecorator = $mixPhpHtmlDecorator; parent::__construct($options); // print return type double colon right after the bracket "function(): string" $this->initializeInsertionMap(); @@ -135,7 +142,7 @@ final class BetterStandardPrinter extends Standard implements NodePrinterInterfa /** @var Node $firstStmt */ $isFirstStmtReprinted = $firstStmt->getAttribute(AttributeKey::ORIGINAL_NODE) === null; if (!$isFirstStmtReprinted) { - return $content; + return $this->cleanSurplusTag($content); } if (!$firstStmt instanceof InlineHTML) { return \str_replace('moveCommentsFromAttributeObjectToCommentsAttribute($nodes); + $this->decorateInlineHTMLOrNopAndUpdatePhpdocInfo($nodes); $content = parent::pArray($nodes, $origNodes, $pos, $indentAdjustment, $parentNodeType, $subNodeName, $fixup); if ($content === null) { return $content; @@ -323,7 +330,7 @@ final class BetterStandardPrinter extends Standard implements NodePrinterInterfa */ protected function pStmts(array $nodes, bool $indent = \true) : string { - $this->moveCommentsFromAttributeObjectToCommentsAttribute($nodes); + $this->decorateInlineHTMLOrNopAndUpdatePhpdocInfo($nodes); return parent::pStmts($nodes, $indent); } /** @@ -489,13 +496,21 @@ final class BetterStandardPrinter extends Standard implements NodePrinterInterfa /** * @param array $nodes */ - private function moveCommentsFromAttributeObjectToCommentsAttribute(array $nodes) : void + private function decorateInlineHTMLOrNopAndUpdatePhpdocInfo(array $nodes) : void { + $file = $this->currentFileProvider->getFile(); + $hasDiff = $file instanceof File && $file->getFileDiff() instanceof FileDiff; // move phpdoc from node to "comment" attribute - foreach ($nodes as $node) { + foreach ($nodes as $key => $node) { if (!$node instanceof Node) { continue; } + if ($node instanceof InlineHTML && $hasDiff) { + $this->mixPhpHtmlDecorator->decorateInlineHTML($node, $key, $nodes); + } + if ($node instanceof Nop && $key === 0 && $hasDiff) { + $this->mixPhpHtmlDecorator->decorateAfterNop($node, $nodes); + } $this->docBlockUpdater->updateNodeWithPhpDocInfo($node); } } diff --git a/src/Rector/AbstractRector.php b/src/Rector/AbstractRector.php index 7c201bd8de0..26c0d7d1a4f 100644 --- a/src/Rector/AbstractRector.php +++ b/src/Rector/AbstractRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Arg; use PhpParser\Node\Expr; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; +use PhpParser\Node\Stmt\InlineHTML; use PhpParser\Node\Stmt\Nop; use PhpParser\NodeTraverser; use PhpParser\NodeVisitor\NodeConnectingVisitor; @@ -27,10 +28,8 @@ use Rector\Core\Exception\ShouldNotHappenException; use Rector\Core\FileSystem\FilePathHelper; use Rector\Core\Logging\CurrentRectorProvider; use Rector\Core\NodeDecorator\CreatedByRuleDecorator; -use Rector\Core\NodeDecorator\MixPhpHtmlDecorator; use Rector\Core\PhpParser\Comparing\NodeComparator; use Rector\Core\PhpParser\Node\BetterNodeFinder; -use Rector\Core\PhpParser\Node\CustomNode\FileWithoutNamespace; use Rector\Core\PhpParser\Node\NodeFactory; use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\ProcessAnalyzer\RectifiedAnalyzer; @@ -155,14 +154,10 @@ CODE_SAMPLE; * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; - /** - * @var \Rector\Core\NodeDecorator\MixPhpHtmlDecorator - */ - private $mixPhpHtmlDecorator; /** * @required */ - public function autowire(NodesToRemoveCollector $nodesToRemoveCollector, NodeRemover $nodeRemover, NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, NodeFactory $nodeFactory, PhpDocInfoFactory $phpDocInfoFactory, StaticTypeMapper $staticTypeMapper, CurrentRectorProvider $currentRectorProvider, CurrentNodeProvider $currentNodeProvider, Skipper $skipper, ValueResolver $valueResolver, BetterNodeFinder $betterNodeFinder, NodeComparator $nodeComparator, CurrentFileProvider $currentFileProvider, RectifiedAnalyzer $rectifiedAnalyzer, CreatedByRuleDecorator $createdByRuleDecorator, ChangedNodeScopeRefresher $changedNodeScopeRefresher, RectorOutputStyle $rectorOutputStyle, FilePathHelper $filePathHelper, DocBlockUpdater $docBlockUpdater, MixPhpHtmlDecorator $mixPhpHtmlDecorator) : void + public function autowire(NodesToRemoveCollector $nodesToRemoveCollector, NodeRemover $nodeRemover, NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, NodeFactory $nodeFactory, PhpDocInfoFactory $phpDocInfoFactory, StaticTypeMapper $staticTypeMapper, CurrentRectorProvider $currentRectorProvider, CurrentNodeProvider $currentNodeProvider, Skipper $skipper, ValueResolver $valueResolver, BetterNodeFinder $betterNodeFinder, NodeComparator $nodeComparator, CurrentFileProvider $currentFileProvider, RectifiedAnalyzer $rectifiedAnalyzer, CreatedByRuleDecorator $createdByRuleDecorator, ChangedNodeScopeRefresher $changedNodeScopeRefresher, RectorOutputStyle $rectorOutputStyle, FilePathHelper $filePathHelper, DocBlockUpdater $docBlockUpdater) : void { $this->nodesToRemoveCollector = $nodesToRemoveCollector; $this->nodeRemover = $nodeRemover; @@ -185,7 +180,6 @@ CODE_SAMPLE; $this->rectorOutputStyle = $rectorOutputStyle; $this->filePathHelper = $filePathHelper; $this->docBlockUpdater = $docBlockUpdater; - $this->mixPhpHtmlDecorator = $mixPhpHtmlDecorator; } /** * @return Node[]|null @@ -306,6 +300,9 @@ CODE_SAMPLE; if ($this->nodeComparator->areSameNode($newNode, $oldNode)) { return; } + if ($oldNode instanceof InlineHTML) { + return; + } $newNode->setAttribute(AttributeKey::PHP_DOC_INFO, $oldNode->getAttribute(AttributeKey::PHP_DOC_INFO)); if (!$newNode instanceof Nop) { $newNode->setAttribute(AttributeKey::COMMENTS, $oldNode->getAttribute(AttributeKey::COMMENTS)); @@ -392,7 +389,6 @@ CODE_SAMPLE; if (!$firstNodePreviousNode instanceof Node && $node->hasAttribute(AttributeKey::PREVIOUS_NODE)) { /** @var Node $previousNode */ $previousNode = $node->getAttribute(AttributeKey::PREVIOUS_NODE); - $this->mixPhpHtmlDecorator->decorateBefore($node, $previousNode); $nodes = \array_merge([$previousNode], \is_array($nodes) ? $nodes : \iterator_to_array($nodes)); } $lastNode = \end($nodes); @@ -400,14 +396,8 @@ CODE_SAMPLE; if (!$lastNodeNextNode instanceof Node && $node->hasAttribute(AttributeKey::NEXT_NODE)) { /** @var Node $nextNode */ $nextNode = $node->getAttribute(AttributeKey::NEXT_NODE); - $this->mixPhpHtmlDecorator->decorateAfter($node, $nodes); $nodes = \array_merge(\is_array($nodes) ? $nodes : \iterator_to_array($nodes), [$nextNode]); } - if (\count($nodes) > 1) { - $this->mixPhpHtmlDecorator->decorateNextNodesInlineHTML($nodes); - } elseif ($firstNode instanceof FileWithoutNamespace) { - $this->mixPhpHtmlDecorator->decorateNextNodesInlineHTML($firstNode->stmts); - } $nodeTraverser = new NodeTraverser(); $nodeTraverser->addVisitor(new NodeConnectingVisitor()); $nodeTraverser->traverse($nodes); diff --git a/vendor/autoload.php b/vendor/autoload.php index aae00df5794..39c8698c450 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -22,4 +22,4 @@ if (PHP_VERSION_ID < 50600) { require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInit7d137b24c781d5ec3fd9812b4d756ab6::getLoader(); +return ComposerAutoloaderInitae0e4f81d7059ecf84d1abae7ad9f749::getLoader(); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 53ea1aa3613..7b2c6f185e8 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInit7d137b24c781d5ec3fd9812b4d756ab6 +class ComposerAutoloaderInitae0e4f81d7059ecf84d1abae7ad9f749 { private static $loader; @@ -22,17 +22,17 @@ class ComposerAutoloaderInit7d137b24c781d5ec3fd9812b4d756ab6 return self::$loader; } - spl_autoload_register(array('ComposerAutoloaderInit7d137b24c781d5ec3fd9812b4d756ab6', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInitae0e4f81d7059ecf84d1abae7ad9f749', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); - spl_autoload_unregister(array('ComposerAutoloaderInit7d137b24c781d5ec3fd9812b4d756ab6', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInitae0e4f81d7059ecf84d1abae7ad9f749', 'loadClassLoader')); require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit7d137b24c781d5ec3fd9812b4d756ab6::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInitae0e4f81d7059ecf84d1abae7ad9f749::getInitializer($loader)); $loader->setClassMapAuthoritative(true); $loader->register(true); - $filesToLoad = \Composer\Autoload\ComposerStaticInit7d137b24c781d5ec3fd9812b4d756ab6::$files; + $filesToLoad = \Composer\Autoload\ComposerStaticInitae0e4f81d7059ecf84d1abae7ad9f749::$files; $requireFile = static function ($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 0109f1731eb..3f7da0b7a5d 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -4,7 +4,7 @@ namespace Composer\Autoload; -class ComposerStaticInit7d137b24c781d5ec3fd9812b4d756ab6 +class ComposerStaticInitae0e4f81d7059ecf84d1abae7ad9f749 { public static $files = array ( 'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php', @@ -3078,9 +3078,9 @@ class ComposerStaticInit7d137b24c781d5ec3fd9812b4d756ab6 public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit7d137b24c781d5ec3fd9812b4d756ab6::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit7d137b24c781d5ec3fd9812b4d756ab6::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit7d137b24c781d5ec3fd9812b4d756ab6::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInitae0e4f81d7059ecf84d1abae7ad9f749::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInitae0e4f81d7059ecf84d1abae7ad9f749::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInitae0e4f81d7059ecf84d1abae7ad9f749::$classMap; }, null, ClassLoader::class); }