diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/HtmlJavadocProvider.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/HtmlJavadocProvider.java
index 4adb55985..2b5761742 100644
--- a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/HtmlJavadocProvider.java
+++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/HtmlJavadocProvider.java
@@ -22,7 +22,8 @@ public class HtmlJavadocProvider implements IJavadocProvider {
public IJavadoc getJavadoc(IType type) {
try {
JavadocContents javadocContents = findHtml(type);
- return new HtmlJavadoc(javadocContents.getTypeDoc(type));
+ String html = javadocContents == null ? null : javadocContents.getTypeDoc(type);
+ return html == null ? null : new HtmlJavadoc(html);
} catch (Exception e) {
Log.log(e);
return null;
@@ -34,7 +35,8 @@ public class HtmlJavadocProvider implements IJavadocProvider {
try {
IType declaringType = field.getDeclaringType();
JavadocContents javadocContents = findHtml(declaringType);
- return new HtmlJavadoc(javadocContents.getFieldDoc(field));
+ String html = javadocContents == null ? null : javadocContents.getFieldDoc(field);
+ return html == null ? null : new HtmlJavadoc(html);
} catch (Exception e) {
Log.log(e);
return null;
@@ -46,7 +48,8 @@ public class HtmlJavadocProvider implements IJavadocProvider {
try {
IType declaringType = method.getDeclaringType();
JavadocContents javadocContents = findHtml(declaringType);
- return new HtmlJavadoc(javadocContents.getMethodDoc(method));
+ String html = javadocContents == null ? null : javadocContents.getMethodDoc(method);
+ return html == null ? null : new HtmlJavadoc(html);
} catch (Exception e) {
Log.log(e);
return null;
diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/internal/JavadocContents.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/internal/JavadocContents.java
index 8d9dcd589..80296589e 100644
--- a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/internal/JavadocContents.java
+++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/internal/JavadocContents.java
@@ -207,7 +207,7 @@ public class JavadocContents {
int javadocStart = indexOfEndLink + JavadocConstants.ANCHOR_SUFFIX_LENGTH;
int javadocEnd = indexOfNextElement == -1 ? indexOfBottom : Math.min(indexOfNextElement, indexOfBottom);
- range = sanitizeRange(new int[]{javadocStart, javadocEnd});
+ range = sanitizeRange(new int[]{javadocStart, javadocEnd}, "ul", "li");
} else {
// the anchor has no suffix
range = UNKNOWN_FORMAT;
@@ -240,7 +240,7 @@ public class JavadocContents {
// we take the end of class data
final int indexOfStartOfClassData = CharOperation.indexOf(JavadocConstants.START_OF_CLASS_DATA, this.content, false);
this.indexOfEndOfClassData = CharOperation.indexOf(JavadocConstants.END_OF_CLASS_DATA, this.content, false, lastIndex);
- int[] classDataRange = sanitizeRange(new int[] { indexOfStartOfClassData + JavadocConstants.START_OF_CLASS_DATA.length, indexOfEndOfClassData});
+ int[] classDataRange = sanitizeRange(new int[] { indexOfStartOfClassData + JavadocConstants.START_OF_CLASS_DATA.length, indexOfEndOfClassData}, "ul", "li", "div");
this.indexOfEndOfClassData = classDataRange[1];
// try to find the field detail end
@@ -257,14 +257,14 @@ public class JavadocContents {
this.indexOfAllMethodsBottom = this.indexOfEndOfClassData;
// Get rid of possible
- tag wrappers
- int[] fieldsRange = sanitizeRange(new int[] {indexOfFieldDetails + JavadocConstants.FIELD_DETAIL.length, indexOfFieldsBottom});
+ int[] fieldsRange = sanitizeRange(new int[] {indexOfFieldDetails + JavadocConstants.FIELD_DETAIL.length, indexOfFieldsBottom}, "ul", "li", "div");
indexOfFieldDetails = fieldsRange[0];
indexOfFieldsBottom = fieldsRange[1];
int[] methodsRange = sanitizeRange(new int[] {
indexOfAllMethodsTop + (indexOfAllMethodsTop == indexOfConstructorDetails
? JavadocConstants.CONSTRUCTOR_DETAIL.length : JavadocConstants.METHOD_DETAIL.length),
- indexOfAllMethodsBottom });
+ indexOfAllMethodsBottom }, "ul", "li", "div");
indexOfAllMethodsTop = methodsRange[0];
indexOfAllMethodsBottom = methodsRange[1];
@@ -565,12 +565,16 @@ public class JavadocContents {
}
if (afterHierarchy != indexOfNextSummary) {
start = afterHierarchy;
+
+ int indexOfClassDescriptionEnd = trimBadEnding("
\n
\n- \n", indexOfNextSummary);
+ indexOfClassDescriptionEnd = trimBadEnding("
\n
\n
\n", indexOfClassDescriptionEnd);
+ this.typeDocRange = new int[]{start, indexOfClassDescriptionEnd};
+ this.typeDocRange = sanitizeRange(typeDocRange, "ul", "li");
+ } else {
+ // No room left for class comment;
+ this.typeDocRange = null;
}
- int indexOfClassDescriptionEnd = trimBadEnding("\n
\n- \n", indexOfNextSummary);
- indexOfClassDescriptionEnd = trimBadEnding("
\n
\n
\n", indexOfClassDescriptionEnd);
- this.typeDocRange = new int[]{start, indexOfClassDescriptionEnd};
- this.typeDocRange = sanitizeRange(typeDocRange);
}
@@ -604,13 +608,16 @@ public class JavadocContents {
}
}
- private int[] sanitizeRange(int[] range) {
+ private int[] sanitizeRange(int[] range, CharSequence... removeWrapperTags) {
boolean changed = false;
do {
int[] newRange = trimRange(range);
- newRange = trimTag(newRange, "div");
- newRange = trimTag(newRange, "ul");
- newRange = trimTag(newRange, "li");
+ for (CharSequence tag : removeWrapperTags) {
+ newRange = trimTag(newRange, tag);
+ }
+// newRange = trimTag(newRange, "div");
+// newRange = trimTag(newRange, "ul");
+// newRange = trimTag(newRange, "li");
changed = !Arrays.equals(newRange, range);
range = newRange;
} while (changed);
diff --git a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java
index 9797787f4..0b755002b 100644
--- a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java
+++ b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java
@@ -389,8 +389,8 @@ public class JavaIndexTest {
IType type = project.findType("hello.Greeting");
assertNotNull(type);
- String expected = "Comment for Greeting class";
- assertEquals(expected, type.getJavaDoc().html().substring(0, expected.length()));
+ String expected = "Comment for Greeting class
";
+ assertEquals(expected, type.getJavaDoc().html());
IField field = type.getField("id");
assertNotNull(field);
@@ -420,7 +420,7 @@ public class JavaIndexTest {
IType type = project.findType("hello.Greeting$TestInnerClass");
assertNotNull(type);
- assertEquals("Comment for inner class", type.getJavaDoc().html());
+ assertEquals("Comment for inner class
", type.getJavaDoc().html());
IField field = type.getField("innerField");
assertNotNull(field);
@@ -450,7 +450,7 @@ public class JavaIndexTest {
IType type = project.findType("hello.Greeting$TestInnerClass$TestInnerClassLevel2");
assertNotNull(type);
- assertEquals("Comment for level 2 nested class", type.getJavaDoc().html());
+ assertEquals("Comment for level 2 nested class
", type.getJavaDoc().html());
IField field = type.getField("innerLevel2Field");
assertNotNull(field);
@@ -470,4 +470,69 @@ public class JavaIndexTest {
);
assertEquals(expected, method.getJavaDoc().html());
}
+
+ @Test
+ public void html_testNoJavadocClass() throws Exception {
+ MavenProjectClasspath.providerType = JavadocProviderTypes.HTML;
+ Path projectPath = projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file");
+ MavenCore.generateJavadocFolderForMavenProject(projectPath);
+ MavenJavaProject project = createMavenProject(projectPath);
+
+ IType type = project.findType("hello.GreetingController");
+ assertNotNull(type);
+ assertNull(type.getJavaDoc());
+ }
+
+ @Test
+ public void html_testEmptyJavadocClass() throws Exception {
+ MavenProjectClasspath.providerType = JavadocProviderTypes.HTML;
+ Path projectPath = projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file");
+ MavenCore.generateJavadocFolderForMavenProject(projectPath);
+ MavenJavaProject project = createMavenProject(projectPath);
+
+ IType type = project.findType("hello.Application");
+ assertNotNull(type);
+ assertNull(type.getJavaDoc());
+ }
+
+ @Test
+ public void html_testNoJavadocMethod() throws Exception {
+ MavenProjectClasspath.providerType = JavadocProviderTypes.HTML;
+ Path projectPath = projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file");
+ MavenCore.generateJavadocFolderForMavenProject(projectPath);
+ MavenJavaProject project = createMavenProject(projectPath);
+
+ IType type = project.findType("hello.Application");
+ assertNotNull(type);
+ IMethod method = type.getMethod("corsConfigurer", Stream.empty());
+ assertNotNull(method);
+ String expected = String.join("\n",
+ "corsConfigurer
",
+ "@Bean",
+ "public org.springframework.web.servlet.config.annotation.WebMvcConfigurer corsConfigurer()
"
+ );
+ assertEquals(expected, method.getJavaDoc().html());
+ }
+
+ @Test
+ public void html_testNoJavadocField() throws Exception {
+ MavenProjectClasspath.providerType = JavadocProviderTypes.HTML;
+ Path projectPath = projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file");
+ MavenCore.generateJavadocFolderForMavenProject(projectPath);
+ MavenJavaProject project = createMavenProject(projectPath);
+
+ IType type = project.findType("hello.GreetingController");
+ assertNotNull(type);
+ IField field = type.getField("template");
+ assertNotNull(field);
+ String expected = String.join("\n",
+ "template
",
+ "public static final String template
",
+ "",
+ "- See Also:
",
+ "- Constant Field Values
",
+ "
"
+ );
+ assertEquals(expected, field.getJavaDoc().html());
+ }
}
diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/main/java/hello/Application.java b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/main/java/hello/Application.java
index a70be84e4..a6ff0249b 100644
--- a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/main/java/hello/Application.java
+++ b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/main/java/hello/Application.java
@@ -8,6 +8,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@SpringBootApplication
+/**
+ */
public class Application {
public static void main(String[] args) {
diff --git a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/main/java/hello/GreetingController.java b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/main/java/hello/GreetingController.java
index 414eddb0c..196319f5c 100644
--- a/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/main/java/hello/GreetingController.java
+++ b/vscode-extensions/commons/commons-maven/src/test/resources/gs-rest-service-cors-boot-1.4.1-with-classpath-file/src/main/java/hello/GreetingController.java
@@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
public class GreetingController {
- private static final String template = "Hello, %s!";
+ public static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
@CrossOrigin(origins = "http://localhost:9000")