aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Generation/ConsoleGenerator.kt6
-rw-r--r--src/Model/DocumentationBuildingVisitor.kt26
-rw-r--r--src/Model/DocumentationModel.kt26
-rw-r--r--src/Model/DocumentationNodeBuilder.kt (renamed from src/Model/DocumentationBuilder.kt)70
-rw-r--r--src/Model/DocumentationResolver.kt16
-rw-r--r--test/playground.kt17
6 files changed, 89 insertions, 72 deletions
diff --git a/src/Generation/ConsoleGenerator.kt b/src/Generation/ConsoleGenerator.kt
index e46cac31..36db88cf 100644
--- a/src/Generation/ConsoleGenerator.kt
+++ b/src/Generation/ConsoleGenerator.kt
@@ -7,6 +7,7 @@ public class ConsoleGenerator() {
generateHeader(node, indent)
generateDetails(node, indent)
generateMembers(node, indent)
+ generateLinks(node, indent)
}
public fun generateHeader(node: DocumentationNode, indent: String = "") {
@@ -24,4 +25,9 @@ public class ConsoleGenerator() {
for (child in node.members)
generate(child, indent + IndentStep)
}
+
+ public fun generateLinks(node: DocumentationNode, indent: String = "") {
+ for (child in node.links)
+ generate(child, indent + IndentStep)
+ }
} \ No newline at end of file
diff --git a/src/Model/DocumentationBuildingVisitor.kt b/src/Model/DocumentationBuildingVisitor.kt
index 81a6474c..b078f753 100644
--- a/src/Model/DocumentationBuildingVisitor.kt
+++ b/src/Model/DocumentationBuildingVisitor.kt
@@ -28,19 +28,19 @@ class DocumentationBuildingVisitor(val context: BindingContext, private val work
visitChildren(descriptor.getTypeParameters(), node)
visitChild(descriptor.getReceiverParameter(), node)
visitChildren(descriptor.getValueParameters(), node)
- return node.resolve(context.getResolutionScope(descriptor))
+ return node.resolve()
}
public override fun visitPackageFragmentDescriptor(descriptor: PackageFragmentDescriptor?, data: DocumentationNode?): DocumentationNode? {
val node = createDocumentation(descriptor!!, data!!)
visitChildren(descriptor.getMemberScope().getAllDescriptors(), node)
- return node.resolve(context.getResolutionScope(descriptor))
+ return node.resolve()
}
public override fun visitPackageViewDescriptor(descriptor: PackageViewDescriptor?, data: DocumentationNode?): DocumentationNode? {
val node = createDocumentation(descriptor!!, data!!)
visitChildren(descriptor.getMemberScope().getAllDescriptors(), node)
- return node.resolve(context.getResolutionScope(descriptor))
+ return node.resolve()
}
public override fun visitVariableDescriptor(descriptor: VariableDescriptor?, data: DocumentationNode?): DocumentationNode? {
@@ -57,12 +57,12 @@ class DocumentationBuildingVisitor(val context: BindingContext, private val work
public override fun visitFunctionDescriptor(descriptor: FunctionDescriptor?, data: DocumentationNode?): DocumentationNode? {
val node = processCallable(descriptor!!, data!!)
- return node.resolve(context.getResolutionScope(descriptor))
+ return node.resolve()
}
public override fun visitTypeParameterDescriptor(descriptor: TypeParameterDescriptor?, data: DocumentationNode?): DocumentationNode? {
val node = createDocumentation(descriptor!!, data!!)
- return node.resolve(context.getResolutionScope(descriptor))
+ return node.resolve()
}
public override fun visitClassDescriptor(descriptor: ClassDescriptor?, data: DocumentationNode?): DocumentationNode? {
@@ -77,43 +77,43 @@ class DocumentationBuildingVisitor(val context: BindingContext, private val work
it !is CallableMemberDescriptor || it.isUserCode()
}
visitChildren(members, node)
- return node.resolve(context.getResolutionScope(descriptor))
+ return node.resolve()
}
public override fun visitModuleDeclaration(descriptor: ModuleDescriptor?, data: DocumentationNode?): DocumentationNode? {
val node = createDocumentation(descriptor!!, data!!)
visitChild(descriptor.getPackage(FqName.ROOT), node)
- return node.resolve(context.getResolutionScope(descriptor))
+ return node.resolve()
}
public override fun visitConstructorDescriptor(descriptor: ConstructorDescriptor?, data: DocumentationNode?): DocumentationNode? {
val node = visitFunctionDescriptor(descriptor!!, data)
- return node?.resolve(context.getResolutionScope(descriptor))
+ return node?.resolve()
}
public override fun visitScriptDescriptor(scriptDescriptor: ScriptDescriptor?, data: DocumentationNode?): DocumentationNode? {
val classDescriptor = scriptDescriptor!!.getClassDescriptor()
val node = visitClassDescriptor(classDescriptor, data)
- return node?.resolve(context.getResolutionScope(classDescriptor))
+ return node?.resolve()
}
public override fun visitValueParameterDescriptor(descriptor: ValueParameterDescriptor?, data: DocumentationNode?): DocumentationNode? {
val node = visitVariableDescriptor(descriptor!!, data)
- return node?.resolve(context.getResolutionScope(descriptor))
+ return node?.resolve()
}
public override fun visitPropertyGetterDescriptor(descriptor: PropertyGetterDescriptor?, data: DocumentationNode?): DocumentationNode? {
val node = visitFunctionDescriptor(descriptor!!, data)
- return node?.resolve(context.getResolutionScope(descriptor))
+ return node?.resolve()
}
public override fun visitPropertySetterDescriptor(descriptor: PropertySetterDescriptor?, data: DocumentationNode?): DocumentationNode? {
val node = visitFunctionDescriptor(descriptor!!, data)
- return node?.resolve(context.getResolutionScope(descriptor))
+ return node?.resolve()
}
public override fun visitReceiverParameterDescriptor(descriptor: ReceiverParameterDescriptor?, data: DocumentationNode?): DocumentationNode? {
val node = createDocumentation(descriptor!!, data!!)
- return node.resolve(context.getResolutionScope(descriptor))
+ return node.resolve()
}
}
diff --git a/src/Model/DocumentationModel.kt b/src/Model/DocumentationModel.kt
index 77bd8373..06bc3775 100644
--- a/src/Model/DocumentationModel.kt
+++ b/src/Model/DocumentationModel.kt
@@ -1,5 +1,6 @@
package org.jetbrains.dokka
+import org.jetbrains.jet.lang.resolve.scopes.JetScope
import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.lang.psi.JetFile
@@ -9,9 +10,11 @@ public enum class DocumentationNodeKind {
Package
Class
Object
+
Constructor
Function
Property
+
Parameter
Receiver
TypeParameter
@@ -19,19 +22,21 @@ public enum class DocumentationNodeKind {
LowerBound
Exception
- Page
Model
}
public enum class DocumentationReferenceKind {
+ Owner
Member
Detail
- Owner
Link
Override
}
-public open class DocumentationNode(val name: String, val doc: String, val kind: DocumentationNodeKind) {
+public open class DocumentationNode(val name: String,
+ val doc: String,
+ val kind: DocumentationNodeKind,
+ val scope: JetScope) {
private val references = arrayListOf<DocumentationReference>()
public val owner: DocumentationNode
@@ -54,12 +59,12 @@ public open class DocumentationNode(val name: String, val doc: String, val kind:
public fun references(kind: DocumentationReferenceKind): List<DocumentationReference> = references.filter { it.kind == kind }
- public override fun toString() : String {
+ public override fun toString(): String {
return "$kind $name"
}
}
-public class DocumentationModel : DocumentationNode("model", "", DocumentationNodeKind.Model) {
+public class DocumentationModel : DocumentationNode("model", "", DocumentationNodeKind.Model, JetScope.EMPTY) {
fun merge(other: DocumentationModel): DocumentationModel {
val model = DocumentationModel()
model.addAllReferencesFrom(other)
@@ -72,3 +77,14 @@ public class DocumentationModel : DocumentationNode("model", "", DocumentationNo
}
public data class DocumentationReference(val from: DocumentationNode, val to: DocumentationNode, val kind: DocumentationReferenceKind)
+
+fun BindingContext.createDocumentationModel(file: JetFile): DocumentationModel {
+ val model = DocumentationModel()
+ val packageFragment = getPackageFragment(file)
+ if (packageFragment == null) throw IllegalArgumentException("File $file should have package fragment")
+
+ val visitor = DocumentationNodeBuilder(this)
+ packageFragment.accept(DocumentationBuildingVisitor(this, visitor), model)
+
+ return model
+}
diff --git a/src/Model/DocumentationBuilder.kt b/src/Model/DocumentationNodeBuilder.kt
index 353e839e..1c451465 100644
--- a/src/Model/DocumentationBuilder.kt
+++ b/src/Model/DocumentationNodeBuilder.kt
@@ -6,95 +6,91 @@ import org.jetbrains.jet.lang.descriptors.*
import org.jetbrains.jet.lang.descriptors.impl.*
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
-fun BindingContext.createDocumentationModel(file: JetFile): DocumentationModel {
- val model = DocumentationModel()
- val packageFragment = getPackageFragment(file)
- if (packageFragment == null) throw IllegalArgumentException("File $file should have package fragment")
-
- val visitor = DocumentationBuilderVisitor(this)
- packageFragment.accept(DocumentationBuildingVisitor(this, visitor), model)
-
- return model
-}
-
-class DocumentationBuilderVisitor(val context: BindingContext) : DeclarationDescriptorVisitorEmptyBodies<DocumentationNode, DocumentationNode>() {
+class DocumentationNodeBuilder(val context: BindingContext) : DeclarationDescriptorVisitorEmptyBodies<DocumentationNode, DocumentationNode>() {
override fun visitDeclarationDescriptor(descriptor: DeclarationDescriptor?, data: DocumentationNode?): DocumentationNode? {
val doc = context.getDocumentation(descriptor!!)
- val node = DocumentationNode(descriptor.getName().asString(), doc, DocumentationNodeKind.Unknown)
- data?.addReferenceTo(node, DocumentationReferenceKind.Member)
+ val node = DocumentationNode(descriptor.getName().asString(), doc, DocumentationNodeKind.Unknown, context.getResolutionScope(descriptor))
+ data!!.addReferenceTo(node, DocumentationReferenceKind.Link)
+ node.addReferenceTo(data, DocumentationReferenceKind.Owner)
return node
}
override fun visitReceiverParameterDescriptor(descriptor: ReceiverParameterDescriptor?, data: DocumentationNode?): DocumentationNode? {
- val node = DocumentationNode(descriptor!!.getName().asString(), "", DocumentationNodeKind.Receiver)
- data?.addReferenceTo(node, DocumentationReferenceKind.Detail)
+ val node = DocumentationNode(descriptor!!.getName().asString(), "", DocumentationNodeKind.Receiver, context.getResolutionScope(descriptor))
+ data!!.addReferenceTo(node, DocumentationReferenceKind.Detail)
+ node.addReferenceTo(data, DocumentationReferenceKind.Owner)
return node
}
override fun visitValueParameterDescriptor(descriptor: ValueParameterDescriptor?, data: DocumentationNode?): DocumentationNode? {
val doc = context.getDocumentation(descriptor!!)
- val node = DocumentationNode(descriptor.getName().asString(), doc, DocumentationNodeKind.Parameter)
- data?.addReferenceTo(node, DocumentationReferenceKind.Detail)
+ val node = DocumentationNode(descriptor.getName().asString(), doc, DocumentationNodeKind.Parameter, context.getResolutionScope(descriptor))
+ data!!.addReferenceTo(node, DocumentationReferenceKind.Detail)
+ node.addReferenceTo(data, DocumentationReferenceKind.Owner)
return node
}
override fun visitClassDescriptor(descriptor: ClassDescriptor?, data: DocumentationNode?): DocumentationNode? {
val doc = context.getDocumentation(descriptor!!)
- val node = DocumentationNode(descriptor.getName().asString(), doc,
- when (descriptor.getKind()) {
- ClassKind.OBJECT -> DocumentationNodeKind.Object
- else -> DocumentationNodeKind.Class
- }
- )
- data?.addReferenceTo(node, DocumentationReferenceKind.Member)
+ val node = DocumentationNode(descriptor.getName().asString(), doc, when (descriptor.getKind()) {
+ ClassKind.OBJECT -> DocumentationNodeKind.Object
+ else -> DocumentationNodeKind.Class
+ }, context.getResolutionScope(descriptor))
+ data!!.addReferenceTo(node, DocumentationReferenceKind.Member)
+ node.addReferenceTo(data, DocumentationReferenceKind.Owner)
return node
}
override fun visitFunctionDescriptor(descriptor: FunctionDescriptor?, data: DocumentationNode?): DocumentationNode? {
val doc = context.getDocumentation(descriptor!!)
- val node = DocumentationNode(descriptor.getName().asString(), doc, DocumentationNodeKind.Function)
- data?.addReferenceTo(node, DocumentationReferenceKind.Member)
+ val node = DocumentationNode(descriptor.getName().asString(), doc, DocumentationNodeKind.Function, context.getResolutionScope(descriptor))
+ data!!.addReferenceTo(node, DocumentationReferenceKind.Member)
+ node.addReferenceTo(data, DocumentationReferenceKind.Owner)
return node
}
override fun visitTypeParameterDescriptor(descriptor: TypeParameterDescriptor?, data: DocumentationNode?): DocumentationNode? {
val doc = context.getDocumentation(descriptor!!)
- val node = DocumentationNode(descriptor.getName().asString(), doc, DocumentationNodeKind.TypeParameter)
- data?.addReferenceTo(node, DocumentationReferenceKind.Detail)
+ val node = DocumentationNode(descriptor.getName().asString(), doc, DocumentationNodeKind.TypeParameter, context.getResolutionScope(descriptor))
+ data!!.addReferenceTo(node, DocumentationReferenceKind.Detail)
val builtIns = KotlinBuiltIns.getInstance()
for (constraint in descriptor.getUpperBounds()) {
if (constraint == builtIns.getDefaultBound())
continue
- val constraintNode = DocumentationNode(constraint.toString(), "", DocumentationNodeKind.UpperBound)
+ val constraintNode = DocumentationNode(constraint.toString(), "", DocumentationNodeKind.UpperBound, context.getResolutionScope(descriptor))
node.addReferenceTo(constraintNode, DocumentationReferenceKind.Detail)
}
for (constraint in descriptor.getLowerBounds()) {
if (builtIns.isNothing(constraint))
continue
- val constraintNode = DocumentationNode(constraint.toString(), "", DocumentationNodeKind.LowerBound)
+ val constraintNode = DocumentationNode(constraint.toString(), "", DocumentationNodeKind.LowerBound, context.getResolutionScope(descriptor))
node.addReferenceTo(constraintNode, DocumentationReferenceKind.Detail)
}
+ node.addReferenceTo(data, DocumentationReferenceKind.Owner)
return node
}
override fun visitPropertyDescriptor(descriptor: PropertyDescriptor?, data: DocumentationNode?): DocumentationNode? {
val doc = context.getDocumentation(descriptor!!)
- val node = DocumentationNode(descriptor.getName().asString(), doc, DocumentationNodeKind.Property)
- data?.addReferenceTo(node, DocumentationReferenceKind.Member)
+ val node = DocumentationNode(descriptor.getName().asString(), doc, DocumentationNodeKind.Property, context.getResolutionScope(descriptor))
+ data!!.addReferenceTo(node, DocumentationReferenceKind.Member)
+ node.addReferenceTo(data, DocumentationReferenceKind.Owner)
return node
}
override fun visitConstructorDescriptor(descriptor: ConstructorDescriptor?, data: DocumentationNode?): DocumentationNode? {
val doc = context.getDocumentation(descriptor!!)
- val node = DocumentationNode(descriptor.getName().asString(), doc, DocumentationNodeKind.Constructor)
- data?.addReferenceTo(node, DocumentationReferenceKind.Member)
+ val node = DocumentationNode(descriptor.getName().asString(), doc, DocumentationNodeKind.Constructor, context.getResolutionScope(descriptor))
+ data!!.addReferenceTo(node, DocumentationReferenceKind.Member)
+ node.addReferenceTo(data, DocumentationReferenceKind.Owner)
return node
}
override fun visitPackageFragmentDescriptor(descriptor: PackageFragmentDescriptor?, data: DocumentationNode?): DocumentationNode? {
- val node = DocumentationNode(descriptor!!.fqName.asString(), "", DocumentationNodeKind.Package)
- data?.addReferenceTo(node, DocumentationReferenceKind.Member)
+ val node = DocumentationNode(descriptor!!.fqName.asString(), "", DocumentationNodeKind.Package, context.getResolutionScope(descriptor))
+ data!!.addReferenceTo(node, DocumentationReferenceKind.Member)
+ node.addReferenceTo(data, DocumentationReferenceKind.Owner)
return node
}
}
diff --git a/src/Model/DocumentationResolver.kt b/src/Model/DocumentationResolver.kt
index 1d470867..dee68f49 100644
--- a/src/Model/DocumentationResolver.kt
+++ b/src/Model/DocumentationResolver.kt
@@ -2,20 +2,15 @@ package org.jetbrains.dokka
import org.jetbrains.jet.lang.resolve.scopes.*
import org.jetbrains.jet.lang.resolve.name.*
-import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
-
+import org.jetbrains.jet.lang.descriptors.*
fun DocumentationNode.resolve(): DocumentationNode {
- return this
-}
-
-fun DocumentationNode.resolve(scope: JetScope): DocumentationNode {
for (detail in details) {
- val symbol = when (detail.kind) {
+ val symbol: DeclarationDescriptor? = when (detail.kind) {
DocumentationNodeKind.Receiver -> (scope.getContainingDeclaration() as FunctionDescriptor).getReceiverParameter()
DocumentationNodeKind.Parameter -> scope.getLocalVariable(Name.guess(detail.name))
- DocumentationNodeKind.Function -> scope.getFunctions(Name.guess(detail.name)).single()
- DocumentationNodeKind.Property -> scope.getProperties(Name.guess(detail.name)).single()
+ DocumentationNodeKind.Function -> scope.getFunctions(Name.guess(detail.name)).firstOrNull()
+ DocumentationNodeKind.Property -> scope.getProperties(Name.guess(detail.name)).firstOrNull()
DocumentationNodeKind.TypeParameter -> scope.getClassifier(Name.guess(detail.name))
else -> scope.getClassifier(Name.guess(detail.name))
}
@@ -24,4 +19,5 @@ fun DocumentationNode.resolve(scope: JetScope): DocumentationNode {
throw IllegalStateException("Cannot resolve node $this detail $detail")
}
return this
-} \ No newline at end of file
+}
+
diff --git a/test/playground.kt b/test/playground.kt
index 38fd4a3f..502d5efd 100644
--- a/test/playground.kt
+++ b/test/playground.kt
@@ -29,15 +29,15 @@ class Class {
* This is a class with constructor and space after doc
*/
-class ClassWithConstructor(val name: String)
+class ClassWithConstructor(/** Doc at parameter */ val name: String)
/**
- * This is data class with constructor and comment after doc
- * $name Person's name
- * $age Person's age
+ * This is data class $Person with constructor and two properties
+ *
+ * $name: Person's name
+ * $age: Person's age
*/
-// irrelevant comment
-data class Person(/** Doc at parameter */ val name: String, val age: Int) {}
+data class Person(val name: String, val age: Int) {}
object Object {
throws(javaClass<IllegalArgumentException>())
@@ -52,7 +52,10 @@ object Object {
class OuterClass {
- class NestedClass {
+ /**
+ * $T: type of the item
+ */
+ class NestedClass<T> {
fun nestedClassFunction() {
}
}