aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/src/main/kotlin/Model/DocumentationNode.kt133
-rw-r--r--core/src/main/kotlin/links/DRI.kt69
-rw-r--r--core/src/main/kotlin/transformers/DefaultDocumentationToPageTransformer.kt1
3 files changed, 130 insertions, 73 deletions
diff --git a/core/src/main/kotlin/Model/DocumentationNode.kt b/core/src/main/kotlin/Model/DocumentationNode.kt
index 19ba22a6..5312915b 100644
--- a/core/src/main/kotlin/Model/DocumentationNode.kt
+++ b/core/src/main/kotlin/Model/DocumentationNode.kt
@@ -1,75 +1,94 @@
package org.jetbrains.dokka
-import org.jetbrains.dokka.links.ClassReference
+import org.jetbrains.dokka.links.Callable
+import org.jetbrains.dokka.links.DRI
+import org.jetbrains.dokka.links.withClass
import org.jetbrains.kotlin.descriptors.*
-class DocumentationNodes {
-
- class Module(name: String, parent: DocumentationNode<*>? = null):
- DocumentationNode<Nothing>(name, parent = parent)
+class Module(val packages: List<Package>) : DocumentationNode<Nothing>(DRI.topLevel, DRI.topLevel) {
+ override val children: List<Package>
+ get() = packages
+}
- class Package(name: String, parent: DocumentationNode<*>):
- DocumentationNode<Nothing>(name, parent = parent)
+class Package(
+ val name: String,
+ override val functions: List<Function>,
+ override val properties: List<Property>,
+ override val classes: List<Class>
+) : ScopeNode<Nothing>(DRI(packageName = name), DRI.topLevel)
- class Class(name: String, descriptor: ClassDescriptor, parent: DocumentationNode<*>? = null) :
- DocumentationNode<ClassDescriptor>(name, descriptor, parent) {
- override val classLike: Boolean = true
- val supertypes = mutableListOf<ClassReference>()
- val isInterface: Boolean
- get() = descriptor?.kind == ClassKind.CLASS
- val isEnum: Boolean
- get() = descriptor?.kind == ClassKind.ENUM_CLASS
- val isEnumEntry: Boolean
- get() = descriptor?.kind == ClassKind.ENUM_ENTRY
- val isAnnotationClass: Boolean
- get() = descriptor?.kind == ClassKind.ANNOTATION_CLASS
- val isObject: Boolean
- get() = descriptor?.kind == ClassKind.OBJECT
- }
-
- class Constructor(name: String, descriptor: ConstructorDescriptor) :
- DocumentationNode<ConstructorDescriptor>(name, descriptor) {
- override val memberLike = true
- }
+class Class(
+ val name: String,
+ override val functions: List<Function>,
+ override val properties: List<Property>,
+ override val classes: List<Class>,
+ override val descriptor: ClassDescriptor,
+ parent: DRI
+) : ScopeNode<ClassDescriptor>(parent.withClass(name), parent)
- class Function(name: String, descriptor: FunctionDescriptor) :
- DocumentationNode<FunctionDescriptor>(name, descriptor) {
- override val memberLike = true
- }
+class Function(
+ val name: String,
+ override val receiver: Parameter?,
+ val parameters: List<Parameter>,
+ override val descriptor: FunctionDescriptor,
+ parent: DRI
+) : CallableNode<FunctionDescriptor>(parent, descriptor) {
+ override val children: List<Parameter>
+ get() = listOfNotNull(receiver) + parameters
+}
- class Property(name: String, descriptor: PropertyDescriptor) :
- DocumentationNode<PropertyDescriptor>(name, descriptor) {
- override val memberLike = true
- }
-/*
- class Field(name: String, descriptor: FieldDescriptor) :
- DocumentationNode<FieldDescriptor>(name, descriptor) {
- override val memberLike = true
- }*/
+class Property(
+ val name: String,
+ override val receiver: Parameter?,
+ override val descriptor: PropertyDescriptor,
+ parent: DRI
+) : CallableNode<PropertyDescriptor>(parent, descriptor) {
+ override val children: List<Parameter>
+ get() = listOfNotNull(receiver)
+}
- class Parameter(name: String, descriptor: ParameterDescriptor?) :
- DocumentationNode<ParameterDescriptor>(name, descriptor)
-/*
- class Annotation(name: String, descriptor: AnnotationDescriptor?) :
- DocumentationNode<AnnotationDescriptor>(name, descriptor)*/
+class Parameter(
+ val name: String,
+ override val descriptor: ParameterDescriptor,
+ parent: DRI,
+ index: Int
+) : DocumentationNode<ParameterDescriptor>(parent, parent.copy(target = index)) {
+ override val children: List<DocumentationNode<*>>
+ get() = emptyList()
}
-abstract class DocumentationNode<T: DeclarationDescriptor>(
- var name: String,
- val descriptor: T? = null,
- val parent: DocumentationNode<*>? = null
+abstract class DocumentationNode<out T : DeclarationDescriptor>(
+ val dri: DRI,
+ val parent: DRI
) {
+ open val descriptor: T? = null
- private val children = mutableListOf<DocumentationNode<*>>()
+ abstract val children: List<DocumentationNode<*>>
- open val classLike = false
+ override fun toString(): String {
+ return "${javaClass.name}($dri)"
+ }
- open val memberLike = false
+ override fun equals(other: Any?) = other is DocumentationNode<*> && this.dri == other.dri
- fun addChild(child: DocumentationNode<*>) =
- children.add(child)
+ override fun hashCode() = dri.hashCode()
+}
- override fun toString(): String {
- return "${javaClass.name}:$name"
- }
+abstract class ScopeNode<out T : ClassOrPackageFragmentDescriptor>(
+ dri: DRI,
+ parent: DRI
+) : DocumentationNode<T>(dri, parent) {
+ abstract val functions: List<Function>
+ abstract val properties: List<Property>
+ abstract val classes: List<Class>
+
+ override val children: List<DocumentationNode<MemberDescriptor>>
+ get() = functions + properties + classes
+}
+
+abstract class CallableNode<out T: CallableDescriptor>(
+ parent: DRI,
+ descriptor: CallableDescriptor
+) : DocumentationNode<T>(parent.copy(callable = Callable.from(descriptor)), parent) {
+ abstract val receiver: Parameter?
} \ No newline at end of file
diff --git a/core/src/main/kotlin/links/DRI.kt b/core/src/main/kotlin/links/DRI.kt
index 35eb6497..7ab25444 100644
--- a/core/src/main/kotlin/links/DRI.kt
+++ b/core/src/main/kotlin/links/DRI.kt
@@ -1,22 +1,28 @@
package org.jetbrains.dokka.links
+import org.jetbrains.kotlin.descriptors.CallableDescriptor
+import org.jetbrains.kotlin.types.KotlinType
import java.text.ParseException
/**
* [DRI] stands for DokkaResourceIdentifier
*/
-data class DRI(val packageName: String? = null,
- val classNames: String? = null,
- val callable: Callable? = null,
- val target: Int? = null,
- val extra: String? = null) {
-
- constructor(packageName: String? = null,
- classNames: String? = null,
- callableName: String? = null,
- signature: String? = null,
- target: Int? = null,
- extra: String? = null) : this(packageName, classNames, Callable.from(callableName, signature), target, extra)
+data class DRI(
+ val packageName: String? = null,
+ val classNames: String? = null,
+ val callable: Callable? = null,
+ val target: Int? = null,
+ val extra: String? = null
+) {
+
+ constructor(
+ packageName: String? = null,
+ classNames: String? = null,
+ callableName: String? = null,
+ signature: String? = null,
+ target: Int? = null,
+ extra: String? = null
+ ) : this(packageName, classNames, Callable.from(callableName, signature), target, extra)
override fun toString(): String =
"${packageName.orEmpty()}/${classNames.orEmpty()}/${callable?.name.orEmpty()}/${callable?.signature().orEmpty()}/${target?.toString().orEmpty()}/${extra.orEmpty()}"
@@ -29,7 +35,11 @@ data class DRI(val packageName: String? = null,
DRI(
packageName,
classNames,
- try { Callable.from(callableName, callableSignature) } catch(e: ParseException) { null },
+ try {
+ Callable.from(callableName, callableSignature)
+ } catch (e: ParseException) {
+ null
+ },
target?.toInt(),
ext
)
@@ -37,11 +47,25 @@ data class DRI(val packageName: String? = null,
} catch (e: Throwable) {
throw ParseException(s, 0)
}
+
+ val topLevel = DRI()
}
}
+fun DRI.withClass(name: String) = copy(classNames = classNames.orEmpty() + ".$name")
+
+val DRI.parent: DRI
+ get() = when {
+ extra != null -> copy(extra = null)
+ target != null -> copy(target = null)
+ callable != null -> copy(callable = null)
+ classNames != null -> copy(classNames = classNames.substringBeforeLast('.').takeIf { it.isNotBlank() })
+ else -> DRI.topLevel
+ }
+
data class Callable(val name: String, val receiver: String, val returnType: String, val params: List<String>) {
- fun signature() = "$receiver.$returnType.${params.joinToString(".")}"
+ fun signature() = "$receiver#$returnType#${params.joinToString("#")}"
+
companion object {
fun from(name: String?, signature: String?): Callable = try {
signature.toString()
@@ -63,10 +87,25 @@ data class Callable(val name: String, val receiver: String, val returnType: Stri
} catch (e: Throwable) {
throw ParseException(s, 0)
}
+
+ fun from(descriptor: CallableDescriptor) = with(descriptor) {
+ Callable(
+ name.asString(),
+ extensionReceiverParameter?.value?.type?.constructorName.orEmpty(),
+ returnType?.constructorName.orEmpty(),
+ valueParameters.map { it.type.constructorName.orEmpty() }
+ )
+ }
}
}
-data class ClassReference(val dri: DRI, val subs: MutableList<ClassReference> = mutableListOf())
+data class ClassReference(val dri: DRI, val subs: MutableList<ClassReference> = mutableListOf()) {
+ private val subsText = subs.takeIf { it.isNotEmpty() }?.toString().orEmpty()
+ override fun toString() = "$dri$subsText"
+}
private operator fun <T> List<T>.component6(): T = get(5)
+private val KotlinType.constructorName
+ get() = constructor.declarationDescriptor?.name?.asString()
+
diff --git a/core/src/main/kotlin/transformers/DefaultDocumentationToPageTransformer.kt b/core/src/main/kotlin/transformers/DefaultDocumentationToPageTransformer.kt
index 13e9b0d0..fd2e6797 100644
--- a/core/src/main/kotlin/transformers/DefaultDocumentationToPageTransformer.kt
+++ b/core/src/main/kotlin/transformers/DefaultDocumentationToPageTransformer.kt
@@ -1,7 +1,6 @@
package org.jetbrains.dokka.transformers
import org.jetbrains.dokka.DocumentationNode
-import org.jetbrains.dokka.DocumentationNodes
import org.jetbrains.dokka.pages.ContentNode
import org.jetbrains.dokka.pages.ContentSymbol
import org.jetbrains.dokka.pages.ModulePageNode