Skip to content

Commit

Permalink
[PhpParser] Reduce AstResolver complexity by move check fileName is n…
Browse files Browse the repository at this point in the history
…ull to parseFileNameToDecoratedNodes() (#5138)
  • Loading branch information
samsonasik committed Oct 7, 2023
1 parent b29a6f8 commit d320ac7
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 95 deletions.
62 changes: 30 additions & 32 deletions src/PhpParser/AstResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
use PHPStan\Reflection\Php\PhpPropertyReflection;
use PHPStan\Reflection\ReflectionProvider;
use PHPStan\Type\TypeWithClassName;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\Reflection\MethodReflectionResolver;
use Rector\Core\ValueObject\MethodName;
use Rector\NodeNameResolver\NodeNameResolver;
Expand Down Expand Up @@ -57,8 +58,8 @@ public function __construct(
private readonly NodeNameResolver $nodeNameResolver,
private readonly ReflectionProvider $reflectionProvider,
private readonly NodeTypeResolver $nodeTypeResolver,
private readonly ClassLikeAstResolver $classLikeAstResolver,
private readonly MethodReflectionResolver $methodReflectionResolver
private readonly MethodReflectionResolver $methodReflectionResolver,
private readonly BetterNodeFinder $betterNodeFinder,
) {
}

Expand All @@ -80,16 +81,7 @@ public function resolveClassMethodFromMethodReflection(MethodReflection $methodR
$classReflection = $methodReflection->getDeclaringClass();
$fileName = $classReflection->getFileName();

// probably native PHP method → un-parseable
if ($fileName === null) {
return null;
}

$nodes = $this->parseFileNameToDecoratedNodes($fileName);
if ($nodes === []) {
return null;
}

$classLikeName = $classReflection->getName();
$methodName = $methodReflection->getName();

Expand Down Expand Up @@ -133,14 +125,7 @@ public function resolveClassMethodOrFunctionFromCall(
public function resolveFunctionFromFunctionReflection(FunctionReflection $functionReflection): ?Function_
{
$fileName = $functionReflection->getFileName();
if ($fileName === null) {
return null;
}

$nodes = $this->parseFileNameToDecoratedNodes($fileName);
if ($nodes === []) {
return null;
}

$functionName = $functionReflection->getName();
$functionNode = null;
Expand Down Expand Up @@ -205,7 +190,27 @@ public function resolveClassMethodFromCall(MethodCall | StaticCall $call): ?Clas
public function resolveClassFromClassReflection(
ClassReflection $classReflection
): Trait_ | Class_ | Interface_ | Enum_ | null {
return $this->classLikeAstResolver->resolveClassFromClassReflection($classReflection, $this);
if ($classReflection->isBuiltin()) {
return null;
}

$fileName = $classReflection->getFileName();
$stmts = $this->parseFileNameToDecoratedNodes($fileName);
$className = $classReflection->getName();

/** @var Class_|Trait_|Interface_|Enum_|null $classLike */
$classLike = $this->betterNodeFinder->findFirst(
$stmts,
function (Node $node) use ($className): bool {
if (! $node instanceof ClassLike) {
return false;
}

return $this->nodeNameResolver->isName($node, $className);
}
);

return $classLike;
}

/**
Expand All @@ -218,15 +223,7 @@ public function parseClassReflectionTraits(ClassReflection $classReflection): ar
$traits = [];
foreach ($classLikes as $classLike) {
$fileName = $classLike->getFileName();
if ($fileName === null) {
continue;
}

$nodes = $this->parseFileNameToDecoratedNodes($fileName);
if ($nodes === []) {
continue;
}

$traitName = $classLike->getName();

$traitNode = null;
Expand Down Expand Up @@ -262,10 +259,6 @@ public function resolvePropertyFromPropertyReflection(
$classReflection = $phpPropertyReflection->getDeclaringClass();

$fileName = $classReflection->getFileName();
if ($fileName === null) {
return null;
}

$nodes = $this->parseFileNameToDecoratedNodes($fileName);
if ($nodes === []) {
return null;
Expand Down Expand Up @@ -309,8 +302,13 @@ function (Node $node) use ($desiredClassName, $desiredPropertyName, &$propertyNo
/**
* @return Stmt[]
*/
public function parseFileNameToDecoratedNodes(string $fileName): array
public function parseFileNameToDecoratedNodes(?string $fileName): array
{
// probably native PHP → un-parseable
if ($fileName === null) {
return [];
}

if (isset($this->parsedFileNodes[$fileName])) {
return $this->parsedFileNodes[$fileName];
}
Expand Down
63 changes: 0 additions & 63 deletions src/PhpParser/ClassLikeAstResolver.php

This file was deleted.

0 comments on commit d320ac7

Please sign in to comment.