Skip to content

Intersections appear not to be templated properly #2581

@muglug

Description

@muglug

Code snippet that reproduces the problem

class MockObject
{
	public function checkExpectations() : void
	{
	}
}

/**
 * @template RequestedType
 * @param class-string<RequestedType> $className
 * @return RequestedType&MockObject
 */
function mock(string $className)
{
	$instance = eval("there be dragons");

	return $instance;
}

class A {
	public function foo() : void {}
}

/**
 * @template UnknownType
 * @param class-string<UnknownType> $className
 */
function useMockTemplated(string $className) : void
{
	mock($className)->checkExpectations();
}

mock(A::class)->foo(); // good
mock(A::class)->checkExpectations(); // good
mock(A::class)->notFoo(); // bad

Expected output

Method (A&MockObject)::notFoo does not exist

Actual output

No issues

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions