From e3fd8759028ae1c42904c9c9574c58aba2b0758a Mon Sep 17 00:00:00 2001 From: sji Date: Thu, 2 Sep 2021 13:24:33 +0900 Subject: [PATCH] support list type --- src/PhpDocTypeReader.php | 10 ++++++++++ src/Type/ListType.php | 24 ++++++++++++++++++++++++ tests/PhpDocTypeReaderTest.php | 15 +++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 src/Type/ListType.php diff --git a/src/PhpDocTypeReader.php b/src/PhpDocTypeReader.php index a86f91d..35e11ff 100644 --- a/src/PhpDocTypeReader.php +++ b/src/PhpDocTypeReader.php @@ -21,6 +21,7 @@ use PhpDocTypeReader\Type\FloatType; use PhpDocTypeReader\Type\GenericType; use PhpDocTypeReader\Type\IntType; +use PhpDocTypeReader\Type\ListType; use PhpDocTypeReader\Type\MixedType; use PhpDocTypeReader\Type\NullType; use PhpDocTypeReader\Type\ObjectType; @@ -120,6 +121,8 @@ private function getTypeFromNodeType(TypeNode $type_node, IdentifierContext $ide return new NullType(); case 'array': return new ArrayType(new MixedType()); + case 'list': + return new ListType(new MixedType()); default: return new ObjectType( $this->tryGetClassNameFromIdentifier($type_node, $identifier_context) @@ -127,6 +130,13 @@ private function getTypeFromNodeType(TypeNode $type_node, IdentifierContext $ide } } if ($type_node instanceof GenericTypeNode) { + if ($type_node->type->name === 'list') { + if (count($type_node->genericTypes) !== 1) { + throw new \LogicException('unsupported parameter types of list type'); + } + $type = $this->getTypeFromNodeType($type_node->genericTypes[0], $identifier_context); + return new ListType($type); + } if ($type_node->type->name === 'array') { if (count($type_node->genericTypes) === 1) { $type = $this->getTypeFromNodeType($type_node->genericTypes[0], $identifier_context); diff --git a/src/Type/ListType.php b/src/Type/ListType.php new file mode 100644 index 0000000..6322818 --- /dev/null +++ b/src/Type/ListType.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace PhpDocTypeReader\Type; + +class ListType extends ArrayType +{ + public function __construct(Type $value_type) + { + $this->key_type = new IntType(); + $this->value_type = $value_type; + $this->parameter_types = [$value_type, $this->key_type]; + } +} diff --git a/tests/PhpDocTypeReaderTest.php b/tests/PhpDocTypeReaderTest.php index 8df804e..394115b 100644 --- a/tests/PhpDocTypeReaderTest.php +++ b/tests/PhpDocTypeReaderTest.php @@ -22,6 +22,7 @@ use PhpDocTypeReader\Type\FloatType; use PhpDocTypeReader\Type\GenericType; use PhpDocTypeReader\Type\IntType; +use PhpDocTypeReader\Type\ListType; use PhpDocTypeReader\Type\MixedType; use PhpDocTypeReader\Type\NullType; use PhpDocTypeReader\Type\ObjectType; @@ -262,6 +263,20 @@ public function paramProvider() '/** @param int[] $array_var */', $default_identifier_context, ], + [ + [ + 'list_var' => new ListType(new IntType()), + ], + '/** @param list $list_var */', + $default_identifier_context, + ], + [ + [ + 'untyped_list_var' => new ListType(new MixedType()), + ], + '/** @param list $untyped_list_var */', + $default_identifier_context, + ], [ [ 'union_var' => new UnionType([new IntType(), new StringType()]),