Skip to content

Commit c00d78f

Browse files
committed
Merge remote-tracking branch 'origin/1.23.x' into 2.0.x
2 parents a131a15 + 82a311f commit c00d78f

File tree

3 files changed

+94
-2
lines changed

3 files changed

+94
-2
lines changed

src/Ast/Type/ArrayShapeNode.php

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ class ArrayShapeNode implements TypeNode
1010

1111
public const KIND_ARRAY = 'array';
1212
public const KIND_LIST = 'list';
13+
public const KIND_NON_EMPTY_ARRAY = 'non-empty-array';
14+
public const KIND_NON_EMPTY_LIST = 'non-empty-list';
1315

1416
use NodeAttributes;
1517

src/Parser/TypeParser.php

+14-2
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,13 @@ private function parseAtomic(TokenIterator $tokens): Ast\Type\TypeNode
166166
} elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
167167
$type = $this->tryParseArrayOrOffsetAccess($tokens, $type);
168168

169-
} elseif (in_array($type->name, ['array', 'list', 'object'], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) {
169+
} elseif (in_array($type->name, [
170+
Ast\Type\ArrayShapeNode::KIND_ARRAY,
171+
Ast\Type\ArrayShapeNode::KIND_LIST,
172+
Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_ARRAY,
173+
Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_LIST,
174+
'object',
175+
], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) {
170176
if ($type->name === 'object') {
171177
$type = $this->parseObjectShape($tokens);
172178
} else {
@@ -665,7 +671,13 @@ private function parseCallableReturnType(TokenIterator $tokens): Ast\Type\TypeNo
665671
$startIndex,
666672
));
667673

668-
} elseif (in_array($type->name, ['array', 'list', 'object'], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) {
674+
} elseif (in_array($type->name, [
675+
Ast\Type\ArrayShapeNode::KIND_ARRAY,
676+
Ast\Type\ArrayShapeNode::KIND_LIST,
677+
Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_ARRAY,
678+
Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_LIST,
679+
'object',
680+
], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) {
669681
if ($type->name === 'object') {
670682
$type = $this->parseObjectShape($tokens);
671683
} else {

tests/PHPStan/Parser/TypeParserTest.php

+78
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,84 @@ public function provideParseData(): array
767767
ArrayShapeNode::KIND_LIST,
768768
),
769769
],
770+
[
771+
'non-empty-array{
772+
int,
773+
string
774+
}',
775+
ArrayShapeNode::createSealed(
776+
[
777+
new ArrayShapeItemNode(
778+
null,
779+
false,
780+
new IdentifierTypeNode('int'),
781+
),
782+
new ArrayShapeItemNode(
783+
null,
784+
false,
785+
new IdentifierTypeNode('string'),
786+
),
787+
],
788+
ArrayShapeNode::KIND_NON_EMPTY_ARRAY,
789+
),
790+
],
791+
[
792+
'callable(): non-empty-array{int, string}',
793+
new CallableTypeNode(new IdentifierTypeNode('callable'), [], ArrayShapeNode::createSealed(
794+
[
795+
new ArrayShapeItemNode(
796+
null,
797+
false,
798+
new IdentifierTypeNode('int'),
799+
),
800+
new ArrayShapeItemNode(
801+
null,
802+
false,
803+
new IdentifierTypeNode('string'),
804+
),
805+
],
806+
ArrayShapeNode::KIND_NON_EMPTY_ARRAY,
807+
), []),
808+
],
809+
[
810+
'callable(): non-empty-list{int, string}',
811+
new CallableTypeNode(new IdentifierTypeNode('callable'), [], ArrayShapeNode::createSealed(
812+
[
813+
new ArrayShapeItemNode(
814+
null,
815+
false,
816+
new IdentifierTypeNode('int'),
817+
),
818+
new ArrayShapeItemNode(
819+
null,
820+
false,
821+
new IdentifierTypeNode('string'),
822+
),
823+
],
824+
ArrayShapeNode::KIND_NON_EMPTY_LIST,
825+
), []),
826+
],
827+
[
828+
'non-empty-list{
829+
int,
830+
string
831+
}',
832+
ArrayShapeNode::createSealed(
833+
[
834+
new ArrayShapeItemNode(
835+
null,
836+
false,
837+
new IdentifierTypeNode('int'),
838+
),
839+
new ArrayShapeItemNode(
840+
null,
841+
false,
842+
new IdentifierTypeNode('string'),
843+
),
844+
],
845+
ArrayShapeNode::KIND_NON_EMPTY_LIST,
846+
),
847+
],
770848
[
771849
'array{...<string>}',
772850
ArrayShapeNode::createUnsealed(

0 commit comments

Comments
 (0)