mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
java: override default: fix super qualifier for default method (IDEA-260570)
GitOrigin-RevId: 7ad2c736b94867a067137f39e0eabf454ed8d5aa
This commit is contained in:
committed by
intellij-monorepo-bot
parent
7f04aa5c7f
commit
a9a9d2dd10
@@ -300,19 +300,22 @@ public final class OverrideImplementUtil extends OverrideImplementExploreUtil {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static String callSuper(@NotNull PsiMethod superMethod, @NotNull PsiMethod overriding) {
|
||||
return callSuper(superMethod, overriding, true);
|
||||
private static String callSuper(@NotNull PsiMethod superMethod, @NotNull PsiMethod overriding, PsiClass targetClass) {
|
||||
return callSuper(superMethod, overriding, targetClass, true);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static String callSuper(@NotNull PsiMethod superMethod, @NotNull PsiMethod overriding, boolean prependReturn) {
|
||||
private static String callSuper(@NotNull PsiMethod superMethod, @NotNull PsiMethod overriding, PsiClass targetClass, boolean prependReturn) {
|
||||
@NonNls StringBuilder buffer = new StringBuilder();
|
||||
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(".");
|
||||
PsiClass superQualifier = getSuperQualifier(aClass, targetClass);
|
||||
if (superQualifier != null) {
|
||||
buffer.append(superQualifier.getName()).append(".");
|
||||
}
|
||||
}
|
||||
buffer.append("super");
|
||||
PsiParameter[] parameters = overriding.getParameterList().getParameters();
|
||||
@@ -330,6 +333,22 @@ public final class OverrideImplementUtil extends OverrideImplementExploreUtil {
|
||||
return buffer.toString();
|
||||
}
|
||||
|
||||
private static PsiClass getSuperQualifier(PsiClass aClass, PsiClass targetClass) {
|
||||
if (targetClass != null) {
|
||||
if (targetClass.isInheritor(aClass, false)) {
|
||||
return aClass;
|
||||
}
|
||||
|
||||
for (PsiClassType type : targetClass.getSuperTypes()) {
|
||||
PsiClass superClass = type.resolve();
|
||||
if (InheritanceUtil.isInheritorOrSelf(superClass, aClass, true)) {
|
||||
return superClass;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void setupMethodBody(@NotNull PsiMethod result, @NotNull PsiMethod originalMethod, @NotNull PsiClass targetClass) throws IncorrectOperationException {
|
||||
boolean isAbstract = originalMethod.hasModifierProperty(PsiModifier.ABSTRACT);
|
||||
String templateName = isAbstract ? JavaTemplateUtil.TEMPLATE_IMPLEMENTED_METHOD_BODY : JavaTemplateUtil.TEMPLATE_OVERRIDDEN_METHOD_BODY;
|
||||
@@ -358,8 +377,8 @@ public final class OverrideImplementUtil extends OverrideImplementExploreUtil {
|
||||
Properties properties = FileTemplateManager.getInstance(targetClass.getProject()).getDefaultProperties();
|
||||
properties.setProperty(FileTemplate.ATTRIBUTE_RETURN_TYPE, returnType.getPresentableText());
|
||||
properties.setProperty(FileTemplate.ATTRIBUTE_DEFAULT_RETURN_VALUE, PsiTypesUtil.getDefaultValueOfType(returnType, true));
|
||||
properties.setProperty(FileTemplate.ATTRIBUTE_CALL_SUPER, callSuper(originalMethod, result));
|
||||
properties.setProperty(FileTemplate.ATTRIBUTE_PLAIN_CALL_SUPER, callSuper(originalMethod, result, false));
|
||||
properties.setProperty(FileTemplate.ATTRIBUTE_CALL_SUPER, callSuper(originalMethod, result, targetClass));
|
||||
properties.setProperty(FileTemplate.ATTRIBUTE_PLAIN_CALL_SUPER, callSuper(originalMethod, result, targetClass, false));
|
||||
JavaTemplateUtil.setClassAndMethodNameProperties(properties, targetClass, result);
|
||||
|
||||
JVMElementFactory factory = JVMElementFactories.getFactory(targetClass.getLanguage(), originalMethod.getProject());
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
interface A<T> {
|
||||
default void m1(T t) { }
|
||||
}
|
||||
|
||||
interface B<T> extends A<T> {
|
||||
|
||||
}
|
||||
|
||||
class MyClass<T> implements B<T> {
|
||||
@Override
|
||||
public void m1(T t) {
|
||||
<selection><caret>B.super.m1(t);</selection>
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
interface A<T> {
|
||||
default void m1(T t) { }
|
||||
}
|
||||
|
||||
interface B<T> extends A<T> {
|
||||
|
||||
}
|
||||
|
||||
class MyClass<T> implements B<T> {
|
||||
<caret>
|
||||
}
|
||||
@@ -50,6 +50,8 @@ class OverrideImplementTest extends LightJavaCodeInsightFixtureTestCase {
|
||||
void testMultipleSuperMethodsThroughGenerics() { doTest(true) }
|
||||
|
||||
void testDoNotImplementExtensionMethods() { doTest(true) }
|
||||
|
||||
void testExtensionMethods1() { doTest(true) }
|
||||
|
||||
void testSkipUnknownAnnotations() { doTest(true) }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user