Skip to content

Commit 82a311f

Browse files
committedOct 13, 2024
Support for non-empty-array and non-empty-list array shape kind
1 parent 6ca22b1 commit 82a311f

File tree

3 files changed

+98
-2
lines changed

3 files changed

+98
-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
@@ -180,7 +180,13 @@ private function parseAtomic(TokenIterator $tokens): Ast\Type\TypeNode
180180
} elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
181181
$type = $this->tryParseArrayOrOffsetAccess($tokens, $type);
182182

183-
} elseif (in_array($type->name, ['array', 'list', 'object'], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) {
183+
} elseif (in_array($type->name, [
184+
Ast\Type\ArrayShapeNode::KIND_ARRAY,
185+
Ast\Type\ArrayShapeNode::KIND_LIST,
186+
Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_ARRAY,
187+
Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_LIST,
188+
'object',
189+
], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) {
184190
if ($type->name === 'object') {
185191
$type = $this->parseObjectShape($tokens);
186192
} else {
@@ -690,7 +696,13 @@ private function parseCallableReturnType(TokenIterator $tokens): Ast\Type\TypeNo
690696
$startIndex
691697
));
692698

693-
} elseif (in_array($type->name, ['array', 'list', 'object'], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) {
699+
} elseif (in_array($type->name, [
700+
Ast\Type\ArrayShapeNode::KIND_ARRAY,
701+
Ast\Type\ArrayShapeNode::KIND_LIST,
702+
Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_ARRAY,
703+
Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_LIST,
704+
'object',
705+
], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) {
694706
if ($type->name === 'object') {
695707
$type = $this->parseObjectShape($tokens);
696708
} else {

‎tests/PHPStan/Parser/TypeParserTest.php

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

0 commit comments

Comments
 (0)
Failed to load comments.