mirror of
https://github.com/danog/psalm.git
synced 2024-11-27 04:45:20 +01:00
Fix #677 - handle get_class checks more accurately
This commit is contained in:
parent
b28cc19fd2
commit
df5d369443
@ -342,7 +342,7 @@ class AssertionFinder
|
||||
// fall through
|
||||
} else {
|
||||
if ($var_name && $var_type) {
|
||||
$if_types[$var_name] = $var_type;
|
||||
$if_types[$var_name] = 'getclass-' . $var_type;
|
||||
}
|
||||
}
|
||||
|
||||
@ -614,7 +614,7 @@ class AssertionFinder
|
||||
// fall through
|
||||
} else {
|
||||
if ($var_name && $var_type) {
|
||||
$if_types[$var_name] = '!' . $var_type;
|
||||
$if_types[$var_name] = '!getclass-' . $var_type;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -479,6 +479,8 @@ class Reconciler
|
||||
) {
|
||||
$existing_var_type->removeType('iterable');
|
||||
$existing_var_type->addType(new TNamedObject('Traversable'));
|
||||
} elseif (substr($negated_type, 0, 9) === 'getclass-') {
|
||||
$negated_type = substr($negated_type, 9);
|
||||
} else {
|
||||
$existing_var_type->removeType($negated_type);
|
||||
}
|
||||
@ -795,6 +797,10 @@ class Reconciler
|
||||
} else {
|
||||
$new_type = Type::getMixed();
|
||||
}
|
||||
} elseif (substr($new_var_type, 0, 9) === 'getclass-') {
|
||||
$new_var_type = substr($new_var_type, 9);
|
||||
$new_type = Type::parseString($new_var_type);
|
||||
$is_strict_equality = true;
|
||||
} else {
|
||||
$new_type = Type::parseString($new_var_type);
|
||||
}
|
||||
@ -850,7 +856,10 @@ class Reconciler
|
||||
} elseif ($code_location && !$new_type->isMixed()) {
|
||||
$has_match = true;
|
||||
|
||||
if ($key && $new_type->getId() === $existing_var_type->getId() && !$is_strict_equality) {
|
||||
if ($key
|
||||
&& $new_type->getId() === $existing_var_type->getId()
|
||||
&& !$is_strict_equality
|
||||
) {
|
||||
self::triggerIssueForImpossible(
|
||||
$existing_var_type,
|
||||
$old_var_type_string,
|
||||
|
@ -571,6 +571,25 @@ class TypeAlgebraTest extends TestCase
|
||||
}
|
||||
}',
|
||||
],
|
||||
'getClassComparison' => [
|
||||
'<?php
|
||||
class Foo {
|
||||
public function bar() : void {}
|
||||
}
|
||||
class Bar extends Foo{
|
||||
public function bar() : void {}
|
||||
}
|
||||
|
||||
class Baz {
|
||||
public function test(Foo $foo) : void {
|
||||
if (get_class($foo) !== Foo::class) {
|
||||
// do nothing
|
||||
} else {
|
||||
$foo->bar();
|
||||
}
|
||||
}
|
||||
}',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user