Skip to content

Commit 687c50d

Browse files
committed
unique index for same-line anonymous classes
1 parent c3cdb0b commit 687c50d

File tree

3 files changed

+20
-12
lines changed

3 files changed

+20
-12
lines changed

src/Parser/VariadicMethodsVisitor.php

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use function array_pop;
1313
use function implode;
1414
use function in_array;
15+
use function sprintf;
1516

1617
final class VariadicMethodsVisitor extends NodeVisitorAbstract
1718
{
@@ -30,6 +31,8 @@ final class VariadicMethodsVisitor extends NodeVisitorAbstract
3031
/** @var array<string, array<string, TrinaryLogic>> */
3132
private array $variadicMethods = [];
3233

34+
private int $anonymousClassIndex = 0;
35+
3336
public const ATTRIBUTE_NAME = 'variadicMethods';
3437

3538
public function beforeTraverse(array $nodes): ?array
@@ -40,6 +43,7 @@ public function beforeTraverse(array $nodes): ?array
4043
$this->classStack = [];
4144
$this->inClassLike = null;
4245
$this->inMethod = null;
46+
$this->anonymousClassIndex = 0;
4347

4448
return null;
4549
}
@@ -54,12 +58,9 @@ public function enterNode(Node $node): ?Node
5458
$this->inNamespace = $node->name->toString();
5559
}
5660

57-
if (
58-
$node instanceof Node\Stmt\Class_
59-
|| $node instanceof Node\Stmt\ClassLike
60-
) {
61+
if ($node instanceof Node\Stmt\ClassLike) {
6162
if (!$node->name instanceof Node\Identifier) {
62-
$className = 'class@anonymous:' . $node->getStartLine();
63+
$className = sprintf('class@anonymous:%s:%s', $node->getStartLine(), ++$this->anonymousClassIndex);
6364
} else {
6465
$className = $node->name->name;
6566
}
@@ -101,10 +102,7 @@ public function leaveNode(Node $node): ?Node
101102
$this->inMethod = null;
102103
}
103104

104-
if (
105-
$node instanceof Node\Stmt\Class_
106-
|| $node instanceof Node\Stmt\ClassLike
107-
) {
105+
if ($node instanceof Node\Stmt\ClassLike) {
108106
array_pop($this->classStack);
109107

110108
if ($this->classStack !== []) {

tests/PHPStan/Parser/ParserTest.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,20 @@ public function dataVariadicCallLikes(): iterable
3939
'variadic_fnZ' => TrinaryLogic::createNo(), // variadicness later on detected via reflection
4040
'implicit_variadic_fnZ' => TrinaryLogic::createYes(),
4141
],
42-
'VariadicMethod\Z\class@anonymous:20' => [
42+
'VariadicMethod\Z\class@anonymous:20:1' => [
4343
'non_variadic_fn_subZ' => TrinaryLogic::createNo(),
4444
'variadic_fn_subZ' => TrinaryLogic::createNo(), // variadicness later on detected via reflection
4545
'implicit_variadic_subZ' => TrinaryLogic::createYes(),
4646
],
47-
'VariadicMethod\class@anonymous:42' => [
47+
'VariadicMethod\class@anonymous:42:2' => [
4848
'non_variadic_fn' => TrinaryLogic::createNo(),
4949
'variadic_fn' => TrinaryLogic::createNo(), // variadicness later on detected via reflection
5050
'implicit_variadic_fn' => TrinaryLogic::createYes(),
5151
],
52+
'VariadicMethod\class@anonymous:54:3' => [
53+
'implicit_variadic_fn' => TrinaryLogic::createYes(),
54+
],
55+
'VariadicMethod\class@anonymous:54:4' => [],
5256
],
5357
];
5458

@@ -72,7 +76,7 @@ public function dataVariadicCallLikes(): iterable
7276
*/
7377
public function testSimpleParserVariadicCallLikes(string $file, string $attributeName, array $expectedVariadics): void
7478
{
75-
/** @var RichParser $parser */
79+
/** @var SimpleParser $parser */
7680
$parser = self::getContainer()->getService('currentPhpVersionSimpleParser');
7781
$ast = $parser->parseFile($file);
7882
$variadics = $ast[0]->getAttribute($attributeName);

tests/PHPStan/Parser/data/variadic-methods.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,9 @@ function implicit_variadic_fn() {
5050
$args = func_get_args();
5151
}
5252
};
53+
54+
$c = new class (new class {}) {
55+
function implicit_variadic_fn() {
56+
$args = func_get_args();
57+
}
58+
};

0 commit comments

Comments
 (0)