Skip to content

Commit e437c5a

Browse files
committed
Adjust a bunch of places for first-class callables and nullsafe operators
1 parent b05cb5e commit e437c5a

17 files changed

+54
-17
lines changed

src/Dependency/DependencyResolver.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@
1414
use PHPStan\DependencyInjection\AutowiredService;
1515
use PHPStan\File\FileHelper;
1616
use PHPStan\Node\ClassPropertyNode;
17+
use PHPStan\Node\FunctionCallableNode;
1718
use PHPStan\Node\InClassMethodNode;
1819
use PHPStan\Node\InClassNode;
1920
use PHPStan\Node\InFunctionNode;
2021
use PHPStan\Node\InPropertyHookNode;
22+
use PHPStan\Node\InstantiationCallableNode;
23+
use PHPStan\Node\MethodCallableNode;
24+
use PHPStan\Node\StaticMethodCallableNode;
2125
use PHPStan\Reflection\ClassReflection;
2226
use PHPStan\Reflection\ExtendedParameterReflection;
2327
use PHPStan\Reflection\ExtendedParametersAcceptor;
@@ -470,6 +474,22 @@ public function resolveDependencies(Node $node, Scope $scope): NodeDependencies
470474
}
471475
}
472476
}
477+
} elseif ($node instanceof StaticMethodCallableNode) {
478+
foreach ($this->resolveDependencies(new Node\Expr\StaticCall($node->getClass(), $node->getName()), $scope)->getReflections() as $dependency) {
479+
$dependenciesReflections[] = $dependency;
480+
}
481+
} elseif ($node instanceof MethodCallableNode) {
482+
foreach ($this->resolveDependencies(new Node\Expr\MethodCall($node->getVar(), $node->getName()), $scope)->getReflections() as $dependency) {
483+
$dependenciesReflections[] = $dependency;
484+
}
485+
} elseif ($node instanceof FunctionCallableNode) {
486+
foreach ($this->resolveDependencies(new Node\Expr\FuncCall($node->getName()), $scope)->getReflections() as $dependency) {
487+
$dependenciesReflections[] = $dependency;
488+
}
489+
} elseif ($node instanceof InstantiationCallableNode) {
490+
foreach ($this->resolveDependencies(new Node\Expr\New_($node->getClass()), $scope)->getReflections() as $dependency) {
491+
$dependenciesReflections[] = $dependency;
492+
}
473493
}
474494

475495
return new NodeDependencies($this->fileHelper, $dependenciesReflections, $this->exportedNodeResolver->resolve($scope->getFile(), $node));

src/Dependency/NodeDependencies.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,14 @@ public function __construct(
2121
{
2222
}
2323

24+
/**
25+
* @return array<int, ClassReflection|FunctionReflection>
26+
*/
27+
public function getReflections(): array
28+
{
29+
return $this->reflections;
30+
}
31+
2432
/**
2533
* @param array<string, true> $analysedFiles
2634
* @return string[]

src/Parser/ArrayFilterArgVisitor.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ final class ArrayFilterArgVisitor extends NodeVisitorAbstract
1616
#[Override]
1717
public function enterNode(Node $node): ?Node
1818
{
19-
if ($node instanceof Node\Expr\FuncCall && $node->name instanceof Node\Name) {
19+
if ($node instanceof Node\Expr\FuncCall && $node->name instanceof Node\Name && !$node->isFirstClassCallable()) {
2020
$functionName = $node->name->toLowerString();
2121
if ($functionName === 'array_filter') {
22-
$args = $node->getRawArgs();
22+
$args = $node->getArgs();
2323
if (isset($args[0])) {
2424
$args[0]->setAttribute(self::ATTRIBUTE_NAME, true);
2525
}

src/Parser/ArrayFindArgVisitor.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ final class ArrayFindArgVisitor extends NodeVisitorAbstract
1717
#[Override]
1818
public function enterNode(Node $node): ?Node
1919
{
20-
if ($node instanceof Node\Expr\FuncCall && $node->name instanceof Node\Name) {
20+
if ($node instanceof Node\Expr\FuncCall && $node->name instanceof Node\Name && !$node->isFirstClassCallable()) {
2121
$functionName = $node->name->toLowerString();
2222
if (in_array($functionName, ['array_all', 'array_any', 'array_find', 'array_find_key'], true)) {
23-
$args = $node->getRawArgs();
23+
$args = $node->getArgs();
2424
if (isset($args[0])) {
2525
$args[0]->setAttribute(self::ATTRIBUTE_NAME, true);
2626
}

src/Parser/ArrayWalkArgVisitor.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ final class ArrayWalkArgVisitor extends NodeVisitorAbstract
1616
#[Override]
1717
public function enterNode(Node $node): ?Node
1818
{
19-
if ($node instanceof Node\Expr\FuncCall && $node->name instanceof Node\Name) {
19+
if ($node instanceof Node\Expr\FuncCall && $node->name instanceof Node\Name && !$node->isFirstClassCallable()) {
2020
$functionName = $node->name->toLowerString();
2121
if ($functionName === 'array_walk') {
22-
$args = $node->getRawArgs();
22+
$args = $node->getArgs();
2323
if (isset($args[0])) {
2424
$args[0]->setAttribute(self::ATTRIBUTE_NAME, true);
2525
}

src/Parser/CurlSetOptArgVisitor.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ final class CurlSetOptArgVisitor extends NodeVisitorAbstract
1616
#[Override]
1717
public function enterNode(Node $node): ?Node
1818
{
19-
if ($node instanceof Node\Expr\FuncCall && $node->name instanceof Node\Name) {
19+
if ($node instanceof Node\Expr\FuncCall && $node->name instanceof Node\Name && !$node->isFirstClassCallable()) {
2020
$functionName = $node->name->toLowerString();
2121
if ($functionName === 'curl_setopt') {
2222
$args = $node->getRawArgs();

src/Parser/ImmediatelyInvokedClosureVisitor.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ final class ImmediatelyInvokedClosureVisitor extends NodeVisitorAbstract
1616
#[Override]
1717
public function enterNode(Node $node): ?Node
1818
{
19-
if ($node instanceof Node\Expr\FuncCall && $node->name instanceof Node\Expr\Closure) {
19+
if ($node instanceof Node\Expr\FuncCall && $node->name instanceof Node\Expr\Closure && !$node->isFirstClassCallable()) {
2020
$node->name->setAttribute(self::ATTRIBUTE_NAME, true);
2121
}
2222

src/Parser/ImplodeArgVisitor.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ final class ImplodeArgVisitor extends NodeVisitorAbstract
1717
#[Override]
1818
public function enterNode(Node $node): ?Node
1919
{
20-
if ($node instanceof Node\Expr\FuncCall && $node->name instanceof Node\Name) {
20+
if ($node instanceof Node\Expr\FuncCall && $node->name instanceof Node\Name && !$node->isFirstClassCallable()) {
2121
$functionName = $node->name->toLowerString();
2222
if (in_array($functionName, ['implode', 'join'], true)) {
2323
$args = $node->getRawArgs();

src/Parser/VariadicFunctionsVisitor.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public function enterNode(Node $node): ?Node
5757
if (
5858
$this->inFunction !== null
5959
&& $node instanceof Node\Expr\FuncCall
60+
&& !$node->isFirstClassCallable()
6061
&& $node->name instanceof Name
6162
&& in_array((string) $node->name, ParametersAcceptor::VARIADIC_FUNCTIONS, true)
6263
&& !array_key_exists($this->inFunction, $this->variadicFunctions)

src/Reflection/BetterReflection/SourceLocator/CachingVisitor.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public function enterNode(Node $node): ?int
8585
return NodeVisitor::DONT_TRAVERSE_CHILDREN;
8686
}
8787

88-
if ($node instanceof Node\Expr\FuncCall) {
88+
if ($node instanceof Node\Expr\FuncCall && !$node->isFirstClassCallable()) {
8989
try {
9090
ConstantNodeChecker::assertValidDefineFunctionCall($node);
9191
} catch (InvalidConstantNode) {

0 commit comments

Comments
 (0)