diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index ea7dcc2d3f56..0059ed71aa60 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -1407,7 +1407,7 @@ public final class HighlightUtil { } return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(message); } - final HighlightInfo.Builder info = checkTextBlockEscapes(expression, text, level, file, description); + final HighlightInfo.Builder info = checkTextBlockEscapes(expression, rawText, level, file, description); if (info != null) return info; } else if (type == JavaTokenType.STRING_LITERAL || type == JavaTokenType.TEXT_BLOCK_LITERAL) { @@ -1418,8 +1418,8 @@ public final class HighlightUtil { } } - if (!StringUtil.startsWithChar(text, '\"')) return null; - if (!StringUtil.endsWithChar(text, '\"') || text.length() == 1) { + if (!StringUtil.startsWithChar(text, '"')) return null; + if (!StringUtil.endsWithChar(text, '"') || text.length() == 1) { String message = JavaErrorBundle.message("illegal.line.end.in.string.literal"); if (description != null) { description.set(message); @@ -1439,7 +1439,7 @@ public final class HighlightUtil { .range(expression, calculateErrorRange(rawText, offsets[chars.length()])) .descriptionAndTooltip(message); } - final HighlightInfo.Builder info2 = checkTextBlockEscapes(expression, text, level, file, description); + final HighlightInfo.Builder info2 = checkTextBlockEscapes(expression, rawText, level, file, description); if (info2 != null) return info2; } else { @@ -1563,8 +1563,10 @@ public final class HighlightUtil { @NotNull LanguageLevel level, @Nullable PsiFile file, @Nullable Ref description) { - if (file == null || !containsUnescaped(text, "\\s")) return null; - HighlightInfo.Builder info = checkFeature(expression, HighlightingFeature.TEXT_BLOCK_ESCAPES, level, file); + if (file == null) return null; + TextRange errorRange = calculateUnescapedRange(text, "\\s", expression.getTextOffset()); + if (errorRange == null) return null; + HighlightInfo.Builder info = checkFeature(errorRange, HighlightingFeature.TEXT_BLOCK_ESCAPES, level, file); if (info == null) return null; if (description != null) { description.set(getUnsupportedFeatureMessage(HighlightingFeature.TEXT_BLOCK_ESCAPES, level, file)); @@ -1584,7 +1586,7 @@ public final class HighlightUtil { return new TextRange(start, end); } - private static boolean containsUnescaped(@NotNull String text, @NotNull String subText) { + private static TextRange calculateUnescapedRange(@NotNull String text, @NotNull String subText, int offset) { int start = 0; while ((start = StringUtil.indexOf(text, subText, start)) != -1) { int nSlashes = 0; @@ -1592,10 +1594,12 @@ public final class HighlightUtil { if (text.charAt(pos) != '\\') break; nSlashes++; } - if (nSlashes % 2 == 0) return true; + if (nSlashes % 2 == 0) { + return TextRange.from(offset + start, subText.length()); + } start += subText.length(); } - return false; + return null; } private static final Pattern FP_LITERAL_PARTS = @@ -2948,7 +2952,7 @@ public final class HighlightUtil { result.append(c); } else if (c != 'u') { - result.append('\'').append(c); + result.append('\\').append(c); escape = false; } else { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UnsupportedFeatures.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UnsupportedFeatures.java index 50928f744e64..f5c430507e01 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UnsupportedFeatures.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UnsupportedFeatures.java @@ -24,8 +24,8 @@ class UnsupportedFeatures { String raw = """hi there"""; - String spaceEscapeSeq = "\s"; - char c = '\s'; + String spaceEscapeSeq = "\s"; + char c = '\s'; String template = STR."Hello \{args[0]}"; }