@@ -848,8 +848,7 @@ private function parseArrayShape(TokenIterator $tokens, Ast\Type\TypeNode $type,
848
848
849
849
$ items = [];
850
850
$ sealed = true ;
851
- $ extraKeyType = null ;
852
- $ extraValueType = null ;
851
+ $ unsealedType = null ;
853
852
854
853
do {
855
854
$ tokens ->tryConsumeTokenType (Lexer::TOKEN_PHPDOC_EOL );
@@ -862,23 +861,12 @@ private function parseArrayShape(TokenIterator $tokens, Ast\Type\TypeNode $type,
862
861
$ sealed = false ;
863
862
864
863
$ tokens ->tryConsumeTokenType (Lexer::TOKEN_PHPDOC_EOL );
865
- if ($ tokens ->tryConsumeTokenType (Lexer::TOKEN_OPEN_ANGLE_BRACKET )) {
866
- $ tokens ->tryConsumeTokenType (Lexer::TOKEN_PHPDOC_EOL );
867
-
868
- $ extraValueType = $ this ->parse ($ tokens );
869
- $ tokens ->tryConsumeTokenType (Lexer::TOKEN_PHPDOC_EOL );
870
-
864
+ if ($ tokens ->isCurrentTokenType (Lexer::TOKEN_OPEN_ANGLE_BRACKET )) {
871
865
if ($ kind === Ast \Type \ArrayShapeNode::KIND_ARRAY ) {
872
- if ($ tokens ->tryConsumeTokenType (Lexer::TOKEN_COMMA )) {
873
- $ tokens ->tryConsumeTokenType (Lexer::TOKEN_PHPDOC_EOL );
874
-
875
- $ extraKeyType = $ extraValueType ;
876
- $ extraValueType = $ this ->parse ($ tokens );
877
- $ tokens ->tryConsumeTokenType (Lexer::TOKEN_PHPDOC_EOL );
878
- }
866
+ $ unsealedType = $ this ->parseArrayShapeUnsealedType ($ tokens );
867
+ } else {
868
+ $ unsealedType = $ this ->parseListShapeUnsealedType ($ tokens );
879
869
}
880
-
881
- $ tokens ->consumeTokenType (Lexer::TOKEN_CLOSE_ANGLE_BRACKET );
882
870
$ tokens ->tryConsumeTokenType (Lexer::TOKEN_PHPDOC_EOL );
883
871
}
884
872
@@ -894,7 +882,7 @@ private function parseArrayShape(TokenIterator $tokens, Ast\Type\TypeNode $type,
894
882
$ tokens ->tryConsumeTokenType (Lexer::TOKEN_PHPDOC_EOL );
895
883
$ tokens ->consumeTokenType (Lexer::TOKEN_CLOSE_CURLY_BRACKET );
896
884
897
- return new Ast \Type \ArrayShapeNode ($ items , $ sealed , $ kind , $ extraKeyType , $ extraValueType );
885
+ return new Ast \Type \ArrayShapeNode ($ items , $ sealed , $ kind , $ unsealedType );
898
886
}
899
887
900
888
@@ -973,6 +961,63 @@ private function parseArrayShapeKey(TokenIterator $tokens)
973
961
);
974
962
}
975
963
964
+ /**
965
+ * @phpstan-impure
966
+ */
967
+ private function parseArrayShapeUnsealedType (TokenIterator $ tokens ): Ast \Type \ArrayShapeUnsealedTypeNode
968
+ {
969
+ $ startLine = $ tokens ->currentTokenLine ();
970
+ $ startIndex = $ tokens ->currentTokenIndex ();
971
+
972
+ $ tokens ->consumeTokenType (Lexer::TOKEN_OPEN_ANGLE_BRACKET );
973
+ $ tokens ->tryConsumeTokenType (Lexer::TOKEN_PHPDOC_EOL );
974
+
975
+ $ valueType = $ this ->parse ($ tokens );
976
+ $ tokens ->tryConsumeTokenType (Lexer::TOKEN_PHPDOC_EOL );
977
+
978
+ $ keyType = null ;
979
+ if ($ tokens ->tryConsumeTokenType (Lexer::TOKEN_COMMA )) {
980
+ $ tokens ->tryConsumeTokenType (Lexer::TOKEN_PHPDOC_EOL );
981
+
982
+ $ keyType = $ valueType ;
983
+ $ valueType = $ this ->parse ($ tokens );
984
+ $ tokens ->tryConsumeTokenType (Lexer::TOKEN_PHPDOC_EOL );
985
+ }
986
+
987
+ $ tokens ->consumeTokenType (Lexer::TOKEN_CLOSE_ANGLE_BRACKET );
988
+
989
+ return $ this ->enrichWithAttributes (
990
+ $ tokens ,
991
+ new Ast \Type \ArrayShapeUnsealedTypeNode ($ valueType , $ keyType ),
992
+ $ startLine ,
993
+ $ startIndex
994
+ );
995
+ }
996
+
997
+ /**
998
+ * @phpstan-impure
999
+ */
1000
+ private function parseListShapeUnsealedType (TokenIterator $ tokens ): Ast \Type \ArrayShapeUnsealedTypeNode
1001
+ {
1002
+ $ startLine = $ tokens ->currentTokenLine ();
1003
+ $ startIndex = $ tokens ->currentTokenIndex ();
1004
+
1005
+ $ tokens ->consumeTokenType (Lexer::TOKEN_OPEN_ANGLE_BRACKET );
1006
+ $ tokens ->tryConsumeTokenType (Lexer::TOKEN_PHPDOC_EOL );
1007
+
1008
+ $ valueType = $ this ->parse ($ tokens );
1009
+ $ tokens ->tryConsumeTokenType (Lexer::TOKEN_PHPDOC_EOL );
1010
+
1011
+ $ tokens ->consumeTokenType (Lexer::TOKEN_CLOSE_ANGLE_BRACKET );
1012
+
1013
+ return $ this ->enrichWithAttributes (
1014
+ $ tokens ,
1015
+ new Ast \Type \ArrayShapeUnsealedTypeNode ($ valueType , null ),
1016
+ $ startLine ,
1017
+ $ startIndex
1018
+ );
1019
+ }
1020
+
976
1021
/**
977
1022
* @phpstan-impure
978
1023
*/
0 commit comments