Skip to content

Commit b10b694

Browse files
authored
Merge 0e32eec into 024c4a3
2 parents 024c4a3 + 0e32eec commit b10b694

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed

src/PhpDocTypeReader.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,21 @@
1414
namespace PhpDocTypeReader;
1515

1616
use PhpDocTypeReader\Context\IdentifierContext;
17+
use PhpDocTypeReader\Type\ArrayType;
18+
use PhpDocTypeReader\Type\AtomicType;
1719
use PhpDocTypeReader\Type\BoolType;
1820
use PhpDocTypeReader\Type\FloatType;
1921
use PhpDocTypeReader\Type\GenericType;
2022
use PhpDocTypeReader\Type\IntType;
2123
use PhpDocTypeReader\Type\ObjectType;
2224
use PhpDocTypeReader\Type\StringType;
2325
use PhpDocTypeReader\Type\Type;
26+
use PhpDocTypeReader\Type\UnionType;
27+
use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode;
2428
use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode;
2529
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
2630
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
31+
use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode;
2732
use PHPStan\PhpDocParser\Lexer\Lexer;
2833
use PHPStan\PhpDocParser\Parser\ConstExprParser;
2934
use PHPStan\PhpDocParser\Parser\PhpDocParser;
@@ -111,6 +116,16 @@ private function getTypeFromNodeType(TypeNode $type_node, IdentifierContext $ide
111116
}
112117
}
113118
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+
114129
return new GenericType(
115130
new ObjectType($this->tryGetClassNameFromIdentifier($type_node->type, $identifier_context)),
116131
array_map(
@@ -119,11 +134,33 @@ private function getTypeFromNodeType(TypeNode $type_node, IdentifierContext $ide
119134
)
120135
);
121136
}
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+
}
122157
/** @psalm-suppress ForbiddenCode */
123158
var_dump($type_node);
124159
throw new \LogicException('unsupported type');
125160
}
126161

162+
163+
127164
private function tryGetClassNameFromIdentifier(
128165
IdentifierTypeNode $type,
129166
IdentifierContext $identifier_context

tests/PhpDocTypeReaderTest.php

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@
1717
use PhpDocTypeReader\Context\RawIdentifierContext;
1818
use PhpDocTypeReader\ExampleTypes\ExampleGenericType;
1919
use PhpDocTypeReader\ExampleTypes\ExampleType;
20+
use PhpDocTypeReader\Type\ArrayType;
2021
use PhpDocTypeReader\Type\BoolType;
2122
use PhpDocTypeReader\Type\FloatType;
2223
use PhpDocTypeReader\Type\GenericType;
2324
use PhpDocTypeReader\Type\IntType;
2425
use PhpDocTypeReader\Type\ObjectType;
2526
use PhpDocTypeReader\Type\StringType;
27+
use PhpDocTypeReader\Type\UnionType;
2628
use PHPUnit\Framework\TestCase;
2729

2830
class PhpDocTypeReaderTest extends TestCase
@@ -195,7 +197,28 @@ public function paramProvider()
195197
new RawIdentifierContext(
196198
'PhpDocTypeReader\\ExampleTypes',
197199
[]
198-
)
200+
),
201+
],
202+
[
203+
[
204+
'array_var' => new ArrayType(new IntType(), []),
205+
],
206+
'/** @param array<int> $array_var */',
207+
$default_identifier_context,
208+
],
209+
[
210+
[
211+
'array_var' => new ArrayType(new IntType(), []),
212+
],
213+
'/** @param int[] $array_var */',
214+
$default_identifier_context,
215+
],
216+
[
217+
[
218+
'union_var' => new UnionType([new IntType(), new StringType()]),
219+
],
220+
'/** @param int|string $union_var */',
221+
$default_identifier_context,
199222
],
200223
];
201224
}

0 commit comments

Comments
 (0)