%PDF- %PDF-
Direktori : /home/vacivi36/vacivitta.com.br/vendor/rector/rector/src/PhpParser/Comparing/ |
Current File : /home/vacivi36/vacivitta.com.br/vendor/rector/rector/src/PhpParser/Comparing/ConditionSearcher.php |
<?php declare (strict_types=1); namespace Rector\Core\PhpParser\Comparing; use PhpParser\Node; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Else_; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\If_; use Rector\Core\PhpParser\Node\BetterNodeFinder; final class ConditionSearcher { /** * @readonly * @var \Rector\Core\PhpParser\Node\BetterNodeFinder */ private $betterNodeFinder; /** * @readonly * @var \Rector\Core\PhpParser\Comparing\NodeComparator */ private $nodeComparator; public function __construct(\Rector\Core\PhpParser\Node\BetterNodeFinder $betterNodeFinder, \Rector\Core\PhpParser\Comparing\NodeComparator $nodeComparator) { $this->betterNodeFinder = $betterNodeFinder; $this->nodeComparator = $nodeComparator; } public function hasIfAndElseForVariableRedeclaration(\PhpParser\Node\Expr\Assign $assign, \PhpParser\Node\Stmt\If_ $if) : bool { $elseNode = $if->else; if (!$elseNode instanceof \PhpParser\Node\Stmt\Else_) { return \false; } /** @var Variable $varNode */ $varNode = $assign->var; if (!$this->hasVariableRedeclaration($varNode, $if->stmts)) { return \false; } foreach ($if->elseifs as $elseifNode) { if (!$this->hasVariableRedeclaration($varNode, $elseifNode->stmts)) { return \false; } } $isInCond = (bool) $this->betterNodeFinder->findFirst($if->cond, function (\PhpParser\Node $subNode) use($varNode) : bool { return $this->nodeComparator->areNodesEqual($varNode, $subNode); }); if ($isInCond) { return \false; } return $this->hasVariableRedeclaration($varNode, $elseNode->stmts); } /** * @param Stmt[] $stmts */ private function hasVariableRedeclaration(\PhpParser\Node\Expr\Variable $variable, array $stmts) : bool { foreach ($stmts as $stmt) { if ($this->hasVariableUsedInExpression($variable, $stmt)) { return \false; } if ($this->hasVariableDeclaration($variable, $stmt)) { return \true; } } return \false; } private function hasVariableUsedInExpression(\PhpParser\Node\Expr\Variable $variable, \PhpParser\Node\Stmt $stmt) : bool { if ($stmt instanceof \PhpParser\Node\Stmt\Expression) { $node = $stmt->expr instanceof \PhpParser\Node\Expr\Assign ? $stmt->expr->expr : $stmt->expr; } else { $node = $stmt; } return (bool) $this->betterNodeFinder->findFirst($node, function (\PhpParser\Node $subNode) use($variable) : bool { return $this->nodeComparator->areNodesEqual($variable, $subNode); }); } private function hasVariableDeclaration(\PhpParser\Node\Expr\Variable $variable, \PhpParser\Node\Stmt $stmt) : bool { if (!$stmt instanceof \PhpParser\Node\Stmt\Expression) { return \false; } if (!$stmt->expr instanceof \PhpParser\Node\Expr\Assign) { return \false; } $assignVar = $stmt->expr->var; if (!$assignVar instanceof \PhpParser\Node\Expr\Variable) { return \false; } if ($variable->name !== $assignVar->name) { return \false; } return \true; } }