From 297a96a98c940356eaba59d9e954b5fbd4acd575 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 14 Jun 2019 09:41:43 +0200 Subject: [PATCH] inference: fix for incomplete constructor call without argument list EA-144940 - IAE: RecursionManager$.$$$reportNull$$$ GitOrigin-RevId: 7367e1bccdcb5d0373293e44dd8afdfb105ee311 --- .../com/intellij/psi/infos/MethodCandidateInfo.java | 12 ++++++++---- .../MultipleGenericConstructorsOnIncompleteCall.java | 9 +++++++++ .../codeInsight/navigation/GotoDeclarationTest.java | 10 +++++++++- 3 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/gotoDeclaration/MultipleGenericConstructorsOnIncompleteCall.java 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 9f050eda2884..1977c834ea2c 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 @@ -447,10 +447,14 @@ public class MethodCandidateInfo extends CandidateInfo{ .inferTypeArguments(typeParameters, method.getParameterList().getParameters(), arguments, this, parent, policy, myLanguageLevel); }; - PsiSubstitutor substitutor = !includeReturnConstraint - ? ourOverloadGuard.doPreventingRecursion(myArgumentList, false, computable) - : computable.compute(); - return ObjectUtils.assertNotNull(substitutor); + if (!includeReturnConstraint) { + return myArgumentList == null + ? PsiSubstitutor.EMPTY + : ObjectUtils.assertNotNull(ourOverloadGuard.doPreventingRecursion(myArgumentList, false, computable)); + } + else { + return computable.compute(); + } } public boolean isRawSubstitution() { diff --git a/java/java-tests/testData/codeInsight/gotoDeclaration/MultipleGenericConstructorsOnIncompleteCall.java b/java/java-tests/testData/codeInsight/gotoDeclaration/MultipleGenericConstructorsOnIncompleteCall.java new file mode 100644 index 000000000000..570f2fa00d5e --- /dev/null +++ b/java/java-tests/testData/codeInsight/gotoDeclaration/MultipleGenericConstructorsOnIncompleteCall.java @@ -0,0 +1,9 @@ +import java.lang.String; + +class X { + X(int i){} + X(String s){} + { + new X + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/navigation/GotoDeclarationTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/navigation/GotoDeclarationTest.java index ac69fc151682..fdb6b56f3fbe 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/navigation/GotoDeclarationTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/navigation/GotoDeclarationTest.java @@ -64,7 +64,7 @@ public class GotoDeclarationTest extends LightCodeInsightTestCase { assertEquals("java.lang", JavaDirectoryService.getInstance().getPackage(element).getQualifiedName()); } - public void testMultipleConstructors() { + private void doTestMultipleConstructors() { String name = getTestName(false); configureByFile("/codeInsight/gotoDeclaration/" + name + ".java"); final int offset = getEditor().getCaretModel().getOffset(); @@ -79,6 +79,14 @@ public class GotoDeclarationTest extends LightCodeInsightTestCase { assertEquals(candidates.toString(), 2, candidates.size()); } + public void testMultipleConstructors() { + doTestMultipleConstructors(); + } + + public void testMultipleGenericConstructorsOnIncompleteCall() { + doTestMultipleConstructors(); + } + public void testMultipleConstructorsButArrayCreation() { String name = getTestName(false); configureByFile("/codeInsight/gotoDeclaration/" + name + ".java");