From 3f76ffa2f8d84ca8793960d4bfc03848454c827a Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 30 May 2017 14:51:43 +0300 Subject: [PATCH] provide quick fix to qualify super call to default interface method from class (IDEA-172325) --- .../daemon/impl/analysis/HighlightMethodUtil.java | 3 +++ .../impl/quickfix/QualifySuperArgumentFix.java | 5 +++-- .../afterDefaultInInterfaceFromClass.java | 14 ++++++++++++++ .../beforeDefaultInInterfaceAbstract.java | 11 +++++++++++ .../beforeDefaultInInterfaceFromClass.java | 14 ++++++++++++++ 5 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyThis/afterDefaultInInterfaceFromClass.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyThis/beforeDefaultInInterfaceAbstract.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyThis/beforeDefaultInInterfaceFromClass.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java index 1fe2bfed9558..5138d2cabf91 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java @@ -826,6 +826,9 @@ public class HighlightMethodUtil { QUICK_FIX_FACTORY.createModifierListFix((PsiClass)resolve, PsiModifier.STATIC, true, false)); } } + else if (qualifierExpression instanceof PsiSuperExpression && ((PsiSuperExpression)qualifierExpression).getQualifier() == null) { + QualifySuperArgumentFix.registerQuickFixAction((PsiSuperExpression)qualifierExpression, highlightInfo); + } QuickFixAction.registerQuickFixAction(highlightInfo, fixRange, QUICK_FIX_FACTORY.createCreateMethodFromUsageFix(methodCall)); QuickFixAction.registerQuickFixAction(highlightInfo, fixRange, QUICK_FIX_FACTORY.createCreateAbstractMethodFromUsageFix(methodCall)); diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QualifySuperArgumentFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QualifySuperArgumentFix.java index 6219d0e12fe3..6cfc3fc07868 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QualifySuperArgumentFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QualifySuperArgumentFix.java @@ -40,7 +40,7 @@ public class QualifySuperArgumentFix extends QualifyThisOrSuperArgumentFix { public static void registerQuickFixAction(@NotNull PsiSuperExpression expr, HighlightInfo highlightInfo) { LOG.assertTrue(expr.getQualifier() == null); final PsiClass containingClass = PsiTreeUtil.getParentOfType(expr, PsiClass.class); - if (containingClass != null && containingClass.isInterface()) { + if (containingClass != null) { final PsiMethodCallExpression callExpression = PsiTreeUtil.getParentOfType(expr, PsiMethodCallExpression.class); if (callExpression != null) { final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(callExpression.getProject()); @@ -50,7 +50,8 @@ public class QualifySuperArgumentFix extends QualifyThisOrSuperArgumentFix { final PsiExpression superQualifierCopy = copy.getMethodExpression().getQualifierExpression(); LOG.assertTrue(superQualifierCopy != null); superQualifierCopy.delete(); - if (((PsiMethodCallExpression)elementFactory.createExpressionFromText(copy.getText(), superClass)).resolveMethod() != null) { + PsiMethod method = ((PsiMethodCallExpression)elementFactory.createExpressionFromText(copy.getText(), superClass)).resolveMethod(); + if (method != null && !method.hasModifierProperty(PsiModifier.ABSTRACT)) { QuickFixAction.registerQuickFixAction(highlightInfo, new QualifySuperArgumentFix(expr, superClass)); } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyThis/afterDefaultInInterfaceFromClass.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyThis/afterDefaultInInterfaceFromClass.java new file mode 100644 index 000000000000..a51feb313093 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyThis/afterDefaultInInterfaceFromClass.java @@ -0,0 +1,14 @@ +// "Qualify super expression with 'Super'" "true" +interface Super +{ + default void method() + { + System.out.println("Super.method()"); + } +} + +class Sub implements Super { + void foo() { + Super.super.method(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyThis/beforeDefaultInInterfaceAbstract.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyThis/beforeDefaultInInterfaceAbstract.java new file mode 100644 index 000000000000..f9f945d3002f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyThis/beforeDefaultInInterfaceAbstract.java @@ -0,0 +1,11 @@ +// "Qualify super expression with 'Super'" "false" +interface Super +{ + void method(); +} + +interface Sub extends Super { + default void foo() { + super.method(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyThis/beforeDefaultInInterfaceFromClass.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyThis/beforeDefaultInInterfaceFromClass.java new file mode 100644 index 000000000000..a3b30f29d730 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/qualifyThis/beforeDefaultInInterfaceFromClass.java @@ -0,0 +1,14 @@ +// "Qualify super expression with 'Super'" "true" +interface Super +{ + default void method() + { + System.out.println("Super.method()"); + } +} + +class Sub implements Super { + void foo() { + super.method(); + } +} \ No newline at end of file