Skip to content

Commit

Permalink
Merge pull request #1 from a-nakano/add-support-type-union-and-array
Browse files Browse the repository at this point in the history
Add support for arrays and unions
  • Loading branch information
sj-i committed May 17, 2021
2 parents 024c4a3 + 49f86fb commit 54c77af
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 1 deletion.
37 changes: 37 additions & 0 deletions src/PhpDocTypeReader.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,21 @@
namespace PhpDocTypeReader;

use PhpDocTypeReader\Context\IdentifierContext;
use PhpDocTypeReader\Type\ArrayType;
use PhpDocTypeReader\Type\AtomicType;
use PhpDocTypeReader\Type\BoolType;
use PhpDocTypeReader\Type\FloatType;
use PhpDocTypeReader\Type\GenericType;
use PhpDocTypeReader\Type\IntType;
use PhpDocTypeReader\Type\ObjectType;
use PhpDocTypeReader\Type\StringType;
use PhpDocTypeReader\Type\Type;
use PhpDocTypeReader\Type\UnionType;
use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode;
use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode;
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode;
use PHPStan\PhpDocParser\Lexer\Lexer;
use PHPStan\PhpDocParser\Parser\ConstExprParser;
use PHPStan\PhpDocParser\Parser\PhpDocParser;
Expand Down Expand Up @@ -111,6 +116,16 @@ private function getTypeFromNodeType(TypeNode $type_node, IdentifierContext $ide
}
}
if ($type_node instanceof GenericTypeNode) {
if ($type_node->type->name === 'array') {
// Only one atomic type argument is allowed for now
$type = $this->getTypeFromNodeType($type_node->genericTypes[0], $identifier_context);
if (!($type instanceof AtomicType)) {
throw new \LogicException('unsupported array type parameter');
}

return new ArrayType($type, []);
}

return new GenericType(
new ObjectType($this->tryGetClassNameFromIdentifier($type_node->type, $identifier_context)),
array_map(
Expand All @@ -119,11 +134,33 @@ private function getTypeFromNodeType(TypeNode $type_node, IdentifierContext $ide
)
);
}
if ($type_node instanceof ArrayTypeNode) {
$type = $this->getTypeFromNodeType($type_node->type, $identifier_context);
if (!($type instanceof AtomicType)) {
throw new \LogicException('unsupported array type');
}
return new ArrayType($type, []);
}
if ($type_node instanceof UnionTypeNode) {
$types = [];
foreach ($type_node->types as $type) {
$type = $this->getTypeFromNodeType($type, $identifier_context);
if (!($type instanceof AtomicType)) {
throw new \LogicException('unsupported union type');
}

$types[] = $type;
}

return new UnionType($types);
}
/** @psalm-suppress ForbiddenCode */
var_dump($type_node);
throw new \LogicException('unsupported type');
}



private function tryGetClassNameFromIdentifier(
IdentifierTypeNode $type,
IdentifierContext $identifier_context
Expand Down
25 changes: 24 additions & 1 deletion tests/PhpDocTypeReaderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,14 @@
use PhpDocTypeReader\Context\RawIdentifierContext;
use PhpDocTypeReader\ExampleTypes\ExampleGenericType;
use PhpDocTypeReader\ExampleTypes\ExampleType;
use PhpDocTypeReader\Type\ArrayType;
use PhpDocTypeReader\Type\BoolType;
use PhpDocTypeReader\Type\FloatType;
use PhpDocTypeReader\Type\GenericType;
use PhpDocTypeReader\Type\IntType;
use PhpDocTypeReader\Type\ObjectType;
use PhpDocTypeReader\Type\StringType;
use PhpDocTypeReader\Type\UnionType;
use PHPUnit\Framework\TestCase;

class PhpDocTypeReaderTest extends TestCase
Expand Down Expand Up @@ -195,7 +197,28 @@ public function paramProvider()
new RawIdentifierContext(
'PhpDocTypeReader\\ExampleTypes',
[]
)
),
],
[
[
'array_var' => new ArrayType(new IntType(), []),
],
'/** @param array<int> $array_var */',
$default_identifier_context,
],
[
[
'array_var' => new ArrayType(new IntType(), []),
],
'/** @param int[] $array_var */',
$default_identifier_context,
],
[
[
'union_var' => new UnionType([new IntType(), new StringType()]),
],
'/** @param int|string $union_var */',
$default_identifier_context,
],
];
}
Expand Down

0 comments on commit 54c77af

Please sign in to comment.