Skip to content

Commit 89ebb98

Browse files
committed
add PhpVersionConditionNodeVisitor
1 parent 08246ce commit 89ebb98

File tree

3 files changed

+53
-0
lines changed

3 files changed

+53
-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: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
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_) {
28+
if ($this->hasVersionCompareCond($node)) {
29+
SimpleNodeTraverser::decorateWithAttributeValue(
30+
[$node->if, $node->else],
31+
AttributeKey::PHP_VERSION_CONDITIONED,
32+
true
33+
);
34+
}
35+
}
36+
37+
return null;
38+
}
39+
40+
private function hasVersionCompareCond(If_|Ternary $ifOrTernary): bool
41+
{
42+
if (! $ifOrTernary->cond instanceof FuncCall) {
43+
return false;
44+
}
45+
46+
$versionCompare = $this->conditionResolver->resolveFromExpr($ifOrTernary->cond);
47+
return $versionCompare instanceof VersionCompareCondition;
48+
}
49+
}

0 commit comments

Comments
 (0)