implement methods in enum from super interface (IDEA-106310)

This commit is contained in:
anna
2013-04-29 20:26:56 +02:00
parent 5de5477453
commit 5e2184d2d4
6 changed files with 31 additions and 23 deletions
@@ -1267,7 +1267,7 @@ public class GenericsHighlightUtil {
holder.add(highlightInfo);
return;
}
highlightInfo = HighlightClassUtil.checkClassWithAbstractMethods(enumConstant.getContainingClass(), enumConstant.getNameIdentifier().getTextRange());
highlightInfo = HighlightClassUtil.checkClassWithAbstractMethods(enumConstant.getContainingClass(), enumConstant, enumConstant.getNameIdentifier().getTextRange());
if (highlightInfo != null) {
holder.add(highlightInfo);
return;
@@ -86,6 +86,11 @@ public class HighlightClassUtil {
@Nullable
static HighlightInfo checkClassWithAbstractMethods(PsiClass aClass, TextRange range) {
return checkClassWithAbstractMethods(aClass, aClass, range);
}
@Nullable
static HighlightInfo checkClassWithAbstractMethods(PsiClass aClass, PsiElement implementsFixElement, TextRange range) {
PsiMethod abstractMethod = ClassUtil.getAnyAbstractMethod(aClass);
if (abstractMethod == null || abstractMethod.getContainingClass() == null) {
@@ -93,14 +98,14 @@ public class HighlightClassUtil {
}
String baseClassName = HighlightUtil.formatClass(aClass, false);
String methodName = HighlightUtil.formatMethod(abstractMethod);
String message = JavaErrorMessages.message(aClass instanceof PsiEnumConstantInitializer ? "enum.constant.should.implement.method" : "class.must.be.abstract",
String message = JavaErrorMessages.message(aClass instanceof PsiEnumConstantInitializer || implementsFixElement instanceof PsiEnumConstant ? "enum.constant.should.implement.method" : "class.must.be.abstract",
baseClassName,
methodName,
HighlightUtil.formatClass(abstractMethod.getContainingClass(), false));
HighlightInfo errorResult = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(range).descriptionAndTooltip(message).create();
if (ClassUtil.getAnyMethodToImplement(aClass) != null) {
QuickFixAction.registerQuickFixAction(errorResult, QUICK_FIX_FACTORY.createImplementMethodsFix(aClass));
QuickFixAction.registerQuickFixAction(errorResult, QUICK_FIX_FACTORY.createImplementMethodsFix(implementsFixElement));
}
if (!(aClass instanceof PsiAnonymousClass)
&& HighlightUtil.getIncompatibleModifier(PsiModifier.ABSTRACT, aClass.getModifierList()) == null) {
@@ -17,6 +17,7 @@ package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.generation.OverrideImplementExploreUtil;
import com.intellij.codeInsight.generation.OverrideImplementUtil;
import com.intellij.codeInsight.generation.PsiMethodMember;
import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement;
@@ -27,16 +28,16 @@ import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiEnumConstant;
import com.intellij.psi.PsiFile;
import com.intellij.psi.infos.CandidateInfo;
import com.intellij.psi.util.MethodSignature;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.TreeMap;
public class ImplementMethodsFix extends LocalQuickFixAndIntentionActionOnPsiElement {
public ImplementMethodsFix(PsiElement aClass) {
@@ -105,21 +106,7 @@ public class ImplementMethodsFix extends LocalQuickFixAndIntentionActionOnPsiEle
protected static MemberChooser<PsiMethodMember> chooseMethodsToImplement(Editor editor, PsiElement startElement, PsiClass aClass) {
FeatureUsageTracker.getInstance().triggerFeatureUsed(ProductivityFeatureNames.CODEASSISTS_OVERRIDE_IMPLEMENT);
final TreeMap<MethodSignature, CandidateInfo> result =
new TreeMap<MethodSignature, CandidateInfo>(new OverrideImplementUtil.MethodSignatureComparator());
final HashMap<MethodSignature, PsiMethod> abstracts = new HashMap<MethodSignature, PsiMethod>();
final HashMap<MethodSignature, PsiMethod> finals = new HashMap<MethodSignature, PsiMethod>();
final HashMap<MethodSignature, PsiMethod> concretes = new HashMap<MethodSignature, PsiMethod>();
for (PsiMethod method : aClass.getMethods()) {
if (method.hasModifierProperty(PsiModifier.ABSTRACT)) {
abstracts.put(method.getHierarchicalMethodSignature(), method);
}
}
OverrideImplementUtil.collectMethodsToImplement(null, abstracts, finals, concretes, result);
return OverrideImplementUtil
.showOverrideImplementChooser(editor, startElement, true, result.values(), Collections.<CandidateInfo>emptyList());
.showOverrideImplementChooser(editor, startElement, true, OverrideImplementExploreUtil.getMethodsToOverrideImplement(aClass, true), Collections.<CandidateInfo>emptyList());
}
}
@@ -126,7 +126,7 @@ interface Barz {
}
enum Fooz implements Barz {
<error descr="Class 'Fooz' must either be declared abstract or implement abstract method 'baz()' in 'Barz'">FOO</error>;
<error descr="Class 'Fooz' must implement abstract method 'baz()' in 'Barz'">FOO</error>;
}
///////////////////////
@@ -0,0 +1,8 @@
// "Implement Methods" "true"
interface Card {
void play();
}
enum E implements Card {
A<caret>
}
@@ -0,0 +1,8 @@
// "Implement Methods" "true"
interface Card {
void play();
}
enum E implements Card {
A<caret>
}