diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterImpl.java index 799f9b459e69..96687c0711ef 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiParameterImpl.java @@ -26,6 +26,7 @@ import com.intellij.psi.impl.PsiImplUtil; import com.intellij.psi.impl.cache.TypeInfo; import com.intellij.psi.impl.java.stubs.JavaStubElementTypes; import com.intellij.psi.impl.java.stubs.PsiParameterStub; +import com.intellij.psi.impl.source.resolve.graphInference.FunctionalInterfaceParameterizationUtil; import com.intellij.psi.impl.source.tree.CompositeElement; import com.intellij.psi.impl.source.tree.JavaSharedImplUtil; import com.intellij.psi.search.LocalSearchScope; @@ -72,6 +73,8 @@ public class PsiParameterImpl extends JavaStubPsiElement imple if (type == null) { type = LambdaUtil.getFunctionalInterfaceType(lambdaExpression, false); } + + type = FunctionalInterfaceParameterizationUtil.getGroundTargetType(type, lambdaExpression); if (type instanceof PsiIntersectionType) { final PsiType[] conjuncts = ((PsiIntersectionType)type).getConjuncts(); for (PsiType conjunct : conjuncts) { @@ -99,7 +102,7 @@ public class PsiParameterImpl extends JavaStubPsiElement imple if (parameterIndex < parameters.length) { final PsiType psiType = LambdaUtil.getSubstitutor(method, resolveResult).substitute(parameters[parameterIndex].getType()); if (!LambdaUtil.dependsOnTypeParams(psiType, conjunct, lambdaExpression)) { - return GenericsUtil.eliminateWildcards(psiType, false); + return psiType; } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/EnsureGroundTypeToGetLambdaParameterType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/EnsureGroundTypeToGetLambdaParameterType.java new file mode 100644 index 000000000000..b4566dce49f2 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/EnsureGroundTypeToGetLambdaParameterType.java @@ -0,0 +1,18 @@ +import java.util.Optional; +import java.util.function.Function; + +class CyclicInferenceTest2 { + void test(final Extractor2 pE, final Match2 pMatch) { + Match2 matcher = pMatch.or(pE, i -> 2); // "i" is red-highlighted + } + +} +class Match2 { + public Match2 or(Extractor2 e, Function c) { + return this; + } +} + +interface Extractor2 { + Optional unapply(T t); +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java index 712df26e356f..ac2ba93420d3 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java @@ -133,6 +133,10 @@ public class NewLambdaHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testEnsureGroundTypeToGetLambdaParameterType() throws Exception { + doTest(); + } + private void doTest() { doTest(false); }