diff --git a/src/Psalm/Internal/Type/TypeParser.php b/src/Psalm/Internal/Type/TypeParser.php index e908c4e3a1d..ecdd5910c86 100644 --- a/src/Psalm/Internal/Type/TypeParser.php +++ b/src/Psalm/Internal/Type/TypeParser.php @@ -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); @@ -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; diff --git a/tests/ArrayKeysTest.php b/tests/ArrayKeysTest.php index e3f9cc897a4..659cd5af5df 100644 --- a/tests/ArrayKeysTest.php +++ b/tests/ArrayKeysTest.php @@ -124,6 +124,65 @@ public function test(): array { } }', ], + 'variousArrayKeys' => [ + 'code' => ' + * + * @template TOrig as a|b + * @template TT as class-string + * + * @template TBool as bool + */ + class b { + /** + * @var array + */ + private array $a = [123 => 123]; + + /** @var array, int> */ + public array $c = []; + + /** @var array, int> */ + public array $d = []; + + /** @var array */ + public array $e = []; + + /** @var array>, int> */ + private array $f = [123 => 123]; + + /** @var array>, int> */ + private array $g = ["test" => 123]; + + /** @var array */ + private array $h = [123 => 123]; + + /** + * @return array<$v is true ? "a" : 123, 123> + */ + public function test(bool $v): array { + return $v ? ["a" => 123] : [123 => 123]; + } + } + + /** @var b<"testKey", "testValue", array<"testKey", "testValue">, b, class-string, true> */ + $b = new b; + $b->d["testKey"] = 123; + + // TODO + //$b->c["testValue"] = 123; + //$b->e["b"] = 123; + ', + ], ]; }