mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[java] IDEA-345355 Refactor HighlightingFeature (in progress)
Declare new features: SERIAL_ANNOTATION, NESTMATES, ALWAYS_STRICTFP, COLLECTION_FACTORIES, INNER_NOT_CAPTURE_THIS, STRING_SWITCH Use more features instead of explicit Java levels GitOrigin-RevId: e90a96501c218ed44faebb7c882770b50477b6e1
This commit is contained in:
committed by
intellij-monorepo-bot
parent
87c2a93f10
commit
d0d82eba52
+3
-2
@@ -16,6 +16,7 @@ import com.intellij.openapi.command.WriteCommandAction;
|
||||
import com.intellij.openapi.command.undo.UndoUtil;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
|
||||
import com.intellij.psi.impl.light.LightElement;
|
||||
@@ -160,7 +161,7 @@ public class AddAnnotationPsiFix extends LocalQuickFixOnPsiElement implements Lo
|
||||
if (modifierListOwner.getParent() instanceof PsiParameterList &&
|
||||
modifierListOwner.getParent().getParent() instanceof PsiLambdaExpression lambda) {
|
||||
// Lambda parameter without type cannot be annotated. Check if we can specify types
|
||||
if (PsiUtil.isLanguageLevel11OrHigher(modifierListOwner)) return true;
|
||||
if (JavaFeature.VAR_LAMBDA_PARAMETER.isAvailable(modifierListOwner)) return true;
|
||||
return LambdaUtil.createLambdaParameterListWithFormalTypes(lambda.getFunctionalInterfaceType(), lambda, false) != null;
|
||||
}
|
||||
return false;
|
||||
@@ -326,7 +327,7 @@ public class AddAnnotationPsiFix extends LocalQuickFixOnPsiElement implements Lo
|
||||
PsiParameter[] parameters = list.getParameters();
|
||||
int index = ArrayUtil.indexOf(parameters, parameter);
|
||||
PsiParameterList newList;
|
||||
if (PsiUtil.isLanguageLevel11OrHigher(list)) {
|
||||
if (JavaFeature.VAR_LAMBDA_PARAMETER.isAvailable(list)) {
|
||||
String newListText = StreamEx.of(parameters).map(p -> PsiKeyword.VAR + " " + p.getName()).joining(",", "(", ")");
|
||||
newList = ((PsiLambdaExpression)JavaPsiFacade.getElementFactory(list.getProject())
|
||||
.createExpressionFromText(newListText+" -> {}", null)).getParameterList();
|
||||
|
||||
@@ -19,9 +19,9 @@ import com.intellij.codeInsight.intention.AddAnnotationPsiFix;
|
||||
import com.intellij.modcommand.ModPsiUpdater;
|
||||
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.siyeh.InspectionGadgetsBundle;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -41,7 +41,7 @@ public class AddSerialVersionUIDFix extends PsiUpdateModCommandQuickFix {
|
||||
final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(aClass.getProject());
|
||||
final long serialVersionUID = SerialVersionUIDBuilder.computeDefaultSUID(aClass);
|
||||
final PsiField field = elementFactory.createFieldFromText(generateSerialVersionUIDFieldText(serialVersionUID), aClass);
|
||||
if (PsiUtil.isLanguageLevel14OrHigher(field)) {
|
||||
if (JavaFeature.SERIAL_ANNOTATION.isAvailable(field)) {
|
||||
annotateFieldWithSerial(field);
|
||||
}
|
||||
aClass.add(field);
|
||||
|
||||
+3
-2
@@ -16,9 +16,10 @@
|
||||
package com.siyeh.ig.j2me;
|
||||
|
||||
import com.intellij.codeInspection.LocalQuickFix;
|
||||
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
|
||||
import com.intellij.modcommand.ModPsiUpdater;
|
||||
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.FileTypeUtils;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
@@ -171,7 +172,7 @@ public final class PrivateMemberAccessBetweenOuterAndInnerClassInspection extend
|
||||
// disable for jsp files IDEADEV-12957
|
||||
return false;
|
||||
}
|
||||
return !PsiUtil.isLanguageLevel11OrHigher(file);
|
||||
return !JavaFeature.NESTMATES.isAvailable(file);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+3
-2
@@ -2,10 +2,11 @@
|
||||
package com.siyeh.ig.migration;
|
||||
|
||||
import com.intellij.codeInspection.LocalQuickFix;
|
||||
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
|
||||
import com.intellij.modcommand.ModPsiUpdater;
|
||||
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.tree.IElementType;
|
||||
import com.intellij.psi.util.InheritanceUtil;
|
||||
@@ -259,7 +260,7 @@ public final class TryFinallyCanBeTryWithResourcesInspection extends BaseInspect
|
||||
IntList initializerPositions = new IntArrayList();
|
||||
for (PsiVariable resourceVariable : collectedVariables) {
|
||||
boolean variableUsedOutsideTry = isVariableUsedOutsideContext(resourceVariable, tryStatement);
|
||||
if (!PsiUtil.isLanguageLevel9OrHigher(finallyBlock) && variableUsedOutsideTry) return null;
|
||||
if (!JavaFeature.REFS_AS_RESOURCE.isAvailable(finallyBlock) && variableUsedOutsideTry) return null;
|
||||
if (!variableUsedOutsideTry && resourceVariable instanceof PsiLocalVariable) {
|
||||
PsiExpression initializer = resourceVariable.getInitializer();
|
||||
boolean hasNonNullInitializer = initializer != null && !PsiTypes.nullType().equals(initializer.getType());
|
||||
|
||||
+2
-2
@@ -9,8 +9,8 @@ import com.intellij.codeInspection.dataFlow.NullabilityUtil;
|
||||
import com.intellij.modcommand.ModPsiUpdater;
|
||||
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.siyeh.InspectionGadgetsBundle;
|
||||
import com.siyeh.ig.BaseInspection;
|
||||
import com.siyeh.ig.BaseInspectionVisitor;
|
||||
@@ -131,7 +131,7 @@ public final class ArraysAsListWithZeroOrOneArgumentInspection extends BaseInspe
|
||||
final PsiExpression[] arguments = argumentList.getExpressions();
|
||||
if (arguments.length > 1) return;
|
||||
|
||||
boolean suggestListOf = PsiUtil.isLanguageLevel9OrHigher(expression);
|
||||
boolean suggestListOf = JavaFeature.COLLECTION_FACTORIES.isAvailable(expression);
|
||||
boolean empty = false;
|
||||
if (arguments.length == 0) {
|
||||
empty = true;
|
||||
|
||||
@@ -124,7 +124,7 @@ public final class SwitchUtils {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (languageLevel.isAtLeast(LanguageLevel.JDK_1_7)) {
|
||||
if (JavaFeature.STRING_SWITCH.isSufficient(languageLevel)) {
|
||||
final PsiExpression stringSwitchExpression = determinePossibleJdk17SwitchExpression(expression, existingCaseValues);
|
||||
if (EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(switchExpression, stringSwitchExpression)) {
|
||||
return true;
|
||||
@@ -230,7 +230,7 @@ public final class SwitchUtils {
|
||||
if (TypeConversionUtil.isEnumType(type)) {
|
||||
return true;
|
||||
}
|
||||
if (languageLevel.isAtLeast(LanguageLevel.JDK_1_7) && type.equalsToText(CommonClassNames.JAVA_LANG_STRING)) {
|
||||
if (JavaFeature.STRING_SWITCH.isSufficient(languageLevel) && type.equalsToText(CommonClassNames.JAVA_LANG_STRING)) {
|
||||
return true;
|
||||
}
|
||||
return JavaFeature.PATTERNS_IN_SWITCH.isAvailable(expression);
|
||||
@@ -479,7 +479,7 @@ public final class SwitchUtils {
|
||||
}
|
||||
}
|
||||
final PsiType type = expression.getType();
|
||||
if ((!languageLevel.isAtLeast(LanguageLevel.JDK_1_7) || !TypeUtils.isJavaLangString(type)) &&
|
||||
if ((!JavaFeature.STRING_SWITCH.isSufficient(languageLevel) || !TypeUtils.isJavaLangString(type)) &&
|
||||
!PsiTypes.intType().equals(type) && !PsiTypes.shortType().equals(type) && !PsiTypes.byteType().equals(type) && !PsiTypes.charType().equals(type)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
+2
-2
@@ -4,9 +4,9 @@ package com.siyeh.ig.serialization;
|
||||
import com.intellij.codeInsight.intention.AddAnnotationFix;
|
||||
import com.intellij.codeInspection.LocalQuickFix;
|
||||
import com.intellij.codeInspection.util.InspectionMessage;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.siyeh.InspectionGadgetsBundle;
|
||||
import com.siyeh.ig.BaseInspection;
|
||||
import com.siyeh.ig.BaseInspectionVisitor;
|
||||
@@ -21,7 +21,7 @@ public final class MissingSerialAnnotationInspection extends BaseInspection {
|
||||
|
||||
@Override
|
||||
public boolean shouldInspect(@NotNull PsiFile file) {
|
||||
return PsiUtil.isLanguageLevel14OrHigher(file);
|
||||
return JavaFeature.SERIAL_ANNOTATION.isAvailable(file);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+2
-2
@@ -4,9 +4,9 @@ package com.siyeh.ig.serialization;
|
||||
import com.intellij.codeInspection.LocalQuickFix;
|
||||
import com.intellij.codeInspection.RemoveAnnotationQuickFix;
|
||||
import com.intellij.codeInspection.util.InspectionMessage;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.siyeh.InspectionGadgetsBundle;
|
||||
import com.siyeh.ig.BaseInspection;
|
||||
import com.siyeh.ig.BaseInspectionVisitor;
|
||||
@@ -22,7 +22,7 @@ public final class SerialAnnotationUsedOnWrongMemberInspection extends BaseInspe
|
||||
|
||||
@Override
|
||||
public boolean shouldInspect(@NotNull PsiFile file) {
|
||||
return PsiUtil.isLanguageLevel14OrHigher(file);
|
||||
return JavaFeature.SERIAL_ANNOTATION.isAvailable(file);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+2
-2
@@ -2,8 +2,8 @@
|
||||
package com.siyeh.ig.serialization;
|
||||
|
||||
import com.intellij.codeInspection.util.InspectionMessage;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.siyeh.InspectionGadgetsBundle;
|
||||
import com.siyeh.ig.BaseInspection;
|
||||
import com.siyeh.ig.BaseInspectionVisitor;
|
||||
@@ -14,7 +14,7 @@ public final class SerializableRecordContainsIgnoredMembersInspection extends Ba
|
||||
|
||||
@Override
|
||||
public boolean shouldInspect(@NotNull PsiFile file) {
|
||||
return PsiUtil.isLanguageLevel14OrHigher(file);
|
||||
return JavaFeature.SERIAL_ANNOTATION.isAvailable(file);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -3,14 +3,13 @@ package com.siyeh.ig.style;
|
||||
|
||||
import com.intellij.codeInspection.CleanupLocalInspectionTool;
|
||||
import com.intellij.codeInspection.LocalQuickFix;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.tree.IElementType;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.siyeh.InspectionGadgetsBundle;
|
||||
import com.siyeh.ig.BaseInspection;
|
||||
import com.siyeh.ig.BaseInspectionVisitor;
|
||||
import com.siyeh.ig.InspectionGadgetsFix;
|
||||
import com.siyeh.ig.fixes.RemoveModifierFix;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -44,7 +43,7 @@ public final class UnnecessaryModifierInspection extends BaseInspection implemen
|
||||
public void visitClass(@NotNull PsiClass aClass) {
|
||||
final PsiElement parent = aClass.getParent();
|
||||
final boolean interfaceMember = parent instanceof PsiClass && ((PsiClass)parent).isInterface();
|
||||
final boolean redundantStrictfp = PsiUtil.isLanguageLevel17OrHigher(aClass) && aClass.hasModifierProperty(PsiModifier.STRICTFP);
|
||||
final boolean redundantStrictfp = JavaFeature.ALWAYS_STRICTFP.isAvailable(aClass) && aClass.hasModifierProperty(PsiModifier.STRICTFP);
|
||||
if (aClass.isRecord() || aClass.isInterface() || aClass.isEnum() || interfaceMember || redundantStrictfp) {
|
||||
PsiModifierList modifierList = aClass.getModifierList();
|
||||
if (modifierList == null) {
|
||||
@@ -103,7 +102,7 @@ public final class UnnecessaryModifierInspection extends BaseInspection implemen
|
||||
|
||||
@Override
|
||||
public void visitMethod(@NotNull PsiMethod method) {
|
||||
final boolean redundantStrictfp = PsiUtil.isLanguageLevel17OrHigher(method) && method.hasModifierProperty(PsiModifier.STRICTFP);
|
||||
final boolean redundantStrictfp = JavaFeature.ALWAYS_STRICTFP.isAvailable(method) && method.hasModifierProperty(PsiModifier.STRICTFP);
|
||||
if (redundantStrictfp) {
|
||||
final PsiModifierList modifierList = method.getModifierList();
|
||||
final List<PsiKeyword> modifiers = PsiTreeUtil.getChildrenOfTypeAsList(modifierList, PsiKeyword.class);
|
||||
|
||||
@@ -63,6 +63,7 @@ feature.multi.catch=Multi-catches
|
||||
feature.try.with.resources=Try-with-resources
|
||||
feature.binary.literals=Binary literals
|
||||
feature.underscores.in.literals=Underscores in literals
|
||||
feature.string.switch=Strings in 'switch' statements
|
||||
feature.stream.api=Stream API
|
||||
feature.advanced.collection.api=Lambda methods in collections
|
||||
feature.with.initial=ThreadLocal.withInitial()
|
||||
@@ -75,15 +76,20 @@ feature.intersections.in.casts=Intersection types in casts
|
||||
feature.static.interface.calls=Static interface method calls
|
||||
feature.try.with.resources.refs=Resource references
|
||||
feature.modules=Modules
|
||||
feature.collection.factories=Collection factory methods
|
||||
feature.lvti=Local variable type inference
|
||||
feature.var.lambda.parameter='var' in lambda parameters
|
||||
feature.nestmates=Nest-based access control
|
||||
feature.text.blocks=Text block literals
|
||||
feature.text.block.escape.sequences='\\s' escape sequences
|
||||
feature.enhanced.switch=Enhanced 'switch' blocks
|
||||
feature.switch.expressions='switch' expressions
|
||||
feature.serial.annotation=@Serial annotation
|
||||
feature.records=Records
|
||||
feature.patterns.instanceof=Patterns in 'instanceof'
|
||||
feature.sealed.classes=Sealed classes
|
||||
feature.strictfp=Always-strict floating point semantics
|
||||
feature.no.this.capture=Inner classes don't capture 'this'
|
||||
feature.local.interfaces=Local interfaces
|
||||
feature.local.enums=Local enums
|
||||
feature.inner.statics=Static declarations in inner classes
|
||||
|
||||
+2
-1
@@ -7,6 +7,7 @@ import com.intellij.java.JavaBundle;
|
||||
import com.intellij.modcommand.ModPsiUpdater;
|
||||
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
|
||||
import com.intellij.psi.codeStyle.SuggestedNameInfo;
|
||||
@@ -255,7 +256,7 @@ public final class BulkFileAttributesReadInspection extends AbstractBaseJavaLoca
|
||||
if (
|
||||
initializer != null
|
||||
&& parent.getContext() != null
|
||||
&& PsiUtil.isLanguageLevel10OrHigher(parent.getContainingFile())
|
||||
&& JavaFeature.LVTI.isAvailable(parent)
|
||||
&& JavaRefactoringSettings.getInstance().INTRODUCE_LOCAL_CREATE_VAR_TYPE
|
||||
) {
|
||||
displayType = TypeUtils.getType(PsiKeyword.VAR, parent.getContext());
|
||||
|
||||
+3
-3
@@ -2,7 +2,7 @@
|
||||
package com.intellij.codeInspection;
|
||||
|
||||
import com.intellij.java.JavaBundle;
|
||||
import com.intellij.pom.java.LanguageLevel;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.InheritanceUtil;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
@@ -95,7 +95,7 @@ public final class CapturingCleanerInspection extends AbstractBaseJavaLocalInspe
|
||||
}
|
||||
if (runnableExpr instanceof PsiNewExpression newExpression) {
|
||||
if (newExpression.getAnonymousClass() != null) {
|
||||
if (PsiUtil.getDeclaredLanguageLevel(trackedClass).isAtLeast(LanguageLevel.JDK_18)) {
|
||||
if (JavaFeature.INNER_NOT_CAPTURE_THIS.isAvailable(trackedClass)) {
|
||||
PsiElement elementCapturingThis = getLambdaOrInnerClassElementCapturingThis(newExpression, trackedClass);
|
||||
if (elementCapturingThis != null) {
|
||||
return elementCapturingThis;
|
||||
@@ -110,7 +110,7 @@ public final class CapturingCleanerInspection extends AbstractBaseJavaLocalInspe
|
||||
if (aClass == null) return null;
|
||||
if (aClass.getContainingClass() != trackedClass) return null;
|
||||
if (aClass.hasModifierProperty(PsiModifier.STATIC)) return null;
|
||||
if (PsiUtil.getDeclaredLanguageLevel(trackedClass).isAtLeast(LanguageLevel.JDK_18) &&
|
||||
if (JavaFeature.INNER_NOT_CAPTURE_THIS.isAvailable(trackedClass) &&
|
||||
getLambdaOrInnerClassElementCapturingThis(newExpression, trackedClass) == null) return null;
|
||||
return classReference;
|
||||
}
|
||||
|
||||
+1
-1
@@ -477,7 +477,7 @@ public final class DuplicateBranchesInSwitchInspection extends LocalInspectionTo
|
||||
PsiElement prevElement = PsiTreeUtil.skipWhitespacesAndCommentsBackward(myLabelToMergeWith);
|
||||
if (prevElement != null) moveTarget = prevElement;
|
||||
}
|
||||
if (PsiUtil.isLanguageLevel14OrHigher(moveTarget) && moveTarget instanceof PsiSwitchLabelStatement labelStatement &&
|
||||
if (JavaFeature.SWITCH_EXPRESSION.isAvailable(moveTarget) && moveTarget instanceof PsiSwitchLabelStatement labelStatement &&
|
||||
myBranchToDelete.canCopyCaseValues(myBranchToMergeWith) && !SwitchUtils.isCaseNull(labelStatement) &&
|
||||
!SwitchUtils.isDefaultLabel(labelStatement)) {
|
||||
for (PsiElement element : myBranchPrefixToMove) {
|
||||
|
||||
+2
-1
@@ -16,6 +16,7 @@ import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.project.Project;
|
||||
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.CodeStyleManager;
|
||||
@@ -1701,7 +1702,7 @@ public final class SimplifyStreamApiCallChainsInspection extends AbstractBaseJav
|
||||
PsiReferenceParameterList typeParameters = qualifierCall.getMethodExpression().getParameterList();
|
||||
String typeParametersText = typeParameters == null ? "" : ct.text(typeParameters);
|
||||
String factory;
|
||||
if (PsiUtil.isLanguageLevel9OrHigher(call) && MethodCallUtils.isVarArgCall(qualifierCall) &&
|
||||
if (JavaFeature.COLLECTION_FACTORIES.isAvailable(call) && MethodCallUtils.isVarArgCall(qualifierCall) &&
|
||||
ContainerUtil
|
||||
.and(qualifierArgs.getExpressions(), e -> NullabilityUtil.getExpressionNullability(e, true) == Nullability.NOT_NULL)) {
|
||||
factory = JAVA_UTIL_LIST + "." + typeParametersText + "of";
|
||||
|
||||
+6
-2
@@ -2,7 +2,10 @@
|
||||
package com.intellij.codeInspection.java19api;
|
||||
|
||||
import com.intellij.codeInsight.Nullability;
|
||||
import com.intellij.codeInspection.*;
|
||||
import com.intellij.codeInspection.AbstractBaseJavaLocalInspectionTool;
|
||||
import com.intellij.codeInspection.ProblemHighlightType;
|
||||
import com.intellij.codeInspection.ProblemsHolder;
|
||||
import com.intellij.codeInspection.RemoveRedundantTypeArgumentsUtil;
|
||||
import com.intellij.codeInspection.dataFlow.NullabilityUtil;
|
||||
import com.intellij.codeInspection.options.OptPane;
|
||||
import com.intellij.codeInspection.util.IntentionName;
|
||||
@@ -10,6 +13,7 @@ import com.intellij.java.JavaBundle;
|
||||
import com.intellij.modcommand.ModPsiUpdater;
|
||||
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.profile.codeInspection.InspectionProjectProfileManager;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.controlFlow.DefUseUtil;
|
||||
@@ -66,7 +70,7 @@ public final class Java9CollectionFactoryInspection extends AbstractBaseJavaLoca
|
||||
@NotNull
|
||||
@Override
|
||||
public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) {
|
||||
if (!PsiUtil.isLanguageLevel9OrHigher(holder.getFile())) {
|
||||
if (!JavaFeature.COLLECTION_FACTORIES.isAvailable(holder.getFile())) {
|
||||
return PsiElementVisitor.EMPTY_VISITOR;
|
||||
}
|
||||
return new JavaElementVisitor() {
|
||||
|
||||
+2
-2
@@ -9,9 +9,9 @@ import com.intellij.codeInspection.AbstractBaseJavaLocalInspectionTool;
|
||||
import com.intellij.codeInspection.ProblemsHolder;
|
||||
import com.intellij.java.JavaBundle;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
@@ -25,7 +25,7 @@ public final class Java9ReflectionClassVisibilityInspection extends AbstractBase
|
||||
@Override
|
||||
public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) {
|
||||
final PsiFile file = holder.getFile();
|
||||
if (PsiUtil.isLanguageLevel9OrHigher(file)) {
|
||||
if (JavaFeature.MODULES.isAvailable(file)) {
|
||||
final PsiJavaModule javaModule = JavaModuleGraphUtil.findDescriptorByElement(file);
|
||||
if (javaModule != null) {
|
||||
return new JavaElementVisitor() {
|
||||
|
||||
+2
-2
@@ -3,8 +3,8 @@ package com.intellij.refactoring.move.moveClassesOrPackages;
|
||||
|
||||
import com.intellij.codeInsight.daemon.impl.analysis.JavaModuleGraphUtil;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.refactoring.MoveDestination;
|
||||
import com.intellij.refactoring.safeDelete.ModuleInfoSafeDeleteUsageDetector;
|
||||
import com.intellij.usageView.UsageInfo;
|
||||
@@ -54,7 +54,7 @@ public abstract class ModuleInfoUsageDetector {
|
||||
@NotNull
|
||||
private static MultiMap<PsiDirectory, PsiClass> groupClassesByDir(PsiElement @NotNull [] elementsToMove) {
|
||||
PsiElement firstElement = ArrayUtil.getFirstElement(elementsToMove);
|
||||
if (firstElement == null || !PsiUtil.isLanguageLevel9OrHigher(firstElement)) return MultiMap.empty();
|
||||
if (firstElement == null || !JavaFeature.MODULES.isAvailable(firstElement)) return MultiMap.empty();
|
||||
MultiMap<PsiDirectory, PsiClass> result = new MultiMap<>();
|
||||
for (PsiElement element : elementsToMove) {
|
||||
PsiClass psiClass = ObjectUtils.tryCast(element, PsiClass.class);
|
||||
|
||||
+7
-4
@@ -19,11 +19,14 @@ import com.intellij.openapi.ui.Messages;
|
||||
import com.intellij.openapi.util.Disposer;
|
||||
import com.intellij.openapi.util.NlsContexts;
|
||||
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.search.GlobalSearchScope;
|
||||
import com.intellij.psi.search.searches.ReferencesSearch;
|
||||
import com.intellij.psi.util.*;
|
||||
import com.intellij.psi.util.PsiFormatUtil;
|
||||
import com.intellij.psi.util.PsiFormatUtilBase;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.psi.util.TypeConversionUtil;
|
||||
import com.intellij.refactoring.typeMigration.TypeMigrationLabeler;
|
||||
import com.intellij.refactoring.typeMigration.TypeMigrationProcessor;
|
||||
import com.intellij.refactoring.typeMigration.TypeMigrationRules;
|
||||
@@ -140,10 +143,10 @@ public abstract class TypeMigrationDialog extends RefactoringDialog {
|
||||
final String text = rootType != null ? rootType.getCanonicalText(true) : "";
|
||||
int flags = 0;
|
||||
PsiElement root = roots[0];
|
||||
if (PsiUtil.getLanguageLevel(root).isAtLeast(LanguageLevel.JDK_1_5)) {
|
||||
if (JavaFeature.VARARGS.isAvailable(root)) {
|
||||
flags |= JavaCodeFragmentFactory.ALLOW_ELLIPSIS;
|
||||
}
|
||||
if (PsiUtil.getLanguageLevel(root).isAtLeast(LanguageLevel.JDK_1_7)) {
|
||||
if (JavaFeature.MULTI_CATCH.isAvailable(root)) {
|
||||
flags |= JavaCodeFragmentFactory.ALLOW_DISJUNCTION;
|
||||
}
|
||||
flags |= JavaCodeFragmentFactory.ALLOW_VOID;
|
||||
|
||||
@@ -13,6 +13,7 @@ import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.NullableComputable;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.pom.java.LanguageLevel;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
|
||||
@@ -578,7 +579,7 @@ public final class ExpectedTypesProvider {
|
||||
PsiClassType enumType = TypeUtils.getType(CommonClassNames.JAVA_LANG_ENUM, statement);
|
||||
myResult.add(createInfoImpl(enumType, enumType));
|
||||
|
||||
if (level.isAtLeast(LanguageLevel.JDK_1_7)) {
|
||||
if (JavaFeature.STRING_SWITCH.isSufficient(level)) {
|
||||
PsiClassType stringType = TypeUtils.getStringType(statement);
|
||||
myResult.add(createInfoImpl(stringType, stringType));
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ 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.LanguageLevel;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.filters.getters.ExpectedTypesGetter;
|
||||
import com.intellij.psi.impl.PsiClassImplUtil;
|
||||
@@ -118,7 +118,7 @@ public class JavaInheritorsGetter {
|
||||
|
||||
PsiType psiType = GenericsUtil.eliminateWildcards(type);
|
||||
if (JavaSmartCompletionContributor.AFTER_NEW.accepts(parameters.getOriginalPosition()) &&
|
||||
PsiUtil.getLanguageLevel(parameters.getOriginalFile()).isAtLeast(LanguageLevel.JDK_1_7)) {
|
||||
JavaFeature.DIAMOND_TYPES.isAvailable(parameters.getOriginalFile())) {
|
||||
final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(psiClass.getProject());
|
||||
PsiClassType classType = (PsiClassType)type;
|
||||
if (psiClass.hasTypeParameters() && !classType.isRaw()) {
|
||||
|
||||
@@ -56,13 +56,13 @@ public final class ModifierChooser {
|
||||
{PsiKeyword.SEALED, PsiKeyword.NON_SEALED}
|
||||
};
|
||||
|
||||
private static final String[][] INTERFACE_9_MEMBER_MODIFIERS = {
|
||||
private static final String[][] INTERFACE_MEMBER_MODIFIERS_WITH_PRIVATE = {
|
||||
{PsiKeyword.PUBLIC, PsiKeyword.PROTECTED, PsiKeyword.PRIVATE},
|
||||
{PsiKeyword.STATIC, PsiKeyword.DEFAULT},
|
||||
{PsiKeyword.FINAL, PsiKeyword.ABSTRACT}
|
||||
};
|
||||
|
||||
private static final String[][] INTERFACE_8_MEMBER_MODIFIERS = {
|
||||
private static final String[][] INTERFACE_MEMBER_MODIFIERS_WITH_DEFAULT = {
|
||||
{PsiKeyword.PUBLIC, PsiKeyword.PROTECTED},
|
||||
{PsiKeyword.STATIC, PsiKeyword.DEFAULT},
|
||||
{PsiKeyword.FINAL, PsiKeyword.ABSTRACT}
|
||||
@@ -140,10 +140,10 @@ public final class ModifierChooser {
|
||||
return INTERFACE_MEMBER_MODIFIERS_WITH_SEALED;
|
||||
}
|
||||
if (PsiUtil.isLanguageLevel9OrHigher(list)) {
|
||||
return INTERFACE_9_MEMBER_MODIFIERS;
|
||||
return INTERFACE_MEMBER_MODIFIERS_WITH_PRIVATE;
|
||||
}
|
||||
if (PsiUtil.isLanguageLevel8OrHigher(list)) {
|
||||
return INTERFACE_8_MEMBER_MODIFIERS;
|
||||
if (JavaFeature.STATIC_INTERFACE_CALLS.isAvailable(list)) {
|
||||
return INTERFACE_MEMBER_MODIFIERS_WITH_DEFAULT;
|
||||
}
|
||||
return INTERFACE_MEMBER_MODIFIERS;
|
||||
}
|
||||
|
||||
+3
-3
@@ -7,8 +7,8 @@ import com.intellij.modcommand.ActionContext;
|
||||
import com.intellij.modcommand.ModPsiUpdater;
|
||||
import com.intellij.modcommand.PsiUpdateModCommandAction;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.siyeh.ig.psiutils.CommentTracker;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -38,7 +38,7 @@ public class RemoveRedundantParameterTypesFix extends PsiUpdateModCommandAction<
|
||||
for (PsiParameter parameter : parameters) {
|
||||
PsiTypeElement typeElement = parameter.getTypeElement();
|
||||
if (typeElement == null) return false;
|
||||
if (!PsiUtil.isLanguageLevel11OrHigher(parameterList)) {
|
||||
if (!JavaFeature.VAR_LAMBDA_PARAMETER.isAvailable(parameterList)) {
|
||||
if (AnonymousCanBeLambdaInspection.mustKeepAnnotations(parameter, Collections.emptySet())) {
|
||||
return false;
|
||||
}
|
||||
@@ -73,7 +73,7 @@ public class RemoveRedundantParameterTypesFix extends PsiUpdateModCommandAction<
|
||||
private static void removeTypes(PsiLambdaExpression lambdaExpression) {
|
||||
if (lambdaExpression != null) {
|
||||
final PsiParameter[] parameters = lambdaExpression.getParameterList().getParameters();
|
||||
if (PsiUtil.isLanguageLevel11OrHigher(lambdaExpression) &&
|
||||
if (JavaFeature.VAR_LAMBDA_PARAMETER.isAvailable(lambdaExpression) &&
|
||||
ContainerUtil.exists(parameters, parameter -> keepVarType(parameter))) {
|
||||
for (PsiParameter parameter : parameters) {
|
||||
PsiTypeElement element = parameter.getTypeElement();
|
||||
|
||||
+3
-3
@@ -11,7 +11,7 @@ import com.intellij.modcommand.*;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
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.codeStyle.VariableKind;
|
||||
@@ -40,8 +40,8 @@ public final class SurroundAutoCloseableAction extends PsiUpdateModCommandAction
|
||||
@Override
|
||||
protected @Nullable Presentation getPresentation(@NotNull ActionContext context, @NotNull PsiElement element) {
|
||||
boolean available = element.getLanguage().isKindOf(JavaLanguage.INSTANCE) &&
|
||||
PsiUtil.getLanguageLevel(element).isAtLeast(LanguageLevel.JDK_1_7) &&
|
||||
(findVariable(element) != null || findExpression(element) != null);
|
||||
JavaFeature.TRY_WITH_RESOURCES.isAvailable(element) &&
|
||||
(findVariable(element) != null || findExpression(element) != null);
|
||||
return available ? Presentation.of(getFamilyName()) : null;
|
||||
}
|
||||
|
||||
|
||||
+1
-3
@@ -14,7 +14,6 @@ import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Condition;
|
||||
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.CodeStyleManager;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
@@ -45,8 +44,7 @@ public class SwitchStatementPostfixTemplate extends SurroundPostfixTemplateBase
|
||||
}
|
||||
|
||||
if (type.equalsToText(CommonClassNames.JAVA_LANG_STRING) && expression.getContainingFile() instanceof PsiJavaFile javaFile) {
|
||||
LanguageLevel level = javaFile.getLanguageLevel();
|
||||
if (level.isAtLeast(LanguageLevel.JDK_1_7)) return true;
|
||||
if (JavaFeature.STRING_SWITCH.isAvailable(javaFile)) return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
+2
-2
@@ -5,7 +5,7 @@ import com.intellij.codeInsight.AnnotationTargetUtil;
|
||||
import com.intellij.modcommand.ModPsiUpdater;
|
||||
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
|
||||
import com.intellij.openapi.project.Project;
|
||||
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.util.JavaPsiPatternUtil;
|
||||
@@ -23,7 +23,7 @@ public final class RedundantExplicitVariableTypeInspection extends AbstractBaseJ
|
||||
@NotNull
|
||||
@Override
|
||||
public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) {
|
||||
if (!PsiUtil.getLanguageLevel(holder.getFile()).isAtLeast(LanguageLevel.JDK_10)) {
|
||||
if (!JavaFeature.LVTI.isAvailable(holder.getFile())) {
|
||||
return PsiElementVisitor.EMPTY_VISITOR;
|
||||
}
|
||||
return new JavaElementVisitor() {
|
||||
|
||||
@@ -15,10 +15,10 @@ import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.ProjectFileIndex;
|
||||
import com.intellij.openapi.roots.ProjectRootManager;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.PsiDirectory;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.impl.light.LightJavaModule;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jps.model.java.JavaSourceRootType;
|
||||
@@ -45,7 +45,7 @@ public class CreateModuleInfoAction extends CreateFromTemplateActionBase {
|
||||
DataContext ctx = e.getDataContext();
|
||||
IdeView view = LangDataKeys.IDE_VIEW.getData(ctx);
|
||||
PsiDirectory target = view != null && e.getProject() != null ? getTargetDirectory(ctx, view) : null;
|
||||
if (target == null || !PsiUtil.isLanguageLevel9OrHigher(target)) {
|
||||
if (target == null || !JavaFeature.MODULES.isAvailable(target)) {
|
||||
e.getPresentation().setEnabledAndVisible(false);
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.siyeh.ig.fixes;
|
||||
|
||||
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
|
||||
import com.intellij.modcommand.ModPsiUpdater;
|
||||
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.CodeStyleManager;
|
||||
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
|
||||
@@ -112,7 +113,7 @@ public class IntroduceHolderFix extends PsiUpdateModCommandQuickFix {
|
||||
final PsiModifierList modifierList = newField.getModifierList();
|
||||
assert modifierList != null;
|
||||
modifierList.setModifierProperty(PsiModifier.FINAL, true);
|
||||
if (!PsiUtil.isLanguageLevel11OrHigher(holderClass)) {
|
||||
if (!JavaFeature.NESTMATES.isAvailable(holderClass)) {
|
||||
modifierList.setModifierProperty(PsiModifier.PACKAGE_LOCAL, true);
|
||||
}
|
||||
newField.setInitializer(rhs);
|
||||
|
||||
+2
-2
@@ -16,7 +16,7 @@
|
||||
package com.siyeh.ig.memory;
|
||||
|
||||
import com.intellij.codeInspection.LocalQuickFix;
|
||||
import com.intellij.pom.java.LanguageLevel;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.InheritanceUtil;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
@@ -57,7 +57,7 @@ public final class AnonymousInnerClassMayBeStaticInspection extends BaseInspecti
|
||||
if (anonymousClass instanceof PsiEnumConstantInitializer) {
|
||||
return;
|
||||
}
|
||||
if (PsiUtil.getDeclaredLanguageLevel(anonymousClass).isAtLeast(LanguageLevel.JDK_18) &&
|
||||
if (JavaFeature.INNER_NOT_CAPTURE_THIS.isAvailable(anonymousClass) &&
|
||||
!InheritanceUtil.isInheritor(anonymousClass, CommonClassNames.JAVA_IO_SERIALIZABLE)) {
|
||||
// Since Java 18, non-serializable anonymous classes don't capture 'this' reference
|
||||
return;
|
||||
|
||||
@@ -8,8 +8,8 @@ import com.intellij.codeInspection.dataFlow.NullabilityUtil;
|
||||
import com.intellij.codeInspection.util.IntentionName;
|
||||
import com.intellij.modcommand.ActionContext;
|
||||
import com.intellij.modcommand.Presentation;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.siyeh.IntentionPowerPackBundle;
|
||||
import com.siyeh.ig.PsiReplacementUtil;
|
||||
@@ -83,12 +83,12 @@ public final class ReplaceWithArraysAsListIntention extends MCIntention {
|
||||
private static String getReplacementMethodText(String methodName, PsiMethodCallExpression context) {
|
||||
final PsiExpression[] arguments = context.getArgumentList().getExpressions();
|
||||
if (methodName.equals("emptyList") && arguments.length == 1 &&
|
||||
!PsiUtil.isLanguageLevel9OrHigher(context) && ClassUtils.findClass("com.google.common.collect.ImmutableList", context) == null) {
|
||||
!JavaFeature.COLLECTION_FACTORIES.isAvailable(context) && ClassUtils.findClass("com.google.common.collect.ImmutableList", context) == null) {
|
||||
return "java.util.Collections.singletonList";
|
||||
}
|
||||
if (methodName.equals("emptyList") || methodName.equals("singletonList")) {
|
||||
if (!ContainerUtil.exists(arguments, ReplaceWithArraysAsListIntention::isPossiblyNull)) {
|
||||
if (PsiUtil.isLanguageLevel9OrHigher(context)) {
|
||||
if (JavaFeature.COLLECTION_FACTORIES.isAvailable(context)) {
|
||||
return "java.util.List.of";
|
||||
}
|
||||
else if (ClassUtils.findClass("com.google.common.collect.ImmutableList", context) != null) {
|
||||
@@ -98,7 +98,7 @@ public final class ReplaceWithArraysAsListIntention extends MCIntention {
|
||||
return "java.util.Arrays.asList";
|
||||
}
|
||||
if (methodName.equals("emptySet") || methodName.equals("singleton")) {
|
||||
if (PsiUtil.isLanguageLevel9OrHigher(context)) {
|
||||
if (JavaFeature.COLLECTION_FACTORIES.isAvailable(context)) {
|
||||
return "java.util.Set.of";
|
||||
}
|
||||
else if (ClassUtils.findClass("com.google.common.collect.ImmutableSet", context) != null) {
|
||||
@@ -106,7 +106,7 @@ public final class ReplaceWithArraysAsListIntention extends MCIntention {
|
||||
}
|
||||
}
|
||||
else if (methodName.equals("emptyMap") || methodName.equals("singletonMap")) {
|
||||
if (PsiUtil.isLanguageLevel9OrHigher(context)) {
|
||||
if (JavaFeature.COLLECTION_FACTORIES.isAvailable(context)) {
|
||||
return "java.util.Map.of";
|
||||
}
|
||||
else if (ClassUtils.findClass("com.google.common.collect.ImmutableMap", context) != null) {
|
||||
|
||||
@@ -9,7 +9,7 @@ import com.intellij.util.ThreeState;
|
||||
import org.jetbrains.annotations.*;
|
||||
|
||||
/**
|
||||
* Represents Java language and standard library features and provides information
|
||||
* Represents Java language, JVM, or standard library features and provides information
|
||||
* whether a particular features is available in a given context
|
||||
*/
|
||||
public enum JavaFeature {
|
||||
@@ -24,6 +24,7 @@ public enum JavaFeature {
|
||||
TRY_WITH_RESOURCES(LanguageLevel.JDK_1_7, "feature.try.with.resources"),
|
||||
BIN_LITERALS(LanguageLevel.JDK_1_7, "feature.binary.literals"),
|
||||
UNDERSCORES(LanguageLevel.JDK_1_7, "feature.underscores.in.literals"),
|
||||
STRING_SWITCH(LanguageLevel.JDK_1_7, "feature.string.switch"),
|
||||
STREAMS(LanguageLevel.JDK_1_8, "feature.stream.api", true),
|
||||
/**
|
||||
* java.util.Arrays.setAll, java.util.Collection#removeIf, java.util.List.sort(Comparator),
|
||||
@@ -43,18 +44,23 @@ public enum JavaFeature {
|
||||
STATIC_INTERFACE_CALLS(LanguageLevel.JDK_1_8, "feature.static.interface.calls"),
|
||||
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"),
|
||||
LVTI(LanguageLevel.JDK_10, "feature.lvti"),
|
||||
VAR_LAMBDA_PARAMETER(LanguageLevel.JDK_11, "feature.var.lambda.parameter"),
|
||||
NESTMATES(LanguageLevel.JDK_11, "feature.nestmates"),
|
||||
ENHANCED_SWITCH(LanguageLevel.JDK_14, "feature.enhanced.switch"),
|
||||
SWITCH_EXPRESSION(LanguageLevel.JDK_14, "feature.switch.expressions"),
|
||||
SERIAL_ANNOTATION(LanguageLevel.JDK_14, "feature.serial.annotation"),
|
||||
RECORDS(LanguageLevel.JDK_16, "feature.records"),
|
||||
PATTERNS(LanguageLevel.JDK_16, "feature.patterns.instanceof"),
|
||||
TEXT_BLOCK_ESCAPES(LanguageLevel.JDK_15, "feature.text.block.escape.sequences"),
|
||||
TEXT_BLOCKS(LanguageLevel.JDK_15, "feature.text.blocks"),
|
||||
SEALED_CLASSES(LanguageLevel.JDK_17, "feature.sealed.classes"),
|
||||
LOCAL_INTERFACES(LanguageLevel.JDK_16, "feature.local.interfaces"),
|
||||
LOCAL_ENUMS(LanguageLevel.JDK_16, "feature.local.enums"),
|
||||
INNER_STATICS(LanguageLevel.JDK_16, "feature.inner.statics"),
|
||||
SEALED_CLASSES(LanguageLevel.JDK_17, "feature.sealed.classes"),
|
||||
ALWAYS_STRICTFP(LanguageLevel.JDK_17, "feature.strictfp"),
|
||||
INNER_NOT_CAPTURE_THIS(LanguageLevel.JDK_18, "feature.no.this.capture"),
|
||||
PARENTHESIZED_PATTERNS(LanguageLevel.JDK_20_PREVIEW, "feature.parenthesised.patterns"){
|
||||
@Override
|
||||
public boolean isSufficient(@NotNull LanguageLevel useSiteLevel) {
|
||||
|
||||
+2
-1
@@ -1,6 +1,7 @@
|
||||
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package com.intellij.psi.impl.source.resolve.graphInference;
|
||||
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.infos.MethodCandidateInfo;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
@@ -105,7 +106,7 @@ public final class PsiPolyExpressionUtil {
|
||||
}
|
||||
|
||||
private static boolean isVarContext(PsiVariable variable) {
|
||||
if (PsiUtil.isLanguageLevel10OrHigher(variable)) {
|
||||
if (JavaFeature.LVTI.isAvailable(variable)) {
|
||||
PsiTypeElement typeElement = variable.getTypeElement();
|
||||
if (typeElement != null && typeElement.isInferredType()) {
|
||||
return true;
|
||||
|
||||
@@ -6,6 +6,7 @@ import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Comparing;
|
||||
import com.intellij.openapi.util.Condition;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.pom.java.LanguageLevel;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.CodeStyleManager;
|
||||
@@ -145,12 +146,12 @@ public final class PsiTypesUtil {
|
||||
case CommonClassNames.JAVA_LANG_DOUBLE:
|
||||
return "0.0";
|
||||
case CommonClassNames.JAVA_UTIL_SET:
|
||||
return PsiUtil.isLanguageLevel9OrHigher(psiClass) ? "java.util.Set.of()" : "java.util.Collections.emptySet()";
|
||||
return JavaFeature.COLLECTION_FACTORIES.isAvailable(psiClass) ? "java.util.Set.of()" : "java.util.Collections.emptySet()";
|
||||
case CommonClassNames.JAVA_UTIL_COLLECTION:
|
||||
case CommonClassNames.JAVA_UTIL_LIST:
|
||||
return PsiUtil.isLanguageLevel9OrHigher(psiClass) ? "java.util.List.of()" : "java.util.Collections.emptyList()";
|
||||
return JavaFeature.COLLECTION_FACTORIES.isAvailable(psiClass) ? "java.util.List.of()" : "java.util.Collections.emptyList()";
|
||||
case CommonClassNames.JAVA_UTIL_MAP:
|
||||
return PsiUtil.isLanguageLevel9OrHigher(psiClass) ? "java.util.Map.of()" : "java.util.Collections.emptyMap()";
|
||||
return JavaFeature.COLLECTION_FACTORIES.isAvailable(psiClass) ? "java.util.Map.of()" : "java.util.Collections.emptyMap()";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1063,18 +1063,10 @@ public final class PsiUtil extends PsiUtilCore {
|
||||
return getLanguageLevel(element).isAtLeast(LanguageLevel.JDK_11);
|
||||
}
|
||||
|
||||
public static boolean isLanguageLevel14OrHigher(@NotNull PsiElement element) {
|
||||
return getLanguageLevel(element).isAtLeast(LanguageLevel.JDK_14);
|
||||
}
|
||||
|
||||
public static boolean isLanguageLevel16OrHigher(@NotNull PsiElement element) {
|
||||
return getLanguageLevel(element).isAtLeast(LanguageLevel.JDK_16);
|
||||
}
|
||||
|
||||
public static boolean isLanguageLevel17OrHigher(@NotNull PsiElement element) {
|
||||
return getLanguageLevel(element).isAtLeast(LanguageLevel.JDK_17);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param element element to get Java language level for
|
||||
* @return the language level. If {@linkplain LanguageLevel#isUnsupported() unsupported} language level
|
||||
|
||||
@@ -4,7 +4,7 @@ package com.intellij.psi.impl;
|
||||
import com.intellij.lang.injection.InjectedLanguageManager;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
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.augment.PsiAugmentProvider;
|
||||
import com.intellij.psi.codeStyle.CodeStyleManager;
|
||||
@@ -17,7 +17,6 @@ import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
public final class PsiDiamondTypeUtil {
|
||||
private static final Logger LOG = Logger.getInstance(PsiDiamondTypeUtil.class);
|
||||
@@ -40,7 +39,7 @@ public final class PsiDiamondTypeUtil {
|
||||
final PsiNewExpression context,
|
||||
@Nullable final PsiType expectedType,
|
||||
boolean skipDiamonds) {
|
||||
if (PsiUtil.getLanguageLevel(context).isAtLeast(LanguageLevel.JDK_1_7)) {
|
||||
if (JavaFeature.DIAMOND_TYPES.isAvailable(context)) {
|
||||
final PsiJavaCodeReferenceElement classReference = expression.getClassOrAnonymousClassReference();
|
||||
if (classReference != null) {
|
||||
final PsiReferenceParameterList parameterList = classReference.getParameterList();
|
||||
|
||||
@@ -9,6 +9,7 @@ import com.intellij.lang.java.parser.JavaParserUtil;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.LanguageLevelProjectExtension;
|
||||
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.impl.source.*;
|
||||
@@ -266,7 +267,7 @@ public class PsiJavaParserFacadeImpl implements PsiJavaParserFacade {
|
||||
@Override
|
||||
public PsiJavaCodeReferenceElement createReferenceFromText(@NotNull String text, @Nullable PsiElement context) throws IncorrectOperationException {
|
||||
boolean isStaticImport = context instanceof PsiImportStaticStatement && !((PsiImportStaticStatement)context).isOnDemand();
|
||||
boolean mayHaveDiamonds = context instanceof PsiNewExpression && PsiUtil.getLanguageLevel(context).isAtLeast(LanguageLevel.JDK_1_7);
|
||||
boolean mayHaveDiamonds = context instanceof PsiNewExpression && JavaFeature.DIAMOND_TYPES.isAvailable(context);
|
||||
JavaParserUtil.ParserWrapper wrapper = isStaticImport ? STATIC_IMPORT_REF : mayHaveDiamonds ? DIAMOND_REF : REFERENCE;
|
||||
DummyHolder holder = DummyHolderFactory.createHolder(myManager, new JavaDummyElement(text, wrapper, level(context)), context);
|
||||
PsiElement element = SourceTreeToPsiMap.treeElementToPsi(holder.getTreeElement().getFirstChildNode());
|
||||
|
||||
+2
-3
@@ -4,7 +4,7 @@ package com.intellij.psi.impl.source.tree.java;
|
||||
import com.intellij.codeInsight.ExceptionUtil;
|
||||
import com.intellij.lang.ASTNode;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.pom.java.LanguageLevel;
|
||||
import com.intellij.pom.java.JavaFeature;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.source.Constants;
|
||||
import com.intellij.psi.impl.source.tree.ChildRole;
|
||||
@@ -76,8 +76,7 @@ public class PsiCatchSectionImpl extends CompositePsiElement implements PsiCatch
|
||||
PsiType declaredType = parameter.getType();
|
||||
|
||||
// When the thrown expression is an ... exception parameter Ej (parameter) of a catch clause Cj (this) ...
|
||||
if (PsiUtil.getLanguageLevel(parameter).isAtLeast(LanguageLevel.JDK_1_7) &&
|
||||
isCatchParameterEffectivelyFinal(parameter, getCatchBlock())) {
|
||||
if (JavaFeature.MULTI_CATCH.isAvailable(parameter) && isCatchParameterEffectivelyFinal(parameter, getCatchBlock())) {
|
||||
PsiTryStatement statement = getTryStatement();
|
||||
// ... and the try block of the try statement which declares Cj (tryBlock) can throw T ...
|
||||
Collection<PsiClassType> thrownTypes = getThrownTypes(statement);
|
||||
|
||||
+2
-2
@@ -4,12 +4,12 @@ package com.intellij.codeInspection
|
||||
import com.intellij.analysis.JvmAnalysisBundle
|
||||
import com.intellij.codeInsight.daemon.impl.analysis.JavaModuleGraphUtil
|
||||
import com.intellij.packageDependencies.DependenciesBuilder
|
||||
import com.intellij.pom.java.JavaFeature
|
||||
import com.intellij.psi.PsiClass
|
||||
import com.intellij.psi.PsiClassOwner
|
||||
import com.intellij.psi.PsiElementVisitor
|
||||
import com.intellij.psi.PsiFile
|
||||
import com.intellij.psi.impl.light.LightJavaModule
|
||||
import com.intellij.psi.util.PsiUtil
|
||||
|
||||
class IllegalDependencyOnInternalPackageInspection : LocalInspectionTool() {
|
||||
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor = IllegalDependencyOnInternalPackage(holder)
|
||||
@@ -17,7 +17,7 @@ class IllegalDependencyOnInternalPackageInspection : LocalInspectionTool() {
|
||||
|
||||
private class IllegalDependencyOnInternalPackage(private val holder: ProblemsHolder) : PsiElementVisitor() {
|
||||
override fun visitFile(file: PsiFile) {
|
||||
if (!PsiUtil.isLanguageLevel9OrHigher(file) || JavaModuleGraphUtil.findDescriptorByElement(file) != null) return
|
||||
if (!JavaFeature.MODULES.isAvailable(file) || JavaModuleGraphUtil.findDescriptorByElement(file) != null) return
|
||||
DependenciesBuilder.analyzeFileDependencies(file) { place, dependency ->
|
||||
if (dependency !is PsiClass) return@analyzeFileDependencies
|
||||
val dependencyFile = dependency.containingFile
|
||||
|
||||
Reference in New Issue
Block a user