IDEA-111144 'Generate Getter' should add @Override if needed

This commit is contained in:
peter
2013-08-01 16:44:26 +02:00
parent ec8fcaccce
commit 0cfc3b5f9e
15 changed files with 76 additions and 21 deletions

View File

@@ -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<PsiMethod> 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) {

View File

@@ -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<PsiMethod> methods = new ArrayList<PsiMethod>();
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);

View File

@@ -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);
}

View File

@@ -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();

View File

@@ -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));

View File

@@ -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;
}
}

View File

@@ -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);

View File

@@ -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();

View File

@@ -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);

View File

@@ -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);

View File

@@ -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));
}
}

View File

@@ -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()));

View File

@@ -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);

View File

@@ -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() {}
}

View File

@@ -0,0 +1,8 @@
// "Create getter for 's'" "true"
public class A extends Parent{
private String <caret>s;
}
class Parent {
public String getS() {}
}