From 24cb042051c8b3d2c5ece4e9335a122c780d3a87 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 1 Jul 2020 10:25:07 +0200 Subject: [PATCH] java: create constructor from usage: ensure parameter type is evaluated before constructor is inserted (IDEA-244902) otherwise inference may detect overload conflict with existing no-arg constructor GitOrigin-RevId: bade4409a64e31bd0c7c4d79ffa41222b17a7c8f --- .../java/actions/CreateConstructorAction.kt | 5 ++++- .../afterInferredType.java | 18 ++++++++++++++++++ .../beforeInferredType.java | 14 ++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorFromCall/afterInferredType.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorFromCall/beforeInferredType.java diff --git a/java/java-impl/src/com/intellij/lang/java/actions/CreateConstructorAction.kt b/java/java-impl/src/com/intellij/lang/java/actions/CreateConstructorAction.kt index 021ffe58e938..5869961a181a 100644 --- a/java/java-impl/src/com/intellij/lang/java/actions/CreateConstructorAction.kt +++ b/java/java-impl/src/com/intellij/lang/java/actions/CreateConstructorAction.kt @@ -50,12 +50,15 @@ private class JavaConstructorRenderer( private val factory = JavaPsiFacade.getElementFactory(project)!! fun doMagic() { + //calculate expected parameter types before constructor is inserted + //to avoid possible overload conflicts + val parameters = request.expectedParameters var constructor = renderConstructor() constructor = insertConstructor(constructor) constructor = forcePsiPostprocessAndRestoreElement(constructor) ?: return val builder = TemplateBuilderImpl(constructor) - createTemplateContext(builder).setupParameters(constructor, request.expectedParameters) + createTemplateContext(builder).setupParameters(constructor, parameters) val superConstructor = setupSuperCall(targetClass, constructor, builder) constructor = forcePsiPostprocessAndRestoreElement(constructor) ?: return diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorFromCall/afterInferredType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorFromCall/afterInferredType.java new file mode 100644 index 000000000000..76c5d317b0e0 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorFromCall/afterInferredType.java @@ -0,0 +1,18 @@ +// "Create constructor" "true" +class MyTest { + T id(T t) { + return t; + } + + { + Foo f = new Foo(id("name")); + } +} + +class Foo { + public Foo() {} + + public Foo(String name) { + + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorFromCall/beforeInferredType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorFromCall/beforeInferredType.java new file mode 100644 index 000000000000..9e7d7e4fb6fc --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorFromCall/beforeInferredType.java @@ -0,0 +1,14 @@ +// "Create constructor" "true" +class MyTest { + T id(T t) { + return t; + } + + { + Foo f = new Foo(id("name")); + } +} + +class Foo { + public Foo() {} +} \ No newline at end of file