Skip to content

Commit 7978df2

Browse files
committed
Add support for strict arrays and list shapes
1 parent 066f9d0 commit 7978df2

File tree

2 files changed

+57
-2
lines changed

2 files changed

+57
-2
lines changed

Diff for: src/Parser/TypeParser.php

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use LogicException;
66
use PHPStan\PhpDocParser\Ast;
77
use PHPStan\PhpDocParser\Lexer\Lexer;
8+
use function in_array;
89
use function strpos;
910
use function trim;
1011

@@ -123,7 +124,7 @@ private function parseAtomic(TokenIterator $tokens): Ast\Type\TypeNode
123124
} elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
124125
$type = $this->tryParseArrayOrOffsetAccess($tokens, $type);
125126

126-
} elseif ($type->name === 'array' && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) {
127+
} elseif (in_array($type->name, ['array', 'list', 'strict-array', 'strict-list'], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) {
127128
$type = $this->parseArrayShape($tokens, $type);
128129

129130
if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
@@ -409,7 +410,7 @@ private function parseCallableReturnType(TokenIterator $tokens): Ast\Type\TypeNo
409410
if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) {
410411
$type = $this->parseGeneric($tokens, $type);
411412

412-
} elseif ($type->name === 'array' && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) {
413+
} elseif (in_array($type->name, ['array', 'list', 'strict-array', 'strict-list'], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) {
413414
$type = $this->parseArrayShape($tokens, $type);
414415
}
415416
}

Diff for: tests/PHPStan/Parser/TypeParserTest.php

+54
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,60 @@ public function provideParseData(): array
592592
),
593593
]),
594594
],
595+
[
596+
'strict-array{
597+
a: int,
598+
b: string
599+
}',
600+
new ArrayShapeNode([
601+
new ArrayShapeItemNode(
602+
new IdentifierTypeNode('a'),
603+
false,
604+
new IdentifierTypeNode('int')
605+
),
606+
new ArrayShapeItemNode(
607+
new IdentifierTypeNode('b'),
608+
false,
609+
new IdentifierTypeNode('string')
610+
),
611+
]),
612+
],
613+
[
614+
'strict-list{
615+
int,
616+
string
617+
}',
618+
new ArrayShapeNode([
619+
new ArrayShapeItemNode(
620+
null,
621+
false,
622+
new IdentifierTypeNode('int')
623+
),
624+
new ArrayShapeItemNode(
625+
null,
626+
false,
627+
new IdentifierTypeNode('string')
628+
),
629+
]),
630+
],
631+
[
632+
'list{
633+
int,
634+
string
635+
}',
636+
new ArrayShapeNode([
637+
new ArrayShapeItemNode(
638+
null,
639+
false,
640+
new IdentifierTypeNode('int')
641+
),
642+
new ArrayShapeItemNode(
643+
null,
644+
false,
645+
new IdentifierTypeNode('string')
646+
),
647+
]),
648+
],
595649
[
596650
'callable(): Foo',
597651
new CallableTypeNode(

0 commit comments

Comments
 (0)