fix: implement phase-2 poly-expression inference for method/construct or references (JLS §15.12.2.7)#5031
Merged
Merged
Conversation
…or references (JLS §15.12.2.7)
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.
After the initial type-variable inference pass (Phase 1), remaining type variables whose only source of information is a poly-expression argument (lambda or method/constructor reference) were left unresolved — for example K in groupingBy(String::new, counting()) stayed as InferenceVariable instead of resolving to String.
Add inferTypeVariablesFromPolyExpressionArguments in MethodCallExprContext: for each argument position whose AST node is a method or constructor reference, retrieve the SAM of the formal functional interface type (with Phase-1 substitutions applied), unwrap any ? extends/? super wildcard on its return type, compute the actual return type of the referenced callable (X for X::new, declared return type for Foo::bar), and match the two to derive additional type-variable bindings. Call this Phase-2 pass in both the instance-method branch and the static (NameExpr) branch of solveMethodAsUsage. Promote JavaParserFacade.toMethodUsage from protected to public to allow access from MethodCallExprContext.
Update the resolveStreamCollectGroupingByWithConstructorReference test to assert the fully resolved type Map<String, Long> instead of the previous relaxed structural checks.