java 9: ensure private methods in interfaces do not receive implicit public modifier (IDEA-171089)

This commit is contained in:
Anna.Kozlova
2017-04-07 18:20:18 +02:00
parent 8e598aa908
commit 229ff01656
3 changed files with 31 additions and 4 deletions
@@ -17,7 +17,6 @@ package com.intellij.psi.impl.source;
import com.intellij.codeInsight.AnnotationTargetUtil;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.Condition;
import com.intellij.psi.*;
import com.intellij.psi.augment.PsiAugmentProvider;
import com.intellij.psi.impl.CheckUtil;
@@ -158,9 +157,11 @@ public class PsiModifierListImpl extends JavaStubPsiElement<PsiModifierListStub>
else if (parent instanceof PsiMethod) {
PsiClass aClass = ((PsiMethod)parent).getContainingClass();
if (aClass != null && aClass.isInterface()) {
implicitModifiers.add(PUBLIC);
if (!explicitModifiers.contains(DEFAULT) && !explicitModifiers.contains(STATIC) && !explicitModifiers.contains(PRIVATE)) {
implicitModifiers.add(ABSTRACT);
if (!explicitModifiers.contains(PRIVATE)) {
implicitModifiers.add(PUBLIC);
if (!explicitModifiers.contains(DEFAULT) && !explicitModifiers.contains(STATIC)) {
implicitModifiers.add(ABSTRACT);
}
}
}
else if (aClass != null && aClass.isEnum() && ((PsiMethod)parent).isConstructor()) {
@@ -0,0 +1,25 @@
interface A {
void m();
}
interface A1 extends A {
<error descr="Static method 'm()' in 'A1' cannot override instance method 'm()' in 'A'">private static void m()</error> {}
}
interface A2 extends A {
<error descr="'m()' in 'A2' clashes with 'm()' in 'A'; attempting to assign weaker access privileges ('private'); was 'public'">private</error> void m() {}
}
interface B {
private void m() {}
}
interface B1 extends B {
private void m() {}
}
interface B2 extends B {
private static void m() {}
}
interface B3 extends B {
default void m() {}
}
interface B4 extends B {
void m();
}
@@ -41,6 +41,7 @@ public class LightAdvHighlightingJdk9Test extends LightDaemonAnalyzerTestCase {
public void testSafeVarargsApplicability() { doTest(true, false); }
public void testPrivateInInterfaces() { doTest(false, false); }
public void testPrivateInInterfacesOverriding() { doTest(false, false); }
public void testUnderscore() { doTest(false, false); }
public void testTryWithResources() { doTest(false, false); }