cleanup IDEA-382376: move com.siyeh.ig.asserttoif package from java-impl to java-impl-inspections

GitOrigin-RevId: 370eb2d447aabf7be85116bf23ad134c07272870
This commit is contained in:
Bartek Pacia
2026-02-12 12:49:55 +00:00
committed by intellij-monorepo-bot
parent b257f53a3b
commit c741482c24
2 changed files with 0 additions and 0 deletions
@@ -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);
}
}
}
@@ -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]);
}
}
}