java: override default with super call (IDEA-258822, IDEA-259098)

GitOrigin-RevId: 295ac3cb605800b005784674c2bac20f0de951ff
This commit is contained in:
Anna Kozlova
2021-01-11 11:55:10 +01:00
committed by intellij-monorepo-bot
parent d9a5f3609d
commit 0e8e6abfcb
8 changed files with 40 additions and 5 deletions

View File

@@ -310,6 +310,10 @@ public final class OverrideImplementUtil extends OverrideImplementExploreUtil {
if (prependReturn && !superMethod.isConstructor() && !PsiType.VOID.equals(superMethod.getReturnType())) {
buffer.append("return ");
}
PsiClass aClass = superMethod.getContainingClass();
if (aClass != null && aClass.isInterface()) {
buffer.append(aClass.getName()).append(".");
}
buffer.append("super");
PsiParameter[] parameters = overriding.getParameterList().getParameters();
if (!superMethod.isConstructor()) {
@@ -327,7 +331,7 @@ public final class OverrideImplementUtil extends OverrideImplementExploreUtil {
}
public static void setupMethodBody(@NotNull PsiMethod result, @NotNull PsiMethod originalMethod, @NotNull PsiClass targetClass) throws IncorrectOperationException {
boolean isAbstract = originalMethod.hasModifierProperty(PsiModifier.ABSTRACT) || originalMethod.hasModifierProperty(PsiModifier.DEFAULT);
boolean isAbstract = originalMethod.hasModifierProperty(PsiModifier.ABSTRACT);
String templateName = isAbstract ? JavaTemplateUtil.TEMPLATE_IMPLEMENTED_METHOD_BODY : JavaTemplateUtil.TEMPLATE_OVERRIDDEN_METHOD_BODY;
FileTemplate template = FileTemplateManager.getInstance(originalMethod.getProject()).getCodeTemplate(templateName);
setupMethodBody(result, originalMethod, targetClass, template);

View File

@@ -38,7 +38,7 @@ public class GenerateSuperMethodCallHandler implements CodeInsightActionHandler
LOG.assertTrue(method != null);
PsiMethod template = (PsiMethod)method.copy();
OverrideImplementUtil.setupMethodBody(template, method, method.getContainingClass());
OverrideImplementUtil.setupMethodBody(template, findNonAbstractSuper(method), method.getContainingClass());
PsiCodeBlock templateBody = template.getBody();
LOG.assertTrue(templateBody != null, template);
PsiStatement superCall = templateBody.getStatements()[0];
@@ -62,6 +62,15 @@ public class GenerateSuperMethodCallHandler implements CodeInsightActionHandler
editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE);
}
private static PsiMethod findNonAbstractSuper(PsiMethod method) {
List<? extends HierarchicalMethodSignature> superSignatures = method.getHierarchicalMethodSignature().getSuperSignatures();
for (HierarchicalMethodSignature superSignature : superSignatures) {
PsiMethod superMethod = superSignature.getMethod();
if (!superMethod.hasModifierProperty(PsiModifier.ABSTRACT)) return superMethod;
}
return null;
}
public static PsiMethod canInsertSuper(Editor editor, PsiFile file) {
int offset = editor.getCaretModel().getOffset();
PsiElement element = file.findElementAt(offset);

View File

@@ -6,6 +6,6 @@ interface A {
interface B extends A {
@Override
default void m() {
A.super.m();
}
}

View File

@@ -0,0 +1,11 @@
interface I {
default void f() {}
}
interface A extends I {
@Override
default void f() {
I.super.f();
}
}

View File

@@ -0,0 +1,10 @@
interface I {
default void f() {}
}
interface A extends I {
@Override
default void f() {
<caret>
}
}

View File

@@ -5,6 +5,6 @@ interface A<T> {
class MyClass<T> implements A<T> {
@Override
public void m(T t) {
<caret>
<caret><selection>A.super.m(t);</selection>
}
}

View File

@@ -5,7 +5,7 @@ interface A<T> {
class MyClass<T> implements A<T> {
@Override
public void m(T t) {
<caret>
<caret><selection>A.super.m(t);</selection>
}
public MyClass() {

View File

@@ -37,6 +37,7 @@ public class GenerateSuperMethodCallTest extends LightJavaCodeInsightTestCase {
public void testImplement() { doTest(); }
public void testOverride() { doTest(); }
public void testOverrideInNestedBlock() { doTest(); }
public void testDefaultMethod() { doTest(); }
private void doTest() {