diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/TrackingRunner.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/TrackingRunner.java index 136e4defdf3b..a5eaa45e7a91 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/TrackingRunner.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/TrackingRunner.java @@ -12,6 +12,7 @@ import com.intellij.codeInspection.dataFlow.value.DfaRelationValue.RelationType; import com.intellij.codeInspection.dataFlow.value.DfaValue; import com.intellij.codeInspection.dataFlow.value.DfaVariableValue; import com.intellij.codeInspection.dataFlow.value.VariableDescriptor; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; @@ -129,13 +130,13 @@ public class TrackingRunner extends StandardDataFlowRunner { return Objects.hash(myChildren, myProblem, myTarget); } - public String dump() { - return dump(0); + public String dump(Document doc) { + return dump(doc, 0); } - private String dump(int indent) { - return StringUtil.repeat(" ", indent) + toString() + (myTarget == null ? "" : " (" + myTarget.getText() + ")") + "\n" + - StreamEx.of(myChildren).map(child -> child.dump(indent + 1)).joining(); + private String dump(Document doc, int indent) { + return StringUtil.repeat(" ", indent) + render(doc) + (myTarget == null ? "" : " (" + myTarget.getText() + ")") + "\n" + + StreamEx.of(myChildren).map(child -> child.dump(doc, indent + 1)).joining(); } public Stream children() { @@ -147,9 +148,21 @@ public class TrackingRunner extends StandardDataFlowRunner { return myTarget; } + public String render(Document doc) { + if (myTarget != null) { + String cause = myProblem.toString(); + if (cause.endsWith("#ref")) { + int offset = myTarget.getTextRange().getStartOffset(); + int number = doc.getLineNumber(offset); + return cause.replaceFirst("#ref$", "line #" + (number + 1)); + } + } + return toString(); + } + @Override public String toString() { - return myProblem.toString(); + return myProblem.toString().replaceFirst("#ref$", "here"); } } @@ -395,7 +408,7 @@ public class TrackingRunner extends StandardDataFlowRunner { } } } - return new CauseItem(new CustomDfaProblemType(condition + " is known from here"), expression); + return new CauseItem(new CustomDfaProblemType(condition + " is known from #ref"), expression); } return null; } @@ -406,7 +419,7 @@ public class TrackingRunner extends StandardDataFlowRunner { PsiExpression defExpression = factDef.getExpression(); if (defExpression != null) { return new CauseItem( - new CustomDfaProblemType(expression.getText() + " is known to be '"+nullability.getPresentationName()+"' from here"), + new CustomDfaProblemType(expression.getText() + " is known to be '" + nullability.getPresentationName() + "' from #ref"), defExpression); } } @@ -534,7 +547,7 @@ public class TrackingRunner extends StandardDataFlowRunner { if (factDef != null) { PsiExpression defExpression = factDef.getExpression(); if (defExpression != null) { - item.addChildren(new CauseItem("Range is known from here", defExpression)); + item.addChildren(new CauseItem("Range is known from #ref", defExpression)); } } return item; diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/fix/FindDfaProblemCauseFix.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/fix/FindDfaProblemCauseFix.java index 82d121928923..755ecc40a896 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/fix/FindDfaProblemCauseFix.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/fix/FindDfaProblemCauseFix.java @@ -89,7 +89,7 @@ public class FindDfaProblemCauseFix implements LocalQuickFix, LowPriorityAction @Override public String toString() { - return StringUtil.repeat(" ", myDepth - 1) + myCauseItem; + return StringUtil.repeat(" ", myDepth - 1) + myCauseItem.render(document); } } List causes = diff --git a/java/java-tests/testData/inspection/dataFlow/tracker/ArrayLength.java b/java/java-tests/testData/inspection/dataFlow/tracker/ArrayLength.java index 8cad5d63fc48..89975c90b77c 100644 --- a/java/java-tests/testData/inspection/dataFlow/tracker/ArrayLength.java +++ b/java/java-tests/testData/inspection/dataFlow/tracker/ArrayLength.java @@ -1,7 +1,7 @@ /* Value is always true (s.length > 0) Left operand range is {1..Integer.MAX_VALUE} (s.length) - Range is known from here (s[0]) + Range is known from line #8 (s[0]) */ class Test { void test(String[] s) { diff --git a/java/java-tests/testData/inspection/dataFlow/tracker/ArrayLengthCollectionSize.java b/java/java-tests/testData/inspection/dataFlow/tracker/ArrayLengthCollectionSize.java index bf4834e36c38..b900d2eca2d8 100644 --- a/java/java-tests/testData/inspection/dataFlow/tracker/ArrayLengthCollectionSize.java +++ b/java/java-tests/testData/inspection/dataFlow/tracker/ArrayLengthCollectionSize.java @@ -1,9 +1,9 @@ /* Value is always false (s.length == list.size()) Left operand range is {1..Integer.MAX_VALUE} (s.length) - Range is known from here (s[0]) + Range is known from line #12 (s[0]) Right operand range is {0} (list.size()) - Range is known from here (list.isEmpty()) + Range is known from line #13 (list.isEmpty()) */ import java.util.List; diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTrackerTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTrackerTest.java index 18f446228d8b..fe254cbd1720 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTrackerTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTrackerTest.java @@ -61,7 +61,7 @@ public class DataFlowInspectionTrackerTest extends LightCodeInsightFixtureTestCa Object singleValue = values.iterator().next(); List items = TrackingRunner.findProblemCause( true, false, expression, new TrackingRunner.ValueDfaProblemType(singleValue)); - String dump = StreamEx.of(items).map(TrackingRunner.CauseItem::dump).joining("\n----\n"); + String dump = StreamEx.of(items).map(item -> item.dump(getEditor().getDocument())).joining("\n----\n"); PsiComment firstComment = PsiTreeUtil.findChildOfType(file, PsiComment.class); if (firstComment == null) { fail("Comment not found");