diff options
-rw-r--r-- | src/Java/JavaDocumentationBuilder.kt | 53 | ||||
-rw-r--r-- | src/main.kt | 2 | ||||
-rw-r--r-- | test/data/format/javaSupertype.html | 13 | ||||
-rw-r--r-- | test/data/format/javaSupertype.java | 9 | ||||
-rw-r--r-- | test/src/TestAPI.kt | 2 | ||||
-rw-r--r-- | test/src/format/HtmlFormatTest.kt | 6 |
6 files changed, 63 insertions, 22 deletions
diff --git a/src/Java/JavaDocumentationBuilder.kt b/src/Java/JavaDocumentationBuilder.kt index 5b4a6bfa..a1724bb9 100644 --- a/src/Java/JavaDocumentationBuilder.kt +++ b/src/Java/JavaDocumentationBuilder.kt @@ -1,29 +1,15 @@ package org.jetbrains.dokka -import com.intellij.psi.PsiJavaFile -import com.intellij.psi.PsiClass -import org.jetbrains.dokka.DocumentationNode.Kind -import com.intellij.psi.PsiMethod +import com.intellij.psi.* import com.intellij.psi.javadoc.PsiDocComment -import com.intellij.psi.PsiType -import com.intellij.psi.PsiParameter -import com.intellij.psi.PsiNamedElement -import com.intellij.psi.PsiDocCommentOwner -import com.intellij.psi.PsiClassType -import com.intellij.psi.PsiPrimitiveType -import com.intellij.psi.PsiModifierListOwner -import com.intellij.psi.PsiModifier -import com.intellij.psi.PsiArrayType -import com.intellij.psi.PsiTypeParameter import com.intellij.psi.javadoc.PsiDocTag import com.intellij.psi.javadoc.PsiDocTagValue -import com.intellij.psi.PsiEllipsisType -import com.intellij.psi.PsiField -import com.intellij.psi.PsiAnnotation -import com.intellij.psi.PsiLiteralExpression -import com.intellij.psi.PsiEnumConstant +import org.jetbrains.dokka.DocumentationNode.Kind + +public class JavaDocumentationBuilder(private val options: DocumentationOptions, + private val pendingReferences: MutableList<PendingDocumentationReference>) { + private val signatureToNode = hashMapOf<String, DocumentationNode>() -public class JavaDocumentationBuilder(private val options: DocumentationOptions) { fun appendFile(file: PsiJavaFile, module: DocumentationModule) { val packageNode = module.findOrCreatePackageNode(file.getPackageName()) packageNode.appendChildren(file.getClasses()) { build() } @@ -55,6 +41,29 @@ public class JavaDocumentationBuilder(private val options: DocumentationOptions) return null } + fun register(element: PsiElement, node: DocumentationNode) { + signatureToNode[getSignature(element)] = node + } + + fun link(node: DocumentationNode, element: PsiElement?) { + val qualifiedName = getSignature(element) + if (qualifiedName != null) { + pendingReferences.add(PendingDocumentationReference( + {() -> node}, + {() -> signatureToNode[qualifiedName]}, + DocumentationReference.Kind.Link)) + } + } + + private fun getSignature(element: PsiElement?) = when(element) { + is PsiClass -> element.getQualifiedName() + is PsiField -> element.getContainingClass().getQualifiedName() + "#" + element.getName() + is PsiMethod -> + element.getContainingClass().getQualifiedName() + "#" + element.getName() + "(" + + element.getParameterList().getParameters().map { it.getType().getCanonicalText() }.join(",") + ")" + else -> null + } + fun DocumentationNode(element: PsiNamedElement, kind: Kind, name: String = element.getName() ?: "<anonymous>"): DocumentationNode { @@ -112,6 +121,7 @@ public class JavaDocumentationBuilder(private val options: DocumentationOptions) node.appendMembers(getMethods()) { build() } node.appendMembers(getFields()) { build() } node.appendMembers(getInnerClasses()) { build() } + register(this, node) return node } @@ -131,6 +141,7 @@ public class JavaDocumentationBuilder(private val options: DocumentationOptions) node.appendTextNode("var", Kind.Modifier) } node.appendType(getType()) + register(this, node) return node } @@ -149,6 +160,7 @@ public class JavaDocumentationBuilder(private val options: DocumentationOptions) } node.appendDetails(getParameterList().getParameters()) { build() } node.appendDetails(getTypeParameters()) { build() } + register(this, node) return node } @@ -201,6 +213,7 @@ public class JavaDocumentationBuilder(private val options: DocumentationOptions) val node = DocumentationNode(name, Content.Empty, kind) if (this is PsiClassType) { node.appendDetails(getParameters()) { build(Kind.Type) } + link(node, resolve()) } if (this is PsiArrayType && this !is PsiEllipsisType) { node.append(getComponentType().build(Kind.Type), DocumentationReference.Kind.Detail) diff --git a/src/main.kt b/src/main.kt index 535eee5c..a48b4af6 100644 --- a/src/main.kt +++ b/src/main.kt @@ -215,7 +215,7 @@ fun buildDocumentationModule(environment: AnalysisEnvironment, } val javaFiles = environment.getJavaSourceFiles().filter(filesToDocumentFilter) - val javaDocumentationBuilder = JavaDocumentationBuilder(options) + val javaDocumentationBuilder = JavaDocumentationBuilder(options, pendingReferences) javaFiles.map { javaDocumentationBuilder.appendFile(it, documentationModule) } pendingReferences.forEach { it.resolve() } diff --git a/test/data/format/javaSupertype.html b/test/data/format/javaSupertype.html new file mode 100644 index 00000000..bf56936c --- /dev/null +++ b/test/data/format/javaSupertype.html @@ -0,0 +1,13 @@ +<HTML> +<HEAD> +<title>test / test.C.Bar</title> +</HEAD> +<BODY> +<a href="test/index">test</a> / <a href="test/test/index">test</a> / <a href="test/test/-c/index">C</a> / <a href="test/test/-c/-bar">Bar</a><br/> +<br/> +<h1>Bar</h1> +<code><span class="keyword">public</span> <span class="keyword">open</span> <span class="keyword">class </span><span class="identifier">Bar</span><span class="symbol"> : </span><a href="test/test/-c/-foo"><span class="identifier">Foo</span></a></code><br/> +<br/> +<br/> +</BODY> +</HTML> diff --git a/test/data/format/javaSupertype.java b/test/data/format/javaSupertype.java new file mode 100644 index 00000000..96caeb1d --- /dev/null +++ b/test/data/format/javaSupertype.java @@ -0,0 +1,9 @@ +package test; + +class C { + public static class Foo { + } + + public static class Bar extends Foo { + } +} diff --git a/test/src/TestAPI.kt b/test/src/TestAPI.kt index 33688053..7c6a2e73 100644 --- a/test/src/TestAPI.kt +++ b/test/src/TestAPI.kt @@ -48,7 +48,7 @@ public fun verifyOutput(path: String, outputExtension: String, outputGenerator: verifyModel(path) { val output = StringBuilder() outputGenerator(it, output) - val expectedOutput = File(path.replace(".kt", outputExtension)).readText() + val expectedOutput = File(path.replace(".kt", outputExtension).replace(".java", outputExtension)).readText() assertEqualsIgnoringSeparators(expectedOutput, output.toString()) } } diff --git a/test/src/format/HtmlFormatTest.kt b/test/src/format/HtmlFormatTest.kt index 9d4d30da..f6e0a2f3 100644 --- a/test/src/format/HtmlFormatTest.kt +++ b/test/src/format/HtmlFormatTest.kt @@ -93,4 +93,10 @@ public class HtmlFormatTest { htmlService.appendNodes(tempLocation, output, model.members.single().members) } } + + Test fun javaSupertypeLink() { + verifyOutput("test/data/format/javaSupertype.java", ".html") { model, output -> + htmlService.appendNodes(tempLocation, output, model.members.single().members.single { it.name == "C"}.members.filter { it.name == "Bar"} ) + } + } } |