From 6ec151fcdb6316fa5a431923fb94012ffe800a7d Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 1 Nov 2012 14:03:39 +0100 Subject: [PATCH] generate: pass class context to correct resolve of param types (IDEA-53337) --- .../generation/GenerateConstructorHandler.java | 8 ++++---- .../generation/GenerateMembersUtil.java | 14 +++++++------- .../generateConstructor/afterSubstitution.java | 13 +++++++++++++ .../generateConstructor/beforeSubstitution.java | 12 ++++++++++++ .../codeInsight/GenerateConstructorTest.java | 1 + 5 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/generateConstructor/afterSubstitution.java create mode 100644 java/java-tests/testData/codeInsight/generateConstructor/beforeSubstitution.java diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java index 48e7ffaf4282..720920c4a0bc 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java @@ -218,8 +218,7 @@ public class GenerateConstructorHandler extends GenerateMembersHandlerBase { JVMElementFactory factory = JVMElementFactories.requireFactory(aClass.getLanguage(), aClass.getProject()); CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(manager.getProject()); - PsiMethod constructor = factory.createConstructor(); - constructor.setName(aClass.getName()); + PsiMethod constructor = factory.createMethodFromText(aClass.getName() + "() {}", aClass); String modifier = getConstructorModifier(aClass); if (modifier != null) { PsiUtil.setModifierProperty(constructor, modifier, true); @@ -251,7 +250,7 @@ public class GenerateConstructorHandler extends GenerateMembersHandlerBase { } PsiParameter[] params = baseConstructor.getParameterList().getParameters(); for (PsiParameter param : params) { - PsiParameter newParam = factory.createParameter(param.getName(), param.getType()); + PsiParameter newParam = factory.createParameter(param.getName(), param.getType(), aClass); GenerateMembersUtil.copyOrReplaceModifierList(param, newParam); constructor.getParameterList().add(newParam); } @@ -260,12 +259,13 @@ public class GenerateConstructorHandler extends GenerateMembersHandlerBase { JavaCodeStyleManager javaStyle = JavaCodeStyleManager.getInstance(aClass.getProject()); + final PsiMethod dummyConstructor = factory.createMethodFromText(constructor.getText(), null); List fieldParams = new ArrayList(); for (PsiField field : fields) { String fieldName = field.getName(); String name = javaStyle.variableNameToPropertyName(fieldName, VariableKind.FIELD); String parmName = javaStyle.propertyNameToVariableName(name, VariableKind.PARAMETER); - parmName = javaStyle.suggestUniqueVariableName(parmName, constructor, true); + parmName = javaStyle.suggestUniqueVariableName(parmName, dummyConstructor, true); PsiParameter parm = factory.createParameter(parmName, field.getType()); final NullableNotNullManager nullableManager = NullableNotNullManager.getInstance(field.getProject()); diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java index 66c1406b2504..32197e1dd1c6 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java @@ -235,13 +235,13 @@ public class GenerateMembersUtil { final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project); try { - final PsiMethod resultMethod = createMethod(factory, sourceMethod); + final PsiMethod resultMethod = createMethod(factory, sourceMethod, target); copyDocComment(sourceMethod, resultMethod); copyModifiers(sourceMethod.getModifierList(), resultMethod.getModifierList()); final PsiSubstitutor collisionResolvedSubstitutor = substituteTypeParameters(factory, target, sourceMethod.getTypeParameterList(), resultMethod.getTypeParameterList(), substitutor); substituteReturnType(PsiManager.getInstance(project), resultMethod, sourceMethod.getReturnType(), collisionResolvedSubstitutor); - substituteParameters(factory, codeStyleManager, sourceMethod.getParameterList(), resultMethod.getParameterList(), collisionResolvedSubstitutor); + substituteParameters(factory, codeStyleManager, sourceMethod.getParameterList(), resultMethod.getParameterList(), collisionResolvedSubstitutor, target); substituteThrows(factory, sourceMethod.getThrowsList(), resultMethod.getThrowsList(), collisionResolvedSubstitutor); return resultMethod; } @@ -344,7 +344,7 @@ public class GenerateMembersUtil { @NotNull JavaCodeStyleManager codeStyleManager, @NotNull PsiParameterList sourceParameterList, @NotNull PsiParameterList targetParameterList, - @NotNull PsiSubstitutor substitutor) { + @NotNull PsiSubstitutor substitutor, PsiElement target) { PsiParameter[] parameters = sourceParameterList.getParameters(); UniqueNameGenerator generator = new UniqueNameGenerator(); for (int i = 0; i < parameters.length; i++) { @@ -367,7 +367,7 @@ public class GenerateMembersUtil { if (paramName == null) paramName = "p" + i; generator.addExistingName(paramName); - final PsiParameter newParameter = factory.createParameter(paramName, substituted); + final PsiParameter newParameter = factory.createParameter(paramName, substituted, target); copyOrReplaceModifierList(parameter, newParameter); targetParameterList.add(newParameter); } @@ -392,11 +392,11 @@ public class GenerateMembersUtil { @NotNull private static PsiMethod createMethod(@NotNull JVMElementFactory factory, - @NotNull PsiMethod method) { + @NotNull PsiMethod method, PsiElement target) { if (method.isConstructor()) { - return factory.createConstructor(method.getName()); + return factory.createMethodFromText(method.getName() + "(){}", target); } - return factory.createMethod(method.getName(), PsiType.VOID); + return factory.createMethodFromText("void " + method.getName() + "(){}", target); } private static void substituteReturnType(@NotNull PsiManager manager, diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterSubstitution.java b/java/java-tests/testData/codeInsight/generateConstructor/afterSubstitution.java new file mode 100644 index 000000000000..f457956a2f25 --- /dev/null +++ b/java/java-tests/testData/codeInsight/generateConstructor/afterSubstitution.java @@ -0,0 +1,13 @@ +class Parent { + T field; + + public Parent(T field) { + this.field = field; + } +} + +class Child extends Parent { + Child(Integer field) { + super(field); + } +} diff --git a/java/java-tests/testData/codeInsight/generateConstructor/beforeSubstitution.java b/java/java-tests/testData/codeInsight/generateConstructor/beforeSubstitution.java new file mode 100644 index 000000000000..e760b9efb96c --- /dev/null +++ b/java/java-tests/testData/codeInsight/generateConstructor/beforeSubstitution.java @@ -0,0 +1,12 @@ +class Parent { + T field; + + public Parent(T field) { + this.field = field; + } +} + +class Child extends Parent { + + +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/GenerateConstructorTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/GenerateConstructorTest.java index 03bd38b013a2..1aeb16c810bd 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/GenerateConstructorTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/GenerateConstructorTest.java @@ -48,6 +48,7 @@ public class GenerateConstructorTest extends LightCodeInsightTestCase { } public void testFinalFieldPreselection() throws Exception { doTest(true); } + public void testSubstitution() throws Exception { doTest(true); } private void doTest() throws Exception { doTest(false);