From 51407fc59fd8f85423780473843fff273bb1a643 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 20 Mar 2025 16:52:13 +0100 Subject: [PATCH] Java: render tags inside javadoc blockquote+pre correctly (IDEA-353552) GitOrigin-RevId: 75dfee7012de46aff860b16acdc98588e5e6eaea --- .../javadoc/JavaDocInfoGenerator.java | 22 ++++++++++++------- ...JdkClassWhenExternalDocIsNotAvailable.html | 6 ++--- .../java/codeInsight/JavaDocumentationTest.kt | 10 +++++---- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java index 74e030df5c92..3bf8d5cc26a1 100644 --- a/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java +++ b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java @@ -1904,14 +1904,20 @@ public class JavaDocInfoGenerator { int suffixIndex = text.indexOf(suffix); if (suffixIndex >= 0) { htmlCodeBlockContents.append(text, 0, suffixIndex); - buffer.append(CODE_BLOCK_PREFIX); - appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet( - doHighlightCodeBlocks(), buffer, myProject, JavaLanguage.INSTANCE, - StringUtil.unescapeXmlEntities(StringUtil.replaceUnicodeEscapeSequences(htmlCodeBlockContents.toString())) - .replace(" ", " ") - .replace("@", "@") - ); - buffer.append(CODE_BLOCK_SUFFIX); + buffer.append(prefix); + String contentString = htmlCodeBlockContents.toString(); + if (contentString.indexOf('<') >= 0 && BLOCKQUOTE_PRE_PREFIX.equals(prefix)) { + appendPlainText(buffer, contentString); + } + else { + appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet( + doHighlightCodeBlocks(), buffer, myProject, JavaLanguage.INSTANCE, + StringUtil.unescapeXmlEntities(StringUtil.replaceUnicodeEscapeSequences(contentString)) + .replace(" ", " ") + .replace("@", "@") + ); + } + buffer.append(suffix); appendPlainText(buffer, text.substring(suffixIndex + suffix.length())); return null; } diff --git a/java/java-tests/testData/codeInsight/javadocIG/documentationForJdkClassWhenExternalDocIsNotAvailable.html b/java/java-tests/testData/codeInsight/javadocIG/documentationForJdkClassWhenExternalDocIsNotAvailable.html index 845f7f515daf..11e9958c34e5 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/documentationForJdkClassWhenExternalDocIsNotAvailable.html +++ b/java/java-tests/testData/codeInsight/javadocIG/documentationForJdkClassWhenExternalDocIsNotAvailable.html @@ -7,11 +7,11 @@ Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings. Because String objects are immutable they can be shared. For example: -

String str = "abc";

+

String str = "abc";

is equivalent to: -

char data[] = {'a', 'b', 'c'};
String str = new String(data);

+

char data[] = {'a', 'b', 'c'};
String str = new String(data);

Here are some more examples of how strings can be used: -

System.out.println("abc");
String cde = "cde";
System.out.println("abc" + cde);
String c = "abc".substring(2,3);
String d = cde.substring(1, 2);
+

System.out.println("abc");
String cde = "cde";
System.out.println("abc" + cde);
String c = "abc".substring(2,3);
String d = cde.substring(1, 2);

The class String includes methods for examining individual characters of the sequence, for comparing strings, for diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/JavaDocumentationTest.kt b/java/java-tests/testSrc/com/intellij/java/codeInsight/JavaDocumentationTest.kt index a03585edad49..cbd179c32b9b 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/JavaDocumentationTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/JavaDocumentationTest.kt @@ -1,4 +1,4 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.java.codeInsight import com.intellij.codeInsight.documentation.DocumentationManager @@ -363,12 +363,14 @@ class JavaDocumentationTest : LightJavaCodeInsightFixtureTestCase() { val expected = """

 C
public void m()

Examples of expected usage: -

StringBuilder sb = new StringBuilder();
+
StringBuilder sb = new StringBuilder();
StringBuilder sb = new StringBuilder();

Continuing... -

quote nr 2;
+
quote nr 2;

Continuing... -

(this.charAt(<i>k</i>) == ch) && (<i>k</i> <= fromIndex)
+
+          (this.charAt(k) == ch) && (k <= fromIndex)
+        
           Unfinished blockquote