mirror of
https://github.com/rectorphp/rector.git
synced 2025-02-21 01:41:00 +01:00
63 lines
1.6 KiB
PHP
63 lines
1.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Rector\NodeNestingScope;
|
|
|
|
use PhpParser\Node;
|
|
use PhpParser\Node\Expr\BinaryOp;
|
|
use PhpParser\Node\FunctionLike;
|
|
use PhpParser\Node\Stmt\Expression;
|
|
use Rector\NodeTypeResolver\Node\AttributeKey;
|
|
|
|
final class FlowOfControlLocator
|
|
{
|
|
public function resolveNestingHashFromFunctionLike(FunctionLike $functionLike, Node $checkedNode): string
|
|
{
|
|
$nestingHash = spl_object_hash($functionLike) . '__';
|
|
|
|
$currentNode = $checkedNode;
|
|
$previous = $currentNode;
|
|
while ($currentNode = $currentNode->getAttribute(AttributeKey::PARENT_NODE)) {
|
|
if ($currentNode instanceof Expression) {
|
|
continue;
|
|
}
|
|
|
|
if (! $currentNode instanceof Node) {
|
|
continue;
|
|
}
|
|
|
|
if ($functionLike === $currentNode) {
|
|
// to high
|
|
break;
|
|
}
|
|
|
|
$nestingHash .= $this->resolveBinaryOpNestingHash($currentNode, $previous);
|
|
|
|
$nestingHash .= spl_object_hash($currentNode);
|
|
|
|
$previous = $currentNode;
|
|
}
|
|
|
|
return $nestingHash;
|
|
}
|
|
|
|
private function resolveBinaryOpNestingHash(Node $currentNode, Node $previous): string
|
|
{
|
|
if (! $currentNode instanceof BinaryOp) {
|
|
return '';
|
|
}
|
|
|
|
// left && right have differnt nesting
|
|
if ($currentNode->left === $previous) {
|
|
return 'binary_left__';
|
|
}
|
|
|
|
if ($currentNode->right === $previous) {
|
|
return 'binary_right__';
|
|
}
|
|
|
|
return '';
|
|
}
|
|
}
|