diff --git a/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java b/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java index 6c96b48e7d0b..2c039cda3a43 100644 --- a/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java +++ b/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java @@ -164,8 +164,11 @@ public class MethodCandidateInfo extends CandidateInfo{ } return level1; }, substitutor); - @ApplicabilityLevelConstant int level = - Objects.requireNonNull(ourOverloadGuard.doPreventingRecursion(myArgumentList, false, computable)); + Integer applicabilityLevel = ourOverloadGuard.doPreventingRecursion(myArgumentList, false, computable); + if (applicabilityLevel == null) { + return ApplicabilityLevel.NOT_APPLICABLE; + } + @ApplicabilityLevelConstant int level = applicabilityLevel; if (level > ApplicabilityLevel.NOT_APPLICABLE && !isTypeArgumentsApplicable(() -> substitutor)) { level = ApplicabilityLevel.NOT_APPLICABLE; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/RecursiveInference.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/RecursiveInference.java new file mode 100644 index 000000000000..ceb53effdf42 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/RecursiveInference.java @@ -0,0 +1,12 @@ +import java.util.function.Function; + +class MyTest { + + java.util.List f(Function ff) { + return null; + } + + void test() { + var t = this.f(t); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvLVTIHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvLVTIHighlightingTest.java index 5ca9900a8528..969966201ad5 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvLVTIHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvLVTIHighlightingTest.java @@ -12,6 +12,8 @@ import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.CommonClassNames; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiMethodCallExpression; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.testFramework.IdeaTestUtil; public class LightAdvLVTIHighlightingTest extends LightDaemonAnalyzerTestCase { @@ -56,6 +58,13 @@ public class LightAdvLVTIHighlightingTest extends LightDaemonAnalyzerTestCase { public void testFailedInferenceWithLeftTypeVar() { doTest(); } public void testDisjunctionType() { doTest(); } + public void testRecursiveInference() { + configureByFile(BASE_PATH + "/" + getTestName(false) + ".java"); + final int offset = getEditor().getCaretModel().getOffset(); + PsiMethodCallExpression expression = PsiTreeUtil.getParentOfType(getFile().findElementAt(offset), PsiMethodCallExpression.class); + assertTrue(expression.resolveMethodGenerics().isValidResult()); + } + public void testVarInLambdaParameters() { setLanguageLevel(LanguageLevel.JDK_11); doTest();