Fix ReflectionGetAttributesMethodReturnTypeExtension for union types#5464
Closed
janedbal wants to merge 1 commit intophpstan:2.1.xfrom
Closed
Fix ReflectionGetAttributesMethodReturnTypeExtension for union types#5464janedbal wants to merge 1 commit intophpstan:2.1.xfrom
janedbal wants to merge 1 commit intophpstan:2.1.xfrom
Conversation
Co-Authored-By: Claude Code
Contributor
Author
|
Looks like duplicate of #5463 |
Contributor
Author
|
Closing in favor of #5463 which fixes the root cause in MethodCallReturnTypeHelper instead of loosening the extension check. |
Contributor
I'll need to rewrite the description cause I changed the strategy by working on ReflectionGetAttributesMethodReturnTypeExtension too |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bug
When calling
getAttributes()on a union type likeReflectionClass|ReflectionProperty, theReflectionGetAttributesMethodReturnTypeExtensionfails to fire for all members of the union. This causes the return type to fall back tolist<ReflectionAttribute<object>>instead of the expectedlist<ReflectionAttribute<T>>, producing falsereturn.typeerrors in generic code.Reproduction:
Root cause
isMethodSupported()checked$methodReflection->getDeclaringClass()->getName() === $this->className. When the receiver is a union type,MethodCallReturnTypeHelperiterates per class name in the union, but the$methodReflectionpassed toisMethodSupportedalways has the same declaring class (from the first resolved member). So the extension fires for one member but not the others, and the unhandled members fall back to the stub return type.Fix
Remove the redundant declaring class check from
isMethodSupported(). The extension is already registered per-class viagetClass()and only dispatched for matching classes bygetDynamicMethodReturnTypeExtensionsForClass($className), so the check was unnecessary and actively harmful for union types.Co-Authored-By: Claude Code