Skip to content

Commit 9a02775

Browse files
committed
Remove FunctionCallStatementFinder
1 parent da0aac6 commit 9a02775

File tree

6 files changed

+68
-82
lines changed

6 files changed

+68
-82
lines changed

conf/config.neon

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -644,9 +644,6 @@ services:
644644
tags:
645645
- phpstan.diagnoseExtension
646646

647-
-
648-
class: PHPStan\Parser\FunctionCallStatementFinder
649-
650647
-
651648
class: PHPStan\Process\CpuCoreCounter
652649

src/Parser/FunctionCallStatementFinder.php

Lines changed: 0 additions & 47 deletions
This file was deleted.

src/Parser/VariadicFunctionsVisitor.php

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
namespace PHPStan\Parser;
44

55
use PhpParser\Node;
6+
use PhpParser\Node\Name;
67
use PhpParser\NodeVisitorAbstract;
78
use PHPStan\Reflection\ParametersAcceptor;
89
use PHPStan\TrinaryLogic;
910
use function array_key_exists;
11+
use function in_array;
1012

1113
final class VariadicFunctionsVisitor extends NodeVisitorAbstract
1214
{
@@ -15,22 +17,19 @@ final class VariadicFunctionsVisitor extends NodeVisitorAbstract
1517

1618
private ?string $inNamespace = null;
1719

20+
private ?string $inFunction = null;
21+
1822
/** @var array<string, TrinaryLogic> */
1923
private array $variadicFunctions = [];
2024

2125
public const ATTRIBUTE_NAME = 'variadicFunctions';
2226

23-
public function __construct(
24-
private FunctionCallStatementFinder $functionCallStatementFinder,
25-
)
26-
{
27-
}
28-
2927
public function beforeTraverse(array $nodes): ?array
3028
{
3129
$this->topNode = null;
3230
$this->variadicFunctions = [];
3331
$this->inNamespace = null;
32+
$this->inFunction = null;
3433

3534
return null;
3635
}
@@ -46,14 +45,32 @@ public function enterNode(Node $node): ?Node
4645
}
4746

4847
if ($node instanceof Node\Stmt\Function_) {
49-
$functionName = $this->inNamespace !== null ? $this->inNamespace . '\\' . $node->name->name : $node->name->name;
50-
51-
if (!array_key_exists($functionName, $this->variadicFunctions)) {
52-
$this->variadicFunctions[$functionName] = TrinaryLogic::createMaybe();
48+
$this->inFunction = $this->inNamespace !== null ? $this->inNamespace . '\\' . $node->name->name : $node->name->name;
49+
50+
foreach ($node->params as $parameter) {
51+
if (!$parameter->variadic) {
52+
continue;
53+
}
54+
55+
if (!array_key_exists($this->inFunction, $this->variadicFunctions)) {
56+
$this->variadicFunctions[$this->inFunction] = TrinaryLogic::createYes();
57+
} else {
58+
$this->variadicFunctions[$this->inFunction]->and(TrinaryLogic::createYes());
59+
}
5360
}
61+
}
5462

55-
$isVariadic = $this->functionCallStatementFinder->findFunctionCallInStatements(ParametersAcceptor::VARIADIC_FUNCTIONS, $node->getStmts()) !== null;
56-
$this->variadicFunctions[$functionName] = $this->variadicFunctions[$functionName]->and(TrinaryLogic::createFromBoolean($isVariadic));
63+
if (
64+
$this->inFunction !== null
65+
&& $node instanceof Node\Expr\FuncCall
66+
&& $node->name instanceof Name
67+
&& in_array((string) $node->name, ParametersAcceptor::VARIADIC_FUNCTIONS, true)
68+
) {
69+
if (!array_key_exists($this->inFunction, $this->variadicFunctions)) {
70+
$this->variadicFunctions[$this->inFunction] = TrinaryLogic::createYes();
71+
} else {
72+
$this->variadicFunctions[$this->inFunction]->and(TrinaryLogic::createYes());
73+
}
5774
}
5875

5976
return null;
@@ -65,6 +82,11 @@ public function leaveNode(Node $node): ?Node
6582
$this->inNamespace = null;
6683
}
6784

85+
if ($node instanceof Node\Stmt\Function_ && $this->inFunction !== null) {
86+
$this->variadicFunctions[$this->inFunction] ??= TrinaryLogic::createNo();
87+
$this->inFunction = null;
88+
}
89+
6890
return null;
6991
}
7092

src/Parser/VariadicMethodsVisitor.php

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,37 @@
33
namespace PHPStan\Parser;
44

55
use PhpParser\Node;
6+
use PhpParser\Node\Name;
67
use PhpParser\Node\Stmt\ClassMethod;
78
use PhpParser\NodeVisitorAbstract;
89
use PHPStan\Reflection\ParametersAcceptor;
10+
use PHPStan\TrinaryLogic;
911
use function array_key_exists;
12+
use function in_array;
1013

1114
final class VariadicMethodsVisitor extends NodeVisitorAbstract
1215
{
1316

1417
private ?Node $topNode = null;
1518

19+
private ?string $inNamespace = null;
20+
1621
private ?string $inClassLike = null;
1722

18-
private ?string $inNamespace = null;
23+
private ?string $inMethod = null;
1924

20-
/** @var array<string, list<string>> */
25+
/** @var array<string, array<string, TrinaryLogic>> */
2126
private array $variadicMethods = [];
2227

2328
public const ATTRIBUTE_NAME = 'variadicMethods';
2429

25-
public function __construct(
26-
private FunctionCallStatementFinder $functionCallStatementFinder,
27-
)
28-
{
29-
}
30-
3130
public function beforeTraverse(array $nodes): ?array
3231
{
3332
$this->topNode = null;
3433
$this->variadicMethods = [];
35-
$this->inClassLike = null;
3634
$this->inNamespace = null;
35+
$this->inClassLike = null;
36+
$this->inMethod = null;
3737

3838
return null;
3939
}
@@ -49,21 +49,30 @@ public function enterNode(Node $node): ?Node
4949
}
5050

5151
if ($node instanceof Node\Stmt\ClassLike && $node->name instanceof Node\Identifier) {
52-
$this->inClassLike = $node->name->name;
52+
$this->inClassLike = $this->inNamespace !== null ? $this->inNamespace . '\\' . $node->name->name : $node->name->name;
53+
$this->variadicMethods[$this->inClassLike] ??= [];
5354
}
5455

5556
if ($this->inClassLike !== null && $node instanceof ClassMethod) {
5657
if ($node->getStmts() === null) {
5758
return null; // interface
5859
}
5960

60-
if ($this->functionCallStatementFinder->findFunctionCallInStatements(ParametersAcceptor::VARIADIC_FUNCTIONS, $node->getStmts()) !== null) {
61-
$className = $this->inNamespace !== null ? $this->inNamespace . '\\' . $this->inClassLike : $this->inClassLike;
62-
if (!array_key_exists($className, $this->variadicMethods)) {
63-
$this->variadicMethods[$className] = [];
64-
}
65-
$this->variadicMethods[$className][] = $node->name->name;
61+
$this->inMethod = $node->name->name;
62+
}
63+
64+
if (
65+
$this->inMethod !== null
66+
&& $node instanceof Node\Expr\FuncCall
67+
&& $node->name instanceof Name
68+
&& in_array((string) $node->name, ParametersAcceptor::VARIADIC_FUNCTIONS, true)
69+
) {
70+
if (!array_key_exists($this->inMethod, $this->variadicMethods[$this->inClassLike])) {
71+
$this->variadicMethods[$this->inClassLike][$this->inMethod] = TrinaryLogic::createYes();
72+
} else {
73+
$this->variadicMethods[$this->inClassLike][$this->inMethod]->and(TrinaryLogic::createYes());
6674
}
75+
6776
}
6877

6978
return null;
@@ -79,6 +88,11 @@ public function leaveNode(Node $node): ?Node
7988
$this->inClassLike = null;
8089
}
8190

91+
if ($node instanceof ClassMethod && $this->inClassLike !== null && $this->inMethod !== null) {
92+
$this->variadicMethods[$this->inClassLike][$this->inMethod] ??= TrinaryLogic::createNo();
93+
$this->inMethod = null;
94+
}
95+
8296
return null;
8397
}
8498

src/Reflection/Php/PhpMethodReflection.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,9 @@ private function isVariadic(): bool
256256
if (
257257
is_array($variadicMethods)
258258
&& array_key_exists($declaringClass->getName(), $variadicMethods)
259-
&& in_array($this->reflection->getName(), $variadicMethods[$declaringClass->getName()], true)
259+
&& array_key_exists($this->reflection->getName(), $variadicMethods[$declaringClass->getName()])
260260
) {
261-
return $this->containsVariadicCalls = true;
261+
return $this->containsVariadicCalls = !$variadicMethods[$declaringClass->getName()][$this->reflection->getName()]->no();
262262
}
263263
}
264264

tests/PHPStan/Parser/CleaningParserTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ public function testParse(
6868
new SimpleParser(
6969
new Php7(new Emulative()),
7070
new NameResolver(),
71-
new VariadicMethodsVisitor(new FunctionCallStatementFinder()),
72-
new VariadicFunctionsVisitor(new FunctionCallStatementFinder()),
71+
new VariadicMethodsVisitor(),
72+
new VariadicFunctionsVisitor(),
7373
),
7474
new PhpVersion($phpVersionId),
7575
);

0 commit comments

Comments
 (0)