java 9: hide inappropriate for interface modifier suggestions, ensure valid combination of modifiers (IDEA-171091)

This commit is contained in:
Anna.Kozlova
2017-04-07 16:39:02 +02:00
parent 229ff01656
commit 32073ed7f9
5 changed files with 75 additions and 5 deletions

View File

@@ -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];

View File

@@ -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);

View File

@@ -0,0 +1,10 @@
// "Make 'I.foo' public" "true"
interface I {
default void foo() { }
}
class A implements I {
{
this.foo();
}
}

View File

@@ -0,0 +1,10 @@
// "Make 'I.foo' public" "true"
interface I {
private void foo() { }
}
class A implements I {
{
this.fo<caret>o();
}
}

View File

@@ -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;
}
}