Avoid cast exception and recursion in resolving SAM type used in constructor #3371
+90
−20
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.
PsiNewExpression#multiResolveuses super type's implementation ofmultiResolve---PsiPolyVariantCachingReference---by treating itself asa fake reference to a constructor. That super implementation may return
ResolveResult[], includingResolveResult.EMPTY_ARRAY(if not resolvedfor some reason, like Lint CLI w/ different JDK, etc.), and the current
direct cast to
JavaResolveResult[]raised the class cast exception.A reproduction, however, failed in ToT Java UAST with a different error:
recursive resolution attempts while resolving the lambda expression used
in the constructor. The type of the lambda's parameter depends on the
chosen method overload, but choosing the correct overload depends on the
lambda's type, hence recursion. We can break the cycle by adding a guard
to the process of resolving lambda parameter type.
^IDEA-383770 fixed