From 48db714b671f3ef0f724a6bb7699f7a344d929f7 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 23 Mar 2015 13:12:03 +0100 Subject: [PATCH] jdk9: support private methods in interfaces (IDEA-137918) --- .../daemon/impl/analysis/HighlightMethodUtil.java | 3 ++- .../codeInsight/daemon/impl/analysis/HighlightUtil.java | 7 ++++++- java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java | 4 ++++ .../advHighlighting9/PrivateInInterfaces.java | 3 +++ .../codeInsight/daemon/LightAdvHighlightingJdk9Test.java | 1 + 5 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting9/PrivateInInterfaces.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 f3f35619dffa..92e639e2543f 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 @@ -1040,6 +1040,7 @@ public class HighlightMethodUtil { boolean isInterface = aClass != null && aClass.isInterface(); boolean isExtension = method.hasModifierProperty(PsiModifier.DEFAULT); boolean isStatic = method.hasModifierProperty(PsiModifier.STATIC); + boolean isPrivate = method.hasModifierProperty(PsiModifier.PRIVATE); final List additionalFixes = new ArrayList(); String description = null; @@ -1053,7 +1054,7 @@ public class HighlightMethodUtil { } } else if (isInterface) { - if (!isExtension && !isStatic) { + if (!isExtension && !isStatic && !isPrivate) { description = JavaErrorMessages.message("interface.methods.cannot.have.body"); if (languageLevel.isAtLeast(LanguageLevel.JDK_1_8)) { additionalFixes.add(QUICK_FIX_FACTORY.createModifierListFix(method, PsiModifier.DEFAULT, true, false)); 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 ce564b32a415..f5be639271d5 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 @@ -154,12 +154,16 @@ public class HighlightUtil extends HighlightUtilBase { Set incompatibles = incompatibleModifiersHash.get(modifier); if (incompatibles == null) return null; final boolean level8OrHigher = PsiUtil.isLanguageLevel8OrHigher(modifierList); + final boolean level9OrHigher = PsiUtil.isLanguageLevel9OrHigher(modifierList); for (@PsiModifier.ModifierConstant String incompatible : incompatibles) { if (level8OrHigher) { if (modifier.equals(PsiModifier.STATIC) && incompatible.equals(PsiModifier.ABSTRACT)){ continue; } } + if (level9OrHigher && modifier.equals(PsiModifier.PRIVATE) && incompatible.equals(PsiModifier.PUBLIC)) { + continue; + } if (modifier.equals(PsiModifier.STATIC) && incompatible.equals(PsiModifier.FINAL)) { final PsiElement parent = modifierList.getParent(); if (parent instanceof PsiMethod) { @@ -883,7 +887,8 @@ public class HighlightUtil extends HighlightUtilBase { if (PsiModifier.PRIVATE.equals(modifier) || PsiModifier.PROTECTED.equals(modifier) || PsiModifier.TRANSIENT.equals(modifier) || PsiModifier.STRICTFP.equals(modifier) || PsiModifier.SYNCHRONIZED.equals(modifier)) { - isAllowed &= modifierOwnerParent instanceof PsiClass && !((PsiClass)modifierOwnerParent).isInterface(); + isAllowed &= modifierOwnerParent instanceof PsiClass && + (!((PsiClass)modifierOwnerParent).isInterface() || PsiUtil.isLanguageLevel9OrHigher(modifierOwner)); } if (containingClass != null && containingClass.isAnnotationType()) { diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java index b31aa352c1f9..1d1978d0948e 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java @@ -889,6 +889,10 @@ public final class PsiUtil extends PsiUtilCore { return getLanguageLevel(element).isAtLeast(LanguageLevel.JDK_1_8); } + public static boolean isLanguageLevel9OrHigher(@NotNull final PsiElement element) { + return getLanguageLevel(element).isAtLeast(LanguageLevel.JDK_1_9); + } + @NotNull public static LanguageLevel getLanguageLevel(@NotNull PsiElement element) { if (element instanceof PsiDirectory) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting9/PrivateInInterfaces.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting9/PrivateInInterfaces.java new file mode 100644 index 000000000000..280cb8a6cab3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting9/PrivateInInterfaces.java @@ -0,0 +1,3 @@ +interface A { + private void m() {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk9Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk9Test.java index d36a4580c143..0c4874791fec 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk9Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk9Test.java @@ -53,4 +53,5 @@ public class LightAdvHighlightingJdk9Test extends LightDaemonAnalyzerTestCase { } public void testSafeVarargsApplicability() { doTest(true, false); } + public void testPrivateInInterfaces() { doTest(false, false); } }