Skip to content

Commit

Permalink
Fix template, conditional array keys
Browse files Browse the repository at this point in the history
  • Loading branch information
danog committed Jan 18, 2024
1 parent 680c8cd commit 2354321
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 1 deletion.
9 changes: 8 additions & 1 deletion src/Psalm/Internal/Type/TypeParser.php
Original file line number Diff line number Diff line change
Expand Up @@ -672,8 +672,8 @@ private static function getTypeFromGenericTree(
// PHP 8 values with whitespace after number are counted as numeric
// and filter_var treats them as such too
if ($atomic_type instanceof TLiteralString
&& trim($atomic_type->value) === $atomic_type->value
&& ($string_to_int = filter_var($atomic_type->value, FILTER_VALIDATE_INT)) !== false
&& trim($atomic_type->value) === $atomic_type->value
) {
$builder = $generic_params[0]->getBuilder();
$builder->removeType($key);
Expand All @@ -688,7 +688,14 @@ private static function getTypeFromGenericTree(
|| $atomic_type instanceof TMixed
|| $atomic_type instanceof TNever
|| $atomic_type instanceof TTemplateParam
|| $atomic_type instanceof TTemplateIndexedAccess
|| $atomic_type instanceof TTemplateValueOf
|| $atomic_type instanceof TTemplateKeyOf
|| $atomic_type instanceof TTemplateParamClass
|| $atomic_type instanceof TTypeAlias
|| $atomic_type instanceof TValueOf
|| $atomic_type instanceof TConditional
|| $atomic_type instanceof TKeyOf
|| !$from_docblock
) {
continue;
Expand Down
58 changes: 58 additions & 0 deletions tests/ArrayKeysTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,64 @@ public function test(): array {
}
}',
],
'variousArrayKeys' => [
'code' => '<?php
/**
* @psalm-type TAlias = 123
*/
class a {}
/**
* @psalm-import-type TAlias from a
* @template TKey as array-key
* @template TValue as array-key
* @template T as array<TKey, TValue>
* @template TT
* @template TBool as bool
*/
class b {
/**
* @var array<TAlias, int>
*/
private array $a = [];
/** @var array<value-of<T>, int> */
private array $c = [];
/** @var array<key-of<T>, int> */
private array $d = [];
/** @var array<TT, int> */
private array $e = [];
/** @var array<key-of<array<int, int>>, int> */
private array $f = [];
/** @var array<value-of<array<int, int>>, int> */
private array $g = [];
/** @var array<TBool is true ? string : int, int> */
private array $h = [];
/**
* @param T $arr
* @param class-string<TT> $b
* @param TBool $c
*/
public function __construct(
array $arr,
string $b,
bool $c
) {}
/**
* @return array<$v is true ? "a" : 123, 123>
*/
public function test(bool $v): array {
return $v ? ["a" => 123] : [123 => 123];
}
}',
],
];
}

Expand Down

0 comments on commit 2354321

Please sign in to comment.