Skip to content

Commit 2c122d2

Browse files
committed
Printer: remove the separator after a removed first list item
Removing the first type from A|B|C printed |B|C. Removing the first type from (A & B) printed ( & B). Amp-Thread-ID: https://ampcode.com/threads/T-01a17930-0285-73c5-a957-4325c77aa1b2
1 parent 565c822 commit 2c122d2

2 files changed

Lines changed: 67 additions & 6 deletions

File tree

‎src/Printer/Printer.php‎

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,7 @@ private function printArrayFormatPreserving(array $nodes, array $originalNodes,
603603
$insertStr = $this->listInsertionMap[$mapKey] ?? null;
604604
$result = '';
605605
$beforeFirstKeepOrReplace = true;
606+
$skipRemovedNode = false;
606607
$delayedAdd = [];
607608

608609
$insertNewline = false;
@@ -643,7 +644,12 @@ private function printArrayFormatPreserving(array $nodes, array $originalNodes,
643644
$commentStartPos = count($origComments) > 0 ? $origComments[0]->startIndex : $itemStartPos;
644645
assert($commentStartPos >= 0);
645646

646-
$result .= $originalTokens->getContentBetween($tokenIndex, $itemStartPos);
647+
if ($skipRemovedNode) {
648+
// the separator after the removed first item belongs to it
649+
$skipRemovedNode = false;
650+
} else {
651+
$result .= $originalTokens->getContentBetween($tokenIndex, $itemStartPos);
652+
}
647653

648654
if (count($delayedAdd) > 0) {
649655
foreach ($delayedAdd as $delayedAddNode) {
@@ -760,12 +766,18 @@ private function printArrayFormatPreserving(array $nodes, array $originalNodes,
760766
if ($i === 0) {
761767
// If we're removing from the start, keep the tokens before the node and drop those after it,
762768
// instead of the other way around.
763-
$originalTokensArray = $originalTokens->getTokens();
764-
for ($j = $tokenIndex; $j < $itemStartPos; $j++) {
765-
if ($originalTokensArray[$j][Lexer::TYPE_OFFSET] === Lexer::TOKEN_PHPDOC_EOL) {
766-
break;
769+
if ($mapKey === PhpDocNode::class . '->children') {
770+
// the line of the removed child is dropped, the next child keeps its own line
771+
$originalTokensArray = $originalTokens->getTokens();
772+
for ($j = $tokenIndex; $j < $itemStartPos; $j++) {
773+
if ($originalTokensArray[$j][Lexer::TYPE_OFFSET] === Lexer::TOKEN_PHPDOC_EOL) {
774+
break;
775+
}
776+
$result .= $originalTokensArray[$j][Lexer::VALUE_OFFSET];
767777
}
768-
$result .= $originalTokensArray[$j][Lexer::VALUE_OFFSET];
778+
} else {
779+
$result .= $originalTokens->getContentBetween($tokenIndex, $itemStartPos);
780+
$skipRemovedNode = true;
769781
}
770782
}
771783

‎tests/PHPStan/Printer/PrinterTest.php‎

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
use PHPUnit\Framework\TestCase;
5959
use function array_map;
6060
use function array_pop;
61+
use function array_shift;
6162
use function array_slice;
6263
use function array_splice;
6364
use function array_unshift;
@@ -2850,6 +2851,54 @@ public function enterNode(Node $node)
28502851
*/'),
28512852
$addCommentToObjectShapeItemMiddle,
28522853
];
2854+
2855+
$removeFirstType = new class extends AbstractNodeVisitor {
2856+
2857+
public function enterNode(Node $node)
2858+
{
2859+
if ($node instanceof UnionTypeNode || $node instanceof IntersectionTypeNode) {
2860+
array_shift($node->types);
2861+
}
2862+
2863+
return $node;
2864+
}
2865+
2866+
};
2867+
2868+
yield [
2869+
'/** @var A|B|C */',
2870+
'/** @var B|C */',
2871+
$removeFirstType,
2872+
];
2873+
2874+
yield [
2875+
'/** @var A | B | C */',
2876+
'/** @var B | C */',
2877+
$removeFirstType,
2878+
];
2879+
2880+
yield [
2881+
'/** @var (A & B & C) */',
2882+
'/** @var (B & C) */',
2883+
$removeFirstType,
2884+
];
2885+
2886+
yield [
2887+
'/** @var A|B|C|D */',
2888+
'/** @var C|D */',
2889+
new class extends AbstractNodeVisitor {
2890+
2891+
public function enterNode(Node $node)
2892+
{
2893+
if ($node instanceof UnionTypeNode) {
2894+
$node->types = [$node->types[2], $node->types[3]];
2895+
}
2896+
2897+
return $node;
2898+
}
2899+
2900+
},
2901+
];
28532902
}
28542903

28552904
/**

0 commit comments

Comments
 (0)