|  | 
| 15 | 15 | 
 | 
| 16 | 16 | use ArrayIterator; | 
| 17 | 17 | use InvalidArgumentException; | 
|  | 18 | +use phpDocumentor\Reflection\PseudoTypes\CallableString; | 
|  | 19 | +use phpDocumentor\Reflection\PseudoTypes\False_; | 
|  | 20 | +use phpDocumentor\Reflection\PseudoTypes\HtmlEscapedString; | 
| 18 | 21 | use phpDocumentor\Reflection\PseudoTypes\IntegerRange; | 
| 19 | 22 | use phpDocumentor\Reflection\PseudoTypes\List_; | 
|  | 23 | +use phpDocumentor\Reflection\PseudoTypes\LiteralString; | 
|  | 24 | +use phpDocumentor\Reflection\PseudoTypes\LowercaseString; | 
|  | 25 | +use phpDocumentor\Reflection\PseudoTypes\NegativeInteger; | 
|  | 26 | +use phpDocumentor\Reflection\PseudoTypes\NonEmptyLowercaseString; | 
|  | 27 | +use phpDocumentor\Reflection\PseudoTypes\NonEmptyString; | 
|  | 28 | +use phpDocumentor\Reflection\PseudoTypes\Numeric_; | 
|  | 29 | +use phpDocumentor\Reflection\PseudoTypes\NumericString; | 
|  | 30 | +use phpDocumentor\Reflection\PseudoTypes\PositiveInteger; | 
|  | 31 | +use phpDocumentor\Reflection\PseudoTypes\TraitString; | 
|  | 32 | +use phpDocumentor\Reflection\PseudoTypes\True_; | 
| 20 | 33 | use phpDocumentor\Reflection\Types\Array_; | 
| 21 | 34 | use phpDocumentor\Reflection\Types\ArrayKey; | 
|  | 35 | +use phpDocumentor\Reflection\Types\Boolean; | 
|  | 36 | +use phpDocumentor\Reflection\Types\Callable_; | 
| 22 | 37 | use phpDocumentor\Reflection\Types\ClassString; | 
| 23 | 38 | use phpDocumentor\Reflection\Types\Collection; | 
| 24 | 39 | use phpDocumentor\Reflection\Types\Compound; | 
| 25 | 40 | use phpDocumentor\Reflection\Types\Context; | 
| 26 | 41 | use phpDocumentor\Reflection\Types\Expression; | 
|  | 42 | +use phpDocumentor\Reflection\Types\Float_; | 
| 27 | 43 | use phpDocumentor\Reflection\Types\Integer; | 
| 28 | 44 | use phpDocumentor\Reflection\Types\InterfaceString; | 
| 29 | 45 | use phpDocumentor\Reflection\Types\Intersection; | 
| 30 | 46 | use phpDocumentor\Reflection\Types\Iterable_; | 
|  | 47 | +use phpDocumentor\Reflection\Types\Mixed_; | 
|  | 48 | +use phpDocumentor\Reflection\Types\Never_; | 
|  | 49 | +use phpDocumentor\Reflection\Types\Null_; | 
| 31 | 50 | use phpDocumentor\Reflection\Types\Nullable; | 
| 32 | 51 | use phpDocumentor\Reflection\Types\Object_; | 
|  | 52 | +use phpDocumentor\Reflection\Types\Parent_; | 
|  | 53 | +use phpDocumentor\Reflection\Types\Resource_; | 
|  | 54 | +use phpDocumentor\Reflection\Types\Scalar; | 
|  | 55 | +use phpDocumentor\Reflection\Types\Self_; | 
|  | 56 | +use phpDocumentor\Reflection\Types\Static_; | 
| 33 | 57 | use phpDocumentor\Reflection\Types\String_; | 
|  | 58 | +use phpDocumentor\Reflection\Types\This; | 
|  | 59 | +use phpDocumentor\Reflection\Types\Void_; | 
| 34 | 60 | use RuntimeException; | 
| 35 | 61 | 
 | 
| 36 | 62 | use function array_key_exists; | 
|  | 63 | +use function array_key_last; | 
| 37 | 64 | use function array_pop; | 
| 38 | 65 | use function array_values; | 
| 39 | 66 | use function class_exists; | 
| 40 | 67 | use function class_implements; | 
| 41 | 68 | use function count; | 
| 42 | 69 | use function current; | 
| 43 |  | -use function end; | 
| 44 | 70 | use function in_array; | 
| 45 | 71 | use function is_numeric; | 
| 46 |  | -use function key; | 
| 47 | 72 | use function preg_split; | 
| 48 | 73 | use function strpos; | 
| 49 | 74 | use function strtolower; | 
| @@ -76,54 +101,51 @@ final class TypeResolver | 
| 76 | 101 |      * @var array<string, string> List of recognized keywords and unto which Value Object they map | 
| 77 | 102 |      * @psalm-var array<string, class-string<Type>> | 
| 78 | 103 |      */ | 
| 79 |  | -    private $keywords = [ | 
| 80 |  | -        'string' => Types\String_::class, | 
| 81 |  | -        'class-string' => Types\ClassString::class, | 
| 82 |  | -        'interface-string' => Types\InterfaceString::class, | 
| 83 |  | -        'html-escaped-string' => PseudoTypes\HtmlEscapedString::class, | 
| 84 |  | -        'lowercase-string' => PseudoTypes\LowercaseString::class, | 
| 85 |  | -        'non-empty-lowercase-string' => PseudoTypes\NonEmptyLowercaseString::class, | 
| 86 |  | -        'non-empty-string' => PseudoTypes\NonEmptyString::class, | 
| 87 |  | -        'numeric-string' => PseudoTypes\NumericString::class, | 
| 88 |  | -        'numeric' => PseudoTypes\Numeric_::class, | 
| 89 |  | -        'trait-string' => PseudoTypes\TraitString::class, | 
| 90 |  | -        'int' => Types\Integer::class, | 
| 91 |  | -        'integer' => Types\Integer::class, | 
| 92 |  | -        'positive-int' => PseudoTypes\PositiveInteger::class, | 
| 93 |  | -        'negative-int' => PseudoTypes\NegativeInteger::class, | 
| 94 |  | -        'bool' => Types\Boolean::class, | 
| 95 |  | -        'boolean' => Types\Boolean::class, | 
| 96 |  | -        'real' => Types\Float_::class, | 
| 97 |  | -        'float' => Types\Float_::class, | 
| 98 |  | -        'double' => Types\Float_::class, | 
| 99 |  | -        'object' => Types\Object_::class, | 
| 100 |  | -        'mixed' => Types\Mixed_::class, | 
| 101 |  | -        'array' => Types\Array_::class, | 
| 102 |  | -        'array-key' => Types\ArrayKey::class, | 
| 103 |  | -        'resource' => Types\Resource_::class, | 
| 104 |  | -        'void' => Types\Void_::class, | 
| 105 |  | -        'null' => Types\Null_::class, | 
| 106 |  | -        'scalar' => Types\Scalar::class, | 
| 107 |  | -        'callback' => Types\Callable_::class, | 
| 108 |  | -        'callable' => Types\Callable_::class, | 
| 109 |  | -        'callable-string' => PseudoTypes\CallableString::class, | 
| 110 |  | -        'false' => PseudoTypes\False_::class, | 
| 111 |  | -        'true' => PseudoTypes\True_::class, | 
| 112 |  | -        'literal-string' => PseudoTypes\LiteralString::class, | 
| 113 |  | -        'self' => Types\Self_::class, | 
| 114 |  | -        '$this' => Types\This::class, | 
| 115 |  | -        'static' => Types\Static_::class, | 
| 116 |  | -        'parent' => Types\Parent_::class, | 
| 117 |  | -        'iterable' => Types\Iterable_::class, | 
| 118 |  | -        'never' => Types\Never_::class, | 
| 119 |  | -        'list' => PseudoTypes\List_::class, | 
|  | 104 | +    private array $keywords = [ | 
|  | 105 | +        'string' => String_::class, | 
|  | 106 | +        'class-string' => ClassString::class, | 
|  | 107 | +        'interface-string' => InterfaceString::class, | 
|  | 108 | +        'html-escaped-string' => HtmlEscapedString::class, | 
|  | 109 | +        'lowercase-string' => LowercaseString::class, | 
|  | 110 | +        'non-empty-lowercase-string' => NonEmptyLowercaseString::class, | 
|  | 111 | +        'non-empty-string' => NonEmptyString::class, | 
|  | 112 | +        'numeric-string' => NumericString::class, | 
|  | 113 | +        'numeric' => Numeric_::class, | 
|  | 114 | +        'trait-string' => TraitString::class, | 
|  | 115 | +        'int' => Integer::class, | 
|  | 116 | +        'integer' => Integer::class, | 
|  | 117 | +        'positive-int' => PositiveInteger::class, | 
|  | 118 | +        'negative-int' => NegativeInteger::class, | 
|  | 119 | +        'bool' => Boolean::class, | 
|  | 120 | +        'boolean' => Boolean::class, | 
|  | 121 | +        'real' => Float_::class, | 
|  | 122 | +        'float' => Float_::class, | 
|  | 123 | +        'double' => Float_::class, | 
|  | 124 | +        'object' => Object_::class, | 
|  | 125 | +        'mixed' => Mixed_::class, | 
|  | 126 | +        'array' => Array_::class, | 
|  | 127 | +        'array-key' => ArrayKey::class, | 
|  | 128 | +        'resource' => Resource_::class, | 
|  | 129 | +        'void' => Void_::class, | 
|  | 130 | +        'null' => Null_::class, | 
|  | 131 | +        'scalar' => Scalar::class, | 
|  | 132 | +        'callback' => Callable_::class, | 
|  | 133 | +        'callable' => Callable_::class, | 
|  | 134 | +        'callable-string' => CallableString::class, | 
|  | 135 | +        'false' => False_::class, | 
|  | 136 | +        'true' => True_::class, | 
|  | 137 | +        'literal-string' => LiteralString::class, | 
|  | 138 | +        'self' => Self_::class, | 
|  | 139 | +        '$this' => This::class, | 
|  | 140 | +        'static' => Static_::class, | 
|  | 141 | +        'parent' => Parent_::class, | 
|  | 142 | +        'iterable' => Iterable_::class, | 
|  | 143 | +        'never' => Never_::class, | 
|  | 144 | +        'list' => List_::class, | 
| 120 | 145 |     ]; | 
| 121 | 146 | 
 | 
| 122 |  | -    /** | 
| 123 |  | -     * @var FqsenResolver | 
| 124 |  | -     * @psalm-readonly | 
| 125 |  | -     */ | 
| 126 |  | -    private $fqsenResolver; | 
|  | 147 | +    /** @psalm-readonly */ | 
|  | 148 | +    private FqsenResolver $fqsenResolver; | 
| 127 | 149 | 
 | 
| 128 | 150 |     /** | 
| 129 | 151 |      * Initializes this TypeResolver with the means to create and resolve Fqsen objects. | 
| @@ -280,8 +302,7 @@ private function parseTypes(ArrayIterator $tokens, Context $context, int $parser | 
| 280 | 302 |             ) { | 
| 281 | 303 |                 break; | 
| 282 | 304 |             } elseif ($token === self::OPERATOR_ARRAY) { | 
| 283 |  | -                end($types); | 
| 284 |  | -                $last = key($types); | 
|  | 305 | +                $last = array_key_last($types); | 
| 285 | 306 |                 if ($last === null) { | 
| 286 | 307 |                     throw new InvalidArgumentException('Unexpected array operator'); | 
| 287 | 308 |                 } | 
|  | 
0 commit comments