diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMemberNameCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMemberNameCompletionContributor.java index ab86b701c3fc..5908a230a32d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMemberNameCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMemberNameCompletionContributor.java @@ -17,6 +17,7 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.TailType; import com.intellij.codeInsight.completion.util.ParenthesesInsertHandler; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.codeInsight.lookup.*; import com.intellij.codeInsight.template.impl.TemplateManagerImpl; import com.intellij.featureStatistics.FeatureUsageTracker; @@ -394,7 +395,7 @@ public class JavaMemberNameCompletionContributor extends CompletionContributor { if (fieldType.equals(varType)) { final String getterName = PropertyUtil.suggestGetterName(field); if ((psiClass.findMethodsByName(getterName, true).length == 0 || - psiClass.findMethodBySignature(PropertyUtil.generateGetterPrototype(field), true) == null)) { + psiClass.findMethodBySignature(GenerateMembersUtil.generateGetterPrototype(field), true) == null)) { propertyHandlers.add(getterName); } } @@ -402,7 +403,7 @@ public class JavaMemberNameCompletionContributor extends CompletionContributor { if (PsiType.VOID.equals(varType)) { final String setterName = PropertyUtil.suggestSetterName(field); if ((psiClass.findMethodsByName(setterName, true).length == 0 || - psiClass.findMethodBySignature(PropertyUtil.generateSetterPrototype(field), true) == null)) { + psiClass.findMethodBySignature(GenerateMembersUtil.generateSetterPrototype(field), true) == null)) { propertyHandlers.add(setterName); } } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateGetterSetterPropertyFromUsageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateGetterSetterPropertyFromUsageFix.java index da7dc084edc6..749fcb623078 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateGetterSetterPropertyFromUsageFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateGetterSetterPropertyFromUsageFix.java @@ -57,13 +57,13 @@ public class CreateGetterSetterPropertyFromUsageFix extends CreatePropertyFromUs @Override protected void beforeTemplateFinished(PsiClass aClass, PsiField field) { - PsiMethod getterPrototype = GenerateMembersUtil.generateGetterPrototype(field); + PsiMethod getterPrototype = GenerateMembersUtil.generateSimpleGetterPrototype(field); if (aClass.findMethodsBySignature(getterPrototype, false).length == 0) { aClass.add(getterPrototype); } - PsiMethod setterPrototype = GenerateMembersUtil.generateSetterPrototype(field); + PsiMethod setterPrototype = GenerateMembersUtil.generateSimpleSetterPrototype(field); if (aClass.findMethodsBySignature(setterPrototype, false).length == 0) { aClass.add(setterPrototype); } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreatePropertyFromUsageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreatePropertyFromUsageFix.java index d1a6031c8bf8..ac2e35b9b776 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreatePropertyFromUsageFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreatePropertyFromUsageFix.java @@ -227,14 +227,14 @@ public class CreatePropertyFromUsageFix extends CreateFromUsageBaseFix implement PsiElement typeReference; PsiCodeBlock body; if (callText.startsWith(GET_PREFIX) || callText.startsWith(IS_PREFIX)) { - accessor = (PsiMethod)targetClass.add(GenerateMembersUtil.generateGetterPrototype(field)); + accessor = (PsiMethod)targetClass.add(GenerateMembersUtil.generateSimpleGetterPrototype(field)); body = accessor.getBody(); LOG.assertTrue(body != null, accessor.getText()); fieldReference = ((PsiReturnStatement)body.getStatements()[0]).getReturnValue(); typeReference = accessor.getReturnTypeElement(); } else { - accessor = (PsiMethod)targetClass.add(PropertyUtil.generateSetterPrototype(field, targetClass)); + accessor = (PsiMethod)targetClass.add(GenerateMembersUtil.generateSimpleSetterPrototype(field, targetClass)); body = accessor.getBody(); LOG.assertTrue(body != null, accessor.getText()); PsiAssignmentExpression expr = (PsiAssignmentExpression)((PsiExpressionStatement)body.getStatements()[0]).getExpression(); diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateGetterAndSetterHandler.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateGetterAndSetterHandler.java index 41062a1b18d1..d54c3b6d900a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateGetterAndSetterHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateGetterAndSetterHandler.java @@ -16,9 +16,13 @@ package com.intellij.codeInsight.generation; import com.intellij.codeInsight.CodeInsightBundle; +import com.intellij.openapi.project.Project; import com.intellij.psi.PsiClass; import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.Nullable; +import javax.swing.*; +import java.awt.*; import java.util.ArrayList; import java.util.Collections; @@ -30,6 +34,15 @@ public class GenerateGetterAndSetterHandler extends GenerateGetterSetterHandlerB super(CodeInsightBundle.message("generate.getter.setter.title")); } + @Nullable + @Override + protected JComponent getHeaderPanel(Project project) { + final JPanel panel = new JPanel(new BorderLayout(2, 2)); + panel.add(getHeaderPanel(project, GetterTemplatesManager.getInstance(), CodeInsightBundle.message("generate.getter.template")), BorderLayout.NORTH); + panel.add(getHeaderPanel(project, SetterTemplatesManager.getInstance(), CodeInsightBundle.message("generate.setter.template")), BorderLayout.SOUTH); + return panel; + } + @Override public GenerationInfo[] generateMemberPrototypes(PsiClass aClass, ClassMember original) throws IncorrectOperationException { ArrayList array = new ArrayList(); diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateGetterHandler.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateGetterHandler.java index 1306e20718ae..fc8a491e9841 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateGetterHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateGetterHandler.java @@ -16,9 +16,24 @@ package com.intellij.codeInsight.generation; import com.intellij.codeInsight.CodeInsightBundle; +import com.intellij.openapi.options.ShowSettingsUtil; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.ComboBox; +import com.intellij.openapi.ui.ComponentWithBrowseButton; import com.intellij.psi.PsiClass; +import com.intellij.ui.ListCellRendererWrapper; import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.java.generate.template.TemplateResource; +import org.jetbrains.java.generate.template.TemplatesManager; +import org.jetbrains.java.generate.view.TemplatesPanel; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Collection; public class GenerateGetterHandler extends GenerateGetterSetterHandlerBase { public GenerateGetterHandler() { @@ -33,6 +48,12 @@ public class GenerateGetterHandler extends GenerateGetterSetterHandlerBase { return super.chooseOriginalMembers(aClass, project); } + @Nullable + @Override + protected JComponent getHeaderPanel(final Project project) { + return getHeaderPanel(project, GetterTemplatesManager.getInstance(), CodeInsightBundle.message("generate.equals.hashcode.template")); + } + @Override protected GenerationInfo[] generateMemberPrototypes(PsiClass aClass, ClassMember original) throws IncorrectOperationException { if (original instanceof PropertyClassMember) { diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateGetterSetterHandlerBase.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateGetterSetterHandlerBase.java index 755b0bb38ac6..6148635cf2bb 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateGetterSetterHandlerBase.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateGetterSetterHandlerBase.java @@ -19,17 +19,28 @@ import com.intellij.codeInsight.hint.HintManager; import com.intellij.lang.StdLanguages; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.options.ShowSettingsUtil; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.ComboBox; +import com.intellij.openapi.ui.ComponentWithBrowseButton; import com.intellij.openapi.util.Condition; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiEnumConstant; import com.intellij.psi.PsiField; +import com.intellij.ui.ListCellRendererWrapper; import com.intellij.util.IncorrectOperationException; import com.intellij.util.NotNullFunction; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.java.generate.template.TemplateResource; +import org.jetbrains.java.generate.template.TemplatesManager; +import org.jetbrains.java.generate.view.TemplatesPanel; +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -73,6 +84,46 @@ public abstract class GenerateGetterSetterHandlerBase extends GenerateMembersHan return chooseMembers(allMembers, false, false, project, editor); } + protected static JComponent getHeaderPanel(final Project project, final TemplatesManager templatesManager, String templatesTitle) { + final JPanel panel = new JPanel(new BorderLayout()); + final JLabel templateChooserLabel = new JLabel(templatesTitle); + panel.add(templateChooserLabel, BorderLayout.WEST); + final ComboBox comboBox = new ComboBox(); + templateChooserLabel.setLabelFor(comboBox); + comboBox.setRenderer(new ListCellRendererWrapper() { + @Override + public void customize(JList list, TemplateResource value, int index, boolean selected, boolean hasFocus) { + setText(value.getName()); + } + }); + final ComponentWithBrowseButton comboBoxWithBrowseButton = + new ComponentWithBrowseButton(comboBox, new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + final TemplatesPanel ui = new TemplatesPanel(project, templatesManager); + ui.selectNodeInTree(templatesManager.getDefaultTemplate()); + if (ShowSettingsUtil.getInstance().editConfigurable(panel, ui)) { + setComboboxModel(templatesManager, comboBox); + } + }}); + + setComboboxModel(templatesManager, comboBox); + comboBox.addActionListener(new ActionListener() { + public void actionPerformed(@NotNull final ActionEvent M) { + templatesManager.setDefaultTemplate((TemplateResource)comboBox.getSelectedItem()); + } + }); + + panel.add(comboBoxWithBrowseButton, BorderLayout.CENTER); + return panel; + } + + private static void setComboboxModel(TemplatesManager templatesManager, ComboBox comboBox) { + final Collection templates = templatesManager.getAllTemplates(); + comboBox.setModel(new DefaultComboBoxModel(templates.toArray(new TemplateResource[templates.size()]))); + comboBox.setSelectedItem(templatesManager.getDefaultTemplate()); + } + @Override protected abstract String getNothingFoundMessage(); protected abstract String getNothingAcceptedMessage(); diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersHandlerBase.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersHandlerBase.java index 1add7cceb9f5..2637409963bc 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersHandlerBase.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersHandlerBase.java @@ -45,6 +45,7 @@ import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.java.generate.exception.GenerateCodeException; +import org.jetbrains.java.generate.template.TemplatesManager; import javax.swing.*; import java.util.ArrayList; @@ -257,12 +258,17 @@ public abstract class GenerateMembersHandlerBase implements CodeInsightActionHan boolean allowEmptySelection, boolean copyJavadocCheckbox, Project project) { - MemberChooser chooser = new MemberChooser(members, allowEmptySelection, true, project); + MemberChooser chooser = new MemberChooser(members, allowEmptySelection, true, project, false, getHeaderPanel(project)); chooser.setTitle(myChooserTitle); chooser.setCopyJavadocVisible(copyJavadocCheckbox); return chooser; } + @Nullable + protected JComponent getHeaderPanel(Project project) { + return null; + } + @NotNull protected List generateMemberPrototypes(PsiClass aClass, ClassMember[] members) throws IncorrectOperationException { ArrayList array = new ArrayList(); 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 9c9034dc7e94..f1fb3a07ee93 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java @@ -51,6 +51,9 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.java.generate.GenerationUtil; +import org.jetbrains.java.generate.element.GenerationHelper; +import org.jetbrains.java.generate.template.TemplatesManager; import java.util.*; @@ -584,14 +587,77 @@ public class GenerateMembersUtil { } } - @Nullable + + //java bean getters/setters + public static PsiMethod generateSimpleGetterPrototype(@NotNull PsiField field) { + return generatePrototype(field, PropertyUtil.generateGetterPrototype(field)); + } + + public static PsiMethod generateSimpleSetterPrototype(@NotNull PsiField field) { + return generatePrototype(field, PropertyUtil.generateSetterPrototype(field)); + } + + public static PsiMethod generateSimpleSetterPrototype(PsiField field, PsiClass targetClass) { + return generatePrototype(field, PropertyUtil.generateSetterPrototype(field, targetClass)); + } + + //custom getters/setters + public static String suggestGetterName(PsiField field) { + final PsiMethod prototype = generateGetterPrototype(field); + return prototype != null ? prototype.getName() : PropertyUtil.suggestGetterName(field); + } + + public static String suggestGetterName(String name, PsiType type, Project project) { + return suggestGetterName(JavaPsiFacade.getElementFactory(project).createField(name, type instanceof PsiEllipsisType ? ((PsiEllipsisType)type).toArrayType() : type)); + } + + public static String suggestSetterName(PsiField field) { + final PsiMethod prototype = generateSetterPrototype(field); + return prototype != null ? prototype.getName() : PropertyUtil.suggestSetterName(field); + } + + public static String suggestSetterName(String name, PsiType type, Project project) { + return suggestSetterName(JavaPsiFacade.getElementFactory(project).createField(name, type instanceof PsiEllipsisType ? ((PsiEllipsisType)type).toArrayType() : type)); + } + public static PsiMethod generateGetterPrototype(@NotNull PsiField field) { - return setVisibility(field, annotateOnOverrideImplement(field.getContainingClass(), PropertyUtil.generateGetterPrototype(field))); + return generatePrototype(field, field.getContainingClass(), GetterTemplatesManager.getInstance()); + } + + public static PsiMethod generateSetterPrototype(@NotNull PsiField field) { + return generateSetterPrototype(field, field.getContainingClass()); + } + + public static PsiMethod generateSetterPrototype(@NotNull PsiField field, PsiClass aClass) { + return generatePrototype(field, aClass, SetterTemplatesManager.getInstance()); + } + + private static PsiMethod generatePrototype(@NotNull PsiField field, + PsiClass psiClass, + TemplatesManager templatesManager) { + Project project = field.getProject(); + PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory(); + final String methodText = GenerationUtil.velocityGenerateCode(psiClass, Collections.singletonList(field), + new HashMap(), + templatesManager.getDefaultTemplate().getTemplate(), 0, false); + + PsiMethod result; + try { + result = factory.createMethodFromText(methodText, psiClass); + } + catch (IncorrectOperationException e) { + LOG.info(e); + result = templatesManager instanceof GetterTemplatesManager ? PropertyUtil.generateGetterPrototype(field) + : PropertyUtil.generateSetterPrototype(field); + } + result = (PsiMethod)CodeStyleManager.getInstance(project).reformat(result); + PropertyUtil.annotateWithNullableStuff(field, result); + return generatePrototype(field, result); } @Nullable - public static PsiMethod generateSetterPrototype(@NotNull PsiField field) { - return setVisibility(field, annotateOnOverrideImplement(field.getContainingClass(), PropertyUtil.generateSetterPrototype(field))); + private static PsiMethod generatePrototype(@NotNull PsiField field, PsiMethod result) { + return setVisibility(field, annotateOnOverrideImplement(field.getContainingClass(), result)); } @Contract("_, null -> null") diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateSetterHandler.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateSetterHandler.java index 76a2251807ab..f4254657bcb9 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateSetterHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateSetterHandler.java @@ -16,8 +16,12 @@ package com.intellij.codeInsight.generation; import com.intellij.codeInsight.CodeInsightBundle; +import com.intellij.openapi.project.Project; import com.intellij.psi.PsiClass; import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; public class GenerateSetterHandler extends GenerateGetterSetterHandlerBase { @@ -25,6 +29,12 @@ public class GenerateSetterHandler extends GenerateGetterSetterHandlerBase { super(CodeInsightBundle.message("generate.setter.fields.chooser.title")); } + @Nullable + @Override + protected JComponent getHeaderPanel(final Project project) { + return getHeaderPanel(project, SetterTemplatesManager.getInstance(), CodeInsightBundle.message("generate.equals.hashcode.template")); + } + @Override protected GenerationInfo[] generateMemberPrototypes(PsiClass aClass, ClassMember original) throws IncorrectOperationException { if (original instanceof PropertyClassMember) { diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GetterTemplatesManager.java b/java/java-impl/src/com/intellij/codeInsight/generation/GetterTemplatesManager.java new file mode 100644 index 000000000000..d7c8d645ea87 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GetterTemplatesManager.java @@ -0,0 +1,57 @@ +/* + * 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.openapi.components.ServiceManager; +import com.intellij.openapi.components.State; +import com.intellij.openapi.components.Storage; +import com.intellij.openapi.components.StoragePathMacros; +import org.jetbrains.java.generate.exception.TemplateResourceException; +import org.jetbrains.java.generate.template.TemplateResource; +import org.jetbrains.java.generate.template.TemplatesManager; + +import java.io.IOException; + +@State( + name = "GetterTemplates", + storages = { + @Storage( + file = StoragePathMacros.APP_CONFIG + "/getterTemplates.xml" + )} +) +public class GetterTemplatesManager extends TemplatesManager { + private static final String DEFAULT = "defaultGetter.vm"; + + public static GetterTemplatesManager getInstance() { + return ServiceManager.getService(GetterTemplatesManager.class); + } + + @Override + public TemplateResource[] getDefaultTemplates() { + try { + return new TemplateResource[]{ + new TemplateResource("IntelliJ Default", readFile(DEFAULT), true), + }; + } + catch (IOException e) { + throw new TemplateResourceException("Error loading default templates", e); + } + } + + protected static String readFile(String resource) throws IOException { + return readFile(resource, GetterTemplatesManager.class); + } +} diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/SetterTemplatesManager.java b/java/java-impl/src/com/intellij/codeInsight/generation/SetterTemplatesManager.java new file mode 100644 index 000000000000..8c474d500ac3 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/generation/SetterTemplatesManager.java @@ -0,0 +1,59 @@ +/* + * 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.openapi.components.ServiceManager; +import com.intellij.openapi.components.State; +import com.intellij.openapi.components.Storage; +import com.intellij.openapi.components.StoragePathMacros; +import org.jetbrains.java.generate.exception.TemplateResourceException; +import org.jetbrains.java.generate.template.TemplateResource; +import org.jetbrains.java.generate.template.TemplatesManager; + +import java.io.IOException; + +@State( + name = "SetterTemplates", + storages = { + @Storage( + file = StoragePathMacros.APP_CONFIG + "/setterTemplates.xml" + )} +) +public class SetterTemplatesManager extends TemplatesManager { + private static final String DEFAULT = "defaultSetter.vm"; + private static final String BUILDER = "builderSetter.vm"; + + public static TemplatesManager getInstance() { + return ServiceManager.getService(SetterTemplatesManager.class); + } + + @Override + public TemplateResource[] getDefaultTemplates() { + try { + return new TemplateResource[]{ + new TemplateResource("IntelliJ Default", readFile(DEFAULT), true), + new TemplateResource("Builder", readFile(BUILDER), true), + }; + } + catch (IOException e) { + throw new TemplateResourceException("Error loading default templates", e); + } + } + + protected static String readFile(String resource) throws IOException { + return readFile(resource, SetterTemplatesManager.class); + } +} diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/builderSetter.vm b/java/java-impl/src/com/intellij/codeInsight/generation/builderSetter.vm new file mode 100644 index 000000000000..257ea698d6db --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/generation/builderSetter.vm @@ -0,0 +1,20 @@ +#set($paramName = $helper.getParamName($field, $project)) +public ## +#if($field.modifierStatic) +static void ## +#else + $classname ## +#end +$helper.suggestSetterName($field, $project)($field.type $paramName) { +#if ($field.name == $paramName) + #if (!$field.modifierStatic) + this.## + #else + $classname.## + #end +#end +$field.name = $paramName; +#if(!$field.modifierStatic) +return this; +#end +} \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/defaultGetter.vm b/java/java-impl/src/com/intellij/codeInsight/generation/defaultGetter.vm new file mode 100644 index 000000000000..780a038f6a71 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/generation/defaultGetter.vm @@ -0,0 +1,7 @@ +public ## +#if($field.modifierStatic) + static ## +#end +$field.type $helper.suggestGetterName($field, $project)() { + return $field.name; +} \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/defaultSetter.vm b/java/java-impl/src/com/intellij/codeInsight/generation/defaultSetter.vm new file mode 100644 index 000000000000..8ce00933ee66 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/generation/defaultSetter.vm @@ -0,0 +1,15 @@ +#set($paramName = $helper.getParamName($field, $project)) +public ## +#if($field.modifierStatic) + static ## +#end +void $helper.suggestSetterName($field, $project)($field.type $paramName) { + #if ($field.name == $paramName) + #if (!$field.modifierStatic) + this.## + #else + $classname.## + #end + #end + $field.name = $paramName; +} \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/refactoring/encapsulateFields/JavaEncapsulateFieldHelper.java b/java/java-impl/src/com/intellij/refactoring/encapsulateFields/JavaEncapsulateFieldHelper.java index e9d597449e2f..1430a4b98fb7 100644 --- a/java/java-impl/src/com/intellij/refactoring/encapsulateFields/JavaEncapsulateFieldHelper.java +++ b/java/java-impl/src/com/intellij/refactoring/encapsulateFields/JavaEncapsulateFieldHelper.java @@ -313,13 +313,13 @@ public class JavaEncapsulateFieldHelper extends EncapsulateFieldHelper { @Override @NotNull public String suggestSetterName(@NotNull PsiField field) { - return PropertyUtil.suggestSetterName(field); + return GenerateMembersUtil.suggestSetterName(field); } @Override @NotNull public String suggestGetterName(@NotNull PsiField field) { - return PropertyUtil.suggestGetterName(field); + return GenerateMembersUtil.suggestGetterName(field); } @Override diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java index c1931273df80..0fc67c480cc0 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -21,6 +21,7 @@ import com.intellij.codeInsight.ExceptionUtil; import com.intellij.codeInsight.NullableNotNullManager; import com.intellij.codeInsight.daemon.impl.analysis.JavaHighlightUtil; import com.intellij.codeInsight.daemon.impl.quickfix.AnonymousTargetClassPreselectionUtil; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.codeInsight.highlighting.HighlightManager; import com.intellij.codeInsight.intention.impl.AddNotNullAnnotationFix; import com.intellij.codeInsight.intention.impl.AddNullableAnnotationFix; @@ -669,7 +670,7 @@ public class ExtractMethodProcessor implements MatchProvider { final List getters = new ArrayList(ContainerUtil.map(initialMethodNames, new Function() { @Override public String fun(String propertyName) { - return PropertyUtil.suggestGetterName(propertyName, myReturnType); + return GenerateMembersUtil.suggestGetterName(propertyName, myReturnType, myProject); } })); ContainerUtil.addIfNotNull(nameByComment, getters); diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java index 4ff65051930a..0b7834c4a122 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java @@ -785,8 +785,9 @@ public class ExtractMethodObjectProcessor extends BaseRefactoringProcessor { PsiStatement st = null; final String pureName = getPureName(variable); final int varIdxInOutput = ArrayUtil.find(myOutputVariables, variable); - final String getterName = varIdxInOutput > -1 && myOutputFields[varIdxInOutput] != null ? PropertyUtil.suggestGetterName( - myOutputFields[varIdxInOutput]) : PropertyUtil.suggestGetterName(pureName, variable.getType()); + final String getterName = varIdxInOutput > -1 && myOutputFields[varIdxInOutput] != null + ? GenerateMembersUtil.suggestGetterName(myOutputFields[varIdxInOutput]) + : GenerateMembersUtil.suggestGetterName(pureName, variable.getType(), myProject); if (isDeclaredInside(variable)) { st = myElementFactory.createStatementFromText( variable.getType().getCanonicalText() + " " + name + " = " + object + "." + getterName + "();", @@ -841,7 +842,8 @@ public class ExtractMethodObjectProcessor extends BaseRefactoringProcessor { if (expression.resolve() == null) { final PsiVariable variable = outVarsNames.get(expression.getReferenceName()); if (variable != null) { - final String call2Getter = objectName + "." + PropertyUtil.suggestGetterName(getPureName(variable), variable.getType()) + "()"; + final String call2Getter = objectName + "." + GenerateMembersUtil.suggestGetterName(getPureName(variable), variable.getType(), + myProject) + "()"; final PsiExpression callToGetter = myElementFactory.createExpressionFromText(call2Getter, variable); replaceMap.put(expression, callToGetter); } diff --git a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java index 30300db5c322..3497ad5e4b01 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java @@ -597,7 +597,7 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor { final String qualifiedName = StringUtil.getQualifiedName(newPackageName, newClassName); @NonNls String getter = null; if (myGenerateAccessors) { - getter = PropertyUtil.suggestGetterName(field); + getter = GenerateMembersUtil.suggestGetterName(field); } else { final PsiMethod fieldGetter = PropertyUtil.findPropertyGetter(sourceClass, field.getName(), false, false); if (fieldGetter != null && isInMovedElement(fieldGetter)) { @@ -607,7 +607,7 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor { @NonNls String setter = null; if (myGenerateAccessors) { - setter = PropertyUtil.suggestSetterName(field); + setter = GenerateMembersUtil.suggestSetterName(field); } else { final PsiMethod fieldSetter = PropertyUtil.findPropertySetter(sourceClass, field.getName(), false, false); if (fieldSetter != null && isInMovedElement(fieldSetter)) { @@ -871,11 +871,11 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor { } private boolean hasGetter(final PsiField field) { - return hasGetterOrSetter(sourceClass.findMethodsBySignature(PropertyUtil.generateGetterPrototype(field), false)); + return hasGetterOrSetter(sourceClass.findMethodsBySignature(GenerateMembersUtil.generateGetterPrototype(field), false)); } private boolean hasSetter(final PsiField field) { - return hasGetterOrSetter(sourceClass.findMethodsBySignature(PropertyUtil.generateSetterPrototype(field), false)); + return hasGetterOrSetter(sourceClass.findMethodsBySignature(GenerateMembersUtil.generateSetterPrototype(field), false)); } protected abstract boolean hasGetterOrSetter(final PsiMethod[] getters); diff --git a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractEnumProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractEnumProcessor.java index 197a0372a198..3d75c880378e 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractEnumProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractEnumProcessor.java @@ -20,12 +20,12 @@ */ package com.intellij.refactoring.extractclass; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.util.PropertyUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtilCore; import com.intellij.refactoring.extractclass.usageInfo.ReplaceStaticVariableAccess; @@ -64,7 +64,7 @@ public class ExtractEnumProcessor { @Override public void fixUsage() throws IncorrectOperationException { final PsiReferenceExpression expression = (PsiReferenceExpression)element; - final String link = PropertyUtil.suggestGetterName("value", expression.getType()) + "()"; + final String link = GenerateMembersUtil.suggestGetterName("value", expression.getType(), myProject) + "()"; MutationUtils.replaceExpression(expression.getReferenceName() + "." + link, expression); } }); diff --git a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractedClassBuilder.java b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractedClassBuilder.java index 5f1da27f429f..34a1de1a03c1 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractedClassBuilder.java +++ b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractedClassBuilder.java @@ -15,6 +15,7 @@ */ package com.intellij.refactoring.extractclass; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; @@ -169,7 +170,7 @@ class ExtractedClassBuilder { } private String getterName() {//todo unique getterName: see also com.intellij.refactoring.extractclass.usageInfo.ReplaceStaticVariableAccess - return PropertyUtil.suggestGetterName("value", myEnumParameterType); + return GenerateMembersUtil.suggestGetterName("value", myEnumParameterType, myProject); } private boolean hasEnumConstants() { @@ -286,12 +287,12 @@ class ExtractedClassBuilder { field.accept(new Mutator(out)); if (myFieldsNeedingGetter != null && myFieldsNeedingGetter.contains(field)) { - out.append(PropertyUtil.generateGetterPrototype(field).getText()); + out.append(GenerateMembersUtil.generateGetterPrototype(field).getText()); out.append("\n"); } if (myFieldsNeedingSetters != null && myFieldsNeedingSetters.contains(field)) { - out.append(PropertyUtil.generateSetterPrototype(field).getText()); + out.append(GenerateMembersUtil.generateSetterPrototype(field).getText()); out.append("\n"); } } @@ -433,7 +434,7 @@ class ExtractedClassBuilder { } } else { - out.append(backPointerName + '.' + PropertyUtil.suggestGetterName(field) + "()"); + out.append(backPointerName + '.' + GenerateMembersUtil.suggestGetterName(field) + "()"); } } } @@ -476,16 +477,16 @@ class ExtractedClassBuilder { private void delegate(final PsiExpression rhs, final PsiField field, final PsiJavaToken sign, final IElementType tokenType, final String fieldName) { if (tokenType.equals(JavaTokenType.EQ)) { - final String setterName = PropertyUtil.suggestSetterName(field); + final String setterName = GenerateMembersUtil.suggestSetterName(field); out.append(fieldName + '.' + setterName + '('); rhs.accept(this); out.append(')'); } else { final String operator = sign.getText().substring(0, sign.getTextLength() - 1); - final String setterName = PropertyUtil.suggestSetterName(field); + final String setterName = GenerateMembersUtil.suggestSetterName(field); out.append(fieldName + '.' + setterName + '('); - final String getterName = PropertyUtil.suggestGetterName(field); + final String getterName = GenerateMembersUtil.suggestGetterName(field); out.append(fieldName + '.' + getterName + "()"); out.append(operator); rhs.accept(this); @@ -521,10 +522,10 @@ class ExtractedClassBuilder { assert field != null; if (!field.hasModifierProperty(PsiModifier.STATIC)) { out.append(backPointerName + - '.' + PropertyUtil.suggestSetterName(field) + + '.' + GenerateMembersUtil.suggestSetterName(field) + '(' + backPointerName + - '.' + PropertyUtil.suggestGetterName(field) + + '.' + GenerateMembersUtil.suggestGetterName(field) + "()" + operator + "1)"); diff --git a/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/ReplaceStaticVariableAccess.java b/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/ReplaceStaticVariableAccess.java index 90f0ef8c3ae7..21dd70c9d0d0 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/ReplaceStaticVariableAccess.java +++ b/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/ReplaceStaticVariableAccess.java @@ -15,9 +15,9 @@ */ package com.intellij.refactoring.extractclass.usageInfo; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.*; -import com.intellij.psi.util.PropertyUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.psi.MutationUtils; import com.intellij.refactoring.util.FixableUsageInfo; @@ -46,7 +46,7 @@ public class ReplaceStaticVariableAccess extends FixableUsageInfo { } } final boolean replaceWithGetEnumValue = myEnumConstant && !alreadyMigratedToEnum(); - final String link = replaceWithGetEnumValue ? "." + PropertyUtil.suggestGetterName("value", expression.getType()) + "()" : ""; + final String link = replaceWithGetEnumValue ? "." + GenerateMembersUtil.suggestGetterName("value", expression.getType(), expression.getProject()) + "()" : ""; MutationUtils.replaceExpression(delegateClass + '.' + expression.getReferenceName() + link, expression); } diff --git a/java/java-impl/src/com/intellij/refactoring/inheritanceToDelegation/InheritanceToDelegationProcessor.java b/java/java-impl/src/com/intellij/refactoring/inheritanceToDelegation/InheritanceToDelegationProcessor.java index f71cb8c52dab..3884a6eb3026 100644 --- a/java/java-impl/src/com/intellij/refactoring/inheritanceToDelegation/InheritanceToDelegationProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inheritanceToDelegation/InheritanceToDelegationProcessor.java @@ -118,7 +118,7 @@ public class InheritanceToDelegationProcessor extends BaseRefactoringProcessor { myFieldName = fieldName; final String propertyName = JavaCodeStyleManager.getInstance(myProject).variableNameToPropertyName(myFieldName, VariableKind.FIELD); - myGetterName = PropertyUtil.suggestGetterName(propertyName, myBaseClassType); + myGetterName = GenerateMembersUtil.suggestGetterName(propertyName, myBaseClassType, myProject); myGenerateGetter = generateGetter; myDelegatedInterfaces = new LinkedHashSet(); diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java index 168e0b71d708..215d4cbe41f1 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterProcessor.java @@ -17,6 +17,7 @@ package com.intellij.refactoring.introduceParameter; import com.intellij.analysis.AnalysisScope; import com.intellij.codeInsight.ChangeContextUtil; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.lang.findUsages.DescriptiveNameUtil; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; @@ -278,7 +279,7 @@ public class IntroduceParameterProcessor extends BaseRefactoringProcessor implem //check getter access instead final PsiClass psiClass = ((PsiField)element).getContainingClass(); LOG.assertTrue(psiClass != null); - final PsiMethod method = psiClass.findMethodBySignature(PropertyUtil.generateGetterPrototype((PsiField)element), true); + final PsiMethod method = psiClass.findMethodBySignature(GenerateMembersUtil.generateGetterPrototype((PsiField)element), true); if (method != null){ element = method; } diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/Util.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/Util.java index 09516b003574..fd20e1b1e67c 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/Util.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/Util.java @@ -24,6 +24,7 @@ */ package com.intellij.refactoring.introduceParameter; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.psi.*; import com.intellij.psi.search.searches.OverridingMethodsSearch; import com.intellij.psi.search.searches.ReferencesSearch; @@ -100,7 +101,7 @@ public class Util { if (e instanceof PsiField) { PsiField psiField = (PsiField)e; - PsiMethod getterPrototype = PropertyUtil.generateGetterPrototype(psiField); + PsiMethod getterPrototype = GenerateMembersUtil.generateGetterPrototype(psiField); PsiMethod getter = psiField.getContainingClass().findMethodBySignature(getterPrototype, true); diff --git a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectProcessor.java b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectProcessor.java index 5fdf3f7bc0d4..54335f2363f9 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectProcessor.java @@ -15,6 +15,7 @@ */ package com.intellij.refactoring.introduceparameterobject; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.ide.highlighter.JavaFileType; import com.intellij.ide.util.PackageUtil; import com.intellij.openapi.diagnostic.Logger; @@ -211,12 +212,12 @@ public class IntroduceParameterObjectProcessor extends FixableUsagesRefactoringP @NonNls String getter = parameterChunk != null ? parameterChunk.getter : null; if (getter == null) { - getter = PropertyUtil.suggestGetterName(replacedParameter.getName(), replacedParameter.getType()); + getter = GenerateMembersUtil.suggestGetterName(replacedParameter.getName(), replacedParameter.getType(), myProject); paramsNeedingGetters.add(replacedParameter); } @NonNls String setter = parameterChunk != null ? parameterChunk.setter : null; if (setter == null) { - setter = PropertyUtil.suggestSetterName(replacedParameter.getName()); + setter = GenerateMembersUtil.suggestSetterName(replacedParameter.getName(), replacedParameter.getType(), myProject); } if (RefactoringUtil.isPlusPlusOrMinusMinus(paramUsage.getParent())) { usages.add(new ReplaceParameterIncrementDecrement(paramUsage, fixedParamName, setter, getter)); diff --git a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/ParameterObjectBuilder.java b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/ParameterObjectBuilder.java index d4e26bdb6a1e..edf33d5b1e82 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/ParameterObjectBuilder.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/ParameterObjectBuilder.java @@ -15,6 +15,7 @@ */ package com.intellij.refactoring.introduceparameterobject; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; @@ -46,7 +47,9 @@ class ParameterObjectBuilder { } public void addField(PsiParameter variable, String name, PsiType type, boolean setterRequired) { - final ParameterSpec field = new ParameterSpec(variable, name, type, setterRequired); + final String propertyName = myJavaCodeStyleManager.variableNameToPropertyName(name, VariableKind.PARAMETER); + final ParameterSpec field = new ParameterSpec(variable, myJavaCodeStyleManager.propertyNameToVariableName(propertyName, VariableKind.FIELD), + type instanceof PsiEllipsisType ? ((PsiEllipsisType)type).toArrayType() : type, setterRequired); fields.add(field); } @@ -110,27 +113,7 @@ class ParameterObjectBuilder { if (!field.isSetterRequired()) { return; } - final PsiParameter parameter = field.getParameter(); - final PsiType type = field.getType(); - final String typeText; - if (parameter.isVarArgs()) { - typeText = ((PsiArrayType) type).getComponentType().getCanonicalText() + "..."; - } else { - typeText = type.getCanonicalText(); - } - final String name = calculateStrippedName(field.getName()); - final String capitalizedName = StringUtil.capitalize(name); - final String parameterName = - myJavaCodeStyleManager.propertyNameToVariableName(name, VariableKind.PARAMETER); - - out.append("\tpublic void set" + capitalizedName + '('); - outputAnnotationString(parameter, out); - out.append(CodeStyleSettingsManager.getSettings(myProject).GENERATE_FINAL_PARAMETERS?"final " : ""); - out.append(' ' +typeText + ' ' + parameterName + ")\n"); - out.append("\t{\n"); - final String fieldName = myJavaCodeStyleManager.propertyNameToVariableName(name, VariableKind.FIELD); - generateFieldAssignment(out, parameterName, fieldName); - out.append("\t}\n"); + out.append(GenerateMembersUtil.generateSetterPrototype(JavaPsiFacade.getElementFactory(myProject).createField(field.getName(), field.getType())).getText()); } private static void generateFieldAssignment(final StringBuffer out, final String parameterName, final String fieldName) { @@ -141,56 +124,22 @@ class ParameterObjectBuilder { } } - @NonNls - private String calculateStrippedName(String name) { - return myJavaCodeStyleManager.variableNameToPropertyName(name, VariableKind.PARAMETER); - } - - private void outputGetter(ParameterSpec field, @NonNls StringBuffer out) { - final PsiParameter parameter = field.getParameter(); - final PsiType type = field.getType(); - final String typeText; - if (parameter.isVarArgs()) { - typeText = ((PsiArrayType) type).getComponentType().getCanonicalText() + "[]"; - } else { - typeText = type.getCanonicalText(); - } - final String name = calculateStrippedName(field.getName()); - final String capitalizedName = StringUtil.capitalize(name); - if (PsiType.BOOLEAN.equals(type)) { - out.append('\t'); - outputAnnotationString(parameter, out); - out.append(" public "+ typeText + " is" + capitalizedName + "()\n"); - } else { - out.append('\t'); - outputAnnotationString(parameter, out); - out.append(" public " +typeText + " get" + capitalizedName + "()\n"); - } - out.append("\t{\n"); - final String fieldName = myJavaCodeStyleManager.propertyNameToVariableName(name, VariableKind.FIELD); - out.append("\t\treturn " + fieldName + ";\n"); - out.append("\t}\n"); + private void outputGetter(ParameterSpec field, @NonNls StringBuffer out) { + out.append(GenerateMembersUtil.generateGetterPrototype(JavaPsiFacade.getElementFactory(myProject).createField(field.getName(), field.getType())).getText()); } private void outputConstructor(@NonNls StringBuffer out) { out.append("\t" + myVisibility + " " + className + '('); for (Iterator iterator = fields.iterator(); iterator.hasNext();) { - final ParameterSpec field = iterator.next(); - final PsiParameter parameter = field.getParameter(); + final ParameterSpec field = iterator.next(); + final PsiParameter parameter = field.getParameter(); outputAnnotationString(parameter, out); out.append(CodeStyleSettingsManager.getSettings(myProject).GENERATE_FINAL_PARAMETERS ? " final " : ""); - - final PsiType type = field.getType(); - final String typeText; - if (parameter.isVarArgs()) { - typeText = ((PsiArrayType) type).getComponentType().getCanonicalText() + "..."; - } else { - typeText = type.getCanonicalText(); - } - final String name = calculateStrippedName(field.getName()); - final String parameterName = - myJavaCodeStyleManager.propertyNameToVariableName(name, VariableKind.PARAMETER); - out.append(' ' +typeText + ' ' + parameterName); + final String parameterName = parameter.getName(); + final PsiType type = field.getType(); + final PsiType fieldType = parameter.isVarArgs() && type instanceof PsiArrayType ? + PsiEllipsisType.createEllipsis(((PsiArrayType)type).getComponentType(), PsiAnnotation.EMPTY_ARRAY) : type; + out.append(' ' + fieldType.getCanonicalText() + ' ' + parameterName); if (iterator.hasNext()) { out.append(", "); } @@ -198,11 +147,7 @@ class ParameterObjectBuilder { out.append(")\n"); out.append("\t{\n"); for (final ParameterSpec field : fields) { - final String name = calculateStrippedName(field.getName()); - final String fieldName = myJavaCodeStyleManager.propertyNameToVariableName(name, VariableKind.FIELD); - final String parameterName = - myJavaCodeStyleManager.propertyNameToVariableName(name, VariableKind.PARAMETER); - generateFieldAssignment(out, parameterName, fieldName); + generateFieldAssignment(out, field.getParameter().getName(), field.getName()); } out.append("\t}\n"); } @@ -215,20 +160,14 @@ class ParameterObjectBuilder { out.append('\n'); } final PsiType type = field.getType(); - final String typeText; - if (parameter.isVarArgs()) { - final PsiType componentType = ((PsiArrayType) type).getComponentType(); - typeText = componentType.getCanonicalText() + "[]"; - } else { - typeText = type.getCanonicalText(); - } - final String name = calculateStrippedName(field.getName()); + final String typeText = type.getCanonicalText(); + final String name = field.getName(); @NonNls String modifierString = "private "; if (!field.isSetterRequired()) { modifierString += "final "; } outputAnnotationString(parameter, out); - out.append('\t' + modifierString + typeText + ' ' + myJavaCodeStyleManager.propertyNameToVariableName(name, VariableKind.FIELD) + ";\n"); + out.append('\t' + modifierString + typeText + ' ' + name + ";\n"); } private void outputAnnotationString(PsiParameter parameter, StringBuffer out) { diff --git a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/ParameterSpec.java b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/ParameterSpec.java index e1bd9923363b..9af5a1ca287d 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/ParameterSpec.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/ParameterSpec.java @@ -17,6 +17,7 @@ package com.intellij.refactoring.introduceparameterobject; import com.intellij.psi.PsiParameter; import com.intellij.psi.PsiType; +import com.intellij.psi.codeStyle.VariableKind; class ParameterSpec { private final PsiParameter myParameter; diff --git a/java/java-impl/src/com/intellij/refactoring/removemiddleman/RemoveMiddlemanProcessor.java b/java/java-impl/src/com/intellij/refactoring/removemiddleman/RemoveMiddlemanProcessor.java index ec94562a1354..28bdc6da78a2 100644 --- a/java/java-impl/src/com/intellij/refactoring/removemiddleman/RemoveMiddlemanProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/removemiddleman/RemoveMiddlemanProcessor.java @@ -65,8 +65,7 @@ public class RemoveMiddlemanProcessor extends FixableUsagesRefactoringProcessor for (final MemberInfo memberInfo : myDelegateMethodInfos) { if (!memberInfo.isChecked()) continue; final PsiMethod method = (PsiMethod)memberInfo.getMember(); - final Project project = method.getProject(); - final String getterName = PropertyUtil.suggestGetterName(field); + final String getterName = GenerateMembersUtil.suggestGetterName(field); final int[] paramPermutation = DelegationUtils.getParameterPermutation(method); final PsiMethod delegatedMethod = DelegationUtils.getDelegatedMethod(method); LOG.assertTrue(!DelegationUtils.isAbstract(method)); diff --git a/java/java-psi-api/src/com/intellij/psi/util/PropertyUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PropertyUtil.java index 7c1f7ac70732..30072f7bab04 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/PropertyUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/PropertyUtil.java @@ -26,13 +26,14 @@ import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.codeStyle.VariableKind; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; -import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.*; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.beans.Introspector; import java.util.*; +import java.util.HashMap; /** * @author Mike @@ -404,7 +405,8 @@ public class PropertyUtil { } /** - * Consider using {@link com.intellij.codeInsight.generation.GenerateMembersUtil#generateGetterPrototype(com.intellij.psi.PsiField)} + * Consider using {@link com.intellij.codeInsight.generation.GenerateMembersUtil#generateGetterPrototype(com.intellij.psi.PsiField)} or + * {@link com.intellij.codeInsight.generation.GenerateMembersUtil#generateSimpleGetterPrototype(com.intellij.psi.PsiField)} * to add @Override annotation */ @Nullable @@ -435,6 +437,7 @@ public class PropertyUtil { /** * Consider using {@link com.intellij.codeInsight.generation.GenerateMembersUtil#generateSetterPrototype(com.intellij.psi.PsiField)} + * or {@link com.intellij.codeInsight.generation.GenerateMembersUtil#generateSimpleSetterPrototype(com.intellij.psi.PsiField)} * to add @Override annotation */ @Nullable @@ -444,6 +447,7 @@ public class PropertyUtil { /** * Consider using {@link com.intellij.codeInsight.generation.GenerateMembersUtil#generateSetterPrototype(com.intellij.psi.PsiField)} + * or {@link com.intellij.codeInsight.generation.GenerateMembersUtil#generateSimpleSetterPrototype(com.intellij.psi.PsiField)} * to add @Override annotation */ @Nullable @@ -453,6 +457,7 @@ public class PropertyUtil { /** * Consider using {@link com.intellij.codeInsight.generation.GenerateMembersUtil#generateSetterPrototype(com.intellij.psi.PsiField)} + * or {@link com.intellij.codeInsight.generation.GenerateMembersUtil#generateSimpleSetterPrototype(com.intellij.psi.PsiField)} * to add @Override annotation */ @Nullable @@ -512,8 +517,8 @@ public class PropertyUtil { } } - private static void annotateWithNullableStuff(final PsiModifierListOwner field, - final PsiModifierListOwner listOwner) + public static void annotateWithNullableStuff(final PsiModifierListOwner field, + final PsiModifierListOwner listOwner) throws IncorrectOperationException { final NullableNotNullManager manager = NullableNotNullManager.getInstance(field.getProject()); final PsiAnnotation notNull = manager.copyNotNullAnnotation(field); diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/GenerateGetterSetterTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/GenerateGetterSetterTest.groovy index 4aabc1448492..89213c72649f 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/GenerateGetterSetterTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/GenerateGetterSetterTest.groovy @@ -16,6 +16,7 @@ package com.intellij.codeInsight import com.intellij.codeInsight.generation.ClassMember import com.intellij.codeInsight.generation.GenerateGetterHandler +import com.intellij.codeInsight.generation.GenerateSetterHandler import com.intellij.openapi.command.WriteCommandAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project @@ -106,4 +107,48 @@ class Foo { }) UIUtil.dispatchAllInvocationEvents() } + + public void "test static or this setter with same name parameter"() { + myFixture.enableInspections(UnqualifiedFieldAccessInspection.class) + myFixture.configureByText 'a.java', ''' +class Foo { + static int p; + int f; + + +} +''' + generateSetter() + myFixture.checkResult ''' +class Foo { + static int p; + int f; + + public static void setP(int p) { + Foo.p = p; + } + + public void setF(int f) { + this.f = f; + } +} +''' + } + + private void generateSetter() { + WriteCommandAction.runWriteCommandAction(getProject(), { + new GenerateSetterHandler() { + @Override + protected ClassMember[] chooseMembers( + ClassMember[] members, + boolean allowEmptySelection, + boolean copyJavadocCheckbox, + Project project, + @Nullable @Nullable Editor editor) { + return members + } + }.invoke(project, myFixture.editor, myFixture.file) + }) + UIUtil.dispatchAllInvocationEvents() + } } diff --git a/java/java-tests/testSrc/com/intellij/refactoring/EncapsulateFieldsTest.java b/java/java-tests/testSrc/com/intellij/refactoring/EncapsulateFieldsTest.java index 23540a0b03b3..e69948fa8795 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/EncapsulateFieldsTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/EncapsulateFieldsTest.java @@ -21,6 +21,7 @@ package com.intellij.refactoring; import com.intellij.JavaTestUtil; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.LocalFileSystem; @@ -123,10 +124,10 @@ public class EncapsulateFieldsTest extends MultiFileTestCase{ public FieldDescriptor[] getSelectedFields() { return new FieldDescriptor[]{new FieldDescriptorImpl( field, - PropertyUtil.suggestGetterName(field), - PropertyUtil.suggestSetterName(field), - isToEncapsulateGet() ? PropertyUtil.generateGetterPrototype(field) : null, - isToEncapsulateSet() ? PropertyUtil.generateSetterPrototype(field) : null + GenerateMembersUtil.suggestGetterName(field), + GenerateMembersUtil.suggestSetterName(field), + isToEncapsulateGet() ? GenerateMembersUtil.generateGetterPrototype(field) : null, + isToEncapsulateSet() ? GenerateMembersUtil.generateSetterPrototype(field) : null )}; } diff --git a/platform/platform-resources-en/src/messages/CodeInsightBundle.properties b/platform/platform-resources-en/src/messages/CodeInsightBundle.properties index 47588e151c8d..c5b0f1659aa1 100644 --- a/platform/platform-resources-en/src/messages/CodeInsightBundle.properties +++ b/platform/platform-resources-en/src/messages/CodeInsightBundle.properties @@ -53,6 +53,8 @@ generate.equals.compare.arrays.comment= // Probably incorrect - comparing Object generate.getter.setter.title=Select Fields to Generate Getters and Setters generate.getter.fields.chooser.title=Select Fields to Generate Getters generate.setter.fields.chooser.title=Select Fields to Generate Setters +generate.setter.template=&Setter template: +generate.getter.template=&Getter template: override.implement.broken.file.template.message=Please Correct "Overridden/Implemented Method Body" Template override.implement.broken.file.template.title=File Template Error methods.to.implement.chooser.title=Select Methods to Implement diff --git a/plugins/generate-tostring/src/org/jetbrains/java/generate/GenerationUtil.java b/plugins/generate-tostring/src/org/jetbrains/java/generate/GenerationUtil.java index e32df90fe7f0..e16e745ede02 100644 --- a/plugins/generate-tostring/src/org/jetbrains/java/generate/GenerationUtil.java +++ b/plugins/generate-tostring/src/org/jetbrains/java/generate/GenerationUtil.java @@ -19,6 +19,7 @@ import com.intellij.codeInsight.generation.PsiElementClassMember; import com.intellij.codeInsight.generation.PsiFieldMember; import com.intellij.codeInsight.generation.PsiMethodMember; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.text.StringUtil; @@ -175,7 +176,11 @@ public class GenerationUtil { // field information logger.debug("Velocity Context - adding fields"); - vc.put("fields", ElementUtils.getOnlyAsFieldElements(selectedMembers, selectedNotNullMembers, useAccessors)); + final List fieldElements = ElementUtils.getOnlyAsFieldElements(selectedMembers, selectedNotNullMembers, useAccessors); + vc.put("fields", fieldElements); + if (fieldElements.size() == 1) { + vc.put("field", fieldElements.get(0)); + } // method information logger.debug("Velocity Context - adding methods"); @@ -200,6 +205,7 @@ public class GenerationUtil { vc.put("FQClassname", ce.getQualifiedName()); vc.put("settings", CodeStyleSettingsManager.getSettings(clazz.getProject())); vc.put("helper", GenerationHelper.class); + vc.put("project", clazz.getProject()); for (String paramName : contextMap.keySet()) { vc.put(paramName, contextMap.get(paramName)); @@ -218,6 +224,9 @@ public class GenerationUtil { params.put("autoImportPackages", (String)vc.get("autoImportPackages")); } } + catch (ProcessCanceledException e) { + throw e; + } catch (Exception e) { throw new GenerateCodeException("Error in Velocity code generator", e); } diff --git a/plugins/generate-tostring/src/org/jetbrains/java/generate/element/AbstractElement.java b/plugins/generate-tostring/src/org/jetbrains/java/generate/element/AbstractElement.java index 6958bdc6d779..40b1f1559b97 100644 --- a/plugins/generate-tostring/src/org/jetbrains/java/generate/element/AbstractElement.java +++ b/plugins/generate-tostring/src/org/jetbrains/java/generate/element/AbstractElement.java @@ -46,6 +46,7 @@ public abstract class AbstractElement implements Element { protected boolean isByte; protected boolean isShort; protected String typeName; + protected String type; protected String typeQualifiedName; protected boolean isModifierStatic; protected boolean isModifierPublic; @@ -133,6 +134,15 @@ public abstract class AbstractElement implements Element { return typeQualifiedName; } + @Override + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + public boolean isBoolean() { return isBoolean; } diff --git a/plugins/generate-tostring/src/org/jetbrains/java/generate/element/Element.java b/plugins/generate-tostring/src/org/jetbrains/java/generate/element/Element.java index fafa5581a51a..f442654241b0 100644 --- a/plugins/generate-tostring/src/org/jetbrains/java/generate/element/Element.java +++ b/plugins/generate-tostring/src/org/jetbrains/java/generate/element/Element.java @@ -174,5 +174,10 @@ public interface Element { */ String getTypeQualifiedName(); + /** + * + * @return type canonical text + */ + String getType(); } diff --git a/plugins/generate-tostring/src/org/jetbrains/java/generate/element/ElementFactory.java b/plugins/generate-tostring/src/org/jetbrains/java/generate/element/ElementFactory.java index bffd927b072d..c6c09aeae7d7 100644 --- a/plugins/generate-tostring/src/org/jetbrains/java/generate/element/ElementFactory.java +++ b/plugins/generate-tostring/src/org/jetbrains/java/generate/element/ElementFactory.java @@ -147,6 +147,7 @@ public class ElementFactory { // type names element.setTypeName(PsiAdapter.getTypeClassName(type)); element.setTypeQualifiedName(PsiAdapter.getTypeQualifiedClassName(type)); + element.setType(type.getCanonicalText()); // arrays, collections and maps types if (PsiAdapter.isObjectArrayType(type)) { diff --git a/plugins/generate-tostring/src/org/jetbrains/java/generate/element/GenerationHelper.java b/plugins/generate-tostring/src/org/jetbrains/java/generate/element/GenerationHelper.java index 1b21e9c77de2..0376d59244cf 100644 --- a/plugins/generate-tostring/src/org/jetbrains/java/generate/element/GenerationHelper.java +++ b/plugins/generate-tostring/src/org/jetbrains/java/generate/element/GenerationHelper.java @@ -15,7 +15,12 @@ */ package org.jetbrains.java.generate.element; +import com.intellij.openapi.project.Project; +import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.psi.codeStyle.JavaCodeStyleManager; +import com.intellij.psi.codeStyle.VariableKind; +import com.intellij.psi.util.PropertyUtil; import java.util.List; @@ -45,4 +50,25 @@ public class GenerationHelper { return id; } + + public static String getParamName(FieldElement fieldElement, Project project) { + String name = fieldElement.getName(); + JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project); + String propertyName = codeStyleManager.variableNameToPropertyName(name, VariableKind.FIELD); + return codeStyleManager.propertyNameToVariableName(propertyName, VariableKind.PARAMETER); + } + + public static String suggestGetterName(FieldElement fieldElement, Project project) { + String text = fieldElement.isModifierStatic() ? "static " : ""; + text += fieldElement.getType() + " " + fieldElement.getName(); + final PsiField field = JavaPsiFacade.getElementFactory(project).createFieldFromText(text, null); + return PropertyUtil.suggestGetterName(field); + } + + public static String suggestSetterName(FieldElement fieldElement, Project project) { + String text = fieldElement.isModifierStatic() ? "static " : ""; + text += fieldElement.getType() + " " + fieldElement.getName(); + final PsiField field = JavaPsiFacade.getElementFactory(project).createFieldFromText(text, null); + return PropertyUtil.suggestSetterName(field); + } } diff --git a/plugins/generate-tostring/src/org/jetbrains/java/generate/view/TemplatesPanel.java b/plugins/generate-tostring/src/org/jetbrains/java/generate/view/TemplatesPanel.java index ed70605e5b24..36800d94fdd0 100644 --- a/plugins/generate-tostring/src/org/jetbrains/java/generate/view/TemplatesPanel.java +++ b/plugins/generate-tostring/src/org/jetbrains/java/generate/view/TemplatesPanel.java @@ -32,6 +32,7 @@ import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; import org.jetbrains.java.generate.template.TemplateResource; +import org.jetbrains.java.generate.template.TemplatesManager; import org.jetbrains.java.generate.template.toString.ToStringTemplatesManager; import java.util.ArrayList; @@ -77,13 +78,19 @@ public class TemplatesPanel extends NamedItemsListEditor { } }; private final Project myProject; + private final TemplatesManager myTemplatesManager; public TemplatesPanel(Project project) { + this(project, ToStringTemplatesManager.getInstance()); + } + + public TemplatesPanel(Project project, TemplatesManager templatesManager) { super(NAMER, FACTORY, CLONER, COMPARER, - new ArrayList(ToStringTemplatesManager.getInstance().getAllTemplates())); + new ArrayList(templatesManager.getAllTemplates())); //ServiceManager.getService(project, MasterDetailsStateService.class).register("ToStringTemplates.UI", this); myProject = project; + myTemplatesManager = templatesManager; } @Nls @@ -104,7 +111,7 @@ public class TemplatesPanel extends NamedItemsListEditor { @Override public boolean isModified() { - return super.isModified() || !Comparing.equal(ToStringTemplatesManager.getInstance().getDefaultTemplate(), getSelectedItem()); + return super.isModified() || !Comparing.equal(myTemplatesManager.getDefaultTemplate(), getSelectedItem()); } @Override @@ -119,10 +126,10 @@ public class TemplatesPanel extends NamedItemsListEditor { @Override public void apply() throws ConfigurationException { super.apply(); - ToStringTemplatesManager.getInstance().setTemplates(getItems()); + myTemplatesManager.setTemplates(getItems()); final TemplateResource selection = getSelectedItem(); if (selection != null) { - ToStringTemplatesManager.getInstance().setDefaultTemplate(selection); + myTemplatesManager.setDefaultTemplate(selection); } } } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/codeInsight/JavaFxGetterSetterPrototypeProvider.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/codeInsight/JavaFxGetterSetterPrototypeProvider.java index 8c0ce5742b35..c6941a2d43dc 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/codeInsight/JavaFxGetterSetterPrototypeProvider.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/codeInsight/JavaFxGetterSetterPrototypeProvider.java @@ -43,7 +43,7 @@ public class JavaFxGetterSetterPrototypeProvider extends GetterSetterPrototypePr public PsiMethod[] generateGetters(PsiField field) { final Project project = field.getProject(); final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); - final PsiMethod getter = GenerateMembersUtil.generateGetterPrototype(field); + final PsiMethod getter = GenerateMembersUtil.generateSimpleGetterPrototype(field); final PsiType wrappedType = JavaFxPsiUtil.getWrappedPropertyType(field, project, JavaFxCommonClassNames.ourReadOnlyMap); @@ -62,7 +62,7 @@ public class JavaFxGetterSetterPrototypeProvider extends GetterSetterPrototypePr @Override public PsiMethod[] generateSetters(PsiField field) { - final PsiMethod setter = GenerateMembersUtil.generateSetterPrototype(field); + final PsiMethod setter = GenerateMembersUtil.generateSimpleSetterPrototype(field); final Project project = field.getProject(); final PsiType wrappedType = JavaFxPsiUtil.getWrappedPropertyType(field, project, JavaFxCommonClassNames.ourWritableMap); diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 2cfbabe396a1..f04431fabb5d 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -1566,6 +1566,10 @@ serviceImplementation="org.jetbrains.java.generate.template.toString.ToStringTemplatesManager"/> + +