From b5e6ec36f66cefadde6d8c8ebddefc90b5c4b4e2 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 5 Dec 2018 18:17:40 +0700 Subject: [PATCH] DataFlowInspectionBase: merge reports for ternary branches on return --- .../dataFlow/DataFlowInspectionBase.java | 22 +++++++++++-------- .../dataFlow/fixture/TernaryNullability.java | 4 ++++ 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java index a90c3f497478..76c564dfd593 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java @@ -275,8 +275,9 @@ public class DataFlowInspectionBase extends AbstractBaseJavaLocalInspectionTool reportAlwaysFailingCalls(reporter, visitor); - reportNullabilityProblems(reporter, visitor); - reportNullableReturns(visitor, reporter, scope); + List> problems = NullabilityProblemKind.postprocessNullabilityProblems(visitor.problems().toList()); + reportNullabilityProblems(reporter, problems, visitor.getConstantExpressions()); + reportNullableReturns(reporter, problems, visitor.getConstantExpressions(), scope); reportOptionalOfNullableImprovements(reporter, visitor.getOfNullableCalls()); @@ -460,9 +461,9 @@ public class DataFlowInspectionBase extends AbstractBaseJavaLocalInspectionTool return null; } - private void reportNullabilityProblems(ProblemReporter reporter, DataFlowInstructionVisitor visitor) { - Map expressions = visitor.getConstantExpressions(); - List> problems = NullabilityProblemKind.postprocessNullabilityProblems(visitor.problems().toList()); + private void reportNullabilityProblems(ProblemReporter reporter, + List> problems, + Map expressions) { for (NullabilityProblem problem : problems) { PsiExpression expression = problem.getDereferencedExpression(); NullabilityProblemKind.innerClassNPE.ifMyProblem(problem, newExpression -> { @@ -840,7 +841,10 @@ public class DataFlowInspectionBase extends AbstractBaseJavaLocalInspectionTool return null; } - private void reportNullableReturns(DataFlowInstructionVisitor visitor, ProblemReporter reporter, @NotNull PsiElement block) { + private void reportNullableReturns(ProblemReporter reporter, + List> problems, + Map expressions, + @NotNull PsiElement block) { final PsiMethod method = getScopeMethod(block); if (method == null) return; NullableNotNullManager manager = NullableNotNullManager.getInstance(method.getProject()); @@ -861,13 +865,13 @@ public class DataFlowInspectionBase extends AbstractBaseJavaLocalInspectionTool // no warnings for Void methods, where only null can be possibly returned if (returnType == null || returnType.equalsToText(CommonClassNames.JAVA_LANG_VOID)) return; - for (NullabilityProblem problem : visitor.problems().map(NullabilityProblemKind.nullableReturn::asMyProblem).nonNull()) { + for (NullabilityProblem problem : StreamEx.of(problems).map(NullabilityProblemKind.nullableReturn::asMyProblem).nonNull()) { final PsiExpression anchor = problem.getAnchor(); PsiExpression expr = problem.getDereferencedExpression(); if (nullability == Nullability.NOT_NULL) { String presentable = NullableStuffInspectionBase.getPresentableAnnoName(anno); - final String text = isNullLiteralExpression(expr) || visitor.getConstantExpressions().get(expr) == ConstantResult.NULL + final String text = isNullLiteralExpression(expr) || expressions.get(expr) == ConstantResult.NULL ? InspectionsBundle.message("dataflow.message.return.null.from.notnull", presentable) : InspectionsBundle.message("dataflow.message.return.nullable.from.notnull", presentable); reporter.registerProblem(expr, text); @@ -875,7 +879,7 @@ public class DataFlowInspectionBase extends AbstractBaseJavaLocalInspectionTool else if (AnnotationUtil.isAnnotatingApplicable(anchor)) { final String defaultNullable = manager.getDefaultNullable(); final String presentableNullable = StringUtil.getShortName(defaultNullable); - final String text = isNullLiteralExpression(expr) || visitor.getConstantExpressions().get(expr) == ConstantResult.NULL + final String text = isNullLiteralExpression(expr) || expressions.get(expr) == ConstantResult.NULL ? InspectionsBundle.message("dataflow.message.return.null.from.notnullable", presentableNullable) : InspectionsBundle.message("dataflow.message.return.nullable.from.notnullable", presentableNullable); final LocalQuickFix[] fixes = diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/TernaryNullability.java b/java/java-tests/testData/inspection/dataFlow/fixture/TernaryNullability.java index 03e43f812bdc..c9c23f3c3082 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/TernaryNullability.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/TernaryNullability.java @@ -17,4 +17,8 @@ final class MyClass { @NotNull String testReturn(boolean b) { return b ? "hello" : null; } + + @NotNull Object testReturn2(boolean b, @Nullable Object o1, @Nullable Object o2) { + return b ? o1 : o2; + } } \ No newline at end of file