diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/ConstructorBodyGenerator.java b/java/java-impl/src/com/intellij/codeInsight/generation/ConstructorBodyGenerator.java index 117bdd59a5c2..702fa7f1968a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/ConstructorBodyGenerator.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/ConstructorBodyGenerator.java @@ -26,6 +26,7 @@ import org.jetbrains.annotations.NotNull; public interface ConstructorBodyGenerator { LanguageExtension INSTANCE = new LanguageExtension("com.intellij.constructorBodyGenerator"); + @Deprecated void generateFieldInitialization(@NotNull StringBuilder buffer, @NotNull PsiField[] fields, @NotNull PsiParameter[] parameters); void generateSuperCallIfNeeded(@NotNull StringBuilder buffer, @NotNull PsiParameter[] parameters); diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/ConstructorBodyGeneratorBase.java b/java/java-impl/src/com/intellij/codeInsight/generation/ConstructorBodyGeneratorBase.java new file mode 100644 index 000000000000..0ddabe102497 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/generation/ConstructorBodyGeneratorBase.java @@ -0,0 +1,75 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInsight.generation; + +import com.intellij.psi.PsiField; +import com.intellij.psi.PsiParameter; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; + +public abstract class ConstructorBodyGeneratorBase implements ConstructorBodyGenerator { + public void generateFieldInitialization(@NotNull StringBuilder buffer, + @NotNull PsiField[] fields, + @NotNull PsiParameter[] parameters, + @NotNull Collection existingNames) { + for (int i = 0, length = fields.length; i < length; i++) { + String fieldName = fields[i].getName(); + String paramName = parameters[i].getName(); + if (existingNames.contains(fieldName)) { + buffer.append("this."); + } + buffer.append(fieldName); + buffer.append("="); + buffer.append(paramName); + appendSemicolon(buffer); + buffer.append("\n"); + } + } + + @Override + public void generateFieldInitialization(@NotNull StringBuilder buffer, @NotNull PsiField[] fields, @NotNull PsiParameter[] parameters) {} + + protected void appendSemicolon(@NotNull StringBuilder buffer) {} + + @Override + public void generateSuperCallIfNeeded(@NotNull StringBuilder buffer, @NotNull PsiParameter[] parameters) { + if (parameters.length > 0) { + buffer.append("super("); + for (int j = 0; j < parameters.length; j++) { + PsiParameter param = parameters[j]; + buffer.append(param.getName()); + if (j < parameters.length - 1) buffer.append(","); + } + buffer.append(")"); + appendSemicolon(buffer); + buffer.append("\n"); + } + } + + @Override + public StringBuilder start(StringBuilder buffer, @NotNull String name, @NotNull PsiParameter[] parameters) { + buffer.append("public ").append(name).append("("); + for (PsiParameter parameter : parameters) { + buffer.append(parameter.getType().getPresentableText()).append(' ').append(parameter.getName()).append(','); + } + if (parameters.length > 0) { + buffer.delete(buffer.length() - 1, buffer.length()); + } + buffer.append("){\n"); + return buffer; + } +} diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/ConstructorBodyGeneratorEx.java b/java/java-impl/src/com/intellij/codeInsight/generation/ConstructorBodyGeneratorEx.java new file mode 100644 index 000000000000..641f579565e1 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/generation/ConstructorBodyGeneratorEx.java @@ -0,0 +1,29 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInsight.generation; + +import com.intellij.psi.PsiField; +import com.intellij.psi.PsiParameter; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; + +public interface ConstructorBodyGeneratorEx { + void generateFieldInitialization(@NotNull StringBuilder buffer, + @NotNull PsiField[] fields, + @NotNull PsiParameter[] parameters, + @NotNull Collection existingNames); +} 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 e10b9a8a88f2..02736f9f5331 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java @@ -298,7 +298,19 @@ public class GenerateConstructorHandler extends GenerateMembersHandlerBase { if (isNotEnum) { generator.generateSuperCallIfNeeded(buffer, baseConstructor.getParameterList().getParameters()); } - generator.generateFieldInitialization(buffer, fields, fieldParams.toArray(new PsiParameter[fieldParams.size()])); + final PsiParameter[] parameters = fieldParams.toArray(new PsiParameter[fieldParams.size()]); + final List existingNames = ContainerUtil.map(dummyConstructor.getParameterList().getParameters(), new Function() { + @Override + public String fun(PsiParameter parameter) { + return parameter.getName(); + } + }); + if (generator instanceof ConstructorBodyGeneratorEx) { + ((ConstructorBodyGeneratorEx)generator).generateFieldInitialization(buffer, fields, parameters, existingNames); + } + else { + generator.generateFieldInitialization(buffer, fields, parameters); + } generator.finish(buffer); PsiMethod stub = factory.createMethodFromText(buffer.toString(), aClass); PsiCodeBlock original = constructor.getBody(), replacement = stub.getBody(); diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/JavaConstructorBodyWithSuperCallGenerator.java b/java/java-impl/src/com/intellij/codeInsight/generation/JavaConstructorBodyWithSuperCallGenerator.java index c56a086f47f9..fe0da00046a9 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/JavaConstructorBodyWithSuperCallGenerator.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/JavaConstructorBodyWithSuperCallGenerator.java @@ -15,55 +15,12 @@ */ package com.intellij.codeInsight.generation; -import com.intellij.psi.PsiField; -import com.intellij.psi.PsiParameter; import org.jetbrains.annotations.NotNull; -/** -* @author Max Medvedev -*/ -public class JavaConstructorBodyWithSuperCallGenerator implements ConstructorBodyGenerator { +public class JavaConstructorBodyWithSuperCallGenerator extends ConstructorBodyGeneratorBase { @Override - public void generateFieldInitialization(@NotNull StringBuilder buffer, - @NotNull PsiField[] fields, - @NotNull PsiParameter[] parameters) { - for (int i = 0, length = fields.length; i < length; i++) { - String fieldName = fields[i].getName(); - String paramName = parameters[i].getName(); - if (fieldName.equals(paramName)) { - buffer.append("this."); - } - buffer.append(fieldName); - buffer.append("="); - buffer.append(paramName); - buffer.append(";\n"); - } - } - - @Override - public void generateSuperCallIfNeeded(@NotNull StringBuilder buffer, @NotNull PsiParameter[] parameters) { - if (parameters.length > 0) { - buffer.append("super("); - for (int j = 0; j < parameters.length; j++) { - PsiParameter param = parameters[j]; - buffer.append(param.getName()); - if (j < parameters.length - 1) buffer.append(","); - } - buffer.append(");\n"); - } - } - - @Override - public StringBuilder start(StringBuilder buffer, @NotNull String name, @NotNull PsiParameter[] parameters) { - buffer.append("public ").append(name).append("("); - for (PsiParameter parameter : parameters) { - buffer.append(parameter.getType().getPresentableText()).append(' ').append(parameter.getName()).append(','); - } - if (parameters.length > 0) { - buffer.delete(buffer.length() - 1, buffer.length()); - } - buffer.append("){\n"); - return buffer; + protected void appendSemicolon(@NotNull StringBuilder buffer) { + buffer.append(";"); } @Override diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/NewJavaConstructorBodyWithSuperCallGenerator.java b/java/java-impl/src/com/intellij/codeInsight/generation/NewJavaConstructorBodyWithSuperCallGenerator.java new file mode 100644 index 000000000000..d185429af2c8 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/generation/NewJavaConstructorBodyWithSuperCallGenerator.java @@ -0,0 +1,19 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInsight.generation; + +public class NewJavaConstructorBodyWithSuperCallGenerator extends JavaConstructorBodyWithSuperCallGenerator implements ConstructorBodyGeneratorEx{ +} diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterSameNamedFields.java b/java/java-tests/testData/codeInsight/generateConstructor/afterSameNamedFields.java index b388bc331fc4..fb2ac805a858 100644 --- a/java/java-tests/testData/codeInsight/generateConstructor/afterSameNamedFields.java +++ b/java/java-tests/testData/codeInsight/generateConstructor/afterSameNamedFields.java @@ -3,7 +3,7 @@ public class Clas extends Clas2{ public Clas(int foo, int foo1) { super(foo); - foo = foo1; + this.foo = foo1; } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/dynamic/GrConstructorBodyGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/dynamic/GrConstructorBodyGenerator.java index 97f93356574c..55ef7ee6cc86 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/dynamic/GrConstructorBodyGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/dynamic/GrConstructorBodyGenerator.java @@ -15,58 +15,12 @@ */ package org.jetbrains.plugins.groovy.annotator.intentions.dynamic; -import com.intellij.codeInsight.generation.ConstructorBodyGenerator; -import com.intellij.psi.PsiField; -import com.intellij.psi.PsiParameter; -import org.jetbrains.annotations.NotNull; +import com.intellij.codeInsight.generation.ConstructorBodyGeneratorBase; +import com.intellij.codeInsight.generation.ConstructorBodyGeneratorEx; -/** - * @author Max Medvedev - */ -public class GrConstructorBodyGenerator implements ConstructorBodyGenerator { - @Override - public void generateFieldInitialization(@NotNull StringBuilder buffer, - @NotNull PsiField[] fields, - @NotNull PsiParameter[] parameters) { - for (int i = 0, length = fields.length; i < length; i++) { - String fieldName = fields[i].getName(); - String paramName = parameters[i].getName(); - if (fieldName.equals(paramName)) { - buffer.append("this."); - } - buffer.append(fieldName); - buffer.append("="); - buffer.append(paramName); - buffer.append("\n"); - } - } - - @Override - public void generateSuperCallIfNeeded(@NotNull StringBuilder buffer, @NotNull PsiParameter[] parameters) { - if (parameters.length > 0) { - buffer.append("super("); - for (int j = 0; j < parameters.length; j++) { - PsiParameter param = parameters[j]; - buffer.append(param.getName()); - if (j < parameters.length - 1) buffer.append(","); - } - buffer.append(")\n"); - } - } - - @Override - public StringBuilder start(StringBuilder buffer, @NotNull String name, @NotNull PsiParameter[] parameters) { - buffer.append("public ").append(name).append("("); - for (PsiParameter parameter : parameters) { - buffer.append(parameter.getType().getPresentableText()).append(' ').append(parameter.getName()).append(','); - } - if (parameters.length > 0) { - buffer.delete(buffer.length() - 1, buffer.length()); - } - buffer.append("){\n"); - return buffer; - } +public class GrConstructorBodyGenerator extends ConstructorBodyGeneratorBase implements ConstructorBodyGeneratorEx{ + @Override public void finish(StringBuilder buffer) { buffer.append('}'); diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 8c0009d4fb70..50d8d16fa25c 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -1159,7 +1159,7 @@ - +