package com.haskforce.highlighting.annotation; import com.intellij.codeInsight.daemon.impl.AnnotationHolderImpl; import com.intellij.lang.annotation.Annotation; import com.intellij.lang.annotation.AnnotationHolder; import com.intellij.lang.annotation.HighlightSeverity; import com.intellij.openapi.util.TextRange; import com.intellij.xml.util.XmlStringUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.HashSet; import java.util.regex.Pattern; public class HaskellAnnotationHolder { public final AnnotationHolder holder; public HaskellAnnotationHolder(@NotNull AnnotationHolder holder) { this.holder = holder; } @Nullable public Annotation createInfoAnnotation(@NotNull TextRange range, @Nullable String message) { return createAnnotation(HighlightSeverity.INFORMATION, range, message); } @Nullable public Annotation createWeakWarningAnnotation(@NotNull TextRange range, @Nullable String message) { return createAnnotation(HighlightSeverity.WEAK_WARNING, range, message); } @Nullable public Annotation createWarningAnnotation(@NotNull TextRange range, @Nullable String message) { return createAnnotation(HighlightSeverity.WARNING, range, message); } @Nullable public Annotation createErrorAnnotation(@NotNull TextRange range, @Nullable String message) { return createAnnotation(HighlightSeverity.ERROR, range, message); } @Nullable private Annotation createAnnotation(@NotNull HighlightSeverity severity, @NotNull TextRange range, @Nullable String message) { // Skip duplicate messages. if (!messages.add(message)) return null; String tooltip = message == null ? null : XmlStringUtil.wrapInHtml(escapeSpacesForHtml(XmlStringUtil.escapeString(message))); return holder.createAnnotation(severity, range, message, tooltip); } private static final Pattern NEWLINE_REGEX = Pattern.compile("\n"); private static final Pattern SPACE_REGEX = Pattern.compile(" "); public static String escapeSpacesForHtml(String string) { return string == null ? null : SPACE_REGEX.matcher(NEWLINE_REGEX.matcher(string).replaceAll("<br/>")).replaceAll(" "); } /** * Keep track of what messages we are displaying so we won't have duplicates. */ private HashSet<String> messages = new HashSet<String>(); }