Skip to content

Commit

Permalink
Merge f41fa3a into a93c2d9
Browse files Browse the repository at this point in the history
  • Loading branch information
sj-i committed Aug 26, 2021
2 parents a93c2d9 + f41fa3a commit 9f404d2
Show file tree
Hide file tree
Showing 6 changed files with 81 additions and 15 deletions.
25 changes: 15 additions & 10 deletions src/PhpDocTypeReader.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
namespace PhpDocTypeReader;

use PhpDocTypeReader\Context\IdentifierContext;
use PhpDocTypeReader\Type\ArrayKeyType;
use PhpDocTypeReader\Type\ArrayType;
use PhpDocTypeReader\Type\AtomicType;
use PhpDocTypeReader\Type\BoolType;
Expand Down Expand Up @@ -105,6 +106,8 @@ private function getTypeFromNodeType(TypeNode $type_node, IdentifierContext $ide
switch ($type_node->name) {
case 'mixed':
return new MixedType();
case 'array-key':
return new ArrayKeyType();
case 'int':
return new IntType();
case 'string':
Expand All @@ -123,13 +126,18 @@ 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');
if (count($type_node->genericTypes) === 1) {
$type = $this->getTypeFromNodeType($type_node->genericTypes[0], $identifier_context);
return new ArrayType($type);
} elseif (count($type_node->genericTypes) === 2) {
$key_type = $this->getTypeFromNodeType($type_node->genericTypes[0], $identifier_context);
$value_type = $this->getTypeFromNodeType($type_node->genericTypes[1], $identifier_context);
if (!($key_type instanceof ArrayKeyType)) {
throw new \LogicException('unsupported array key type');
}
return new ArrayType($value_type, $key_type);
}

return new ArrayType($type, []);
throw new \LogicException('unsupported parameter types of array');
}

return new GenericType(
Expand All @@ -142,10 +150,7 @@ 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, []);
return new ArrayType($type);
}
if ($type_node instanceof UnionTypeNode) {
$types = [];
Expand Down
18 changes: 18 additions & 0 deletions src/Type/ArrayKeyType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

/**
* This file is part of the sj-i/phpdoc-type-reader package.
*
* (c) sji <sji@sj-i.dev>
*
* 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 ArrayKeyType extends ScalarType
{
}
17 changes: 16 additions & 1 deletion src/Type/ArrayType.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,22 @@

namespace PhpDocTypeReader\Type;

class ArrayType extends GenericType
class ArrayType extends AtomicType
{
/** @var Type[] */
public array $parameter_types;

public ArrayKeyType $key_type;

public Type $value_type;

public function __construct(Type $value_type, ?ArrayKeyType $key_type = null)
{
if (is_null($key_type)) {
$key_type = new ArrayKeyType();
}
$this->key_type = $key_type;
$this->value_type = $value_type;
$this->parameter_types = [$value_type, $key_type];
}
}
2 changes: 1 addition & 1 deletion src/Type/IntType.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

namespace PhpDocTypeReader\Type;

class IntType extends ScalarType
class IntType extends ArrayKeyType
{

}
2 changes: 1 addition & 1 deletion src/Type/StringType.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

namespace PhpDocTypeReader\Type;

class StringType extends ScalarType
class StringType extends ArrayKeyType
{

}
32 changes: 30 additions & 2 deletions tests/PhpDocTypeReaderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -215,14 +215,42 @@ public function paramProvider()
],
[
[
'array_var' => new ArrayType(new IntType(), []),
'array_var' => new ArrayType(new IntType()),
],
'/** @param array<int> $array_var */',
$default_identifier_context,
],
[
[
'array_var' => new ArrayType(new IntType(), []),
'mixed_array_var' => new ArrayType(new MixedType()),
],
'/** @param array<mixed> $mixed_array_var */',
$default_identifier_context,
],
[
[
'int_key_array_var' => new ArrayType(new MixedType(), new IntType()),
],
'/** @param array<int, mixed> $int_key_array_var */',
$default_identifier_context,
],
[
[
'string_key_array_var' => new ArrayType(new MixedType(), new StringType()),
],
'/** @param array<string, mixed> $string_key_array_var */',
$default_identifier_context,
],
[
[
'array_key_array_var' => new ArrayType(new MixedType()),
],
'/** @param array<array-key, mixed> $array_key_array_var */',
$default_identifier_context,
],
[
[
'array_var' => new ArrayType(new IntType()),
],
'/** @param int[] $array_var */',
$default_identifier_context,
Expand Down

0 comments on commit 9f404d2

Please sign in to comment.