diff --git a/core/src/main/java/com/google/errorprone/bugpatterns/javadoc/UnescapedEntity.java b/core/src/main/java/com/google/errorprone/bugpatterns/javadoc/UnescapedEntity.java index b5e11fc0f0a..cdf9d113121 100644 --- a/core/src/main/java/com/google/errorprone/bugpatterns/javadoc/UnescapedEntity.java +++ b/core/src/main/java/com/google/errorprone/bugpatterns/javadoc/UnescapedEntity.java @@ -36,6 +36,7 @@ import com.google.errorprone.bugpatterns.BugChecker.VariableTreeMatcher; import com.google.errorprone.fixes.SuggestedFix; import com.google.errorprone.matchers.Description; +import com.google.errorprone.util.ErrorProneComment.ErrorProneCommentStyle; import com.sun.source.doctree.DocTree; import com.sun.source.doctree.EndElementTree; import com.sun.source.doctree.ErroneousTree; @@ -109,9 +110,13 @@ private Description handle(@Nullable DocTreePath path, VisitorState state) { if (path == null) { return NO_MATCH; } + Comment comment = ((DCDocComment) path.getDocComment()).comment; + // javac's markdown javadoc parser doesn't produce ErroneousTree for <, >, or &. + if (ErrorProneCommentStyle.from(comment.getStyle()) == ErrorProneCommentStyle.JAVADOC_LINE) { + return NO_MATCH; + } RangesFinder rangesFinder = new RangesFinder(state); rangesFinder.scan(path, null); - Comment comment = ((DCDocComment) path.getDocComment()).comment; Matcher matcher = GENERIC_PATTERN.matcher(comment.getText()); RangeSet generics = TreeRangeSet.create(); while (matcher.find()) { diff --git a/core/src/test/java/com/google/errorprone/bugpatterns/javadoc/UnescapedEntityTest.java b/core/src/test/java/com/google/errorprone/bugpatterns/javadoc/UnescapedEntityTest.java index 33de98e83d3..a338c52f241 100644 --- a/core/src/test/java/com/google/errorprone/bugpatterns/javadoc/UnescapedEntityTest.java +++ b/core/src/test/java/com/google/errorprone/bugpatterns/javadoc/UnescapedEntityTest.java @@ -332,6 +332,48 @@ interface Test {} .doTest(); } + @Test + public void markdownJavadoc_ampersand() { + assume().that(Runtime.version().feature()).isAtLeast(23); + helper + .addSourceLines( + "Test.java", + """ + /// Foo & bar + interface Test {} + """) + .doTest(); + } + + @Test + public void markdownJavadoc_htmlTags() { + assume().that(Runtime.version().feature()).isAtLeast(23); + helper + .addSourceLines( + "Test.java", + """ + /// important stuff + interface Test {} + """) + .doTest(); + } + + @Test + public void markdownJavadoc_codeBlock() { + assume().that(Runtime.version().feature()).isAtLeast(23); + helper + .addSourceLines( + "Test.java", + """ + /// Example: + /// ``` + /// List list = new ArrayList<>(); + /// ``` + interface Test {} + """) + .doTest(); + } + @Test public void nestedGenericType_properlyEscaped() { refactoring