mirror of
https://github.com/danog/psalm.git
synced 2024-11-27 12:55:26 +01:00
Fix #5140 - always replace closure return types, whether or not a matching input type is present
This commit is contained in:
parent
25659dd1a9
commit
0eed186edf
@ -222,16 +222,15 @@ trait CallableTrait
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($input_type instanceof Atomic\TCallable || $input_type instanceof Atomic\TClosure)
|
if ($callable->return_type) {
|
||||||
&& $callable->return_type
|
|
||||||
&& $input_type->return_type
|
|
||||||
) {
|
|
||||||
$callable->return_type = TemplateStandinTypeReplacer::replace(
|
$callable->return_type = TemplateStandinTypeReplacer::replace(
|
||||||
$callable->return_type,
|
$callable->return_type,
|
||||||
$template_result,
|
$template_result,
|
||||||
$codebase,
|
$codebase,
|
||||||
$statements_analyzer,
|
$statements_analyzer,
|
||||||
$input_type->return_type,
|
$input_type instanceof Atomic\TCallable || $input_type instanceof Atomic\TClosure
|
||||||
|
? $input_type->return_type
|
||||||
|
: null,
|
||||||
$input_arg_offset,
|
$input_arg_offset,
|
||||||
$calling_class,
|
$calling_class,
|
||||||
$calling_function,
|
$calling_function,
|
||||||
|
@ -4282,29 +4282,6 @@ class ClassTemplateExtendsTest extends TestCase
|
|||||||
function getIterator(): Traversable;
|
function getIterator(): Traversable;
|
||||||
}'
|
}'
|
||||||
],
|
],
|
||||||
'extendsWithoutAlias' => [
|
|
||||||
'<?php
|
|
||||||
/**
|
|
||||||
* @template TAValue
|
|
||||||
*/
|
|
||||||
abstract class A {
|
|
||||||
/**
|
|
||||||
* @psalm-param TAValue $val
|
|
||||||
*/
|
|
||||||
abstract public function foo($val): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @template TBValue
|
|
||||||
* @extends A<TBValue>
|
|
||||||
*/
|
|
||||||
abstract class B extends A {
|
|
||||||
/**
|
|
||||||
* @psalm-param TBValue $val
|
|
||||||
*/
|
|
||||||
abstract public function foo($val): void;
|
|
||||||
}'
|
|
||||||
],
|
|
||||||
'extendsWithAlias' => [
|
'extendsWithAlias' => [
|
||||||
'<?php
|
'<?php
|
||||||
/**
|
/**
|
||||||
@ -4332,6 +4309,44 @@ class ClassTemplateExtendsTest extends TestCase
|
|||||||
abstract public function foo($val): void;
|
abstract public function foo($val): void;
|
||||||
}'
|
}'
|
||||||
],
|
],
|
||||||
|
'extendsWithTemplatedClosureProperty' => [
|
||||||
|
'<?php
|
||||||
|
/**
|
||||||
|
* @template T1
|
||||||
|
*/
|
||||||
|
class A
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var T1|null
|
||||||
|
*/
|
||||||
|
protected $type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var (Closure(): T1)|null
|
||||||
|
*/
|
||||||
|
protected $closure;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @template T2
|
||||||
|
* @extends A<T2>
|
||||||
|
*/
|
||||||
|
class B extends A {
|
||||||
|
/**
|
||||||
|
* @return T2|null
|
||||||
|
*/
|
||||||
|
public function getType() {
|
||||||
|
return $this->type;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return (Closure(): T2)|null
|
||||||
|
*/
|
||||||
|
public function getClosureReturningType() {
|
||||||
|
return $this->closure;
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user