nodeNameResolver = $nodeNameResolver; $this->binaryOpManipulator = $binaryOpManipulator; } public function processBooleanOr(BooleanOr $booleanOr, string $type, string $newMethodName): ?FuncCall { $twoNodeMatch = $this->binaryOpManipulator->matchFirstAndSecondConditionNode( $booleanOr, Instanceof_::class, FuncCall::class ); if ($twoNodeMatch === null) { return null; } /** @var Instanceof_ $instanceOf */ $instanceOf = $twoNodeMatch->getFirstExpr(); /** @var FuncCall $funcCall */ $funcCall = $twoNodeMatch->getSecondExpr(); $instanceOfClass = $instanceOf->class; if ($instanceOfClass instanceof Expr) { return null; } if ((string) $instanceOfClass !== $type) { return null; } if (! $this->nodeNameResolver->isName($funcCall, 'is_array')) { return null; } // both use same var if (! $funcCall->args[0]->value instanceof Variable) { return null; } /** @var Variable $firstVarNode */ $firstVarNode = $funcCall->args[0]->value; if (! $instanceOf->expr instanceof Variable) { return null; } /** @var Variable $secondVarNode */ $secondVarNode = $instanceOf->expr; // are they same variables if ($firstVarNode->name !== $secondVarNode->name) { return null; } return new FuncCall(new Name($newMethodName), [new Arg($firstVarNode)]); } }