14
14
namespace PhpDocTypeReader ;
15
15
16
16
use PhpDocTypeReader \Context \IdentifierContext ;
17
+ use PhpDocTypeReader \Type \ArrayType ;
18
+ use PhpDocTypeReader \Type \AtomicType ;
17
19
use PhpDocTypeReader \Type \BoolType ;
18
20
use PhpDocTypeReader \Type \FloatType ;
19
21
use PhpDocTypeReader \Type \GenericType ;
20
22
use PhpDocTypeReader \Type \IntType ;
21
23
use PhpDocTypeReader \Type \ObjectType ;
22
24
use PhpDocTypeReader \Type \StringType ;
23
25
use PhpDocTypeReader \Type \Type ;
26
+ use PhpDocTypeReader \Type \UnionType ;
27
+ use PHPStan \PhpDocParser \Ast \Type \ArrayTypeNode ;
24
28
use PHPStan \PhpDocParser \Ast \Type \GenericTypeNode ;
25
29
use PHPStan \PhpDocParser \Ast \Type \IdentifierTypeNode ;
26
30
use PHPStan \PhpDocParser \Ast \Type \TypeNode ;
31
+ use PHPStan \PhpDocParser \Ast \Type \UnionTypeNode ;
27
32
use PHPStan \PhpDocParser \Lexer \Lexer ;
28
33
use PHPStan \PhpDocParser \Parser \ConstExprParser ;
29
34
use PHPStan \PhpDocParser \Parser \PhpDocParser ;
@@ -111,6 +116,16 @@ private function getTypeFromNodeType(TypeNode $type_node, IdentifierContext $ide
111
116
}
112
117
}
113
118
if ($ type_node instanceof GenericTypeNode) {
119
+ if ($ type_node ->type ->name === 'array ' ) {
120
+ // とりあえず一つだけ
121
+ $ type = $ this ->getTypeFromNodeType ($ type_node ->genericTypes [0 ], $ identifier_context );
122
+ if (!($ type instanceof AtomicType)) {
123
+ throw new \LogicException ('unsupported array type parameter ' );
124
+ }
125
+
126
+ return new ArrayType ($ type , []);
127
+ }
128
+
114
129
return new GenericType (
115
130
new ObjectType ($ this ->tryGetClassNameFromIdentifier ($ type_node ->type , $ identifier_context )),
116
131
array_map (
@@ -119,11 +134,33 @@ private function getTypeFromNodeType(TypeNode $type_node, IdentifierContext $ide
119
134
)
120
135
);
121
136
}
137
+ if ($ type_node instanceof ArrayTypeNode) {
138
+ $ type = $ this ->getTypeFromNodeType ($ type_node ->type , $ identifier_context );
139
+ if (!($ type instanceof AtomicType)) {
140
+ throw new \LogicException ('unsupported array type ' );
141
+ }
142
+ return new ArrayType ($ type , []);
143
+ }
144
+ if ($ type_node instanceof UnionTypeNode) {
145
+ $ types = [];
146
+ foreach ($ type_node ->types as $ type ) {
147
+ $ type = $ this ->getTypeFromNodeType ($ type , $ identifier_context );
148
+ if (!($ type instanceof AtomicType)) {
149
+ throw new \LogicException ('unsupported union type ' );
150
+ }
151
+
152
+ $ types [] = $ type ;
153
+ }
154
+
155
+ return new UnionType ($ types );
156
+ }
122
157
/** @psalm-suppress ForbiddenCode */
123
158
var_dump ($ type_node );
124
159
throw new \LogicException ('unsupported type ' );
125
160
}
126
161
162
+
163
+
127
164
private function tryGetClassNameFromIdentifier (
128
165
IdentifierTypeNode $ type ,
129
166
IdentifierContext $ identifier_context
0 commit comments