aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Java/JavaDocumentationBuilder.kt53
-rw-r--r--src/main.kt2
-rw-r--r--test/data/format/javaSupertype.html13
-rw-r--r--test/data/format/javaSupertype.java9
-rw-r--r--test/src/TestAPI.kt2
-rw-r--r--test/src/format/HtmlFormatTest.kt6
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>&nbsp;/&nbsp;<a href="test/test/index">test</a>&nbsp;/&nbsp;<a href="test/test/-c/index">C</a>&nbsp;/&nbsp;<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"} )
+ }
+ }
}