1
0
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:
Matt Brown 2021-02-01 21:40:30 -05:00
parent 25659dd1a9
commit 0eed186edf
2 changed files with 42 additions and 28 deletions

View File

@ -222,16 +222,15 @@ trait CallableTrait
}
}
if (($input_type instanceof Atomic\TCallable || $input_type instanceof Atomic\TClosure)
&& $callable->return_type
&& $input_type->return_type
) {
if ($callable->return_type) {
$callable->return_type = TemplateStandinTypeReplacer::replace(
$callable->return_type,
$template_result,
$codebase,
$statements_analyzer,
$input_type->return_type,
$input_type instanceof Atomic\TCallable || $input_type instanceof Atomic\TClosure
? $input_type->return_type
: null,
$input_arg_offset,
$calling_class,
$calling_function,

View File

@ -4282,29 +4282,6 @@ class ClassTemplateExtendsTest extends TestCase
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' => [
'<?php
/**
@ -4332,6 +4309,44 @@ class ClassTemplateExtendsTest extends TestCase
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;
}
}'
],
];
}