Repository navigation
Expand file tree
/
Copy pathExplicitBoolConditionResolver.php
More file actions
67 lines (56 loc) · 1.92 KB
/
Copy pathExplicitBoolConditionResolver.php
File metadata and controls
67 lines (56 loc) · 1.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php
declare(strict_types=1);
namespace Rector\CodeQuality\NodeAnalyzer;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\BinaryOp;
use PhpParser\Node\Expr\BooleanNot;
use PhpParser\Node\Expr\Cast\Bool_;
use PhpParser\Node\Expr\Empty_;
use PhpParser\Node\Expr\Instanceof_;
use PhpParser\Node\Expr\Isset_;
use PhpParser\Node\Expr\Ternary;
use PhpParser\Node\Stmt\ElseIf_;
use PhpParser\Node\Stmt\If_;
use PHPStan\Type\MixedType;
use Rector\CodeQuality\ValueObject\ExplicitBoolCondition;
use Rector\NodeTypeResolver\NodeTypeResolver;
final readonly class ExplicitBoolConditionResolver
{
public function __construct(
private NodeTypeResolver $nodeTypeResolver
) {
}
public function resolve(If_|ElseIf_|Ternary $node): ?ExplicitBoolCondition
{
// skip short ternary
if ($node instanceof Ternary && ! $node->if instanceof Expr) {
return null;
}
if ($node->cond instanceof BooleanNot) {
$conditionNode = $node->cond->expr;
$isNegated = true;
} else {
$conditionNode = $node->cond;
$isNegated = false;
}
if ($conditionNode instanceof Bool_) {
return null;
}
// cheap bail - these shapes can never be a nullable object, skip costly native type resolution
if ($this->isNeverNullableObject($conditionNode)) {
return null;
}
$conditionStaticType = $this->nodeTypeResolver->getNativeType($conditionNode);
if ($conditionStaticType instanceof MixedType || $conditionStaticType->isBoolean()->yes()) {
return null;
}
return new ExplicitBoolCondition($conditionNode, $isNegated);
}
private function isNeverNullableObject(Expr $expr): bool
{
return $expr instanceof BinaryOp
|| $expr instanceof Instanceof_
|| $expr instanceof Empty_
|| $expr instanceof Isset_;
}
}