Skip to content

Commit 7486ed5

Browse files
authored
add PhpVersionConditionNodeVisitor (#7709)
1 parent 08246ce commit 7486ed5

File tree

3 files changed

+56
-0
lines changed

3 files changed

+56
-0
lines changed

src/DependencyInjection/LazyContainerFactory.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@
103103
use Rector\NodeTypeResolver\PHPStan\Scope\NodeVisitor\ContextNodeVisitor;
104104
use Rector\NodeTypeResolver\PHPStan\Scope\NodeVisitor\GlobalVariableNodeVisitor;
105105
use Rector\NodeTypeResolver\PHPStan\Scope\NodeVisitor\NameNodeVisitor;
106+
use Rector\NodeTypeResolver\PHPStan\Scope\NodeVisitor\PhpVersionConditionNodeVisitor;
106107
use Rector\NodeTypeResolver\PHPStan\Scope\NodeVisitor\PropertyOrClassConstDefaultNodeVisitor;
107108
use Rector\NodeTypeResolver\PHPStan\Scope\NodeVisitor\StaticVariableNodeVisitor;
108109
use Rector\NodeTypeResolver\PHPStan\Scope\NodeVisitor\SymfonyClosureNodeVisitor;
@@ -239,6 +240,7 @@ final class LazyContainerFactory
239240
*/
240241
private const DECORATING_NODE_VISITOR_CLASSES = [
241242
ArgNodeVisitor::class,
243+
PhpVersionConditionNodeVisitor::class,
242244
AssignedToNodeVisitor::class,
243245
SymfonyClosureNodeVisitor::class,
244246
ByRefReturnNodeVisitor::class,

src/NodeTypeResolver/Node/AttributeKey.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,4 +296,6 @@ final class AttributeKey
296296
public const IS_INSIDE_BYREF_FUNCTION_LIKE = 'is_inside_byref_function_like';
297297

298298
public const CLASS_CONST_FETCH_NAME = 'class_const_fetch_name';
299+
300+
public const PHP_VERSION_CONDITIONED = 'php_version_conditioned';
299301
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\NodeTypeResolver\PHPStan\Scope\NodeVisitor;
6+
7+
use PhpParser\Node;
8+
use PhpParser\Node\Expr\FuncCall;
9+
use PhpParser\Node\Expr\Ternary;
10+
use PhpParser\Node\Stmt\If_;
11+
use PhpParser\NodeVisitorAbstract;
12+
use Rector\Contract\PhpParser\DecoratingNodeVisitorInterface;
13+
use Rector\DeadCode\ConditionResolver;
14+
use Rector\DeadCode\ValueObject\VersionCompareCondition;
15+
use Rector\NodeTypeResolver\Node\AttributeKey;
16+
use Rector\PhpParser\NodeTraverser\SimpleNodeTraverser;
17+
18+
final class PhpVersionConditionNodeVisitor extends NodeVisitorAbstract implements DecoratingNodeVisitorInterface
19+
{
20+
public function __construct(
21+
private readonly ConditionResolver $conditionResolver
22+
) {
23+
}
24+
25+
public function enterNode(Node $node): ?Node
26+
{
27+
if (($node instanceof Ternary || $node instanceof If_) && $this->hasVersionCompareCond($node)) {
28+
if ($node instanceof Ternary) {
29+
$nodes = [$node->else];
30+
if ($node->if instanceof \PhpParser\Node) {
31+
$nodes[] = $node->if;
32+
}
33+
} else {
34+
$nodes = $node->stmts;
35+
}
36+
37+
SimpleNodeTraverser::decorateWithAttributeValue($nodes, AttributeKey::PHP_VERSION_CONDITIONED, true);
38+
}
39+
40+
return null;
41+
}
42+
43+
private function hasVersionCompareCond(If_|Ternary $ifOrTernary): bool
44+
{
45+
if (! $ifOrTernary->cond instanceof FuncCall) {
46+
return false;
47+
}
48+
49+
$versionCompare = $this->conditionResolver->resolveFromExpr($ifOrTernary->cond);
50+
return $versionCompare instanceof VersionCompareCondition;
51+
}
52+
}

0 commit comments

Comments
 (0)