Java: improve inspection messages

for "Null check can be replaced with method call" inspection

GitOrigin-RevId: ffa45cce88afb341cdeb9a49d4ee256251865bfc
This commit is contained in:
Bas Leijdekkers
2022-07-22 18:35:53 +00:00
committed by intellij-monorepo-bot
parent 77b9f43a1d
commit e5caa802af
34 changed files with 47 additions and 46 deletions
@@ -1,4 +1,4 @@
// 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.
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInspection;
import com.intellij.codeInsight.Nullability;
@@ -41,8 +41,7 @@ public class ReplaceNullCheckInspection extends AbstractBaseJavaLocalInspectionT
@Override
public JComponent createOptionsPanel() {
MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this);
panel
.addCheckbox(JavaBundle.message("inspection.require.non.null.no.warning.replacement.bigger"), "noWarningReplacementBigger");
panel.addCheckbox(JavaBundle.message("inspection.require.non.null.no.warning.replacement.bigger"), "noWarningReplacementBigger");
return panel;
}
@@ -62,10 +61,11 @@ public class ReplaceNullCheckInspection extends AbstractBaseJavaLocalInspectionT
PsiStatement nextToDelete = context.myNextToDelete;
int maybeImplicitElseLength = nextToDelete != null ? nextToDelete.getTextLength() : 0;
boolean isInfoLevel = noWarningReplacementBigger && ifStatement.getTextLength() + maybeImplicitElseLength - context.getLenAfterReplace() < MINIMAL_WARN_DELTA_SIZE;
boolean isInfoLevel = noWarningReplacementBigger &&
ifStatement.getTextLength() + maybeImplicitElseLength - context.getLenAfterReplace() < MINIMAL_WARN_DELTA_SIZE;
ProblemHighlightType highlight = getHighlight(context, isInfoLevel);
if (!isOnTheFly && highlight == ProblemHighlightType.INFORMATION) return;
holder.registerProblem(ifStatement.getFirstChild(), JavaBundle.message("inspection.require.non.null.message", method), highlight,
holder.registerProblem(ifStatement.getFirstChild(), JavaBundle.message("inspection.require.non.null.message", 1, method), highlight,
new ReplaceWithRequireNonNullFix(method, false));
}
@@ -87,12 +87,12 @@ public class ReplaceNullCheckInspection extends AbstractBaseJavaLocalInspectionT
String method = getMethodWithClass(context.myNullExpr, false);
String name = context.myReferenceExpression.getText();
boolean replacementShorter =
name != null
&& context.myNullExpr.getTextLength() + method.length() + name.length() < context.myTernary.getTextLength() + MINIMAL_WARN_DELTA_SIZE;
name != null &&
context.myNullExpr.getTextLength() + method.length() + name.length() < context.myTernary.getTextLength() + MINIMAL_WARN_DELTA_SIZE;
boolean isInfoLevel = noWarningReplacementBigger && replacementShorter;
ProblemHighlightType highlightType = isInfoLevel ? ProblemHighlightType.INFORMATION : ProblemHighlightType.GENERIC_ERROR_OR_WARNING;
if (!isOnTheFly && highlightType == ProblemHighlightType.INFORMATION) return;
holder.registerProblem(ternary, JavaBundle.message("inspection.require.non.null.message", method),
holder.registerProblem(ternary, JavaBundle.message("inspection.require.non.null.message", 2, method),
highlightType, new ReplaceWithRequireNonNullFix(method, true));
}
};
@@ -110,7 +110,7 @@ public class ReplaceNullCheckInspection extends AbstractBaseJavaLocalInspectionT
@NotNull
@Override
public String getName() {
return JavaBundle.message("inspection.require.non.null.message", myMethod);
return JavaBundle.message("inspection.require.non.null.quickfix", myIsTernary ? 2 : 1, myMethod);
}
@Nls
@@ -207,11 +207,11 @@ public class ReplaceNullCheckInspection extends AbstractBaseJavaLocalInspectionT
@Nullable
static NotNullContext from(@NotNull PsiIfStatement ifStatement) {
PsiExpression condition = ifStatement.getCondition();
PsiExpression condition = PsiUtil.skipParenthesizedExprDown(ifStatement.getCondition());
if(condition == null) return null;
PsiBinaryExpression binOp = tryCast(condition, PsiBinaryExpression.class);
if(binOp == null) return null;
PsiExpression value = ExpressionUtils.getValueComparedWithNull(binOp);
PsiExpression value = PsiUtil.skipParenthesizedExprDown(ExpressionUtils.getValueComparedWithNull(binOp));
PsiReferenceExpression referenceExpression = tryCast(value, PsiReferenceExpression.class);
if(referenceExpression == null) return null;
PsiVariable variable = tryCast(referenceExpression.resolve(), PsiVariable.class);
@@ -1,6 +1,6 @@
<html>
<body>
Reports null checks that can be replaced with a call to a static method from <code>Objects</code> or <code>Stream</code>.
Reports <code>null</code> checks that can be replaced with a call to a static method from <code>Objects</code> or <code>Stream</code>.
<p><b>Example:</b></p>
<pre><code>
if (message == null) {
@@ -16,7 +16,7 @@ Reports null checks that can be replaced with a call to a static method from <co
</code></pre>
<!-- tooltip end -->
<p>
Use the <b>Don't warn if length of replacement bigger than original</b> option to ignore the cases when the replacement is longer than the
Use the <b>Don't warn if the replacement is longer than the original</b> option to ignore the cases when the replacement is longer than the
original code.
</p>
<p><small>New in 2017.3</small></p>
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElseGet" "true"
// "Replace 'if' statement with 'Objects.requireNonNullElseGet()' call" "true"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElse" "GENERIC_ERROR_OR_WARNING"
// "Replace 'if' statement with 'Objects.requireNonNullElse()' call" "GENERIC_ERROR_OR_WARNING"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElseGet" "INFORMATION"
// "Replace 'if' statement with 'Objects.requireNonNullElseGet()' call" "INFORMATION"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElse" "true"
// "Replace 'if' statement with 'Objects.requireNonNullElse()' call" "true"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElse" "true"
// "Replace 'if' statement with 'Objects.requireNonNullElse()' call" "true"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Stream.ofNullable" "true"
// "Replace 'if' statement with 'Stream.ofNullable()' call" "true"
import java.util.*;
import java.util.stream.Stream;
@@ -1,4 +1,4 @@
// "Replace condition with Stream.ofNullable" "true"
// "Replace 'if' statement with 'Stream.ofNullable()' call" "true"
import java.util.*;
import java.util.stream.Stream;
@@ -1,4 +1,4 @@
// "Replace condition with Stream.ofNullable" "true"
// "Replace 'if' statement with 'Stream.ofNullable()' call" "true"
import java.util.*;
import java.util.stream.Collectors;
@@ -1,4 +1,4 @@
// "Replace condition with Stream.ofNullable" "true"
// "Replace 'if' statement with 'Stream.ofNullable()' call" "true"
import java.util.*;
import java.util.stream.Stream;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElse" "true"
// "Replace conditional expression with 'Objects.requireNonNullElse()' call" "true"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElseGet" "true"
// "Replace conditional expression with 'Objects.requireNonNullElseGet()' call" "true"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElse" "true"
// "Replace conditional expression with 'Objects.requireNonNullElse()' call" "true"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElse" "true"
// "Replace conditional expression with 'Objects.requireNonNullElse()' call" "true"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElseGet" "INFORMATION"
// "Replace conditional expression with 'Objects.requireNonNullElseGet()' call" "INFORMATION"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElseGet" "true"
// "Replace 'if' statement with 'Objects.requireNonNullElseGet()' call" "true"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElse" "GENERIC_ERROR_OR_WARNING"
// "Replace 'if' statement with 'Objects.requireNonNullElse()' call" "GENERIC_ERROR_OR_WARNING"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElseGet" "INFORMATION"
// "Replace 'if' statement with 'Objects.requireNonNullElseGet()' call" "INFORMATION"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElse" "true"
// "Replace 'if' statement with 'Objects.requireNonNullElse()' call" "true"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElse" "true"
// "Replace 'if' statement with 'Objects.requireNonNullElse()' call" "true"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Stream.ofNullable" "true"
// "Replace 'if' statement with 'Stream.ofNullable()' call" "true"
import java.util.*;
import java.util.stream.Stream;
@@ -1,4 +1,4 @@
// "Replace condition with Stream.ofNullable" "true"
// "Replace 'if' statement with 'Stream.ofNullable()' call" "true"
import java.util.*;
import java.util.stream.Stream;
@@ -1,4 +1,4 @@
// "Replace condition with Stream.ofNullable" "true"
// "Replace 'if' statement with 'Stream.ofNullable()' call" "true"
import java.util.*;
import java.util.stream.Collectors;
@@ -1,4 +1,4 @@
// "Replace condition with Stream.ofNullable" "true"
// "Replace 'if' statement with 'Stream.ofNullable()' call" "true"
import java.util.*;
import java.util.stream.Stream;
@@ -7,7 +7,7 @@ import java.util.stream.Stream;
public class Main {
Stream<Object> getStream(Object[] arr) {
if<caret>(arr == null) return Stream.empty();
if<caret>(((arr) == (null))) return Stream.empty();
else return Stream.of(arr);
}
}
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElse" "false"
// "Replace 'if' statement with 'Objects.requireNonNullElse()' call" "false"
class Component {
public Component add(Component component, int index) {
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElse" "true"
// "Replace conditional expression with 'Objects.requireNonNullElse()' call" "true"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElseGet" "true"
// "Replace conditional expression with 'Objects.requireNonNullElseGet()' call" "true"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElse" "false"
// "Replace conditional expression with 'Objects.requireNonNullElse()' call" "false"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElse" "true"
// "Replace conditional expression with 'Objects.requireNonNullElse()' call" "true"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElse" "true"
// "Replace conditional expression with 'Objects.requireNonNullElse()' call" "true"
import java.util.*;
@@ -1,4 +1,4 @@
// "Replace condition with Objects.requireNonNullElseGet" "INFORMATION"
// "Replace conditional expression with 'Objects.requireNonNullElseGet()' call" "INFORMATION"
import java.util.*;
@@ -677,8 +677,9 @@ inspection.replace.with.trivial.lambda.fix.family.name=Replace with trivial lamb
inspection.replace.with.trivial.lambda.fix.name=Replace with lambda returning ''{0}''
inspection.require.non.null=Replace null check with Objects/Stream static call
inspection.require.non.null.description=Null check can be replaced with method call
inspection.require.non.null.message=Replace condition with {0}
inspection.require.non.null.no.warning.replacement.bigger=Don't warn if length of replacement bigger than original
inspection.require.non.null.message={0, choice, 1#''if'' statement|2#Conditional expression} can be replaced with call to ''{1}()''
inspection.require.non.null.quickfix=Replace {0, choice, 1#''if'' statement|2#conditional expression} with ''{1}()'' call
inspection.require.non.null.no.warning.replacement.bigger=Don't warn if the replacement is longer than the original
inspection.return.separated.from.computation.descriptor=Return separated from computation of value of ''{0}''
inspection.return.separated.from.computation.family.quickfix=Move 'return' closer to computation of the result
inspection.return.separated.from.computation.name='return' separated from the result computation