> */ private const BREAK_NODES = [FunctionLike::class, ClassMethod::class]; /** * @var array> */ private const LOOP_NODES = [For_::class, Foreach_::class, While_::class, Do_::class, Switch_::class]; /** * @var BetterNodeFinder */ private $betterNodeFinder; public function __construct(BetterNodeFinder $betterNodeFinder) { $this->betterNodeFinder = $betterNodeFinder; } public function isInLoop(Node $node): bool { $stopNodes = array_merge(self::LOOP_NODES, self::BREAK_NODES); $firstParent = $this->betterNodeFinder->findParentTypes($node, $stopNodes); if (! $firstParent instanceof Node) { return false; } return StaticInstanceOf::isOneOf($firstParent, self::LOOP_NODES); } public function isInIf(Node $node): bool { $breakNodes = array_merge([If_::class], self::BREAK_NODES); $previousNode = $this->betterNodeFinder->findParentTypes($node, $breakNodes); if (! $previousNode instanceof Node) { return false; } return $previousNode instanceof If_; } }