Skip to content

Commit 692b018

Browse files
committed
Fix nested generic static
1 parent c6c5bf6 commit 692b018

File tree

3 files changed

+8
-3
lines changed

3 files changed

+8
-3
lines changed

src/Reflection/Type/CalledOnTypeUnresolvedMethodPrototypeReflection.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ private function transformStaticType(Type $type): Type
119119
return TypeTraverser::map($type, function (Type $type, callable $traverse): Type {
120120
if ($type instanceof GenericStaticType) {
121121
if ($this->calledOnType instanceof ObjectType) {
122-
return new GenericObjectType($this->calledOnType->getClassName(), $type->getTypes());
122+
return $traverse(new GenericObjectType($this->calledOnType->getClassName(), $type->getTypes()));
123123
}
124124

125125
return $this->calledOnType;

src/Type/StaticType.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,10 +300,10 @@ private function transformStaticType(Type $type, ClassMemberAccessAnswerer $scop
300300
}
301301
$type = $type->changeBaseClass($classReflection);
302302
if (!$isFinal || $type instanceof ThisType) {
303-
return $type;
303+
return $traverse($type);
304304
}
305305

306-
return $type->getStaticObjectType();
306+
return $traverse($type->getStaticObjectType());
307307
}
308308

309309
return $traverse($type);

tests/PHPStan/Analyser/nsrt/generic-static.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ public function flip();
2424
/** @return static<T, U> */
2525
public function fluent();
2626

27+
/** @return static<T, static<U>> */
28+
public function nested();
29+
2730
}
2831

2932
/**
@@ -57,6 +60,7 @@ public function doFoo(): void
5760

5861
assertType('static(GenericStatic\FooImpl<U (class GenericStatic\FooImpl, argument), T (class GenericStatic\FooImpl, argument)>)', $this->flip());
5962
assertType('static(GenericStatic\FooImpl<T (class GenericStatic\FooImpl, argument), U (class GenericStatic\FooImpl, argument)>)', $this->fluent());
63+
assertType('static(GenericStatic\FooImpl<T (class GenericStatic\FooImpl, argument), static(GenericStatic\FooImpl<U (class GenericStatic\FooImpl, argument), mixed>)>)', $this->nested());
6064
}
6165

6266
/**
@@ -70,6 +74,7 @@ public function doBar(self $s): void
7074

7175
assertType('GenericStatic\\FooImpl<float, string>', $s->flip());
7276
assertType('GenericStatic\\FooImpl<string, float>', $s->fluent());
77+
assertType('GenericStatic\FooImpl<string, GenericStatic\FooImpl<float>>', $s->nested());
7378
}
7479

7580
}

0 commit comments

Comments
 (0)