From ff0e6be0369f2778d33fd7aa4821548745172b80 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 20 Feb 2015 18:56:43 +0100 Subject: process @link and @linkplain tags in javadoc --- src/Java/JavaDocumentationBuilder.kt | 27 +++++++++++++++++++++++++-- test/data/format/javaLinkTag.html | 26 ++++++++++++++++++++++++++ test/data/format/javaLinkTag.java | 8 ++++++++ test/src/format/HtmlFormatTest.kt | 6 ++++++ test/src/model/JavaTest.kt | 2 +- 5 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 test/data/format/javaLinkTag.html create mode 100644 test/data/format/javaLinkTag.java diff --git a/src/Java/JavaDocumentationBuilder.kt b/src/Java/JavaDocumentationBuilder.kt index e1b91470..ddc526ac 100644 --- a/src/Java/JavaDocumentationBuilder.kt +++ b/src/Java/JavaDocumentationBuilder.kt @@ -4,6 +4,7 @@ import com.intellij.psi.* import com.intellij.psi.javadoc.PsiDocComment import com.intellij.psi.javadoc.PsiDocTag import com.intellij.psi.javadoc.PsiDocTagValue +import com.intellij.psi.javadoc.PsiInlineDocTag import org.jetbrains.dokka.DocumentationNode.Kind public class JavaDocumentationBuilder(private val options: DocumentationOptions, @@ -18,9 +19,15 @@ public class JavaDocumentationBuilder(private val options: DocumentationOptions, fun parseDocumentation(docComment: PsiDocComment?): Content { if (docComment == null) return Content.Empty val result = Content() + val para = ContentParagraph() + result.append(para) docComment.getDescriptionElements().dropWhile { it.getText().trim().isEmpty() }.forEach { - val text = if (result.isEmpty()) it.getText().trimLeading() else it.getText() - result.append(ContentText(text)) + if (it is PsiInlineDocTag) { + para.append(convertInlineDocTag(it)) + } else { + val text = if (para.isEmpty()) it.getText().trimLeading() else it.getText() + para.append(ContentText(text)) + } } docComment.getTags().forEach { tag -> val subjectName = tag.getSubjectName() @@ -34,6 +41,22 @@ public class JavaDocumentationBuilder(private val options: DocumentationOptions, return result } + private fun convertInlineDocTag(tag: PsiInlineDocTag) = when (tag.getName()) { + "link", "linkplain" -> resolveLink(tag.getValueElement()) ?: ContentText(tag.getText()) + else -> ContentText(tag.getText()) + } + + private fun resolveLink(valueElement: PsiDocTagValue?): ContentNode? { + val target = valueElement?.getReference()?.resolve() + if (target != null) { + val signature = getSignature(target) + if (signature != null) { + return ContentNodeLazyLink(valueElement!!.getText(), {() -> signatureToNode[signature]}) + } + } + return null + } + fun PsiDocTag.getSubjectName(): String? { if (getName() == "param" || getName() == "throws" || getName() == "exception") { return getValueElement()?.getText() diff --git a/test/data/format/javaLinkTag.html b/test/data/format/javaLinkTag.html new file mode 100644 index 00000000..65d33283 --- /dev/null +++ b/test/data/format/javaLinkTag.html @@ -0,0 +1,26 @@ + + +test / test.Foo + + +test / test / Foo
+
+

Foo

+open class Foo : Any
+

Call to do the job. +

+
+
+

Functions

+ + + + + + + +
+bar +public open fun bar(): Unit
+ + diff --git a/test/data/format/javaLinkTag.java b/test/data/format/javaLinkTag.java new file mode 100644 index 00000000..06452f16 --- /dev/null +++ b/test/data/format/javaLinkTag.java @@ -0,0 +1,8 @@ +package test; + +/** + * Call {@link #bar()} to do the job. + */ +class Foo { + public void bar() +} diff --git a/test/src/format/HtmlFormatTest.kt b/test/src/format/HtmlFormatTest.kt index f6e0a2f3..030b72f8 100644 --- a/test/src/format/HtmlFormatTest.kt +++ b/test/src/format/HtmlFormatTest.kt @@ -99,4 +99,10 @@ public class HtmlFormatTest { htmlService.appendNodes(tempLocation, output, model.members.single().members.single { it.name == "C"}.members.filter { it.name == "Bar"} ) } } + + Test fun javaLinkTag() { + verifyOutput("test/data/format/javaLinkTag.java", ".html") { model, output -> + htmlService.appendNodes(tempLocation, output, model.members.single().members) + } + } } diff --git a/test/src/model/JavaTest.kt b/test/src/model/JavaTest.kt index 1c2df0d6..f3c7c610 100644 --- a/test/src/model/JavaTest.kt +++ b/test/src/model/JavaTest.kt @@ -12,7 +12,7 @@ public class JavaTest { with(cls.members.single()) { assertEquals("fn", name) assertEquals(DocumentationNode.Kind.Function, kind) - assertEquals("Summary for Function", content.summary.toTestString()) + assertEquals("Summary for Function", content.summary.toTestString().trimTrailing()) assertEquals(3, content.sections.size()) with(content.sections[0]) { assertEquals("Parameters", tag) -- cgit