Skip to content

Commit 93cf392

Browse files
Add [file] + [rule] debug info on --debug + fix literal number downgrade type change to string (#2302)
* exact attribute type * add debug file + rule on --debug for easier output * make DowngradeNumericLiteralSeparatorRector keep the type * [ci-review] Rector Rectify Co-authored-by: GitHub Action <[email protected]>
1 parent e88903f commit 93cf392

File tree

2 files changed

+45
-14
lines changed

2 files changed

+45
-14
lines changed

rules/DowngradePhp74/Rector/LNumber/DowngradeNumericLiteralSeparatorRector.php

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,21 @@ public function getNodeTypes(): array
6464
*/
6565
public function refactor(Node $node): ?Node
6666
{
67-
if (! $this->shouldRefactor($node)) {
67+
if ($this->shouldSkip($node)) {
6868
return null;
6969
}
7070

71-
$numberNode = clone $node;
72-
$numberNodeValue = (string) $numberNode->value;
73-
if (\str_contains($numberNodeValue, '+')) {
71+
$numberValueAsString = (string) $node->value;
72+
if (\str_contains($numberValueAsString, '+')) {
7473
return null;
7574
}
7675

77-
$node->value = (string) $node->value;
76+
// trigger reprint
77+
$node->setAttribute(AttributeKey::ORIGINAL_NODE, null);
78+
79+
if ($node instanceof LNumber) {
80+
return $node;
81+
}
7882

7983
/**
8084
* This code follows a guess, to avoid modifying floats needlessly.
@@ -83,24 +87,33 @@ public function refactor(Node $node): ?Node
8387
* by adding ".0" at the end (eg: 0.0).
8488
* Then, add it again.
8589
*/
86-
if ($node instanceof DNumber && ! \str_contains($node->value, '.')) {
87-
$node->value .= '.0';
90+
if (! \str_contains($numberValueAsString, '.')) {
91+
$numberValueAsString .= '.0';
8892
}
8993

90-
if (! str_contains($node->value, '_')) {
91-
return null;
92-
}
94+
$node->value = (float) $numberValueAsString;
9395

9496
return $node;
9597
}
9698

97-
public function shouldRefactor(LNumber | DNumber $node): bool
99+
private function shouldSkip(LNumber | DNumber $node): bool
98100
{
99101
// "_" notation can be applied to decimal numbers only
100102
if ($node instanceof LNumber) {
101-
return $node->getAttribute(AttributeKey::KIND) === LNumber::KIND_DEC;
103+
$numberKind = $node->getAttribute(AttributeKey::KIND);
104+
if ($numberKind !== LNumber::KIND_DEC) {
105+
return true;
106+
}
107+
}
108+
109+
// we have to hack around tokens to get original value, see https://github.com/nikic/PHP-Parser/pull/832
110+
$oldTokens = $this->file->getOldTokens();
111+
$tokenValue = $oldTokens[$node->getStartTokenPos()][1] ?? null;
112+
113+
if ($tokenValue === null) {
114+
return true;
102115
}
103116

104-
return true;
117+
return ! str_contains((string) $tokenValue, '_');
105118
}
106119
}

src/Rector/AbstractRector.php

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use Rector\ChangesReporting\ValueObject\RectorWithLineChange;
2222
use Rector\Core\Application\ChangedNodeScopeRefresher;
2323
use Rector\Core\Configuration\CurrentNodeProvider;
24+
use Rector\Core\Console\Output\RectorOutputStyle;
2425
use Rector\Core\Contract\Rector\PhpRectorInterface;
2526
use Rector\Core\Exception\ShouldNotHappenException;
2627
use Rector\Core\Exclusion\ExclusionManager;
@@ -123,6 +124,8 @@ abstract class AbstractRector extends NodeVisitorAbstract implements PhpRectorIn
123124

124125
private UnreachableStmtAnalyzer $unreachableStmtAnalyzer;
125126

127+
private RectorOutputStyle $rectorOutputStyle;
128+
126129
#[Required]
127130
public function autowire(
128131
NodesToRemoveCollector $nodesToRemoveCollector,
@@ -145,7 +148,8 @@ public function autowire(
145148
RectifiedAnalyzer $rectifiedAnalyzer,
146149
CreatedByRuleDecorator $createdByRuleDecorator,
147150
ChangedNodeScopeRefresher $changedNodeScopeRefresher,
148-
UnreachableStmtAnalyzer $unreachableStmtAnalyzer
151+
UnreachableStmtAnalyzer $unreachableStmtAnalyzer,
152+
RectorOutputStyle $rectorOutputStyle,
149153
): void {
150154
$this->nodesToRemoveCollector = $nodesToRemoveCollector;
151155
$this->nodesToAddCollector = $nodesToAddCollector;
@@ -168,6 +172,7 @@ public function autowire(
168172
$this->createdByRuleDecorator = $createdByRuleDecorator;
169173
$this->changedNodeScopeRefresher = $changedNodeScopeRefresher;
170174
$this->unreachableStmtAnalyzer = $unreachableStmtAnalyzer;
175+
$this->rectorOutputStyle = $rectorOutputStyle;
171176
}
172177

173178
/**
@@ -216,6 +221,8 @@ final public function enterNode(Node $node)
216221

217222
$originalAttributes = $node->getAttributes();
218223

224+
$this->printDebugCurrentFileAndRule();
225+
219226
$node = $this->refactor($node);
220227

221228
// nothing to change → continue
@@ -435,4 +442,15 @@ private function connectParentNodes(Node $node): void
435442
$nodeTraverser->addVisitor(new ParentConnectingVisitor());
436443
$nodeTraverser->traverse([$node]);
437444
}
445+
446+
private function printDebugCurrentFileAndRule(): void
447+
{
448+
if (! $this->rectorOutputStyle->isDebug()) {
449+
return;
450+
}
451+
452+
$this->rectorOutputStyle->writeln('[file] ' . $this->file->getRelativeFilePath());
453+
$this->rectorOutputStyle->writeln('[rule] ' . static::class);
454+
$this->rectorOutputStyle->newLine(1);
455+
}
438456
}

0 commit comments

Comments
 (0)