[java] JavaFeature.OBJECTS_CLASS

GitOrigin-RevId: 99e54a5f42368279b20fca9388f420cd6e24dee2
This commit is contained in:
Tagir Valeev
2024-03-14 13:26:35 +01:00
committed by intellij-monorepo-bot
parent d18c733fe1
commit 3ed2f12a89
11 changed files with 34 additions and 18 deletions

View File

@@ -5,7 +5,7 @@ import com.intellij.codeInspection.CommonQuickFixBundle;
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.JavaCodeStyleManager;
import com.intellij.psi.util.PsiTreeUtil;
@@ -57,7 +57,7 @@ public final class ReplaceWithObjectsEqualsFix extends PsiUpdateModCommandQuickF
@NotNull PsiReferenceExpression methodExpression) {
if (!"equals".equals(methodExpression.getReferenceName()) ||
call.getArgumentList().getExpressionCount() != 1 ||
!PsiUtil.getLanguageLevel(call).isAtLeast(LanguageLevel.JDK_1_7)) {
!PsiUtil.isAvailable(JavaFeature.OBJECTS_CLASS, call)) {
return null;
}

View File

@@ -17,10 +17,11 @@ package com.siyeh.ig.fixes;
import com.intellij.codeInsight.Nullability;
import com.intellij.codeInsight.intention.PriorityAction;
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
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.JavaTokenType;
import com.intellij.psi.PsiBinaryExpression;
import com.intellij.psi.PsiElement;
@@ -89,7 +90,7 @@ public final class EqualityToSafeEqualsFix extends PsiUpdateModCommandQuickFix i
final String lhsText = tracker.text(lhs);
final String rhsText = tracker.text(rhs);
@NonNls final StringBuilder newExpression = new StringBuilder();
if (PsiUtil.isLanguageLevel7OrHigher(expression) && ClassUtils.findClass("java.util.Objects", expression) != null) {
if (PsiUtil.isAvailable(JavaFeature.OBJECTS_CLASS, expression) && ClassUtils.findClass("java.util.Objects", expression) != null) {
if (JavaTokenType.NE.equals(expression.getOperationTokenType())) {
newExpression.append('!');
}

View File

@@ -1,11 +1,15 @@
// 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.migration;
import com.intellij.codeInspection.*;
import com.intellij.codeInspection.CleanupLocalInspectionTool;
import com.intellij.codeInspection.CommonQuickFixBundle;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemHighlightType;
import com.intellij.codeInspection.options.OptPane;
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.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
@@ -22,6 +26,8 @@ import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Set;
import static com.intellij.codeInspection.options.OptPane.checkbox;
import static com.intellij.codeInspection.options.OptPane.pane;
@@ -84,8 +90,8 @@ public final class EqualsReplaceableByObjectsCallInspection extends BaseInspecti
}
@Override
public boolean shouldInspect(@NotNull PsiFile file) {
return PsiUtil.isLanguageLevel7OrHigher(file);
public @NotNull Set<@NotNull JavaFeature> requiredFeatures() {
return Set.of(JavaFeature.OBJECTS_CLASS);
}
@Override

View File

@@ -5,12 +5,13 @@ import com.intellij.codeInsight.Nullability;
import com.intellij.codeInspection.AbstractBaseJavaLocalInspectionTool;
import com.intellij.codeInspection.CommonQuickFixBundle;
import com.intellij.codeInspection.ProblemsHolder;
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
import com.intellij.codeInspection.dataFlow.NullabilityUtil;
import com.intellij.java.analysis.JavaAnalysisBundle;
import com.intellij.modcommand.ModPsiUpdater;
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.NlsSafe;
import com.intellij.pom.java.JavaFeature;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
@@ -22,6 +23,7 @@ import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
import java.util.Set;
import static com.intellij.psi.util.PsiPrecedenceUtil.EQUALITY_PRECEDENCE;
import static com.intellij.psi.util.PsiPrecedenceUtil.METHOD_CALL_PRECEDENCE;
@@ -30,12 +32,14 @@ public final class ObjectsEqualsCanBeSimplifiedInspection extends AbstractBaseJa
private static final CallMatcher OBJECTS_EQUALS = CallMatcher.staticCall(
CommonClassNames.JAVA_UTIL_OBJECTS, "equals").parameterCount(2);
@Override
public @NotNull Set<@NotNull JavaFeature> requiredFeatures() {
return Set.of(JavaFeature.OBJECTS_CLASS);
}
@NotNull
@Override
public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) {
if (!PsiUtil.isLanguageLevel7OrHigher(holder.getFile())) {
return PsiElementVisitor.EMPTY_VISITOR;
}
return new JavaElementVisitor() {
@Override
public void visitMethodCallExpression(@NotNull PsiMethodCallExpression call) {

View File

@@ -67,6 +67,7 @@ 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.objects.class=java.util.Objects API
feature.stream.and.optional.api=Stream and Optional API
feature.advanced.collection.api=Lambda methods in collections
feature.with.initial=ThreadLocal.withInitial()

View File

@@ -28,6 +28,7 @@ public enum JavaFeature {
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"),
OBJECTS_CLASS(LanguageLevel.JDK_1_7, "feature.objects.class"),
STREAM_OPTIONAL(LanguageLevel.JDK_1_8, "feature.stream.and.optional.api", true),
/**
* java.util.Arrays.setAll, java.util.Collection#removeIf, java.util.List.sort(Comparator),

View File

@@ -156,7 +156,7 @@ public final class DataFlowInspection extends DataFlowInspectionBase {
}
}
if (!alwaysNull && PsiUtil.isLanguageLevel7OrHigher(qualifier)) {
if (!alwaysNull && PsiUtil.isAvailable(JavaFeature.OBJECTS_CLASS, qualifier)) {
fixes.add(new SurroundWithRequireNonNullFix(qualifier));
}

View File

@@ -65,7 +65,7 @@ public class ConvertRecordToClassFix extends PsiUpdateModCommandAction<PsiElemen
@Nullable
public static PsiClass tryMakeRecord(@NotNull PsiElement element) {
// We use java.util.Objects for code generation, but it's absent before Java 7
if (!PsiUtil.isLanguageLevel7OrHigher(element)) return null;
if (!PsiUtil.isAvailable(JavaFeature.OBJECTS_CLASS, element)) return null;
PsiJavaFile maybeRecord = (PsiJavaFile)PsiFileFactory.getInstance(element.getProject())
.createFileFromText("Dummy.java", JavaLanguage.INSTANCE, element.getText(), false, false);
PsiUtil.FILE_LANGUAGE_LEVEL_KEY.set(maybeRecord, LanguageLevel.JDK_16);

View File

@@ -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.asserttoif;
import com.intellij.modcommand.ModPsiUpdater;
import com.intellij.codeInspection.LocalQuickFix;
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.intellij.util.ArrayUtil;
@@ -76,7 +77,7 @@ public final class IfCanBeAssertionInspection extends BaseInspection {
if (condition == null || statement.getElseBranch() != null || getThrownNewException(statement.getThenBranch()) == null) {
return;
}
final boolean isObjectsRequireNonNullAvailable = PsiUtil.isLanguageLevel7OrHigher(statement) &&
final boolean isObjectsRequireNonNullAvailable = PsiUtil.isAvailable(JavaFeature.OBJECTS_CLASS, statement) &&
ComparisonUtils.isNullComparison(condition) &&
((PsiBinaryExpression)condition).getOperationTokenType() == JavaTokenType.EQEQ;
registerStatementError(statement, isObjectsRequireNonNullAvailable, true);
@@ -86,7 +87,7 @@ public final class IfCanBeAssertionInspection extends BaseInspection {
public void visitMethodCallExpression(@NotNull PsiMethodCallExpression expression) {
super.visitMethodCallExpression(expression);
if (MATCHER.test(expression) && expression.getArgumentList().getExpressionCount() <= 2) { // for parametrized messages we don't suggest anything
registerMethodCallError(expression, PsiUtil.isLanguageLevel7OrHigher(expression), false);
registerMethodCallError(expression, PsiUtil.isAvailable(JavaFeature.OBJECTS_CLASS, expression), false);
}
}
}

View File

@@ -9,6 +9,7 @@ import com.intellij.modcommand.ModPsiUpdater;
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.NlsSafe;
import com.intellij.pom.java.JavaFeature;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
@@ -421,7 +422,7 @@ public final class RedundantCollectionOperationInspection extends AbstractBaseJa
}
static RedundantCollectionOperationHandler handler(PsiMethodCallExpression call) {
if(!PsiUtil.isLanguageLevel7OrHigher(call)) return null;
if(!PsiUtil.isAvailable(JavaFeature.OBJECTS_CLASS, call)) return null;
PsiMethodCallExpression qualifierCall = MethodCallUtils.getQualifierMethodCall(call);
if (!SINGLETON.test(qualifierCall)) return null;
return new SingletonContainsHandler();

View File

@@ -5,6 +5,7 @@ import com.intellij.codeInsight.Nullability;
import com.intellij.codeInsight.NullabilityAnnotationInfo;
import com.intellij.codeInsight.NullableNotNullManager;
import com.intellij.codeInspection.util.IntentionName;
import com.intellij.pom.java.JavaFeature;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
@@ -86,7 +87,7 @@ public final class ObjectsRequireNonNullIntention extends MCIntention {
@Override
public boolean satisfiedBy(PsiElement element) {
if (!PsiUtil.isLanguageLevel7OrHigher(element)) {
if (!PsiUtil.isAvailable(JavaFeature.OBJECTS_CLASS, element)) {
return false;
}
if (!(element instanceof PsiReferenceExpression referenceExpression)) {