diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java index a59193525fc2..96c029acd468 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java @@ -680,7 +680,8 @@ public final class AnnotationsHighlightUtil { } static HighlightInfo.Builder checkFunctionalInterface(@NotNull PsiAnnotation annotation, @NotNull LanguageLevel languageLevel) { - if (languageLevel.isAtLeast(LanguageLevel.JDK_1_8) && Comparing.strEqual(annotation.getQualifiedName(), CommonClassNames.JAVA_LANG_FUNCTIONAL_INTERFACE)) { + if (JavaFeature.LAMBDA_EXPRESSIONS.isSufficient(languageLevel) && + Comparing.strEqual(annotation.getQualifiedName(), CommonClassNames.JAVA_LANG_FUNCTIONAL_INTERFACE)) { PsiAnnotationOwner owner = annotation.getOwner(); if (owner instanceof PsiModifierList) { PsiElement parent = ((PsiModifierList)owner).getParent(); diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java index 371fd465caa1..925610fd3e6f 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightControlFlowUtil.java @@ -16,6 +16,7 @@ import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.util.Predicates; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.TextRange; +import com.intellij.pom.java.JavaFeature; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.augment.PsiAugmentProvider; @@ -724,7 +725,7 @@ public final class HighlightControlFlowUtil { return null; } } - boolean isToBeEffectivelyFinal = languageLevel.isAtLeast(LanguageLevel.JDK_1_8); + boolean isToBeEffectivelyFinal = JavaFeature.EFFECTIVELY_FINAL.isSufficient(languageLevel); if (isToBeEffectivelyFinal && isEffectivelyFinal(variable, scope, context)) { return null; } 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 1880734b9bce..f224440488ac 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 @@ -220,8 +220,8 @@ public final class HighlightMethodUtil { } PsiType substitutedSuperReturnType; - boolean isJdk15 = languageLevel.isAtLeast(LanguageLevel.JDK_1_5); - if (isJdk15 && !superMethodSignature.isRaw() && superMethodSignature.equals(methodSignature)) { //see 8.4.5 + boolean hasGenerics = JavaFeature.GENERICS.isSufficient(languageLevel); + if (hasGenerics && !superMethodSignature.isRaw() && superMethodSignature.equals(methodSignature)) { //see 8.4.5 PsiSubstitutor unifyingSubstitutor = MethodSignatureUtil.getSuperMethodSignatureSubstitutor(methodSignature, superMethodSignature); substitutedSuperReturnType = unifyingSubstitutor == null @@ -234,7 +234,7 @@ public final class HighlightMethodUtil { if (returnType.equals(substitutedSuperReturnType)) return null; if (!(returnType instanceof PsiPrimitiveType) && substitutedSuperReturnType.getDeepComponentType() instanceof PsiClassType) { - if (isJdk15 && LambdaUtil.performWithSubstitutedParameterBounds(methodSignature.getTypeParameters(), + if (hasGenerics && LambdaUtil.performWithSubstitutedParameterBounds(methodSignature.getTypeParameters(), methodSignature.getSubstitutor(), () -> TypeConversionUtil.isAssignable(substitutedSuperReturnType, returnType))) { return null; @@ -505,8 +505,8 @@ public final class HighlightMethodUtil { TextRange range = getFixRange(methodCall); registerStaticMethodQualifierFixes(methodCall, builder); registerUsageFixes(methodCall, builder, range); - if (resolved instanceof PsiVariable && languageLevel.isAtLeast(LanguageLevel.JDK_1_8)) { - PsiMethod method = LambdaUtil.getFunctionalInterfaceMethod(((PsiVariable)resolved).getType()); + if (resolved instanceof PsiVariable variable && JavaFeature.LAMBDA_EXPRESSIONS.isSufficient(languageLevel)) { + PsiMethod method = LambdaUtil.getFunctionalInterfaceMethod(variable.getType()); if (method != null) { IntentionAction action = QuickFixFactory.getInstance().createInsertMethodCallFix(methodCall, method); builder.registerFix(action, null, null, range, null); @@ -1393,10 +1393,10 @@ public final class HighlightMethodUtil { description = JavaErrorBundle.message("extension.method.should.have.a.body"); } else if (isInterface) { - if (isStatic && languageLevel.isAtLeast(LanguageLevel.JDK_1_8)) { + if (isStatic && JavaFeature.STATIC_INTERFACE_CALLS.isSufficient(languageLevel)) { description = JavaErrorBundle.message("static.methods.in.interfaces.should.have.body"); } - else if (isPrivate && languageLevel.isAtLeast(LanguageLevel.JDK_1_9)) { + else if (isPrivate && JavaFeature.PRIVATE_INTERFACE_METHODS.isSufficient(languageLevel)) { description = JavaErrorBundle.message("private.methods.in.interfaces.should.have.body"); } } @@ -1407,7 +1407,7 @@ public final class HighlightMethodUtil { else if (isInterface) { if (!isExtension && !isStatic && !isPrivate && !isConstructor) { description = JavaErrorBundle.message("interface.methods.cannot.have.body"); - if (languageLevel.isAtLeast(LanguageLevel.JDK_1_8)) { + if (JavaFeature.EXTENSION_METHODS.isSufficient(languageLevel)) { if (Stream.of(method.findDeepestSuperMethods()) .map(PsiMethod::getContainingClass) .filter(Objects::nonNull) 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 889d7abba541..de49f60c639a 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 @@ -2080,7 +2080,8 @@ public final class HighlightUtil { } } - if (qualifier != null && aClass.isInterface() && expr instanceof PsiSuperExpression && languageLevel.isAtLeast(LanguageLevel.JDK_1_8)) { + if (qualifier != null && aClass.isInterface() && expr instanceof PsiSuperExpression && + JavaFeature.EXTENSION_METHODS.isSufficient(languageLevel)) { //15.12.1 for method invocation expressions; 15.13 for method references //If TypeName denotes an interface, I, then let T be the type declaration immediately enclosing the method reference expression. //It is a compile-time error if I is not a direct superinterface of T, @@ -2135,7 +2136,7 @@ public final class HighlightUtil { static HighlightInfo.Builder checkUnqualifiedSuperInDefaultMethod(@NotNull LanguageLevel languageLevel, @NotNull PsiReferenceExpression expr, @Nullable PsiExpression qualifier) { - if (languageLevel.isAtLeast(LanguageLevel.JDK_1_8) && qualifier instanceof PsiSuperExpression) { + if (JavaFeature.EXTENSION_METHODS.isSufficient(languageLevel) && qualifier instanceof PsiSuperExpression) { PsiMethod method = PsiTreeUtil.getParentOfType(expr, PsiMethod.class); if (method != null && method.hasModifierProperty(PsiModifier.DEFAULT) && ((PsiSuperExpression)qualifier).getQualifier() == null) { String description = JavaErrorBundle.message("unqualified.super.disallowed"); @@ -2152,7 +2153,7 @@ public final class HighlightUtil { @Nullable PsiJavaCodeReferenceElement qualifier, @NotNull PsiClass aClass, @NotNull LanguageLevel languageLevel) { - if (!(expr instanceof PsiSuperExpression) || qualifier == null || !languageLevel.isAtLeast(LanguageLevel.JDK_1_8)) return false; + if (!(expr instanceof PsiSuperExpression) || qualifier == null || !JavaFeature.EXTENSION_METHODS.isSufficient(languageLevel)) return false; PsiType superType = expr.getType(); if (!(superType instanceof PsiClassType)) return false; PsiClass superClass = ((PsiClassType)superType).resolve(); @@ -3804,11 +3805,7 @@ public final class HighlightUtil { if (!feature.isSufficient(level)) { message = message == null ? getUnsupportedFeatureMessage(feature, level, file) : message; HighlightInfo.Builder info = HighlightInfo.newHighlightInfo(highlightInfoType).range(element).descriptionAndTooltip(message); - List registrar = new ArrayList<>(); - registerIncreaseLanguageLevelFixes(file, feature, registrar); - for (IntentionAction action : registrar) { - info.registerFix(action, null, null, null, null); - } + registerIncreaseLanguageLevelFixes(file, feature, info); return info; } @@ -3822,17 +3819,24 @@ public final class HighlightUtil { if (!feature.isSufficient(level)) { String message = getUnsupportedFeatureMessage(feature, level, file); HighlightInfo.Builder info = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(range).descriptionAndTooltip(message); - List registrar = new ArrayList<>(); - registerIncreaseLanguageLevelFixes(file, feature, registrar); - for (IntentionAction action : registrar) { - info.registerFix(action, null, null, null, null); - } + registerIncreaseLanguageLevelFixes(file, feature, info); return info; } return null; } + public static void registerIncreaseLanguageLevelFixes(@NotNull PsiElement element, + @NotNull JavaFeature feature, + HighlightInfo.Builder info) { + if (info == null) return; + List registrar = new ArrayList<>(); + registerIncreaseLanguageLevelFixes(element, feature, registrar); + for (IntentionAction action : registrar) { + info.registerFix(action, null, null, null, null); + } + } + public static void registerIncreaseLanguageLevelFixes(@NotNull PsiElement element, @NotNull JavaFeature feature, @NotNull List registrar) { diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index 92ada6b36440..e6a90502356f 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -771,7 +771,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh if (!hasErrorResults()) { add(HighlightClassUtil.checkClassRestrictedKeyword(myLanguageLevel, identifier)); } - if (!hasErrorResults() && myLanguageLevel.isAtLeast(LanguageLevel.JDK_1_8)) { + if (!hasErrorResults() && JavaFeature.EXTENSION_METHODS.isSufficient(myLanguageLevel)) { add(GenericsHighlightUtil.checkUnrelatedDefaultMethods(aClass, identifier)); } diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/SwitchBlockHighlightingModel.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/SwitchBlockHighlightingModel.java index fcb3cad7f6da..e75588cd7cca 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/SwitchBlockHighlightingModel.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/SwitchBlockHighlightingModel.java @@ -159,19 +159,18 @@ public class SwitchBlockHighlightingModel { SelectorKind kind = getSwitchSelectorKind(); if (kind == SelectorKind.INT) return; - LanguageLevel requiredLevel = null; - if (kind == SelectorKind.ENUM) requiredLevel = LanguageLevel.JDK_1_5; - if (kind == SelectorKind.STRING) requiredLevel = LanguageLevel.JDK_1_7; + JavaFeature requiredFeature = null; + if (kind == SelectorKind.ENUM) requiredFeature = JavaFeature.ENUMS; + if (kind == SelectorKind.STRING) requiredFeature = JavaFeature.STRING_SWITCH; - if (kind == null || requiredLevel != null && !myLevel.isAtLeast(requiredLevel)) { + if (kind == null || requiredFeature != null && !requiredFeature.isSufficient(myLevel)) { boolean is7 = myLevel.isAtLeast(LanguageLevel.JDK_1_7); String expected = JavaErrorBundle.message(is7 ? "valid.switch.1_7.selector.types" : "valid.switch.selector.types"); HighlightInfo.Builder info = createError(mySelector, JavaErrorBundle.message("incompatible.types", expected, JavaHighlightUtil.formatType(mySelectorType))); registerFixesOnInvalidSelector(info); - if (requiredLevel != null) { - IntentionAction action = getFixFactory().createIncreaseLanguageLevelFix(requiredLevel); - info.registerFix(action, null, null, null, null); + if (requiredFeature != null) { + HighlightUtil.registerIncreaseLanguageLevelFixes(mySelector, requiredFeature, info); } errorSink.accept(info); } diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapWithAdapterMethodCallFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapWithAdapterMethodCallFix.java index a7b7abf63aaa..ee5a6bc9c95d 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapWithAdapterMethodCallFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapWithAdapterMethodCallFix.java @@ -11,6 +11,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Predicates; import com.intellij.openapi.util.TextRange; +import com.intellij.pom.java.JavaFeature; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; @@ -229,11 +230,11 @@ public final class WrapWithAdapterMethodCallFix extends LocalQuickFixAndIntentio new Wrapper("java.util.Arrays.asList({0})", inType -> inType instanceof PsiArrayType && ((PsiArrayType)inType).getComponentType() instanceof PsiClassType, outType -> InheritanceUtil.isInheritor(outType, CommonClassNames.JAVA_LANG_ITERABLE) && - isAppropriateLanguageLevel(outType ,l -> l.isLessThan(JDK_1_9))), + isAppropriateLanguageLevel(outType, l -> l.isLessThan(JDK_1_9))), new Wrapper("java.util.List.of({0})", inType -> inType instanceof PsiArrayType && ((PsiArrayType)inType).getComponentType() instanceof PsiClassType, outType -> InheritanceUtil.isInheritor(outType, CommonClassNames.JAVA_LANG_ITERABLE) && - isAppropriateLanguageLevel(outType ,l -> l.isAtLeast(JDK_1_9))), + isAppropriateLanguageLevel(outType, JavaFeature.COLLECTION_FACTORIES::isSufficient)), new Wrapper("java.lang.Math.toIntExact({0})", inType -> PsiTypes.longType().equals(inType) || inType.equalsToText(CommonClassNames.JAVA_LANG_LONG), outType -> PsiTypes.intType().equals(outType) || outType.equalsToText(CommonClassNames.JAVA_LANG_INTEGER)), diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java index e6b36613198c..1751c0256789 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeLambdaInspection.java @@ -13,7 +13,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.pom.java.LanguageLevel; +import com.intellij.pom.java.JavaFeature; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.controlFlow.AnalysisCanceledException; @@ -208,7 +208,7 @@ public final class AnonymousCanBeLambdaInspection extends AbstractBaseJavaLocalI boolean acceptParameterizedFunctionTypes, boolean reportNotAnnotatedInterfaces, @NotNull Set ignoredRuntimeAnnotations) { - if (PsiUtil.getLanguageLevel(aClass).isAtLeast(LanguageLevel.JDK_1_8)) { + if (PsiUtil.isAvailable(JavaFeature.LAMBDA_EXPRESSIONS, aClass)) { final PsiClassType baseClassType = aClass.getBaseClassType(); final PsiClassType.ClassResolveResult resolveResult = baseClassType.resolveGenerics(); final PsiClass baseClass = resolveResult.getElement(); diff --git a/java/java-analysis-impl/src/com/siyeh/ig/psiutils/SwitchUtils.java b/java/java-analysis-impl/src/com/siyeh/ig/psiutils/SwitchUtils.java index 787908a9e61f..20a31cfb5d24 100644 --- a/java/java-analysis-impl/src/com/siyeh/ig/psiutils/SwitchUtils.java +++ b/java/java-analysis-impl/src/com/siyeh/ig/psiutils/SwitchUtils.java @@ -252,7 +252,7 @@ public final class SwitchUtils { if (expression == null) { return null; } - if (languageLevel.isAtLeast(LanguageLevel.JDK_1_7)) { + if (JavaFeature.STRING_SWITCH.isSufficient(languageLevel)) { final PsiExpression jdk17Expression = determinePossibleJdk17SwitchExpression(expression, null); if (jdk17Expression != null) { return jdk17Expression; @@ -472,8 +472,8 @@ public final class SwitchUtils { if (expression == null) { return false; } - if (languageLevel.isAtLeast(LanguageLevel.JDK_1_5) && expression instanceof PsiReferenceExpression) { - final PsiElement referent = ((PsiReference)expression).resolve(); + if (JavaFeature.ENUMS.isSufficient(languageLevel) && expression instanceof PsiReferenceExpression ref) { + final PsiElement referent = ref.resolve(); if (referent instanceof PsiEnumConstant) { return existingCaseValues == null || existingCaseValues.add(referent); } diff --git a/java/java-analysis-impl/src/com/siyeh/ig/visibility/ClassEscapesItsScopeInspection.java b/java/java-analysis-impl/src/com/siyeh/ig/visibility/ClassEscapesItsScopeInspection.java index 6233adb928d3..daed50a83a66 100644 --- a/java/java-analysis-impl/src/com/siyeh/ig/visibility/ClassEscapesItsScopeInspection.java +++ b/java/java-analysis-impl/src/com/siyeh/ig/visibility/ClassEscapesItsScopeInspection.java @@ -24,9 +24,10 @@ import com.intellij.openapi.roots.ModuleFileIndex; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.pom.java.LanguageLevel; +import com.intellij.pom.java.JavaFeature; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.util.containers.ContainerUtil; import com.siyeh.InspectionGadgetsBundle; import org.intellij.lang.annotations.Pattern; @@ -69,19 +70,17 @@ public final class ClassEscapesItsScopeInspection extends AbstractBaseJavaLocalI List checkers = new ArrayList<>(2); if (checkModuleApi) { PsiFile file = holder.getFile(); - if (file instanceof PsiJavaFile javaFile) { - if (javaFile.getLanguageLevel().isAtLeast(LanguageLevel.JDK_1_9)) { - PsiJavaModule psiModule = JavaModuleGraphUtil.findDescriptorByElement(file); - if (psiModule != null) { - VirtualFile vFile = file.getVirtualFile(); - if (vFile != null) { - Module module = ProjectFileIndex.getInstance(holder.getProject()).getModuleForFile(vFile); - if (module != null) { - Set exportedPackageNames = - new HashSet<>(ContainerUtil.mapNotNull(psiModule.getExports(), PsiPackageAccessibilityStatement::getPackageName)); - if (exportedPackageNames.contains(javaFile.getPackageName())) { - checkers.add(new Java9NonAccessibleTypeExposedVisitor(holder, module, psiModule.getName(), exportedPackageNames)); - } + if (file instanceof PsiJavaFile javaFile && PsiUtil.isAvailable(JavaFeature.MODULES, javaFile)) { + PsiJavaModule psiModule = JavaModuleGraphUtil.findDescriptorByElement(file); + if (psiModule != null) { + VirtualFile vFile = file.getVirtualFile(); + if (vFile != null) { + Module module = ProjectFileIndex.getInstance(holder.getProject()).getModuleForFile(vFile); + if (module != null) { + Set exportedPackageNames = + new HashSet<>(ContainerUtil.mapNotNull(psiModule.getExports(), PsiPackageAccessibilityStatement::getPackageName)); + if (exportedPackageNames.contains(javaFile.getPackageName())) { + checkers.add(new Java9NonAccessibleTypeExposedVisitor(holder, module, psiModule.getName(), exportedPackageNames)); } } } diff --git a/java/java-frontback-impl/src/com/intellij/codeInsight/editorActions/JavaBackspaceHandler.java b/java/java-frontback-impl/src/com/intellij/codeInsight/editorActions/JavaBackspaceHandler.java index 4fdb5612bee8..27eff5b8b292 100644 --- a/java/java-frontback-impl/src/com/intellij/codeInsight/editorActions/JavaBackspaceHandler.java +++ b/java/java-frontback-impl/src/com/intellij/codeInsight/editorActions/JavaBackspaceHandler.java @@ -3,7 +3,7 @@ package com.intellij.codeInsight.editorActions; import com.intellij.codeInsight.definition.AbstractBasicJavaDefinitionService; import com.intellij.openapi.editor.Editor; -import com.intellij.pom.java.LanguageLevel; +import com.intellij.pom.java.JavaFeature; import com.intellij.psi.AbstractBasicJavaFile; import com.intellij.psi.JavaTokenType; import com.intellij.psi.PsiFile; @@ -23,7 +23,7 @@ public final class JavaBackspaceHandler extends BackspaceHandlerDelegate { private static boolean isHigherThan50r(@Nullable PsiFile file){ return file instanceof AbstractBasicJavaFile && - AbstractBasicJavaDefinitionService.getJavaDefinitionService().getLanguageLevel(file).isAtLeast(LanguageLevel.JDK_1_5); + JavaFeature.GENERICS.isSufficient(AbstractBasicJavaDefinitionService.getJavaDefinitionService().getLanguageLevel(file)); } @Override diff --git a/java/java-frontback-impl/src/com/intellij/codeInsight/editorActions/JavaQuoteHandler.java b/java/java-frontback-impl/src/com/intellij/codeInsight/editorActions/JavaQuoteHandler.java index b1297317d2c2..6ae52c332bc0 100644 --- a/java/java-frontback-impl/src/com/intellij/codeInsight/editorActions/JavaQuoteHandler.java +++ b/java/java-frontback-impl/src/com/intellij/codeInsight/editorActions/JavaQuoteHandler.java @@ -7,7 +7,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.highlighter.HighlighterIterator; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.pom.java.LanguageLevel; +import com.intellij.pom.java.JavaFeature; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.impl.source.BasicJavaAstTreeUtil; @@ -127,8 +127,7 @@ public class JavaQuoteHandler extends SimpleTokenSetQuoteHandler implements Java } private static boolean testBlocksIsAvailable(@NotNull PsiFile file){ - return AbstractBasicJavaDefinitionService.getJavaDefinitionService() - .getLanguageLevel(file).isAtLeast(LanguageLevel.JDK_15); + return JavaFeature.TEXT_BLOCKS.isSufficient(AbstractBasicJavaDefinitionService.getJavaDefinitionService().getLanguageLevel(file)); } @Override diff --git a/java/java-frontback-psi-api/resources/messages/JavaPsiBundle.properties b/java/java-frontback-psi-api/resources/messages/JavaPsiBundle.properties index fd006a7ef1d0..2c12a317787c 100644 --- a/java/java-frontback-psi-api/resources/messages/JavaPsiBundle.properties +++ b/java/java-frontback-psi-api/resources/messages/JavaPsiBundle.properties @@ -52,6 +52,8 @@ element.type.semicolon=semicolon element.receiver.parameter=receiver parameter element.method.call=method call +feature.assertions=Assertions +feature.enums=Enums feature.generics=Generics feature.annotations=Annotations feature.static.imports=Static imports @@ -77,6 +79,7 @@ feature.static.interface.calls=Static interface method calls feature.effectively.final=Effectively final variables feature.try.with.resources.refs=Resource references feature.modules=Modules +feature.private.interface.methods=Private interface methods feature.collection.factories=Collection factory methods feature.lvti=Local variable type inference feature.var.lambda.parameter='var' in lambda parameters diff --git a/java/java-frontback-psi-api/src/com/intellij/pom/java/JavaFeature.java b/java/java-frontback-psi-api/src/com/intellij/pom/java/JavaFeature.java index 1b978a05638f..c9f9ab757fc4 100644 --- a/java/java-frontback-psi-api/src/com/intellij/pom/java/JavaFeature.java +++ b/java/java-frontback-psi-api/src/com/intellij/pom/java/JavaFeature.java @@ -13,6 +13,8 @@ import java.util.Set; * whether a particular features is available in a given context */ public enum JavaFeature { + ASSERTIONS(LanguageLevel.JDK_1_4, "feature.generics"), + ENUMS(LanguageLevel.JDK_1_5, "feature.enums"), GENERICS(LanguageLevel.JDK_1_5, "feature.generics"), ANNOTATIONS(LanguageLevel.JDK_1_5, "feature.annotations"), STATIC_IMPORTS(LanguageLevel.JDK_1_5, "feature.static.imports"), @@ -46,6 +48,7 @@ public enum JavaFeature { REFS_AS_RESOURCE(LanguageLevel.JDK_1_9, "feature.try.with.resources.refs"), MODULES(LanguageLevel.JDK_1_9, "feature.modules"), COLLECTION_FACTORIES(LanguageLevel.JDK_1_9, "feature.collection.factories"), + PRIVATE_INTERFACE_METHODS(LanguageLevel.JDK_1_9, "feature.private.interface.methods"), LVTI(LanguageLevel.JDK_10, "feature.lvti"), VAR_LAMBDA_PARAMETER(LanguageLevel.JDK_11, "feature.var.lambda.parameter"), NESTMATES(LanguageLevel.JDK_11, "feature.nestmates"), diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/dataFlow/DataFlowInspection.java b/java/java-impl-inspections/src/com/intellij/codeInspection/dataFlow/DataFlowInspection.java index 34a73ac939c6..950b3b705a6b 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/dataFlow/DataFlowInspection.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/dataFlow/DataFlowInspection.java @@ -10,7 +10,6 @@ import com.intellij.codeInspection.nullable.NullableStuffInspection; import com.intellij.codeInspection.options.OptPane; import com.intellij.openapi.diagnostic.Logger; import com.intellij.pom.java.JavaFeature; -import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.util.PsiPrecedenceUtil; import com.intellij.psi.util.PsiUtil; @@ -143,7 +142,7 @@ public final class DataFlowInspection extends DataFlowInspectionBase { } else if (!alwaysNull && !SideEffectChecker.mayHaveSideEffects(qualifier)) { String suffix = " != null"; - if (PsiUtil.getLanguageLevel(qualifier).isAtLeast(LanguageLevel.JDK_1_4) && CodeBlockSurrounder.canSurround(expression)) { + if (PsiUtil.isAvailable(JavaFeature.ASSERTIONS, qualifier) && CodeBlockSurrounder.canSurround(expression)) { String replacement = ParenthesesUtils.getText(qualifier, ParenthesesUtils.EQUALITY_PRECEDENCE) + suffix; fixes.add(new AddAssertStatementFix(replacement)); } diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/java19api/Java9GenerateModuleDescriptorsAction.java b/java/java-impl-inspections/src/com/intellij/codeInspection/java19api/Java9GenerateModuleDescriptorsAction.java index 216b3ebdde0e..9d07c882aac7 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/java19api/Java9GenerateModuleDescriptorsAction.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/java19api/Java9GenerateModuleDescriptorsAction.java @@ -30,7 +30,7 @@ import com.intellij.openapi.util.NlsContexts; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.platform.backend.workspace.WorkspaceModel; import com.intellij.platform.workspace.storage.url.VirtualFileUrl; -import com.intellij.pom.java.LanguageLevel; +import com.intellij.pom.java.JavaFeature; import com.intellij.psi.CommonClassNames; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -163,7 +163,7 @@ public final class Java9GenerateModuleDescriptorsAction extends AnAction { } private static boolean mayContainModuleInfo(@NotNull final Module module) { - return ReadAction.compute(() -> LanguageLevelUtil.getEffectiveLanguageLevel(module).isAtLeast(LanguageLevel.JDK_1_9)); + return ReadAction.compute(() -> JavaFeature.MODULES.isSufficient(LanguageLevelUtil.getEffectiveLanguageLevel(module))); } @NotNull diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspection.java b/java/java-impl-inspections/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspection.java index 155eb152701e..44d5228b20bf 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspection.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspection.java @@ -20,6 +20,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.JavaVersionService; import com.intellij.openapi.util.WriteExternalException; +import com.intellij.pom.java.JavaFeature; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.impl.source.resolve.graphInference.PsiPolyExpressionUtil; @@ -119,7 +120,7 @@ public final class UncheckedWarningLocalInspection extends AbstractBaseJavaLocal boolean isOnTheFly, @NotNull LocalInspectionToolSession session) { LanguageLevel languageLevel = PsiUtil.getLanguageLevel(session.getFile()); - if (!languageLevel.isAtLeast(LanguageLevel.JDK_1_5)) return super.buildVisitor(holder, isOnTheFly, session); + if (!JavaFeature.GENERICS.isSufficient(languageLevel)) return super.buildVisitor(holder, isOnTheFly, session); return new UncheckedWarningsVisitor(isOnTheFly, languageLevel){ @Override diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java index 7c3a9ed4ea58..e39c441f6b4c 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -1647,11 +1647,11 @@ public class ExtractMethodProcessor implements MatchProvider { private void updateModifiersInInterface(PsiMethod newMethod) { LanguageLevel languageLevel = PsiUtil.getLanguageLevel(myTargetClass); - if (languageLevel.isAtLeast(LanguageLevel.JDK_1_8)) { + if (JavaFeature.EXTENSION_METHODS.isSufficient(languageLevel)) { if (!isStatic()) { final PsiMethod containingMethod = PsiTreeUtil.getParentOfType(myCodeFragmentMember, PsiMethod.class, false); if (containingMethod != null && containingMethod.hasModifierProperty(PsiModifier.DEFAULT)) { - if (languageLevel.isAtLeast(LanguageLevel.JDK_1_9)) { + if (JavaFeature.PRIVATE_INTERFACE_METHODS.isSufficient(languageLevel)) { PsiUtil.setModifierProperty(newMethod, PsiModifier.PRIVATE, true); // don't increase the API surface } else { @@ -1661,7 +1661,7 @@ public class ExtractMethodProcessor implements MatchProvider { } PsiUtil.setModifierProperty(newMethod, PsiModifier.PUBLIC, false); PsiUtil.setModifierProperty(newMethod, PsiModifier.PROTECTED, false); - if (isStatic() || !languageLevel.isAtLeast(LanguageLevel.JDK_1_9)) { + if (isStatic() || !JavaFeature.PRIVATE_INTERFACE_METHODS.isSufficient(languageLevel)) { PsiUtil.setModifierProperty(newMethod, PsiModifier.PRIVATE, false); } } diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/introduceField/IntroduceConstantDialog.java b/java/java-impl-refactorings/src/com/intellij/refactoring/introduceField/IntroduceConstantDialog.java index 7720e7ef076a..340216950295 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/introduceField/IntroduceConstantDialog.java +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/introduceField/IntroduceConstantDialog.java @@ -16,7 +16,7 @@ import com.intellij.openapi.roots.LanguageLevelProjectExtension; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Comparing; -import com.intellij.pom.java.LanguageLevel; +import com.intellij.pom.java.JavaFeature; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.codeStyle.SuggestedNameInfo; @@ -262,7 +262,7 @@ class IntroduceConstantDialog extends DialogWrapper { if ((myTypeSelectorManager.isSuggestedType(CommonClassNames.JAVA_LANG_STRING) || (myLocalVariable != null && AnnotationUtil.isAnnotated(myLocalVariable, AnnotationUtil.NON_NLS, CHECK_EXTERNAL))) && - LanguageLevelProjectExtension.getInstance(myProject).getLanguageLevel().isAtLeast(LanguageLevel.JDK_1_5) && + JavaFeature.ANNOTATIONS.isSufficient(LanguageLevelProjectExtension.getInstance(myProject).getLanguageLevel()) && JavaPsiFacade.getInstance(myProject).findClass(AnnotationUtil.NON_NLS, myParentClass.getResolveScope()) != null) { final PropertiesComponent component = PropertiesComponent.getInstance(myProject); myCbNonNls.setSelected(component.getBoolean(NONNLS_SELECTED_PROPERTY)); diff --git a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java index cc2b10d793d9..6cea4e3d75e7 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java @@ -575,14 +575,13 @@ public final class ExpectedTypesProvider { } myResult.add(createInfoImpl(PsiTypes.intType(), PsiTypes.intType())); LanguageLevel level = PsiUtil.getLanguageLevel(statement); - if (level.isAtLeast(LanguageLevel.JDK_1_5)) { + if (JavaFeature.ENUMS.isSufficient(level)) { PsiClassType enumType = TypeUtils.getType(CommonClassNames.JAVA_LANG_ENUM, statement); myResult.add(createInfoImpl(enumType, enumType)); - - if (JavaFeature.STRING_SWITCH.isSufficient(level)) { - PsiClassType stringType = TypeUtils.getStringType(statement); - myResult.add(createInfoImpl(stringType, stringType)); - } + } + if (JavaFeature.STRING_SWITCH.isSufficient(level)) { + PsiClassType stringType = TypeUtils.getStringType(statement); + myResult.add(createInfoImpl(stringType, stringType)); } } diff --git a/java/java-impl/src/com/intellij/codeInsight/MakeExternalAnnotationExplicit.java b/java/java-impl/src/com/intellij/codeInsight/MakeExternalAnnotationExplicit.java index 707d67808383..359aeee03e8b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/MakeExternalAnnotationExplicit.java +++ b/java/java-impl/src/com/intellij/codeInsight/MakeExternalAnnotationExplicit.java @@ -14,7 +14,7 @@ import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.pom.java.LanguageLevel; +import com.intellij.pom.java.JavaFeature; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.util.PsiUtil; @@ -45,7 +45,7 @@ public final class MakeExternalAnnotationExplicit implements ModCommandAction { final PsiModifierListOwner owner = NonCodeAnnotationsLineMarkerProvider.getAnnotationOwner(leaf); if (owner != null && owner.getLanguage().isKindOf(JavaLanguage.INSTANCE) && isWritable(owner) && ModuleUtilCore.findModuleForPsiElement(file) != null && - PsiUtil.getLanguageLevel(file).isAtLeast(LanguageLevel.JDK_1_5)) { + PsiUtil.isAvailable(JavaFeature.ANNOTATIONS, file)) { final PsiAnnotation[] annotations = getAnnotations(context.project(), owner); if (annotations.length > 0) { final String annos = StringUtil.join(annotations, annotation -> { diff --git a/java/java-impl/src/com/intellij/codeInsight/MakeInferredAnnotationExplicit.java b/java/java-impl/src/com/intellij/codeInsight/MakeInferredAnnotationExplicit.java index dc5fb619b1ae..587798417d6a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/MakeInferredAnnotationExplicit.java +++ b/java/java-impl/src/com/intellij/codeInsight/MakeInferredAnnotationExplicit.java @@ -16,7 +16,7 @@ import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.pom.java.LanguageLevel; +import com.intellij.pom.java.JavaFeature; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.search.GlobalSearchScope; @@ -53,7 +53,7 @@ public final class MakeInferredAnnotationExplicit extends BaseIntentionAction { public boolean isAvailable(PsiFile file, PsiModifierListOwner owner) { if (owner != null && owner.getLanguage().isKindOf(JavaLanguage.INSTANCE) && isWritable(owner) && ModuleUtilCore.findModuleForPsiElement(file) != null && - PsiUtil.getLanguageLevel(file).isAtLeast(LanguageLevel.JDK_1_5)) { + PsiUtil.isAvailable(JavaFeature.ANNOTATIONS, file)) { List annotations = getAnnotationsToAdd(owner); if (!annotations.isEmpty()) { String presentation = StreamEx.of(annotations) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java index 3c7b208eb57b..081bb1b3732d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java @@ -23,7 +23,7 @@ import com.intellij.codeInsight.lookup.VariableLookupItem; import com.intellij.lang.java.JavaLanguage; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.patterns.PsiJavaPatterns; -import com.intellij.pom.java.LanguageLevel; +import com.intellij.pom.java.JavaFeature; import com.intellij.psi.*; import com.intellij.psi.javadoc.PsiDocComment; import com.intellij.psi.javadoc.PsiDocToken; @@ -82,7 +82,7 @@ public final class JavaCharFilter extends CharFilter { if (c == ':') { PsiDocumentManager.getInstance(file.getProject()).commitDocument(lookup.getEditor().getDocument()); PsiElement leaf = file.findElementAt(lookup.getEditor().getCaretModel().getOffset() - 1); - if (PsiUtil.getLanguageLevel(file).isAtLeast(LanguageLevel.JDK_1_8)) { + if (PsiUtil.isAvailable(JavaFeature.METHOD_REFERENCES, file)) { PsiStatement statement = PsiTreeUtil.getParentOfType(leaf, PsiStatement.class); if (statement == null || statement.getTextRange().getStartOffset() != leaf.getTextRange().getStartOffset()) { // not typing a statement label diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java index 45f4ea46f447..9f1d4a5ee9d9 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java @@ -13,7 +13,6 @@ import com.intellij.openapi.editor.EditorModificationUtilEx; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.pom.java.JavaFeature; -import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.codeStyle.JavaCodeStyleSettings; @@ -141,7 +140,7 @@ class JavaClassNameInsertHandler implements InsertHandler condition, @NotNull LanguageLevel languageLevel) { //JLS3 15.8.2 - if (languageLevel.isAtLeast(LanguageLevel.JDK_1_5) && isGetClass(method)) { + if (JavaFeature.GENERICS.isSufficient(languageLevel) && isGetClass(method)) { PsiExpression qualifier = methodExpression.getQualifierExpression(); PsiType qualifierType = null; final Project project = call.getProject(); diff --git a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java index 88d235625d17..a87203948911 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java @@ -7,6 +7,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectRootModificationTracker; import com.intellij.openapi.util.*; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.pom.java.JavaFeature; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; @@ -266,7 +267,7 @@ public final class TypeConversionUtil { PsiManager manager = fromClass.getManager(); final LanguageLevel languageLevel = toClassType.getLanguageLevel(); // jep-397 - if (languageLevel.isAtLeast(LanguageLevel.JDK_17)) { + if (JavaFeature.SEALED_CLASSES.isSufficient(languageLevel)) { if (fromClass.isInterface() || toClass.isInterface()) { if (fromClass.hasModifierProperty(PsiModifier.SEALED)) { if (!canConvertSealedTo(fromClass, toClass)) return false; diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/generation/OverrideImplementExploreUtil.java b/java/java-psi-impl/src/com/intellij/codeInsight/generation/OverrideImplementExploreUtil.java index aedb0316ecce..984d8c1f651d 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/generation/OverrideImplementExploreUtil.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/generation/OverrideImplementExploreUtil.java @@ -5,7 +5,7 @@ import com.intellij.codeInsight.MemberImplementorExplorer; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.NullableLazyValue; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.pom.java.LanguageLevel; +import com.intellij.pom.java.JavaFeature; import com.intellij.psi.*; import com.intellij.psi.infos.CandidateInfo; import com.intellij.psi.util.*; @@ -111,8 +111,7 @@ public class OverrideImplementExploreUtil { } private static boolean isDefaultMethod(@NotNull PsiClass aClass, @NotNull PsiMethod method) { - return method.hasModifierProperty(PsiModifier.DEFAULT) && - PsiUtil.getLanguageLevel(aClass).isAtLeast(LanguageLevel.JDK_1_8); + return method.hasModifierProperty(PsiModifier.DEFAULT) && PsiUtil.isAvailable(JavaFeature.EXTENSION_METHODS, aClass); } private static void fillMap(@NotNull HierarchicalMethodSignature signature, @NotNull PsiMethod method, @NotNull Map map) { diff --git a/java/java-psi-impl/src/com/intellij/lang/java/lexer/JavaLexer.java b/java/java-psi-impl/src/com/intellij/lang/java/lexer/JavaLexer.java index d5aa40a5f202..204728700854 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/lexer/JavaLexer.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/lexer/JavaLexer.java @@ -48,8 +48,8 @@ public final class JavaLexer extends BasicJavaLexer { } public static boolean isKeyword(@NotNull String id, @NotNull LanguageLevel level) { return KEYWORDS.contains(id) || - level.isAtLeast(LanguageLevel.JDK_1_4) && ASSERT.equals(id) || - level.isAtLeast(LanguageLevel.JDK_1_5) && ENUM.equals(id); + JavaFeature.ASSERTIONS.isSufficient(level) && ASSERT.equals(id) || + JavaFeature.ENUMS.isSufficient(level) && ENUM.equals(id); } /** diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java index 17bced6cfc6c..19d3dd8b17f8 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java @@ -9,6 +9,7 @@ import com.intellij.lexer.Lexer; import com.intellij.openapi.Disposable; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; +import com.intellij.pom.java.JavaFeature; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; @@ -59,7 +60,7 @@ public final class PsiElementFactoryImpl extends PsiJavaParserFacadeImpl impleme } private PsiClass createArrayClass(LanguageLevel level) { - String text = level.isAtLeast(LanguageLevel.JDK_1_5) ? + String text = JavaFeature.GENERICS.isSufficient(level) ? "public static class __Array__ {\n public final int length;\n public T[] clone() {}\n}" : "public static class __Array__{\n public final int length;\n public Object clone() {}\n}"; PsiClass psiClass = ((PsiExtensibleClass)createClassFromText(text, null)).getOwnInnerClasses().get(0); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/ClassInnerStuffCache.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/ClassInnerStuffCache.java index d11fbddb0980..abb110b90a7f 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/ClassInnerStuffCache.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/ClassInnerStuffCache.java @@ -4,7 +4,7 @@ package com.intellij.psi.impl.source; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Ref; -import com.intellij.pom.java.LanguageLevel; +import com.intellij.pom.java.JavaFeature; import com.intellij.psi.*; import com.intellij.psi.augment.PsiAugmentProvider; import com.intellij.psi.impl.PsiClassImplUtil; @@ -96,7 +96,7 @@ public final class ClassInnerStuffCache { } private boolean classNameIsSealed() { - return PsiKeyword.SEALED.equals(myClass.getName()) && PsiUtil.getLanguageLevel(myClass).isAtLeast(LanguageLevel.JDK_17); + return PsiKeyword.SEALED.equals(myClass.getName()) && PsiUtil.isAvailable(JavaFeature.SEALED_CLASSES, myClass); } @Nullable diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java index 5934c54a6c4b..c490af317291 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java @@ -7,6 +7,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.pom.java.JavaFeature; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; @@ -390,7 +391,7 @@ public class PsiReferenceExpressionImpl extends ExpressionPsiElement implements ret = ((PsiClassType)ret).setLanguageLevel(languageLevel); } - if (languageLevel.isAtLeast(LanguageLevel.JDK_1_5)) { + if (JavaFeature.GENERICS.isSufficient(languageLevel)) { PsiSubstitutor substitutor = result.getSubstitutor(); if (owner == null || !PsiUtil.isRawSubstitutor(owner, substitutor)) { PsiType substitutedType = substitutor.substitute(ret); @@ -503,7 +504,7 @@ public class PsiReferenceExpressionImpl extends ExpressionPsiElement implements private static boolean hasValidQualifier(@NotNull PsiMethod method, @NotNull PsiReferenceExpression ref, PsiElement scope) { PsiClass containingClass = method.getContainingClass(); if (containingClass != null && containingClass.isInterface() && method.hasModifierProperty(PsiModifier.STATIC)) { - if (!PsiUtil.getLanguageLevel(ref).isAtLeast(LanguageLevel.JDK_1_8)) { + if (!PsiUtil.isAvailable(JavaFeature.STATIC_INTERFACE_CALLS, ref)) { return false; }