assign weaker access: find method to implement (IDEA-153610)

This commit is contained in:
Anna.Kozlova
2016-05-13 18:12:52 +02:00
parent e08efff14a
commit 2755100873
5 changed files with 69 additions and 1 deletions

View File

@@ -1327,6 +1327,7 @@ public class HighlightMethodUtil {
static HighlightInfo checkOverrideEquivalentInheritedMethods(PsiClass aClass, PsiFile containingFile, @NotNull LanguageLevel languageLevel) {
String description = null;
boolean appendImplementMethodFix = true;
final Collection<HierarchicalMethodSignature> visibleSignatures = aClass.getVisibleSignatures();
PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(aClass.getProject()).getResolveHelper();
Ultimate:
@@ -1360,6 +1361,7 @@ public class HighlightMethodUtil {
HighlightUtil.formatClass(containingClass),
JavaHighlightUtil.formatMethod(superMethod),
HighlightUtil.formatClass(superMethod.getContainingClass()));
appendImplementMethodFix = false;
break Ultimate;
}
}
@@ -1383,7 +1385,11 @@ public class HighlightMethodUtil {
if (description != null) {
// show error info at the class level
TextRange textRange = HighlightNamesUtil.getClassDeclarationTextRange(aClass);
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(textRange).descriptionAndTooltip(description).create();
final HighlightInfo highlightInfo = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(textRange).descriptionAndTooltip(description).create();
if (appendImplementMethodFix) {
QuickFixAction.registerQuickFixAction(highlightInfo, QUICK_FIX_FACTORY.createImplementMethodsFix(aClass));
}
return highlightInfo;
}
return null;
}

View File

@@ -52,6 +52,14 @@ public class OverrideImplementExploreUtil {
PsiUtilCore.ensureValid(method);
if (method.hasModifierProperty(PsiModifier.STATIC) || !resolveHelper.isAccessible(method, aClass, aClass)) continue;
for (HierarchicalMethodSignature superMethodSignature : signature.getSuperSignatures()) {
final PsiMethod superMethod = superMethodSignature.getMethod();
if (PsiUtil.getAccessLevel(superMethod.getModifierList()) > PsiUtil.getAccessLevel(method.getModifierList())) {
method = superMethod;
break;
}
}
PsiClass hisClass = method.getContainingClass();
if (hisClass == null) continue;
// filter non-immediate super constructors

View File

@@ -0,0 +1,13 @@
// "Implement methods" "true"
class B {
protected void f() {}
}
interface A {
void f();
}
class D extends B implements A {
@Override
public void f() {
<caret>
}
}

View File

@@ -0,0 +1,8 @@
// "Implement methods" "true"
class B {
protected void f() {}
}
interface A {
void f();
}
<caret>class D extends B implements A {}

View File

@@ -68,6 +68,39 @@ interface B extends A {
"""
}
public void testImplementInterfaceWhenClassProvidesProtectedImplementation() {
myFixture.addClass """\
interface A {
void f();
}
"""
myFixture.addClass """\
class B {
protected void f() {}
}
"""
def file = myFixture.addClass("""\
class C extends B implements A {
<caret>
}
""").containingFile.virtualFile
myFixture.configureFromExistingVirtualFile(file)
def Presentation presentation = new Presentation()
presentation.setText(ActionsBundle.message("action.ImplementMethods.text"))
CommandProcessor.instance.executeCommand(project, { invokeAction(true) }, presentation.text, null)
myFixture.checkResult """\
class C extends B implements A {
@Override
public void f() {
<caret>
}
}
"""
}
public void testImplementSameNamedInterfaces() {
myFixture.addClass """\
class Main1 {