mirror of
https://github.com/danog/psalm.git
synced 2024-11-27 12:55:26 +01:00
Fix #1911 - allow proper namespaces in union assertions
This commit is contained in:
parent
ea83068deb
commit
bceb4efde9
@ -2440,11 +2440,18 @@ class ReflectorVisitor extends PhpParser\NodeVisitorAbstract implements PhpParse
|
||||
$assertion_type_parts = explode('|', $assertion_type);
|
||||
|
||||
foreach ($assertion_type_parts as $i => $assertion_type_part) {
|
||||
if ($assertion_type_part !== 'falsy'
|
||||
&& !isset($template_types[$assertion_type_part])
|
||||
&& !isset(Type::PSALM_RESERVED_WORDS[$assertion_type_part])
|
||||
) {
|
||||
$assertion_type_parts[$i] = $prefix . Type::getFQCLNFromString($assertion_type_part, $this->aliases);
|
||||
if ($assertion_type_part !== 'falsy') {
|
||||
$namespaced_type = Type::parseTokens(
|
||||
Type::fixUpLocalType(
|
||||
$assertion_type_part,
|
||||
$this->aliases,
|
||||
$this->function_template_types + $this->class_template_types,
|
||||
$this->type_aliases,
|
||||
null
|
||||
)
|
||||
);
|
||||
|
||||
$assertion_type_parts[$i] = $prefix . $namespaced_type->getId();
|
||||
} else {
|
||||
$assertion_type_parts[$i] = $prefix . $assertion_type_part;
|
||||
}
|
||||
|
@ -908,6 +908,54 @@ class AssertTest extends TestCase
|
||||
|
||||
if (!is_int($a)) $a->bar();',
|
||||
],
|
||||
'assertUnionInNamespace' => [
|
||||
'<?php
|
||||
namespace Foo\Bar\Baz;
|
||||
|
||||
/**
|
||||
* @psalm-template ExpectedType of object
|
||||
* @param mixed $value
|
||||
* @psalm-param class-string<ExpectedType> $interface
|
||||
* @psalm-assert ExpectedType|class-string<ExpectedType> $value
|
||||
*/
|
||||
function implementsInterface($value, $interface, string $message = ""): void {}
|
||||
|
||||
/**
|
||||
* @psalm-template ExpectedType of object
|
||||
* @param mixed $value
|
||||
* @psalm-param class-string<ExpectedType> $interface
|
||||
* @psalm-assert null|ExpectedType|class-string<ExpectedType> $value
|
||||
*/
|
||||
function nullOrImplementsInterface(?object $value, $interface, string $message = ""): void {}
|
||||
|
||||
interface A
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $value
|
||||
*
|
||||
* @psalm-return A|class-string<A>
|
||||
*/
|
||||
function consume($value) {
|
||||
implementsInterface($value, A::class);
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param mixed $value
|
||||
*
|
||||
* @psalm-return A|class-string<A>|null
|
||||
*/
|
||||
function consume2($value)
|
||||
{
|
||||
nullOrImplementsInterface($value, A::class);
|
||||
|
||||
return $value;
|
||||
}'
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user