mirror of
https://github.com/danog/psalm.git
synced 2024-11-26 20:34:47 +01:00
Fix #1915 - allow @psalm-assert-if-true to operate on $this
This commit is contained in:
parent
820eba1151
commit
5c4ac97546
@ -1847,6 +1847,20 @@ class AssertionFinder
|
||||
$if_types[$var_name] = [[$prefix . $assertion->rule[0][0]]];
|
||||
}
|
||||
}
|
||||
} elseif ($assertion->var_id === '$this' && $expr instanceof PhpParser\Node\Expr\MethodCall) {
|
||||
$var_id = ExpressionAnalyzer::getArrayVarId(
|
||||
$expr->var,
|
||||
$this_class_name,
|
||||
$source
|
||||
);
|
||||
|
||||
if ($var_id) {
|
||||
if ($prefix === $assertion->rule[0][0][0]) {
|
||||
$if_types[$var_id] = [[substr($assertion->rule[0][0], 1)]];
|
||||
} else {
|
||||
$if_types[$var_id] = [[$prefix . $assertion->rule[0][0]]];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1873,6 +1887,20 @@ class AssertionFinder
|
||||
$if_types[$var_name] = [[$negated_prefix . $assertion->rule[0][0]]];
|
||||
}
|
||||
}
|
||||
} elseif ($assertion->var_id === '$this' && $expr instanceof PhpParser\Node\Expr\MethodCall) {
|
||||
$var_id = ExpressionAnalyzer::getArrayVarId(
|
||||
$expr->var,
|
||||
$this_class_name,
|
||||
$source
|
||||
);
|
||||
|
||||
if ($var_id) {
|
||||
if ($negated_prefix === $assertion->rule[0][0][0]) {
|
||||
$if_types[$var_id] = [[substr($assertion->rule[0][0], 1)]];
|
||||
} else {
|
||||
$if_types[$var_id] = [[$negated_prefix . $assertion->rule[0][0]]];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -956,6 +956,31 @@ class AssertTest extends TestCase
|
||||
return $value;
|
||||
}'
|
||||
],
|
||||
'assertThisTypeIfTrue' => [
|
||||
'<?php
|
||||
class Type {
|
||||
/**
|
||||
* @psalm-assert-if-true FooType $this
|
||||
*/
|
||||
public function isFoo() : bool {
|
||||
return $this instanceof FooType;
|
||||
}
|
||||
}
|
||||
|
||||
class FooType extends Type {
|
||||
public function bar(): void {}
|
||||
}
|
||||
|
||||
function takesType(Type $t) : void {
|
||||
if ($t->isFoo()) {
|
||||
$t->bar();
|
||||
}
|
||||
switch (true) {
|
||||
case $t->isFoo():
|
||||
$t->bar();
|
||||
}
|
||||
}'
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user