mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 06:05:01 +07:00
cleanup IDEA-382376: move com.siyeh.ig.asserttoif package from java-impl to java-impl-inspections
GitOrigin-RevId: 370eb2d447aabf7be85116bf23ad134c07272870
This commit is contained in:
committed by
intellij-monorepo-bot
parent
b257f53a3b
commit
c741482c24
+109
@@ -0,0 +1,109 @@
|
||||
/*
|
||||
* Copyright 2003-2019 Dave Griffith, Bas Leijdekkers
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.siyeh.ig.asserttoif;
|
||||
|
||||
import com.intellij.codeInsight.BlockUtils;
|
||||
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.JavaTokenType;
|
||||
import com.intellij.psi.PsiAssertStatement;
|
||||
import com.intellij.psi.PsiCodeBlock;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiErrorElement;
|
||||
import com.intellij.psi.PsiExpression;
|
||||
import com.intellij.psi.PsiKeyword;
|
||||
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.PsiReplacementUtil;
|
||||
import com.siyeh.ig.psiutils.BoolUtils;
|
||||
import com.siyeh.ig.psiutils.CommentTracker;
|
||||
import org.jetbrains.annotations.Nls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
public final class AssertionCanBeIfInspection extends BaseInspection {
|
||||
|
||||
@Override
|
||||
protected @NotNull String buildErrorString(Object... infos) {
|
||||
return getDisplayName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull Set<@NotNull JavaFeature> requiredFeatures() {
|
||||
return Set.of(JavaFeature.ASSERTIONS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull BaseInspectionVisitor buildVisitor() {
|
||||
return new AssertToIfVisitor();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected @NotNull LocalQuickFix buildFix(Object... infos) {
|
||||
return new AssertToIfFix();
|
||||
}
|
||||
|
||||
private static class AssertToIfVisitor extends BaseInspectionVisitor {
|
||||
@Override
|
||||
public void visitAssertStatement(@NotNull PsiAssertStatement assertStatement) {
|
||||
super.visitAssertStatement(assertStatement);
|
||||
if (assertStatement.getAssertCondition() == null) {
|
||||
return;
|
||||
}
|
||||
final PsiElement lastLeaf = PsiTreeUtil.getDeepestLast(assertStatement);
|
||||
if (lastLeaf instanceof PsiErrorElement ||
|
||||
PsiUtil.isJavaToken(lastLeaf, JavaTokenType.SEMICOLON) && PsiTreeUtil.prevLeaf(lastLeaf) instanceof PsiErrorElement) {
|
||||
return;
|
||||
}
|
||||
if (isVisibleHighlight(assertStatement)) {
|
||||
registerStatementError(assertStatement);
|
||||
}
|
||||
else {
|
||||
registerError(assertStatement);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static class AssertToIfFix extends PsiUpdateModCommandQuickFix {
|
||||
@Override
|
||||
public @Nls @NotNull String getFamilyName() {
|
||||
return InspectionGadgetsBundle.message("assert.can.be.if.quickfix");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void applyFix(@NotNull Project project, @NotNull PsiElement element, @NotNull ModPsiUpdater updater) {
|
||||
PsiAssertStatement assertStatement =
|
||||
element instanceof PsiKeyword ? (PsiAssertStatement)element.getParent() : (PsiAssertStatement)element;
|
||||
if (!(assertStatement.getParent() instanceof PsiCodeBlock)) {
|
||||
assertStatement = BlockUtils.expandSingleStatementToBlockStatement(assertStatement);
|
||||
}
|
||||
final PsiExpression condition = assertStatement.getAssertCondition();
|
||||
CommentTracker tracker = new CommentTracker();
|
||||
final String conditionText = BoolUtils.getNegatedExpressionText(condition, tracker);
|
||||
final PsiExpression description = assertStatement.getAssertDescription();
|
||||
final String errorText = description != null ? tracker.text(description) : "";
|
||||
String newStatement = "if(" + conditionText + ") throw new java.lang.AssertionError(" + errorText + ");";
|
||||
PsiReplacementUtil.replaceStatement(assertStatement, newStatement, tracker);
|
||||
}
|
||||
}
|
||||
}
|
||||
+221
@@ -0,0 +1,221 @@
|
||||
// Copyright 2000-2024 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.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.CommonClassNames;
|
||||
import com.intellij.psi.JavaTokenType;
|
||||
import com.intellij.psi.PsiBinaryExpression;
|
||||
import com.intellij.psi.PsiBlockStatement;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiExpression;
|
||||
import com.intellij.psi.PsiExpressionList;
|
||||
import com.intellij.psi.PsiIfStatement;
|
||||
import com.intellij.psi.PsiMethodCallExpression;
|
||||
import com.intellij.psi.PsiNewExpression;
|
||||
import com.intellij.psi.PsiReferenceExpression;
|
||||
import com.intellij.psi.PsiStatement;
|
||||
import com.intellij.psi.PsiThrowStatement;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.ObjectUtils;
|
||||
import com.siyeh.InspectionGadgetsBundle;
|
||||
import com.siyeh.ig.BaseInspection;
|
||||
import com.siyeh.ig.BaseInspectionVisitor;
|
||||
import com.siyeh.ig.PsiReplacementUtil;
|
||||
import com.siyeh.ig.callMatcher.CallMatcher;
|
||||
import com.siyeh.ig.psiutils.BoolUtils;
|
||||
import com.siyeh.ig.psiutils.CommentTracker;
|
||||
import com.siyeh.ig.psiutils.ComparisonUtils;
|
||||
import com.siyeh.ig.psiutils.ExpressionUtils;
|
||||
import com.siyeh.ig.psiutils.TypeUtils;
|
||||
import org.jetbrains.annotations.Nls;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public final class IfCanBeAssertionInspection extends BaseInspection {
|
||||
private static final CallMatcher.Simple MATCHER = CallMatcher.staticCall("com.google.common.base.Preconditions", "checkNotNull");
|
||||
|
||||
@Override
|
||||
protected @NotNull String buildErrorString(Object... infos) {
|
||||
return getDisplayName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull Set<@NotNull JavaFeature> requiredFeatures() {
|
||||
return Set.of(JavaFeature.ASSERTIONS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull BaseInspectionVisitor buildVisitor() {
|
||||
return new IfToAssertionVisitor();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected LocalQuickFix @NotNull [] buildFixes(Object... infos) {
|
||||
boolean isObjectsRequireNonNullAvailable = (boolean)infos[0];
|
||||
boolean isIfStatement = (boolean)infos[1];
|
||||
List<LocalQuickFix> fixes = new ArrayList<>(2);
|
||||
if (isObjectsRequireNonNullAvailable) {
|
||||
fixes.add(new ReplaceWithObjectsNonNullFix(isIfStatement));
|
||||
}
|
||||
if (isIfStatement) {
|
||||
fixes.add(new IfToAssertionFix());
|
||||
}
|
||||
return fixes.toArray(LocalQuickFix.EMPTY_ARRAY);
|
||||
}
|
||||
|
||||
static PsiNewExpression getThrownNewException(PsiElement element) {
|
||||
if (element instanceof PsiBlockStatement) {
|
||||
final PsiStatement[] statements = ((PsiBlockStatement)element).getCodeBlock().getStatements();
|
||||
if (statements.length == 1) {
|
||||
return getThrownNewException(statements[0]);
|
||||
}
|
||||
}
|
||||
else if (element instanceof PsiThrowStatement throwStatement) {
|
||||
final PsiExpression exception = PsiUtil.skipParenthesizedExprDown(throwStatement.getException());
|
||||
if (exception instanceof PsiNewExpression) {
|
||||
return (PsiNewExpression)exception;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static class IfToAssertionVisitor extends BaseInspectionVisitor {
|
||||
|
||||
@Override
|
||||
public void visitIfStatement(@NotNull PsiIfStatement statement) {
|
||||
super.visitIfStatement(statement);
|
||||
final PsiExpression condition = PsiUtil.skipParenthesizedExprDown(statement.getCondition());
|
||||
if (condition == null || statement.getElseBranch() != null || getThrownNewException(statement.getThenBranch()) == null) {
|
||||
return;
|
||||
}
|
||||
final boolean isObjectsRequireNonNullAvailable = PsiUtil.isAvailable(JavaFeature.OBJECTS_CLASS, statement) &&
|
||||
ComparisonUtils.isNullComparison(condition) &&
|
||||
((PsiBinaryExpression)condition).getOperationTokenType() == JavaTokenType.EQEQ;
|
||||
registerStatementError(statement, isObjectsRequireNonNullAvailable, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
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.isAvailable(JavaFeature.OBJECTS_CLASS, expression), false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static class ReplaceWithObjectsNonNullFix extends PsiUpdateModCommandQuickFix {
|
||||
private final boolean myIsIfStatement;
|
||||
|
||||
ReplaceWithObjectsNonNullFix(boolean isIfStatement) {
|
||||
myIsIfStatement = isIfStatement;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nls @NotNull String getFamilyName() {
|
||||
return InspectionGadgetsBundle.message("if.can.be.assertion.replace.with.objects.requirenonnull.quickfix");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void applyFix(@NotNull Project project, @NotNull PsiElement startElement, @NotNull ModPsiUpdater updater) {
|
||||
if (myIsIfStatement) {
|
||||
final PsiElement parent = startElement.getParent();
|
||||
if (!(parent instanceof PsiIfStatement ifStatement)) return;
|
||||
final PsiExpression condition = PsiUtil.skipParenthesizedExprDown(ifStatement.getCondition());
|
||||
if (!(condition instanceof PsiBinaryExpression)) return;
|
||||
PsiExpression nullComparedExpression = ExpressionUtils.getValueComparedWithNull((PsiBinaryExpression)condition);
|
||||
if (nullComparedExpression == null) return;
|
||||
PsiNewExpression exception = getThrownNewException(ifStatement.getThenBranch());
|
||||
if (exception == null) return;
|
||||
PsiExpressionList args = exception.getArgumentList();
|
||||
PsiExpression message = null;
|
||||
if (args != null) {
|
||||
PsiExpression arg = ArrayUtil.getFirstElement(args.getExpressions());
|
||||
if (arg != null && TypeUtils.isJavaLangString(arg.getType())) {
|
||||
message = arg;
|
||||
}
|
||||
}
|
||||
CommentTracker tracker = new CommentTracker();
|
||||
final String text = buildNewExpressionText(tracker.markUnchanged(nullComparedExpression), message);
|
||||
PsiReplacementUtil.replaceStatementAndShortenClassNames(ifStatement, text + ";", tracker);
|
||||
} else {
|
||||
PsiReferenceExpression ref = ObjectUtils.tryCast(startElement.getParent(), PsiReferenceExpression.class);
|
||||
if (ref == null) return;
|
||||
PsiMethodCallExpression methodCall = ObjectUtils.tryCast(ref.getParent(), PsiMethodCallExpression.class);
|
||||
if (!MATCHER.test(methodCall)) {
|
||||
return;
|
||||
}
|
||||
PsiExpression[] args = methodCall.getArgumentList().getExpressions();
|
||||
if (args.length > 2) return;
|
||||
CommentTracker tracker = new CommentTracker();
|
||||
final String text = buildNewExpressionText(tracker.markUnchanged(args[0]), (args.length == 2) ? tracker.markUnchanged(args[1]) : null);
|
||||
PsiReplacementUtil.replaceExpressionAndShorten(methodCall, text, tracker);
|
||||
}
|
||||
}
|
||||
|
||||
private static String buildNewExpressionText(@NotNull PsiExpression nullComparedExpression, @Nullable PsiExpression message) {
|
||||
final @NonNls StringBuilder result = new StringBuilder("java.util.Objects.requireNonNull(");
|
||||
result.append(nullComparedExpression.getText());
|
||||
if (message != null) {
|
||||
result.append(", ");
|
||||
if (ExpressionUtils.hasStringType(message)) {
|
||||
result.append(message.getText());
|
||||
}
|
||||
else {
|
||||
result.append(CommonClassNames.JAVA_LANG_STRING + ".valueOf(").append(message.getText()).append(")");
|
||||
}
|
||||
}
|
||||
result.append(")");
|
||||
return result.toString();
|
||||
}
|
||||
}
|
||||
|
||||
private static class IfToAssertionFix extends PsiUpdateModCommandQuickFix {
|
||||
@Override
|
||||
public @Nls @NotNull String getFamilyName() {
|
||||
return InspectionGadgetsBundle.message("if.can.be.assertion.replace.with.assertion.quickfix");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void applyFix(@NotNull Project project, @NotNull PsiElement startElement, @NotNull ModPsiUpdater updater) {
|
||||
final PsiElement parent = startElement.getParent();
|
||||
if (!(parent instanceof PsiIfStatement ifStatement)) {
|
||||
return;
|
||||
}
|
||||
final @NonNls StringBuilder newStatementText = new StringBuilder("assert ");
|
||||
CommentTracker tracker = new CommentTracker();
|
||||
newStatementText.append(BoolUtils.getNegatedExpressionText(ifStatement.getCondition(), tracker));
|
||||
final PsiNewExpression newException = getThrownNewException(ifStatement.getThenBranch());
|
||||
final String message = getExceptionMessage(newException, tracker);
|
||||
if (message != null) {
|
||||
newStatementText.append(':').append(message);
|
||||
}
|
||||
newStatementText.append(';');
|
||||
PsiReplacementUtil.replaceStatement(ifStatement, newStatementText.toString(), tracker);
|
||||
}
|
||||
|
||||
private static String getExceptionMessage(PsiNewExpression newExpression, CommentTracker tracker) {
|
||||
if (newExpression == null) {
|
||||
return null;
|
||||
}
|
||||
final PsiExpressionList argumentList = newExpression.getArgumentList();
|
||||
if (argumentList == null) {
|
||||
return null;
|
||||
}
|
||||
final PsiExpression[] arguments = argumentList.getExpressions();
|
||||
if (arguments.length < 1) {
|
||||
return null;
|
||||
}
|
||||
return tracker.text(arguments[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user