mirror of
https://github.com/danog/psalm.git
synced 2024-11-30 04:39:00 +01:00
Fix access on matched T[K]
This commit is contained in:
parent
2eae79060f
commit
cf02e9c22c
@ -488,8 +488,6 @@ class ArrayFetchAnalyzer
|
|||||||
if ($offset_as instanceof Type\Atomic\TTemplateKeyOf
|
if ($offset_as instanceof Type\Atomic\TTemplateKeyOf
|
||||||
&& $offset_as->param_name === $original_type->param_name
|
&& $offset_as->param_name === $original_type->param_name
|
||||||
&& $offset_as->defining_class === $original_type->defining_class
|
&& $offset_as->defining_class === $original_type->defining_class
|
||||||
&& $offset_atomic_type->defining_class
|
|
||||||
=== $original_type->defining_class
|
|
||||||
) {
|
) {
|
||||||
$type->type_params[1] = new Type\Union([
|
$type->type_params[1] = new Type\Union([
|
||||||
new Type\Atomic\TTemplateIndexedAccess(
|
new Type\Atomic\TTemplateIndexedAccess(
|
||||||
|
@ -189,6 +189,7 @@ abstract class Atomic
|
|||||||
|
|
||||||
if (isset($template_type_map[$value])) {
|
if (isset($template_type_map[$value])) {
|
||||||
$first_class = array_keys($template_type_map[$value])[0];
|
$first_class = array_keys($template_type_map[$value])[0];
|
||||||
|
|
||||||
return new TTemplateParam(
|
return new TTemplateParam(
|
||||||
$value,
|
$value,
|
||||||
$template_type_map[$value][$first_class][0],
|
$template_type_map[$value][$first_class][0],
|
||||||
|
@ -2373,7 +2373,7 @@ class TemplateTest extends TestCase
|
|||||||
'$c' => 'int',
|
'$c' => 'int',
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'keyOfClassTemplate' => [
|
'keyOfClassTemplateAcceptingIndexedAccess' => [
|
||||||
'<?php
|
'<?php
|
||||||
/**
|
/**
|
||||||
* @template TData as array
|
* @template TData as array
|
||||||
@ -2391,13 +2391,6 @@ class TemplateTest extends TestCase
|
|||||||
$this->data = $data;
|
$this->data = $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param key-of<TData> $property
|
|
||||||
*/
|
|
||||||
public function __get(string $property) {
|
|
||||||
return $this->data[$property] ?? null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @template K as key-of<TData>
|
* @template K as key-of<TData>
|
||||||
*
|
*
|
||||||
@ -2409,6 +2402,36 @@ class TemplateTest extends TestCase
|
|||||||
}
|
}
|
||||||
}'
|
}'
|
||||||
],
|
],
|
||||||
|
'keyOfClassTemplateReturningIndexedAccess' => [
|
||||||
|
'<?php
|
||||||
|
/**
|
||||||
|
* @template TData as array
|
||||||
|
*/
|
||||||
|
abstract class DataBag {
|
||||||
|
/**
|
||||||
|
* @var TData
|
||||||
|
*/
|
||||||
|
protected $data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param TData $data
|
||||||
|
*/
|
||||||
|
public function __construct(array $data) {
|
||||||
|
$this->data = $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @template K as key-of<TData>
|
||||||
|
*
|
||||||
|
* @param K $property
|
||||||
|
*
|
||||||
|
* @return TData[K]
|
||||||
|
*/
|
||||||
|
public function __get(string $property) {
|
||||||
|
return $this->data[$property];
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
],
|
||||||
'unionTOrClassStringTPassedClassString' => [
|
'unionTOrClassStringTPassedClassString' => [
|
||||||
'<?php
|
'<?php
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user