mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-20 13:31:28 +07:00
java: override default with super call (IDEA-258822, IDEA-259098)
GitOrigin-RevId: 295ac3cb605800b005784674c2bac20f0de951ff
This commit is contained in:
committed by
intellij-monorepo-bot
parent
d9a5f3609d
commit
0e8e6abfcb
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -6,6 +6,6 @@ interface A {
|
||||
interface B extends A {
|
||||
@Override
|
||||
default void m() {
|
||||
|
||||
A.super.m();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
interface I {
|
||||
default void f() {}
|
||||
}
|
||||
|
||||
interface A extends I {
|
||||
@Override
|
||||
default void f() {
|
||||
I.super.f();
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
interface I {
|
||||
default void f() {}
|
||||
}
|
||||
|
||||
interface A extends I {
|
||||
@Override
|
||||
default void f() {
|
||||
<caret>
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user