From 32073ed7f90fe6d34edea958d2ebe2de2cd69772 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Fri, 7 Apr 2017 16:39:02 +0200 Subject: [PATCH] java 9: hide inappropriate for interface modifier suggestions, ensure valid combination of modifiers (IDEA-171091) --- .../daemon/impl/analysis/HighlightUtil.java | 5 +++ .../daemon/impl/quickfix/ModifierFix.java | 20 ++++++++--- .../quickFix/modifier19/afterMakeDefault.java | 10 ++++++ .../modifier19/beforeMakeDefault.java | 10 ++++++ .../daemon/quickFix/Modifier19Test.java | 35 +++++++++++++++++++ 5 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/modifier19/afterMakeDefault.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/modifier19/beforeMakeDefault.java create mode 100644 java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/Modifier19Test.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index f7befda24842..edaf4e6391c8 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -200,6 +200,7 @@ public class HighlightUtil extends HighlightUtilBase { /** * make element protected/package-private/public suggestion + * for private method in the interface it should add default modifier as well */ static void registerAccessQuickFixAction(@NotNull PsiMember refElement, @NotNull PsiJavaCodeReferenceElement place, @@ -238,6 +239,10 @@ public class HighlightUtil extends HighlightUtilBase { if (refElement.hasModifierProperty(PsiModifier.PROTECTED)) { minModifier = PsiModifier.PUBLIC; } + PsiClass containingClass = refElement.getContainingClass(); + if (containingClass != null && containingClass.isInterface()) { + minModifier = PsiModifier.PUBLIC; + } String[] modifiers = {PsiModifier.PACKAGE_LOCAL, PsiModifier.PROTECTED, PsiModifier.PUBLIC,}; for (int i = ArrayUtil.indexOf(modifiers, minModifier); i < modifiers.length; i++) { @PsiModifier.ModifierConstant String modifier = modifiers[i]; diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ModifierFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ModifierFix.java index 3f3948ce123c..068000712f53 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ModifierFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ModifierFix.java @@ -200,11 +200,21 @@ public class ModifierFix extends LocalQuickFixAndIntentionActionOnPsiElement { ApplicationManager.getApplication().runWriteAction(() -> { changeModifierList(modifierList); - if (myShouldHave && owner instanceof PsiMethod && PsiModifier.ABSTRACT.equals(myModifier)) { - final PsiMethod method = (PsiMethod)owner; - final PsiClass aClass = method.getContainingClass(); - if (aClass != null && !aClass.hasModifierProperty(PsiModifier.ABSTRACT)) { - changeModifierList(aClass.getModifierList()); + if (myShouldHave && owner instanceof PsiMethod) { + if (PsiModifier.ABSTRACT.equals(myModifier)) { + final PsiMethod method = (PsiMethod)owner; + final PsiClass aClass = method.getContainingClass(); + if (aClass != null && !aClass.hasModifierProperty(PsiModifier.ABSTRACT)) { + changeModifierList(aClass.getModifierList()); + } + } + else if (PsiModifier.PUBLIC.equals(myModifier) && + ((PsiMethod)owner).getBody() != null && + !((PsiMethod)owner).hasModifierProperty(PsiModifier.STATIC)) { + PsiClass containingClass = ((PsiMethod)owner).getContainingClass(); + if (containingClass != null && containingClass.isInterface()) { + modifierList.setModifierProperty(PsiModifier.DEFAULT, true); + } } } UndoUtil.markPsiFileForUndo(containingFile); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/modifier19/afterMakeDefault.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/modifier19/afterMakeDefault.java new file mode 100644 index 000000000000..c787af2ad7ee --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/modifier19/afterMakeDefault.java @@ -0,0 +1,10 @@ +// "Make 'I.foo' public" "true" +interface I { + default void foo() { } +} + +class A implements I { + { + this.foo(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/modifier19/beforeMakeDefault.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/modifier19/beforeMakeDefault.java new file mode 100644 index 000000000000..76b1c34ebdb9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/modifier19/beforeMakeDefault.java @@ -0,0 +1,10 @@ +// "Make 'I.foo' public" "true" +interface I { + private void foo() { } +} + +class A implements I { + { + this.foo(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/Modifier19Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/Modifier19Test.java new file mode 100644 index 000000000000..202de7565669 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/Modifier19Test.java @@ -0,0 +1,35 @@ +/* + * Copyright 2000-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInsight.daemon.quickFix; + +import com.intellij.testFramework.LightProjectDescriptor; +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; +import org.jetbrains.annotations.NotNull; + +public class Modifier19Test extends LightQuickFixParameterizedTestCase { + public void test() throws Exception { doAllTests(); } + + @Override + protected String getBasePath() { + return "/codeInsight/daemonCodeAnalyzer/quickFix/modifier19"; + } + + @NotNull + @Override + protected LightProjectDescriptor getProjectDescriptor() { + return LightCodeInsightFixtureTestCase.JAVA_9; + } +}