From 7c64f7f035f0e070478088a640c4c2e4113dc5fa Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 15 Jun 2020 22:01:30 +0200 Subject: [PATCH] java sealed types: forbid non-sealed classes without sealed supers (IDEA-243536) GitOrigin-RevId: ce7b48fc5df80edf0a4efc987a23850aff993f6c --- .../codeInsight/daemon/impl/analysis/HighlightUtil.java | 5 +++++ .../advHighlightingSealedTypes/SealedTypesBasics.java | 4 ++++ 2 files changed, 9 insertions(+) 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 45a5535097bb..6c1f6c369be9 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 @@ -988,6 +988,11 @@ public class HighlightUtil { isAllowed &= !privateOrProtected; } } + if (PsiModifier.NON_SEALED.equals(modifier) && !aClass.hasModifierProperty(PsiModifier.SEALED)) { + isAllowed = Arrays.stream(aClass.getSuperTypes()) + .map(PsiClassType::resolve) + .anyMatch(superClass -> superClass != null && superClass.hasModifierProperty(PsiModifier.SEALED)); + } } else if (modifierOwner instanceof PsiMethod) { PsiMethod method = (PsiMethod)modifierOwner; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingSealedTypes/SealedTypesBasics.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingSealedTypes/SealedTypesBasics.java index 43a98903a8d5..58c1bdbcb5fe 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingSealedTypes/SealedTypesBasics.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingSealedTypes/SealedTypesBasics.java @@ -13,3 +13,7 @@ sealed interface IA permits IB, IC {} final class IB implements IA {} sealed interface IC extends IA {} class ICSameFile implements IC {} + +sealed interface ID0 {} +non-sealed interface ID1 extends ID0 {} +non-sealed interface ID extends ID1 {}