Skip to content

Commit dac1622

Browse files
{@code} inline tag is not rendered correctly in Markdown hover
This PR fixes an issue where the {@code} inline tag is not rendered correctly in the Markdown hover. It also addresses incorrect handling of the {@literal} tag, which is included as part of the same issue. Fix: #3672
1 parent 1fce85d commit dac1622

2 files changed

Lines changed: 75 additions & 0 deletions

File tree

org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/javadoc/JavadocContentAccess2.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ private static void collectTagElements(String content, IJavaElement element, Tag
168168
if (e instanceof TagElement t) {
169169
if ("@link".equals(t.getTagName()) || "@linkplain".equals(t.getTagName())) {
170170
collectLinkedTag(element, t, buf);
171+
} else if ("@code".equals(t.getTagName()) || "@literal".equals(t.getTagName())) {
172+
collectCodeAndLiteralTag(element, t, buf);
171173
} else {
172174
collectTagElements(content, element, t, buf);
173175
}
@@ -195,6 +197,25 @@ private static void collectTagElements(String content, IJavaElement element, Tag
195197
}
196198
}
197199

200+
private static void collectCodeAndLiteralTag(IJavaElement element, TagElement t, StringBuilder buf) {
201+
if (t.fragments().size() > 0) {
202+
try {
203+
if (t.fragments().size() == 1) {
204+
String code = ((TextElement) t.fragments().get(0)).getText();
205+
if ("@code".equals(t.getTagName())) {
206+
buf.append("`" + code + "`");
207+
} else if ("@literal".equals(t.getTagName())) {
208+
// escape chars applied for <>*^&\`[]
209+
code = code.replaceAll("([<>*^&\\\\`\\[\\]])", "\\\\$1");
210+
buf.append(code);
211+
}
212+
}
213+
} catch (Exception e) {
214+
JavaManipulationPlugin.log(e);
215+
}
216+
}
217+
}
218+
198219
private static void collectLinkedTag(IJavaElement element, TagElement t, StringBuilder buf) {
199220
@SuppressWarnings("unchecked")
200221
List<IDocElement> children = t.fragments();

org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/HoverHandlerTest.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,4 +1050,58 @@ public class Meh {}
10501050
actual = ResourceUtils.dos2Unix(actual);
10511051
assertEquals(expectedJavadoc, actual, "Unexpected hover ");
10521052
}
1053+
1054+
@Test
1055+
public void testHoverMarkdownWithCodeTag_01() throws Exception {
1056+
String name = "java25";
1057+
importProjects("eclipse/" + name);
1058+
IProject project = getProject(name);
1059+
IJavaProject javaProject = JavaCore.create(project);
1060+
IPackageFragmentRoot packageFragmentRoot = javaProject.getPackageFragmentRoot(project.getFolder("src/main/java"));
1061+
IPackageFragment pack1 = packageFragmentRoot.createPackageFragment("test", false, null);
1062+
StringBuilder buf = new StringBuilder();
1063+
//@formatter:off
1064+
buf.append("package test;\n"
1065+
+ "/// {@code List<String>}\n"
1066+
+ "public class Markdown{}\n");
1067+
//@formatter:on
1068+
ICompilationUnit cu = pack1.createCompilationUnit("Test.java", buf.toString(), false, null);
1069+
Hover hover = getHover(cu, 2, 14);
1070+
assertNotNull(hover);
1071+
assertEquals(2, hover.getContents().getLeft().size());
1072+
StringBuilder expectedJavadoc = new StringBuilder();
1073+
//@formatter:off
1074+
expectedJavadoc.append("` List<String>` ");
1075+
//@formatter:on
1076+
String actual = hover.getContents().getLeft().get(1).getLeft();
1077+
actual = ResourceUtils.dos2Unix(actual);
1078+
assertEquals(expectedJavadoc.toString(), actual, "Unexpected hover ");
1079+
}
1080+
1081+
@Test
1082+
public void testHoverMarkdownWithCodeTag_02() throws Exception {
1083+
String name = "java25";
1084+
importProjects("eclipse/" + name);
1085+
IProject project = getProject(name);
1086+
IJavaProject javaProject = JavaCore.create(project);
1087+
IPackageFragmentRoot packageFragmentRoot = javaProject.getPackageFragmentRoot(project.getFolder("src/main/java"));
1088+
IPackageFragment pack1 = packageFragmentRoot.createPackageFragment("test", false, null);
1089+
StringBuilder buf = new StringBuilder();
1090+
//@formatter:off
1091+
buf.append("package test;\n"
1092+
+ "/// {@literal List<String> <>*^&`[]}\n"
1093+
+ "public class Markdown{}\n");
1094+
//@formatter:on
1095+
ICompilationUnit cu = pack1.createCompilationUnit("Test.java", buf.toString(), false, null);
1096+
Hover hover = getHover(cu, 2, 14);
1097+
assertNotNull(hover);
1098+
assertEquals(2, hover.getContents().getLeft().size());
1099+
StringBuilder expectedJavadoc = new StringBuilder();
1100+
//@formatter:off
1101+
expectedJavadoc.append(" List\\<String\\> \\<\\>\\*\\^\\&\\`\\[\\] ");
1102+
//@formatter:on
1103+
String actual = hover.getContents().getLeft().get(1).getLeft();
1104+
actual = ResourceUtils.dos2Unix(actual);
1105+
assertEquals(expectedJavadoc.toString(), actual, "Unexpected hover ");
1106+
}
10531107
}

0 commit comments

Comments
 (0)