diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java
index 5a6a3abc7033..6df3810d0843 100644
--- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java
+++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java
@@ -27,6 +27,7 @@ import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.IndexNotReadyException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.*;
+import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.problems.Problem;
import com.intellij.problems.WolfTheProblemSolver;
@@ -42,6 +43,7 @@ import com.intellij.util.concurrency.EdtExecutorService;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.JBIterable;
import com.intellij.util.containers.Stack;
+import com.intellij.xml.util.XmlStringUtil;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -486,14 +488,16 @@ public class GeneralHighlightingPass extends ProgressableTextEditorHighlightingP
range -> joiner.add(text.subSequence(range.getStartOffset(), range.getEndOffset()))
);
String description = joiner.toString();
+ String tooltip = XmlStringUtil.escapeString(StringUtil.shortenPathWithEllipsis(description, 1024)).replace("\n", "
");
TextAttributes attributes = todoItem.getPattern().getAttributes().getTextAttributes();
- addTodoItem(startOffset, endOffset, priorityRange, insideResult, outsideResult, attributes, description, textRange);
+ addTodoItem(startOffset, endOffset, priorityRange, insideResult, outsideResult, attributes, description, tooltip, textRange);
if (!additionalRanges.isEmpty()) {
TextAttributes attributesForAdditionalLines = attributes.clone();
attributesForAdditionalLines.setErrorStripeColor(null);
for (TextRange range: additionalRanges) {
- addTodoItem(startOffset, endOffset, priorityRange, insideResult, outsideResult, attributesForAdditionalLines, description, range);
+ addTodoItem(startOffset, endOffset, priorityRange, insideResult, outsideResult, attributesForAdditionalLines, description,
+ tooltip, range);
}
}
}
@@ -505,12 +509,13 @@ public class GeneralHighlightingPass extends ProgressableTextEditorHighlightingP
@NotNull Collection super HighlightInfo> insideResult,
@NotNull Collection super HighlightInfo> outsideResult,
@NotNull TextAttributes attributes,
- @NotNull String description, @NotNull TextRange range) {
+ @NotNull String description, @NotNull String tooltip, @NotNull TextRange range) {
if (range.getStartOffset() >= restrictEndOffset || range.getEndOffset() <= restrictStartOffset) return;
HighlightInfo info = HighlightInfo.newHighlightInfo(HighlightInfoType.TODO)
.range(range)
.textAttributes(attributes)
.description(description)
+ .escapedToolTip(tooltip)
.createUnconditionally();
Collection super HighlightInfo> result = priorityRange.containsRange(info.getStartOffset(), info.getEndOffset()) ? insideResult : outsideResult;
result.add(info);
diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java
index 646b565193ce..18887564a18d 100644
--- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java
+++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java
@@ -643,7 +643,7 @@ public class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzerEx implements Pers
final List foundInfoList = new SmartList<>();
processHighlightsNearOffset(document, myProject, minSeverity, offset, includeFixRange,
info -> {
- if (info.getSeverity() == HighlightInfoType.ELEMENT_UNDER_CARET_SEVERITY) {
+ if (info.getSeverity() == HighlightInfoType.ELEMENT_UNDER_CARET_SEVERITY || info.type == HighlightInfoType.TODO) {
return true;
}
if (!foundInfoList.isEmpty()) {
diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java
index ceca4c0c7529..57c1082afe99 100644
--- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java
+++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java
@@ -4,6 +4,7 @@ package com.intellij.openapi.editor.impl;
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzerSettings;
import com.intellij.codeInsight.daemon.impl.HighlightInfo;
+import com.intellij.codeInsight.daemon.impl.HighlightInfoType;
import com.intellij.codeInsight.hint.*;
import com.intellij.ide.IdeEventQueue;
import com.intellij.ide.ui.UISettings;
@@ -292,10 +293,13 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
final int startOffset = getOffset(fitLineToEditor(visualLine - myPreviewLines), true);
final int endOffset = getOffset(fitLineToEditor(visualLine + myPreviewLines), false);
markupModel.processRangeHighlightersOverlappingWith(startOffset, endOffset, highlighter -> {
- if (highlighter.getErrorStripeMarkColor() != null) {
- if (highlighter.getStartOffset() < endOffset && highlighter.getEndOffset() > startOffset) {
- highlighters.add(highlighter);
- }
+ Object tooltip = highlighter.getErrorStripeTooltip();
+ if (tooltip != null &&
+ !(tooltip instanceof HighlightInfo && ((HighlightInfo)tooltip).type == HighlightInfoType.TODO) &&
+ highlighter.getErrorStripeMarkColor() != null &&
+ highlighter.getStartOffset() < endOffset &&
+ highlighter.getEndOffset() > startOffset) {
+ highlighters.add(highlighter);
}
return true;
});