From 31f950b5013eb0ddb73acb7dcadaf755c5fe2795 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 6 Feb 2025 08:38:20 +0100 Subject: [PATCH] [java-highlighting] checkCreateInnerClassFromStaticContext -> JavaInheritorsGetter.isInnerClassFromStaticContext Part of IDEA-365344 Create a new Java error highlighter with minimal dependencies (PSI only) GitOrigin-RevId: 449d1d80f89480b3d13f8f0d299d2c309da0f0c6 --- .../impl/analysis/HighlightClassUtil.java | 74 +------------------ .../completion/JavaInheritorsGetter.java | 18 +++-- 2 files changed, 16 insertions(+), 76 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java index eb0cb5b1738a..1cf9f887a4f6 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java @@ -11,7 +11,10 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.search.searches.DirectClassInheritorsSearch; -import com.intellij.psi.util.*; +import com.intellij.psi.util.JavaElementKind; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiTypesUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -32,75 +35,6 @@ public final class HighlightClassUtil { return PsiTypesUtil.isRestrictedIdentifier(typeName, level); } - private static void registerMakeInnerClassStatic(@Nullable PsiClass aClass, @Nullable HighlightInfo.Builder result) { - if (result == null || aClass == null) return; - if (aClass.getContainingClass() != null) { - PsiModifierList modifierList = aClass.getModifierList(); - if (modifierList != null && JavaPsiModifierUtil.getIncompatibleModifier(PsiModifier.STATIC, modifierList) == null) { - IntentionAction action = QuickFixFactory.getInstance().createModifierListFix(aClass, PsiModifier.STATIC, true, false); - result.registerFix(action, null, null, null, null); - } - } - } - - public static HighlightInfo.Builder checkCreateInnerClassFromStaticContext(@NotNull PsiElement element, - @Nullable PsiExpression qualifier, - @NotNull PsiClass aClass) { - PsiElement placeToSearchEnclosingFrom; - if (qualifier != null) { - PsiType qType = qualifier.getType(); - placeToSearchEnclosingFrom = PsiUtil.resolveClassInType(qType); - } - else { - placeToSearchEnclosingFrom = element; - } - if (placeToSearchEnclosingFrom == null) { - return null; - } - return checkCreateInnerClassFromStaticContext(element, placeToSearchEnclosingFrom, aClass); - } - - static HighlightInfo.Builder checkCreateInnerClassFromStaticContext(@NotNull PsiElement element, - @NotNull PsiElement placeToSearchEnclosingFrom, - @NotNull PsiClass aClass) { - if (!PsiUtil.isInnerClass(aClass)) return null; - PsiClass outerClass = aClass.getContainingClass(); - if (outerClass == null) return null; - - if (outerClass instanceof PsiSyntheticClass || - InheritanceUtil.hasEnclosingInstanceInScope(outerClass, placeToSearchEnclosingFrom, true, false)) { - return null; - } - return checkIllegalEnclosingUsage(placeToSearchEnclosingFrom, aClass, outerClass, element); - } - - static HighlightInfo.Builder checkIllegalEnclosingUsage(@NotNull PsiElement place, - @Nullable PsiClass aClass, - @NotNull PsiClass outerClass, - @NotNull PsiElement elementToHighlight) { - if (!PsiTreeUtil.isContextAncestor(outerClass, place, false)) { - String description = JavaErrorBundle.message("is.not.an.enclosing.class", HighlightUtil.formatClass(outerClass)); - HighlightInfo.Builder highlightInfo = - HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(elementToHighlight).descriptionAndTooltip(description); - registerMakeInnerClassStatic(aClass, highlightInfo); - return highlightInfo; - } - PsiModifierListOwner staticParent = PsiUtil.getEnclosingStaticElement(place, outerClass); - if (staticParent != null) { - String element = HighlightUtil.formatClass(outerClass) + "." + - (place instanceof PsiSuperExpression ? PsiKeyword.SUPER : PsiKeyword.THIS); - String description = JavaErrorBundle.message("cannot.be.referenced.from.static.context", element); - HighlightInfo.Builder builder = - HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(elementToHighlight).descriptionAndTooltip(description); - // make context not static or referenced class static - IntentionAction action1 = QuickFixFactory.getInstance().createModifierListFix(staticParent, PsiModifier.STATIC, false, false); - builder.registerFix(action1, null, null, null, null); - registerMakeInnerClassStatic(aClass, builder); - return builder; - } - return null; - } - public static HighlightInfo.Builder checkExtendsSealedClass(@NotNull PsiClass aClass, @NotNull PsiClass superClass, @NotNull PsiJavaCodeReferenceElement elementToHighlight) { diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java index 89765d9249d9..1f3a926ea667 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaInheritorsGetter.java @@ -3,7 +3,6 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.CodeInsightUtil; import com.intellij.codeInsight.ExpectedTypeInfo; -import com.intellij.codeInsight.daemon.impl.analysis.HighlightClassUtil; import com.intellij.codeInsight.lookup.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.pom.java.JavaFeature; @@ -15,10 +14,7 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.statistics.JavaStatisticsManager; import com.intellij.psi.statistics.StatisticsInfo; import com.intellij.psi.statistics.StatisticsManager; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.PsiTypesUtil; -import com.intellij.psi.util.PsiUtil; -import com.intellij.psi.util.TypeConversionUtil; +import com.intellij.psi.util.*; import com.intellij.util.ArrayUtil; import com.intellij.util.Consumer; import com.intellij.util.IncorrectOperationException; @@ -110,7 +106,7 @@ public class JavaInheritorsGetter { PsiElement position = parameters.getPosition(); if ((parameters.getInvocationCount() < 2 || psiClass instanceof PsiCompiledElement) && - HighlightClassUtil.checkCreateInnerClassFromStaticContext(position, null, psiClass) != null && + isInnerClassFromStaticContext(position, psiClass) && !psiElement().afterLeaf(psiElement().withText(PsiKeyword.NEW).afterLeaf(".")).accepts(position)) { return null; } @@ -251,4 +247,14 @@ public class JavaInheritorsGetter { } return true; } + + private static boolean isInnerClassFromStaticContext(@NotNull PsiElement element, @NotNull PsiClass aClass) { + if (aClass.hasModifierProperty(PsiModifier.STATIC)) return false; + PsiClass outerClass = aClass.getContainingClass(); + if (outerClass == null) return false; + + return !InheritanceUtil.hasEnclosingInstanceInScope(outerClass, element, true, false) && + (!PsiTreeUtil.isContextAncestor(outerClass, element, false) || + PsiUtil.getEnclosingStaticElement(element, outerClass) != null); + } }