From 0cfc3b5f9ee59538bf542db0e68b2b7acb0a1bc1 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 1 Aug 2013 16:44:26 +0200 Subject: [PATCH] IDEA-111144 'Generate Getter' should add @Override if needed --- ...vaGenerateMemberCompletionContributor.java | 5 ++-- .../quickfix/CreateGetterOrSetterFix.java | 6 ++--- ...reateGetterSetterPropertyFromUsageFix.java | 5 ++-- .../quickfix/CreatePropertyFromUsageFix.java | 3 ++- ...eInaccessibleFieldWithGetterSetterFix.java | 3 ++- .../generation/GenerateMembersUtil.java | 24 +++++++++++++++++++ .../EncapsulateFieldsDialog.java | 5 ++-- .../ExtractMethodObjectProcessor.java | 3 ++- .../extractclass/ExtractClassProcessor.java | 5 ++-- .../OldReferenceResolver.java | 4 ++-- .../usageInfo/AppendAccessorsUsageInfo.java | 6 ++--- .../RemoveMiddlemanProcessor.java | 3 ++- .../com/intellij/psi/util/PropertyUtil.java | 4 ++++ .../afterGetterOverride.java | 13 ++++++++++ .../beforeGetterOverride.java | 8 +++++++ 15 files changed, 76 insertions(+), 21 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createGetterOrSetter/afterGetterOverride.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createGetterOrSetter/beforeGetterOverride.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaGenerateMemberCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaGenerateMemberCompletionContributor.java index 246b8da66c10..ee7a96a1dd4f 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaGenerateMemberCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaGenerateMemberCompletionContributor.java @@ -26,7 +26,6 @@ import com.intellij.openapi.util.Iconable; import com.intellij.openapi.util.Key; import com.intellij.psi.*; import com.intellij.psi.infos.CandidateInfo; -import com.intellij.psi.util.PropertyUtil; import com.intellij.psi.util.PsiFormatUtil; import com.intellij.psi.util.PsiFormatUtilBase; import com.intellij.ui.RowIcon; @@ -68,8 +67,8 @@ public class JavaGenerateMemberCompletionContributor { List prototypes = ContainerUtil.newArrayList(); for (PsiField field : parent.getFields()) { if (!(field instanceof PsiEnumConstant)) { - prototypes.add(PropertyUtil.generateGetterPrototype(field)); - prototypes.add(PropertyUtil.generateSetterPrototype(field)); + prototypes.add(GenerateMembersUtil.generateGetterPrototype(field)); + prototypes.add(GenerateMembersUtil.generateSetterPrototype(field)); } } for (final PsiMethod prototype : prototypes) { diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateGetterOrSetterFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateGetterOrSetterFix.java index 89c098757373..11bab8017903 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateGetterOrSetterFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateGetterOrSetterFix.java @@ -17,13 +17,13 @@ package com.intellij.codeInsight.daemon.impl.quickfix; import com.intellij.codeInsight.FileModificationService; import com.intellij.codeInsight.daemon.QuickFixBundle; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInsight.intention.LowPriorityAction; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.util.PropertyUtil; -import com.intellij.psi.util.PsiUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -116,10 +116,10 @@ public class CreateGetterOrSetterFix implements IntentionAction, LowPriorityActi PsiClass aClass = myField.getContainingClass(); final List methods = new ArrayList(); if (myCreateGetter) { - methods.add(PropertyUtil.generateGetterPrototype(myField)); + methods.add(GenerateMembersUtil.generateGetterPrototype(myField)); } if (myCreateSetter) { - methods.add(PropertyUtil.generateSetterPrototype(myField)); + methods.add(GenerateMembersUtil.generateSetterPrototype(myField)); } for (PsiMethod method : methods) { aClass.add(method); 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 eeae2b08c245..c5bd0289d4e3 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 @@ -15,6 +15,7 @@ */ package com.intellij.codeInsight.daemon.impl.quickfix; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiField; import com.intellij.psi.PsiMethod; @@ -55,13 +56,13 @@ public class CreateGetterSetterPropertyFromUsageFix extends CreatePropertyFromUs @Override protected void beforeTemplateFinished(PsiClass aClass, PsiField field) { - PsiMethod getterPrototype = PropertyUtil.generateGetterPrototype(field); + PsiMethod getterPrototype = GenerateMembersUtil.generateGetterPrototype(field); if (aClass.findMethodsBySignature(getterPrototype, false).length == 0) { aClass.add(getterPrototype); } - PsiMethod setterPrototype = PropertyUtil.generateSetterPrototype(field); + PsiMethod setterPrototype = GenerateMembersUtil.generateSetterPrototype(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 6d8e7b9f5e6b..6567a9a478cc 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 @@ -18,6 +18,7 @@ package com.intellij.codeInsight.daemon.impl.quickfix; import com.intellij.codeInsight.CodeInsightUtilCore; import com.intellij.codeInsight.completion.JavaLookupElementBuilder; import com.intellij.codeInsight.daemon.QuickFixBundle; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.codeInsight.intention.HighPriorityAction; import com.intellij.codeInsight.intention.impl.TypeExpression; import com.intellij.codeInsight.lookup.LookupElement; @@ -226,7 +227,7 @@ public class CreatePropertyFromUsageFix extends CreateFromUsageBaseFix implement PsiElement typeReference; PsiCodeBlock body; if (callText.startsWith(GET_PREFIX) || callText.startsWith(IS_PREFIX)) { - accessor = (PsiMethod)targetClass.add(PropertyUtil.generateGetterPrototype(field)); + accessor = (PsiMethod)targetClass.add(GenerateMembersUtil.generateGetterPrototype(field)); body = accessor.getBody(); LOG.assertTrue(body != null, accessor.getText()); fieldReference = ((PsiReturnStatement)body.getStatements()[0]).getReturnValue(); diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceInaccessibleFieldWithGetterSetterFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceInaccessibleFieldWithGetterSetterFix.java index 8e0621898dfc..12176d337f0f 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceInaccessibleFieldWithGetterSetterFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceInaccessibleFieldWithGetterSetterFix.java @@ -17,6 +17,7 @@ package com.intellij.codeInsight.daemon.impl.quickfix; import com.intellij.codeInsight.FileModificationService; import com.intellij.codeInsight.daemon.impl.HighlightInfo; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; @@ -98,7 +99,7 @@ public class ReplaceInaccessibleFieldWithGetterSetterFix extends LocalQuickFixAn } } else if (PsiUtil.isAccessedForReading((PsiExpression)place)) { - final PsiMethod getterPrototype = PropertyUtil.generateGetterPrototype(psiField); + final PsiMethod getterPrototype = GenerateMembersUtil.generateGetterPrototype(psiField); final PsiMethod getter = containingClass.findMethodBySignature(getterPrototype, true); if (getter != null && PsiUtil.isAccessible(getter, place, accessObjectClass)) { QuickFixAction.registerQuickFixAction(error, new ReplaceInaccessibleFieldWithGetterSetterFix(place, getter, false)); 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 0aed3b608dc5..27c53252c09c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java @@ -33,6 +33,7 @@ import com.intellij.psi.impl.light.LightTypeElement; import com.intellij.psi.impl.source.tree.PsiWhiteSpaceImpl; import com.intellij.psi.javadoc.PsiDocComment; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.PropertyUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; @@ -550,4 +551,27 @@ public class GenerateMembersUtil { } } } + + @Nullable + public static PsiMethod generateGetterPrototype(@NotNull PsiField field) { + return annotateOnOverrideImplement(field.getContainingClass(), PropertyUtil.generateGetterPrototype(field)); + } + + @Nullable + public static PsiMethod generateSetterPrototype(@NotNull PsiField field) { + return annotateOnOverrideImplement(field.getContainingClass(), PropertyUtil.generateSetterPrototype(field)); + } + + @Nullable + private static PsiMethod annotateOnOverrideImplement(@Nullable PsiClass targetClass, @Nullable PsiMethod generated) { + if (generated == null || targetClass == null) return generated; + + if (CodeStyleSettingsManager.getSettings(targetClass.getProject()).INSERT_OVERRIDE_ANNOTATION) { + PsiMethod superMethod = targetClass.findMethodBySignature(generated, true); + if (superMethod != null && superMethod.getContainingClass() != targetClass) { + OverrideImplementUtil.annotateOnOverrideImplement(generated, targetClass, superMethod, true); + } + } + return generated; + } } diff --git a/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsDialog.java b/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsDialog.java index 9943d48fc8d6..e8d41e0efa8c 100644 --- a/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/encapsulateFields/EncapsulateFieldsDialog.java @@ -15,6 +15,7 @@ */ package com.intellij.refactoring.encapsulateFields; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.icons.AllIcons; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.help.HelpManager; @@ -509,8 +510,8 @@ public String getAccessorsVisibility() { private PsiMethod generateMethodPrototype(PsiField field, String methodName, boolean isGetter) { PsiMethod prototype = isGetter - ? PropertyUtil.generateGetterPrototype(field) - : PropertyUtil.generateSetterPrototype(field); + ? GenerateMembersUtil.generateGetterPrototype(field) + : GenerateMembersUtil.generateSetterPrototype(field); try { PsiElementFactory factory = JavaPsiFacade.getInstance(field.getProject()).getElementFactory(); PsiIdentifier identifier = factory.createIdentifier(methodName); 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 284433f7c4f0..90131299c98d 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java @@ -21,6 +21,7 @@ package com.intellij.refactoring.extractMethodObject; import com.intellij.codeInsight.NullableNotNullManager; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; @@ -255,7 +256,7 @@ public class ExtractMethodObjectProcessor extends BaseRefactoringProcessor { field = PropertyUtil.findPropertyField(myProject, myInnerClass, name, false); } LOG.assertTrue(field != null, "i:" + i + "; output variables: " + Arrays.toString(outputVariables) + "; parameters: " + Arrays.toString(getMethod().getParameterList().getParameters()) + "; output field: " + outputField ); - myInnerClass.add(PropertyUtil.generateGetterPrototype(field)); + myInnerClass.add(GenerateMembersUtil.generateGetterPrototype(field)); } PsiParameter[] params = getMethod().getParameterList().getParameters(); 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 d096db58b1cf..3969ae580919 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java @@ -15,6 +15,7 @@ */ package com.intellij.refactoring.extractclass; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.ide.highlighter.JavaFileType; import com.intellij.ide.util.PackageUtil; import com.intellij.openapi.application.ApplicationManager; @@ -311,11 +312,11 @@ public class ExtractClassProcessor extends FixableUsagesRefactoringProcessor { if (myGenerateAccessors) { final NecessaryAccessorsVisitor visitor = checkNecessaryGettersSetters4SourceClass(); for (PsiField field : visitor.getFieldsNeedingGetter()) { - sourceClass.add(PropertyUtil.generateGetterPrototype(field)); + sourceClass.add(GenerateMembersUtil.generateGetterPrototype(field)); } for (PsiField field : visitor.getFieldsNeedingSetter()) { - sourceClass.add(PropertyUtil.generateSetterPrototype(field)); + sourceClass.add(GenerateMembersUtil.generateSetterPrototype(field)); } } super.performRefactoring(usageInfos); diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/OldReferenceResolver.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/OldReferenceResolver.java index 0ef27c9b930d..a94f41155c54 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/OldReferenceResolver.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/OldReferenceResolver.java @@ -15,11 +15,11 @@ */ package com.intellij.refactoring.introduceParameter; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; -import com.intellij.psi.util.PropertyUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.IntroduceParameterRefactoring; import com.intellij.refactoring.util.RefactoringUtil; @@ -217,7 +217,7 @@ public class OldReferenceResolver { } PsiElement newExpr = expr; - 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/usageInfo/AppendAccessorsUsageInfo.java b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/usageInfo/AppendAccessorsUsageInfo.java index 59ec81a7ec48..e862915d8db8 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/usageInfo/AppendAccessorsUsageInfo.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/usageInfo/AppendAccessorsUsageInfo.java @@ -20,12 +20,12 @@ */ package com.intellij.refactoring.introduceparameterobject.usageInfo; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiField; import com.intellij.psi.PsiParameter; -import com.intellij.psi.util.PropertyUtil; import com.intellij.refactoring.RefactorJBundle; import com.intellij.refactoring.introduceparameterobject.IntroduceParameterObjectProcessor; import com.intellij.refactoring.util.FixableUsageInfo; @@ -70,8 +70,8 @@ public class AppendAccessorsUsageInfo extends FixableUsageInfo{ final PsiField field = parameterChunk.getField(); if (field != null) { element.add(isGetter - ? PropertyUtil.generateGetterPrototype(field) - : PropertyUtil.generateSetterPrototype(field)); + ? GenerateMembersUtil.generateGetterPrototype(field) + : GenerateMembersUtil.generateSetterPrototype(field)); } } 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 ab14d4f8f2c9..091e6f7fc0d3 100644 --- a/java/java-impl/src/com/intellij/refactoring/removemiddleman/RemoveMiddlemanProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/removemiddleman/RemoveMiddlemanProcessor.java @@ -15,6 +15,7 @@ */ package com.intellij.refactoring.removemiddleman; +import com.intellij.codeInsight.generation.GenerateMembersUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Ref; @@ -99,7 +100,7 @@ public class RemoveMiddlemanProcessor extends FixableUsagesRefactoringProcessor } else { access = getterName + "()"; if (getter == null) { - getter = PropertyUtil.generateGetterPrototype(field); + getter = GenerateMembersUtil.generateGetterPrototype(field); } } usages.add(new InlineDelegatingCall(call, paramPermutation, access, delegatedMethod.getName())); 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 9bb742f4af74..1674c655a971 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 @@ -397,6 +397,7 @@ public class PropertyUtil { return ArrayUtil.toStringArray(result); } + @Nullable public static PsiMethod generateGetterPrototype(@NotNull PsiField field) { PsiElementFactory factory = JavaPsiFacade.getInstance(field.getProject()).getElementFactory(); Project project = field.getProject(); @@ -422,14 +423,17 @@ public class PropertyUtil { } } + @Nullable public static PsiMethod generateSetterPrototype(PsiField field) { return generateSetterPrototype(field, field.getContainingClass()); } + @Nullable public static PsiMethod generateSetterPrototype(PsiField field, final PsiClass containingClass) { return generateSetterPrototype(field, containingClass, false); } + @Nullable public static PsiMethod generateSetterPrototype(PsiField field, final PsiClass containingClass, boolean returnSelf) { Project project = field.getProject(); JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createGetterOrSetter/afterGetterOverride.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createGetterOrSetter/afterGetterOverride.java new file mode 100644 index 000000000000..34f84b40a1ed --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createGetterOrSetter/afterGetterOverride.java @@ -0,0 +1,13 @@ +// "Create getter for 's'" "true" +public class A extends Parent{ + private String s; + + @Override + public String getS() { + return s; + } +} + +class Parent { + public String getS() {} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createGetterOrSetter/beforeGetterOverride.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createGetterOrSetter/beforeGetterOverride.java new file mode 100644 index 000000000000..fa0b827b5f27 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createGetterOrSetter/beforeGetterOverride.java @@ -0,0 +1,8 @@ +// "Create getter for 's'" "true" +public class A extends Parent{ + private String s; +} + +class Parent { + public String getS() {} +} \ No newline at end of file