java: override default: fix super qualifier for default method (IDEA-260570)

GitOrigin-RevId: 7ad2c736b94867a067137f39e0eabf454ed8d5aa
This commit is contained in:
Anna Kozlova
2021-01-29 21:22:57 +00:00
committed by intellij-monorepo-bot
parent 7f04aa5c7f
commit a9a9d2dd10
4 changed files with 52 additions and 6 deletions
@@ -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) }