diff --git a/src/Analyser/MutatingScope.php b/src/Analyser/MutatingScope.php index 0af911b030..2744d23ab7 100644 --- a/src/Analyser/MutatingScope.php +++ b/src/Analyser/MutatingScope.php @@ -5048,6 +5048,9 @@ private function exactInstantiation(New_ $node, Name $className): Type $traverser = new ConstructorClassTemplateTraverser($classTemplateTypes); foreach ($constructorVariant->getParameters() as $parameter) { + if (!$parameter->getType()->hasTemplateOrLateResolvableType()) { + continue; + } TypeTraverser::map($parameter->getType(), $traverser); } $classTemplateTypes = $traverser->getClassTemplateTypes(); @@ -5219,6 +5222,11 @@ classReflection: $classReflection->withTypes($types)->asFinal(), [], ); } + + if (!$newGenericType->hasTemplateOrLateResolvableType()) { + return $newGenericType; + } + return TypeTraverser::map($newGenericType, new GenericTypeTemplateTraverser($resolvedTemplateTypeMap)); } diff --git a/src/Analyser/Traverser/VoidToNullTraverser.php b/src/Analyser/Traverser/VoidToNullTraverser.php index 92e00f181e..64f0ed9b74 100644 --- a/src/Analyser/Traverser/VoidToNullTraverser.php +++ b/src/Analyser/Traverser/VoidToNullTraverser.php @@ -2,7 +2,6 @@ namespace PHPStan\Analyser\Traverser; -use PHPStan\Type\IntersectionType; use PHPStan\Type\NullType; use PHPStan\Type\Type; use PHPStan\Type\TypeTraverserCallable; @@ -16,7 +15,7 @@ final class VoidToNullTraverser implements TypeTraverserCallable */ public function traverse(Type $type, callable $traverse): Type { - if ($type instanceof UnionType || $type instanceof IntersectionType) { + if ($type instanceof UnionType) { return $traverse($type); }