2020-06-02 07:28:51 +00:00
|
|
|
<?php
|
|
|
|
|
2021-05-09 20:15:43 +00:00
|
|
|
declare (strict_types=1);
|
2022-06-06 17:12:56 +00:00
|
|
|
namespace Rector\Php80\NodeManipulator;
|
2020-06-02 07:28:51 +00:00
|
|
|
|
2022-06-06 17:12:56 +00:00
|
|
|
use PhpParser\Node;
|
|
|
|
use PhpParser\Node\Arg;
|
|
|
|
use PhpParser\Node\Expr;
|
|
|
|
use PhpParser\Node\Expr\ArrayDimFetch;
|
|
|
|
use PhpParser\Node\Expr\Assign;
|
|
|
|
use PhpParser\Node\Expr\BinaryOp\Identical;
|
|
|
|
use PhpParser\Node\Expr\BooleanNot;
|
|
|
|
use PhpParser\Node\Expr\ConstFetch;
|
|
|
|
use PhpParser\Node\Expr\FuncCall;
|
|
|
|
use PhpParser\Node\Expr\MethodCall;
|
|
|
|
use PhpParser\Node\Expr\PropertyFetch;
|
2023-01-17 01:10:44 +00:00
|
|
|
use PhpParser\Node\Expr\Ternary;
|
2022-06-06 17:12:56 +00:00
|
|
|
use PhpParser\Node\Expr\Variable;
|
|
|
|
use PhpParser\Node\Stmt\If_;
|
|
|
|
use Rector\Core\NodeAnalyzer\ArgsAnalyzer;
|
|
|
|
use Rector\Core\PhpParser\Comparing\NodeComparator;
|
2023-01-17 01:10:44 +00:00
|
|
|
use Rector\Core\PhpParser\Node\BetterNodeFinder;
|
2022-06-06 17:12:56 +00:00
|
|
|
use Rector\Core\PhpParser\Node\Value\ValueResolver;
|
|
|
|
use Rector\Core\Util\StringUtils;
|
|
|
|
use Rector\NodeNameResolver\NodeNameResolver;
|
|
|
|
use Rector\NodeTypeResolver\Node\AttributeKey;
|
|
|
|
use Rector\NodeTypeResolver\NodeTypeResolver;
|
|
|
|
use Rector\Php80\ValueObject\ArrayDimFetchAndConstFetch;
|
2022-08-29 20:49:28 +00:00
|
|
|
use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser;
|
2022-06-06 17:12:56 +00:00
|
|
|
use Rector\PostRector\Collector\NodesToRemoveCollector;
|
2020-06-02 07:28:51 +00:00
|
|
|
final class TokenManipulator
|
|
|
|
{
|
|
|
|
/**
|
2021-08-23 00:20:32 +00:00
|
|
|
* @var \PhpParser\Node\Expr|null
|
2020-06-02 07:28:51 +00:00
|
|
|
*/
|
2021-05-10 23:39:21 +00:00
|
|
|
private $assignedNameExpr;
|
2020-06-02 07:28:51 +00:00
|
|
|
/**
|
2021-12-04 12:47:17 +00:00
|
|
|
* @readonly
|
2022-08-29 20:49:28 +00:00
|
|
|
* @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser
|
2020-06-02 07:28:51 +00:00
|
|
|
*/
|
2021-05-10 23:39:21 +00:00
|
|
|
private $simpleCallableNodeTraverser;
|
2020-06-02 07:28:51 +00:00
|
|
|
/**
|
2021-12-04 12:47:17 +00:00
|
|
|
* @readonly
|
2021-05-10 23:39:21 +00:00
|
|
|
* @var \Rector\NodeNameResolver\NodeNameResolver
|
2020-06-02 07:28:51 +00:00
|
|
|
*/
|
|
|
|
private $nodeNameResolver;
|
|
|
|
/**
|
2021-12-04 12:47:17 +00:00
|
|
|
* @readonly
|
2021-05-10 23:39:21 +00:00
|
|
|
* @var \Rector\NodeTypeResolver\NodeTypeResolver
|
2020-06-02 07:28:51 +00:00
|
|
|
*/
|
|
|
|
private $nodeTypeResolver;
|
|
|
|
/**
|
2021-12-04 12:47:17 +00:00
|
|
|
* @readonly
|
2021-05-10 23:39:21 +00:00
|
|
|
* @var \Rector\PostRector\Collector\NodesToRemoveCollector
|
2020-06-02 07:28:51 +00:00
|
|
|
*/
|
|
|
|
private $nodesToRemoveCollector;
|
2020-07-31 20:20:45 +00:00
|
|
|
/**
|
2021-12-04 12:47:17 +00:00
|
|
|
* @readonly
|
2021-05-10 23:39:21 +00:00
|
|
|
* @var \Rector\Core\PhpParser\Node\Value\ValueResolver
|
2020-07-31 20:20:45 +00:00
|
|
|
*/
|
2021-05-10 23:39:21 +00:00
|
|
|
private $valueResolver;
|
|
|
|
/**
|
2021-12-04 12:47:17 +00:00
|
|
|
* @readonly
|
2021-05-10 23:39:21 +00:00
|
|
|
* @var \Rector\Core\PhpParser\Comparing\NodeComparator
|
|
|
|
*/
|
|
|
|
private $nodeComparator;
|
2021-09-27 15:43:15 +00:00
|
|
|
/**
|
2021-12-04 12:47:17 +00:00
|
|
|
* @readonly
|
2021-09-27 15:43:15 +00:00
|
|
|
* @var \Rector\Core\NodeAnalyzer\ArgsAnalyzer
|
|
|
|
*/
|
|
|
|
private $argsAnalyzer;
|
2023-01-17 01:10:44 +00:00
|
|
|
/**
|
|
|
|
* @readonly
|
|
|
|
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
|
|
|
|
*/
|
|
|
|
private $betterNodeFinder;
|
|
|
|
public function __construct(SimpleCallableNodeTraverser $simpleCallableNodeTraverser, NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver, NodesToRemoveCollector $nodesToRemoveCollector, ValueResolver $valueResolver, NodeComparator $nodeComparator, ArgsAnalyzer $argsAnalyzer, BetterNodeFinder $betterNodeFinder)
|
2021-05-09 20:15:43 +00:00
|
|
|
{
|
2021-01-16 21:45:18 +00:00
|
|
|
$this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser;
|
2020-06-02 07:28:51 +00:00
|
|
|
$this->nodeNameResolver = $nodeNameResolver;
|
|
|
|
$this->nodeTypeResolver = $nodeTypeResolver;
|
|
|
|
$this->nodesToRemoveCollector = $nodesToRemoveCollector;
|
2021-05-10 23:39:21 +00:00
|
|
|
$this->valueResolver = $valueResolver;
|
2021-02-19 12:01:23 +00:00
|
|
|
$this->nodeComparator = $nodeComparator;
|
2021-09-27 15:43:15 +00:00
|
|
|
$this->argsAnalyzer = $argsAnalyzer;
|
2023-01-17 01:10:44 +00:00
|
|
|
$this->betterNodeFinder = $betterNodeFinder;
|
2020-06-02 07:28:51 +00:00
|
|
|
}
|
|
|
|
/**
|
|
|
|
* @param Node[] $nodes
|
|
|
|
*/
|
2022-07-15 08:14:37 +00:00
|
|
|
public function refactorArrayToken(array $nodes, Variable $singleTokenVariable) : void
|
2020-06-02 07:28:51 +00:00
|
|
|
{
|
2022-07-15 08:14:37 +00:00
|
|
|
$this->replaceTokenDimFetchZeroWithGetTokenName($nodes, $singleTokenVariable);
|
2020-06-02 07:28:51 +00:00
|
|
|
// replace "$token[1]"; with "$token->value"
|
2022-06-07 08:22:29 +00:00
|
|
|
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($nodes, function (Node $node) : ?PropertyFetch {
|
|
|
|
if (!$node instanceof ArrayDimFetch) {
|
2020-12-20 21:05:48 +00:00
|
|
|
return null;
|
|
|
|
}
|
2021-05-09 20:15:43 +00:00
|
|
|
if (!$this->isArrayDimFetchWithDimIntegerValue($node, 1)) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
2021-10-07 18:52:22 +00:00
|
|
|
$tokenStaticType = $this->nodeTypeResolver->getType($node->var);
|
2022-11-15 15:22:43 +00:00
|
|
|
if (!$tokenStaticType->isArray()->yes()) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
2022-06-07 08:22:29 +00:00
|
|
|
return new PropertyFetch($node->var, 'text');
|
2020-06-02 07:28:51 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* @param Node[] $nodes
|
|
|
|
*/
|
2022-07-15 08:14:37 +00:00
|
|
|
public function refactorNonArrayToken(array $nodes, Variable $singleTokenVariable) : void
|
2020-06-02 07:28:51 +00:00
|
|
|
{
|
|
|
|
// replace "$content = $token;" → "$content = $token->text;"
|
2022-07-15 08:14:37 +00:00
|
|
|
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($nodes, function (Node $node) use($singleTokenVariable) {
|
2022-06-07 08:22:29 +00:00
|
|
|
if (!$node instanceof Assign) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
2022-07-15 08:14:37 +00:00
|
|
|
if (!$this->nodeComparator->areNodesEqual($node->expr, $singleTokenVariable)) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
2021-10-07 18:52:22 +00:00
|
|
|
$tokenStaticType = $this->nodeTypeResolver->getType($node->expr);
|
2022-11-15 15:22:43 +00:00
|
|
|
if ($tokenStaticType->isArray()->yes()) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
2022-07-15 08:14:37 +00:00
|
|
|
$node->expr = new PropertyFetch($singleTokenVariable, 'text');
|
2020-06-02 07:28:51 +00:00
|
|
|
});
|
|
|
|
// replace "$name = null;" → "$name = $token->getTokenName();"
|
2022-07-15 08:14:37 +00:00
|
|
|
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($nodes, function (Node $node) use($singleTokenVariable) : ?Assign {
|
2022-06-07 08:22:29 +00:00
|
|
|
if (!$node instanceof Assign) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
2021-10-07 18:52:22 +00:00
|
|
|
$tokenStaticType = $this->nodeTypeResolver->getType($node->expr);
|
2022-11-15 15:22:43 +00:00
|
|
|
if ($tokenStaticType->isArray()->yes()) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
if ($this->assignedNameExpr === null) {
|
|
|
|
return null;
|
|
|
|
}
|
2021-05-09 20:15:43 +00:00
|
|
|
if (!$this->nodeComparator->areNodesEqual($node->var, $this->assignedNameExpr)) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
2021-05-09 20:15:43 +00:00
|
|
|
if (!$this->valueResolver->isValue($node->expr, 'null')) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
2022-07-15 08:14:37 +00:00
|
|
|
$node->expr = new MethodCall($singleTokenVariable, 'getTokenName');
|
2020-06-02 07:28:51 +00:00
|
|
|
return $node;
|
|
|
|
});
|
|
|
|
}
|
2020-10-11 14:17:43 +00:00
|
|
|
/**
|
|
|
|
* @param Node[] $nodes
|
|
|
|
*/
|
2022-07-15 08:14:37 +00:00
|
|
|
public function refactorTokenIsKind(array $nodes, Variable $singleTokenVariable) : void
|
2020-06-02 07:28:51 +00:00
|
|
|
{
|
2022-07-15 08:14:37 +00:00
|
|
|
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($nodes, function (Node $node) use($singleTokenVariable) : ?MethodCall {
|
2022-06-07 08:22:29 +00:00
|
|
|
if (!$node instanceof Identical) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
2020-08-23 09:39:09 +00:00
|
|
|
$arrayDimFetchAndConstFetch = $this->matchArrayDimFetchAndConstFetch($node);
|
2022-06-07 08:22:29 +00:00
|
|
|
if (!$arrayDimFetchAndConstFetch instanceof ArrayDimFetchAndConstFetch) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
2021-05-09 20:15:43 +00:00
|
|
|
if (!$this->isArrayDimFetchWithDimIntegerValue($arrayDimFetchAndConstFetch->getArrayDimFetch(), 0)) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
2020-08-23 09:39:09 +00:00
|
|
|
$arrayDimFetch = $arrayDimFetchAndConstFetch->getArrayDimFetch();
|
|
|
|
$constFetch = $arrayDimFetchAndConstFetch->getConstFetch();
|
2022-07-15 08:14:37 +00:00
|
|
|
if (!$this->nodeComparator->areNodesEqual($arrayDimFetch->var, $singleTokenVariable)) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
$constName = $this->nodeNameResolver->getName($constFetch);
|
|
|
|
if ($constName === null) {
|
|
|
|
return null;
|
|
|
|
}
|
2022-06-07 08:22:29 +00:00
|
|
|
if (!StringUtils::isMatch($constName, '#^T_#')) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
2021-05-09 20:15:43 +00:00
|
|
|
return $this->createIsTConstTypeMethodCall($arrayDimFetch, $arrayDimFetchAndConstFetch->getConstFetch());
|
2020-06-02 07:28:51 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* @param Node[] $nodes
|
|
|
|
*/
|
2022-06-07 08:22:29 +00:00
|
|
|
public function removeIsArray(array $nodes, Variable $singleTokenVariable) : void
|
2020-06-02 07:28:51 +00:00
|
|
|
{
|
2023-01-17 01:10:44 +00:00
|
|
|
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($nodes, function (Node $node) use($singleTokenVariable) : ?FuncCall {
|
2022-06-07 08:22:29 +00:00
|
|
|
if (!$node instanceof FuncCall) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
2021-05-09 20:15:43 +00:00
|
|
|
if (!$this->nodeNameResolver->isName($node, 'is_array')) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
2021-09-27 15:43:15 +00:00
|
|
|
if (!$this->argsAnalyzer->isArgInstanceInArgsPosition($node->args, 0)) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
/** @var Arg $firstArg */
|
|
|
|
$firstArg = $node->args[0];
|
|
|
|
if (!$this->nodeComparator->areNodesEqual($firstArg->value, $singleTokenVariable)) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
if ($this->shouldSkipNodeRemovalForPartOfIf($node)) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
// remove correct node
|
|
|
|
$nodeToRemove = $this->matchParentNodeInCaseOfIdenticalTrue($node);
|
2023-01-17 01:10:44 +00:00
|
|
|
$parentNode = $nodeToRemove->getAttribute(AttributeKey::PARENT_NODE);
|
|
|
|
if ($parentNode instanceof Ternary) {
|
|
|
|
$this->replaceTernary($parentNode);
|
|
|
|
return $node;
|
|
|
|
}
|
2020-06-02 07:28:51 +00:00
|
|
|
$this->nodesToRemoveCollector->addNodeToRemove($nodeToRemove);
|
2023-01-17 01:10:44 +00:00
|
|
|
return $node;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
private function replaceTernary(Ternary $ternary) : void
|
|
|
|
{
|
|
|
|
$currentStmt = $this->betterNodeFinder->resolveCurrentStatement($ternary);
|
|
|
|
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($currentStmt, static function (Node $subNode) use($ternary) : ?Expr {
|
|
|
|
if ($subNode === $ternary) {
|
|
|
|
return $ternary->if;
|
|
|
|
}
|
|
|
|
return null;
|
2020-06-02 07:28:51 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Replace $token[0] with $token->getTokenName() call
|
|
|
|
*
|
|
|
|
* @param Node[] $nodes
|
|
|
|
*/
|
2022-07-15 08:14:37 +00:00
|
|
|
private function replaceTokenDimFetchZeroWithGetTokenName(array $nodes, Variable $singleTokenVariable) : void
|
2020-06-02 07:28:51 +00:00
|
|
|
{
|
2022-07-15 08:14:37 +00:00
|
|
|
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($nodes, function (Node $node) use($singleTokenVariable) : ?MethodCall {
|
2022-06-07 08:22:29 +00:00
|
|
|
if (!$node instanceof FuncCall) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
2021-05-09 20:15:43 +00:00
|
|
|
if (!$this->nodeNameResolver->isName($node, 'token_name')) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
2021-09-27 15:43:15 +00:00
|
|
|
if (!$this->argsAnalyzer->isArgInstanceInArgsPosition($node->args, 0)) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
/** @var Arg $firstArg */
|
|
|
|
$firstArg = $node->args[0];
|
|
|
|
$possibleTokenArray = $firstArg->value;
|
2022-06-07 08:22:29 +00:00
|
|
|
if (!$possibleTokenArray instanceof ArrayDimFetch) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
2021-10-07 18:52:22 +00:00
|
|
|
$tokenStaticType = $this->nodeTypeResolver->getType($possibleTokenArray->var);
|
2022-11-15 15:22:43 +00:00
|
|
|
if (!$tokenStaticType->isArray()->yes()) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
if ($possibleTokenArray->dim === null) {
|
|
|
|
return null;
|
|
|
|
}
|
2021-05-09 20:15:43 +00:00
|
|
|
if (!$this->valueResolver->isValue($possibleTokenArray->dim, 0)) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
2022-07-15 08:14:37 +00:00
|
|
|
if (!$this->nodeComparator->areNodesEqual($possibleTokenArray->var, $singleTokenVariable)) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
// save token variable name for later
|
2022-06-07 08:22:29 +00:00
|
|
|
$parentNode = $node->getAttribute(AttributeKey::PARENT_NODE);
|
|
|
|
if ($parentNode instanceof Assign) {
|
2020-06-02 07:28:51 +00:00
|
|
|
$this->assignedNameExpr = $parentNode->var;
|
|
|
|
}
|
2022-07-15 08:14:37 +00:00
|
|
|
return new MethodCall($singleTokenVariable, 'getTokenName');
|
2020-06-02 07:28:51 +00:00
|
|
|
});
|
|
|
|
}
|
2022-06-07 08:22:29 +00:00
|
|
|
private function isArrayDimFetchWithDimIntegerValue(ArrayDimFetch $arrayDimFetch, int $value) : bool
|
2020-06-02 07:28:51 +00:00
|
|
|
{
|
2021-01-19 23:29:52 +00:00
|
|
|
if ($arrayDimFetch->dim === null) {
|
2021-05-09 20:15:43 +00:00
|
|
|
return \false;
|
2020-06-02 07:28:51 +00:00
|
|
|
}
|
2021-01-19 23:29:52 +00:00
|
|
|
return $this->valueResolver->isValue($arrayDimFetch->dim, $value);
|
2020-06-02 07:28:51 +00:00
|
|
|
}
|
2022-06-07 08:22:29 +00:00
|
|
|
private function matchArrayDimFetchAndConstFetch(Identical $identical) : ?ArrayDimFetchAndConstFetch
|
2020-08-05 20:45:36 +00:00
|
|
|
{
|
2022-06-07 08:22:29 +00:00
|
|
|
if ($identical->left instanceof ArrayDimFetch && $identical->right instanceof ConstFetch) {
|
|
|
|
return new ArrayDimFetchAndConstFetch($identical->left, $identical->right);
|
2020-08-05 20:45:36 +00:00
|
|
|
}
|
2022-06-07 08:22:29 +00:00
|
|
|
if (!$identical->right instanceof ArrayDimFetch) {
|
2021-02-21 09:32:45 +00:00
|
|
|
return null;
|
2020-08-05 20:45:36 +00:00
|
|
|
}
|
2022-06-07 08:22:29 +00:00
|
|
|
if (!$identical->left instanceof ConstFetch) {
|
2021-02-21 09:32:45 +00:00
|
|
|
return null;
|
|
|
|
}
|
2022-06-07 08:22:29 +00:00
|
|
|
return new ArrayDimFetchAndConstFetch($identical->right, $identical->left);
|
2020-08-05 20:45:36 +00:00
|
|
|
}
|
2022-06-07 08:22:29 +00:00
|
|
|
private function createIsTConstTypeMethodCall(ArrayDimFetch $arrayDimFetch, ConstFetch $constFetch) : MethodCall
|
2020-06-02 07:28:51 +00:00
|
|
|
{
|
2022-06-07 08:22:29 +00:00
|
|
|
return new MethodCall($arrayDimFetch->var, 'is', [new Arg($constFetch)]);
|
2020-06-02 07:28:51 +00:00
|
|
|
}
|
2022-06-07 08:22:29 +00:00
|
|
|
private function shouldSkipNodeRemovalForPartOfIf(FuncCall $funcCall) : bool
|
2020-06-02 07:28:51 +00:00
|
|
|
{
|
2022-06-07 08:22:29 +00:00
|
|
|
$parentNode = $funcCall->getAttribute(AttributeKey::PARENT_NODE);
|
2020-06-02 07:28:51 +00:00
|
|
|
// cannot remove x from if(x)
|
2022-06-07 08:22:29 +00:00
|
|
|
if ($parentNode instanceof If_ && $parentNode->cond === $funcCall) {
|
2021-05-09 20:15:43 +00:00
|
|
|
return \true;
|
2020-06-02 07:28:51 +00:00
|
|
|
}
|
2022-06-07 08:22:29 +00:00
|
|
|
if ($parentNode instanceof BooleanNot) {
|
|
|
|
$parentParentNode = $parentNode->getAttribute(AttributeKey::PARENT_NODE);
|
|
|
|
if ($parentParentNode instanceof If_) {
|
2020-06-02 07:28:51 +00:00
|
|
|
$parentParentNode->cond = $parentNode;
|
2021-05-09 20:15:43 +00:00
|
|
|
return \true;
|
2020-06-02 07:28:51 +00:00
|
|
|
}
|
|
|
|
}
|
2021-05-09 20:15:43 +00:00
|
|
|
return \false;
|
2020-06-02 07:28:51 +00:00
|
|
|
}
|
2021-06-18 17:31:16 +00:00
|
|
|
/**
|
|
|
|
* @return \PhpParser\Node\Expr\BinaryOp\Identical|\PhpParser\Node\Expr\FuncCall
|
|
|
|
*/
|
2022-06-07 08:22:29 +00:00
|
|
|
private function matchParentNodeInCaseOfIdenticalTrue(FuncCall $funcCall)
|
2020-06-02 07:28:51 +00:00
|
|
|
{
|
2022-06-07 08:22:29 +00:00
|
|
|
$parentNode = $funcCall->getAttribute(AttributeKey::PARENT_NODE);
|
|
|
|
if ($parentNode instanceof Identical) {
|
2021-05-09 20:15:43 +00:00
|
|
|
$isRightValueTrue = $this->valueResolver->isValue($parentNode->right, \true);
|
2021-01-30 23:20:05 +00:00
|
|
|
if ($parentNode->left === $funcCall && $isRightValueTrue) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return $parentNode;
|
|
|
|
}
|
2021-05-09 20:15:43 +00:00
|
|
|
$isLeftValueTrue = $this->valueResolver->isValue($parentNode->left, \true);
|
2021-01-30 23:20:05 +00:00
|
|
|
if ($parentNode->right === $funcCall && $isLeftValueTrue) {
|
2020-06-02 07:28:51 +00:00
|
|
|
return $parentNode;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return $funcCall;
|
|
|
|
}
|
|
|
|
}
|