1
0
mirror of https://github.com/danog/psalm.git synced 2024-11-30 04:39:00 +01:00

Fix #2192 - allow static return value on templated object

This commit is contained in:
Brown 2019-10-11 12:02:41 -04:00
parent 4ee037923a
commit 3f837a3493
3 changed files with 25 additions and 4 deletions

View File

@ -217,7 +217,10 @@ class MethodCallAnalyzer extends \Psalm\Internal\Analyzer\Statements\Expression\
$codebase, $codebase,
$context, $context,
$lhs_type_part, $lhs_type_part,
$lhs_type_part instanceof Type\Atomic\TNamedObject ? $lhs_type_part : null, $lhs_type_part instanceof Type\Atomic\TNamedObject
|| $lhs_type_part instanceof Type\Atomic\TTemplateParam
? $lhs_type_part
: null,
$lhs_var_id, $lhs_var_id,
$return_type, $return_type,
$returns_by_ref, $returns_by_ref,
@ -400,7 +403,7 @@ class MethodCallAnalyzer extends \Psalm\Internal\Analyzer\Statements\Expression\
* @param PhpParser\Node\Expr\MethodCall $stmt * @param PhpParser\Node\Expr\MethodCall $stmt
* @param Codebase $codebase * @param Codebase $codebase
* @param Context $context * @param Context $context
* @param Type\Atomic $lhs_type_part * @param Type\Atomic\TNamedObject|Type\Atomic\TTemplateParam $static_type
* @param ?string $lhs_var_id * @param ?string $lhs_var_id
* @param ?Type\Union &$return_type * @param ?Type\Union &$return_type
* @param bool &$returns_by_ref * @param bool &$returns_by_ref
@ -419,7 +422,7 @@ class MethodCallAnalyzer extends \Psalm\Internal\Analyzer\Statements\Expression\
Codebase $codebase, Codebase $codebase,
Context $context, Context $context,
Type\Atomic $lhs_type_part, Type\Atomic $lhs_type_part,
?Type\Atomic\TNamedObject $static_type, ?Type\Atomic $static_type,
$lhs_var_id, $lhs_var_id,
&$return_type, &$return_type,
&$returns_by_ref, &$returns_by_ref,

View File

@ -1764,7 +1764,7 @@ class ClassTemplateTest extends TestCase
return $bar->get(); return $bar->get();
}' }'
], ],
'templatedThing' => [ 'templatedLiteralStringReplacement' => [
'<?php '<?php
/** /**
* @template T * @template T

View File

@ -781,6 +781,24 @@ class FunctionTemplateTest extends TestCase
$staticIdGenerator = idGenerator([Id::class, "fromString"]); $staticIdGenerator = idGenerator([Id::class, "fromString"]);
client($staticIdGenerator());' client($staticIdGenerator());'
], ],
'noCrashWhenTemplatedClassIsStatic' => [
'<?php
abstract class Model {
/** @return static */
public function newInstance() {
return new static();
}
}
/**
* @template T of Model
* @param T $m
* @return T
*/
function foo(Model $m) : Model {
return $m->newInstance();
}'
],
]; ];
} }