Repository navigation
[phpstan] Add PHPStan rule to flag same class-type union in param and return - #8585
Merged
Merged
Conversation
Flags methods like (A|B $node): A|B|null that should use a @template generic to narrow the return to the passed type. Applies the template to the 13 existing matches.
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.
Adds
PreferGenericTemplateOnSameUnionTypeRuleunderutils/phpstan, registered inphpstan.neon, to catch the shape generalized in #8584: a method whose single param and return share the same class-type union, e.g.Such a method almost always returns the node it was passed, so a
@templategeneric narrows the return to the concrete passed type and lets callers drop/** @var ... */hacks.The rule only fires when every union member is a class type (a
Namenode). Scalar unions likeint|floatand mixed unions likeNode|arrayare skipped, since there the return is usually a fresh value, not the input - adding a template would be unsound. Methods that already carry@templateare skipped too.Covered by
PreferGenericTemplateOnSameUnionTypeRuleTestwith a failing fixture (bare union) and a passing one (already generic, scalar union, mismatched union).Also applies the
@templateto the 13 existing matches across the tree, so a fullcomposer phpstanrun reports no hits outside the rule test fixtures.