diff --git a/plugins/grazie/src/main/kotlin/com/intellij/grazie/rule/ParsedSentence.kt b/plugins/grazie/src/main/kotlin/com/intellij/grazie/rule/ParsedSentence.kt index 601e03efd252..9ede883125a9 100644 --- a/plugins/grazie/src/main/kotlin/com/intellij/grazie/rule/ParsedSentence.kt +++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/rule/ParsedSentence.kt @@ -34,7 +34,13 @@ class ParsedSentence private constructor( @JvmField val extractedText: TextContent, /** The dependency tree for the sentence */ - @JvmField val tree: Tree + @JvmField val tree: Tree, + + /** + * The range of the sentence in [extractedText] as reported by the sentence tokenizer, + * including leading or trailing space + */ + @JvmField val untrimmedRange: TextRange ) { fun textOffsetToFile(textOffset: Int): Int { @@ -110,7 +116,7 @@ class ParsedSentence private constructor( tree = tree.withStartOffset(start)!! val stubbed = trees[sentence.stubbedSwe()] if (stubbed != null) tree = tree.withStubbed(StubbedSentence(sentence.swe(), stubbed.withStartOffset(start)))!! - out.add(ParsedSentence(tree.startOffset(), tree.text(), content, tree)) + out.add(ParsedSentence(tree.startOffset(), tree.text(), content, tree, TextRange(sentence.start, sentence.end()))) } } } diff --git a/plugins/grazie/src/main/kotlin/com/intellij/grazie/text/TreeRuleChecker.java b/plugins/grazie/src/main/kotlin/com/intellij/grazie/text/TreeRuleChecker.java index a48f30860218..291d575ca5d4 100644 --- a/plugins/grazie/src/main/kotlin/com/intellij/grazie/text/TreeRuleChecker.java +++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/text/TreeRuleChecker.java @@ -410,17 +410,20 @@ public final class TreeRuleChecker { for (int i = 0; i < sentences.size(); i++) { ParsedSentence parsed = sentences.get(i); - String trimmed = parsed.text.trim(); - int trimmedStart = parsed.text.indexOf(trimmed); + TextRange untrimmedRange = parsed.untrimmedRange; + String untrimmedText = untrimmedRange.substring(content.toString()); + + String trimmed = untrimmedText.trim(); + int trimmedStart = untrimmedText.indexOf(trimmed); var suppressions = ContainerUtil.map2Set(suppressedRanges.getOrDefault(trimmed, Set.of()), r -> r.shiftRight(trimmedStart)); - DocumentSentence.Analyzed ds = new DocumentSentence(parsed.text, parsed.tree.treeSupport().getGrazieLanguage()) + DocumentSentence.Analyzed ds = new DocumentSentence(untrimmedText, parsed.tree.treeSupport().getGrazieLanguage()) .withIntro(i == 0 ? getIntro(content) : List.of()) - .withExclusions(SentenceTokenizer.rangeExclusions(content, TextRange.from(parsed.textStartOffset, parsed.text.length()))) + .withExclusions(SentenceTokenizer.rangeExclusions(content, untrimmedRange)) .withSuppressions(suppressions) .withTree(parsed.tree.withStartOffset(offset)) .withMetadata(matches.get(i).metadata); - doc.add(new SentenceWithContent(ds, content, offset, offset + parsed.textStartOffset)); + doc.add(new SentenceWithContent(ds, content, offset, offset + untrimmedRange.getStartOffset())); } offset += content.length(); }