aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/kotlin/Model
diff options
context:
space:
mode:
authorBłażej Kardyś <bkardys@virtuslab.com>2019-11-07 08:21:43 +0100
committerBłażej Kardyś <bkardys@virtuslab.com>2019-11-08 18:47:43 +0100
commit493951f487910a1306a4129b7e8144e679c0213c (patch)
tree15ac0502e76c0a327bb835e31d0e65f499928ec1 /core/src/main/kotlin/Model
parent0627b9dd15171db221bee2e5a6b0082aec813c98 (diff)
downloaddokka-493951f487910a1306a4129b7e8144e679c0213c.tar.gz
dokka-493951f487910a1306a4129b7e8144e679c0213c.tar.bz2
dokka-493951f487910a1306a4129b7e8144e679c0213c.zip
Moving platform merging to documentationNodes
Diffstat (limited to 'core/src/main/kotlin/Model')
-rw-r--r--core/src/main/kotlin/Model/DocumentationNode.kt51
-rw-r--r--core/src/main/kotlin/Model/transformers/DocumentationNodeTransformer.kt1
-rw-r--r--core/src/main/kotlin/Model/transformers/DocumentationNodesMerger.kt (renamed from core/src/main/kotlin/Model/transformers/ActualExpectedMerger.kt)39
3 files changed, 62 insertions, 29 deletions
diff --git a/core/src/main/kotlin/Model/DocumentationNode.kt b/core/src/main/kotlin/Model/DocumentationNode.kt
index 99764fac..7efe6818 100644
--- a/core/src/main/kotlin/Model/DocumentationNode.kt
+++ b/core/src/main/kotlin/Model/DocumentationNode.kt
@@ -5,10 +5,7 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.kdoc.psi.impl.KDocTag
class Module(val packages: List<Package>) : DocumentationNode<Nothing>() {
- override val docTags: List<KDocTag> = emptyList()
-
override val dri: DRI = DRI.topLevel
-
override val children: List<Package> = packages
}
@@ -19,8 +16,6 @@ class Package(
override val classes: List<Class>
) : ScopeNode<Nothing>() {
val name = dri.packageName.orEmpty()
-
- override val docTags: List<KDocTag> = emptyList()
}
class Class(
@@ -30,8 +25,8 @@ class Class(
override val functions: List<Function>,
override val properties: List<Property>,
override val classes: List<Class>,
- override val docTags: List<KDocTag>,
- override val descriptors: List<ClassDescriptor>
+ override val expectDescriptor: Descriptor<ClassDescriptor>?,
+ override val actualDescriptors: List<Descriptor<ClassDescriptor>>
) : ScopeNode<ClassDescriptor>()
class Function(
@@ -39,8 +34,8 @@ class Function(
val name: String,
override val receiver: Parameter?,
val parameters: List<Parameter>,
- override val docTags: List<KDocTag>,
- override val descriptors: List<FunctionDescriptor>
+ override val expectDescriptor: Descriptor<FunctionDescriptor>?,
+ override val actualDescriptors: List<Descriptor<FunctionDescriptor>>
) : CallableNode<FunctionDescriptor>() {
override val children: List<Parameter>
get() = listOfNotNull(receiver) + parameters
@@ -50,8 +45,8 @@ class Property(
override val dri: DRI,
val name: String,
override val receiver: Parameter?,
- override val docTags: List<KDocTag>,
- override val descriptors: List<PropertyDescriptor>
+ override val expectDescriptor: Descriptor<PropertyDescriptor>?,
+ override val actualDescriptors: List<Descriptor<PropertyDescriptor>>
) : CallableNode<PropertyDescriptor>() {
override val children: List<Parameter>
get() = listOfNotNull(receiver)
@@ -61,35 +56,51 @@ class Property(
class Parameter(
override val dri: DRI,
val name: String?,
- override val docTags: List<KDocTag>,
- override val descriptors: List<ParameterDescriptor>
+ override val actualDescriptors: List<Descriptor<ParameterDescriptor>>
) : DocumentationNode<ParameterDescriptor>() {
override val children: List<DocumentationNode<*>>
get() = emptyList()
}
-abstract class DocumentationNode<out T : DeclarationDescriptor> {
- open val descriptors: List<T> = emptyList()
+class Descriptor<out T : DeclarationDescriptor>(
+ val descriptor: T,
+ val docTag: KDocTag?,
+ val links: Map<String, DRI>,
+ val passes: List<String>
+) : DeclarationDescriptor by descriptor {
+
+ override fun equals(other: Any?): Boolean =
+ other is Descriptor<*> && (
+ descriptor.toString() == other.descriptor.toString() &&
+ docTag?.text == other.docTag?.text &&
+ links == other.links)
+
+ override fun hashCode(): Int =
+ listOf(descriptor.toString(), docTag?.text, links).hashCode()
+}
- abstract val docTags: List<KDocTag> // TODO: replace in the future with more robust doc-comment model
+abstract class DocumentationNode<out T : DeclarationDescriptor> {
+ open val expectDescriptor: Descriptor<T>? = null
+ open val actualDescriptors: List<Descriptor<T>> = emptyList()
+ val descriptors by lazy { listOfNotNull(expectDescriptor) + actualDescriptors }
abstract val dri: DRI
abstract val children: List<DocumentationNode<*>>
override fun toString(): String {
- return "${javaClass.simpleName}($dri)" + briefDocstring.takeIf { it.isNotBlank() }?.let { " [$it]"}.orEmpty()
+ return "${javaClass.simpleName}($dri)" + briefDocstring.takeIf { it.isNotBlank() }?.let { " [$it]" }.orEmpty()
}
override fun equals(other: Any?) = other is DocumentationNode<*> && this.dri == other.dri
override fun hashCode() = dri.hashCode()
- val rawDocstrings: List<String>
- get() = docTags.map(KDocTag::getContent)
+ val commentsData: List<Pair<String, Map<String, DRI>>>
+ get() = descriptors.mapNotNull { it.docTag?.let { tag -> Pair(tag.getContent(), it.links) } }
val briefDocstring: String
- get() = rawDocstrings.firstOrNull().orEmpty().shorten(40)
+ get() = descriptors.firstOrNull()?.docTag?.getContent().orEmpty().shorten(40)
}
abstract class ScopeNode<out T : ClassOrPackageFragmentDescriptor> : DocumentationNode<T>() {
diff --git a/core/src/main/kotlin/Model/transformers/DocumentationNodeTransformer.kt b/core/src/main/kotlin/Model/transformers/DocumentationNodeTransformer.kt
index f94147fb..318d20b3 100644
--- a/core/src/main/kotlin/Model/transformers/DocumentationNodeTransformer.kt
+++ b/core/src/main/kotlin/Model/transformers/DocumentationNodeTransformer.kt
@@ -4,4 +4,5 @@ import org.jetbrains.dokka.Model.Module
interface DocumentationNodeTransformer {
operator fun invoke(original: Module): Module
+ operator fun invoke(modules: Collection<Module>): Module
} \ No newline at end of file
diff --git a/core/src/main/kotlin/Model/transformers/ActualExpectedMerger.kt b/core/src/main/kotlin/Model/transformers/DocumentationNodesMerger.kt
index 171b41d0..c5a67513 100644
--- a/core/src/main/kotlin/Model/transformers/ActualExpectedMerger.kt
+++ b/core/src/main/kotlin/Model/transformers/DocumentationNodesMerger.kt
@@ -2,11 +2,14 @@ package org.jetbrains.dokka.Model.transformers
import org.jetbrains.dokka.Model.*
import org.jetbrains.dokka.Model.Function
+import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
-internal object ActualExpectedMerger : DocumentationNodeTransformer {
+internal object DocumentationNodesMerger : DocumentationNodeTransformer {
override fun invoke(original: Module) = Module(
original.packages.map { mergePackageContent(it) }
)
+ override fun invoke(modules: Collection<Module>): Module =
+ Module(merge(modules.flatMap { it.packages }, Package::mergeWith))
}
private fun mergePackageContent(original: Package) = Package(
@@ -21,21 +24,33 @@ private fun <T: DocumentationNode<*>> merge(elements: List<T>, reducer: (T, T) -
.reduce { _, left, right -> reducer(left, right)}
.values.toList()
+fun <T:DeclarationDescriptor> Descriptor<T>.mergeWith(other: Descriptor<T>?) = Descriptor(
+ descriptor,
+ docTag,
+ links,
+ (passes + (other?.passes ?: emptyList())).distinct()
+)
+
+fun <T:DeclarationDescriptor> List<Descriptor<T>>.merge() : List<Descriptor<T>> =
+ groupingBy { it.descriptor }.reduce {
+ _, left, right -> left.mergeWith(right)
+ }.values.toList()
+
fun Function.mergeWith(other: Function) = Function(
dri,
name,
if (receiver != null && other.receiver != null) receiver.mergeWith(other.receiver) else null,
merge(parameters + other.parameters, Parameter::mergeWith),
- docTags + other.docTags,
- descriptors + other.descriptors
+ expectDescriptor?.mergeWith(other.expectDescriptor),
+ (actualDescriptors + other.actualDescriptors).merge()
)
fun Property.mergeWith(other: Property) = Property(
dri,
name,
if (receiver != null && other.receiver != null) receiver.mergeWith(other.receiver) else null,
- docTags + other.docTags,
- descriptors + other.descriptors
+ expectDescriptor?.mergeWith(other.expectDescriptor),
+ (actualDescriptors + other.actualDescriptors).merge()
)
fun Class.mergeWith(other: Class) = Class(
@@ -45,13 +60,19 @@ fun Class.mergeWith(other: Class) = Class(
merge(functions + other.functions, Function::mergeWith),
merge(properties + other.properties, Property::mergeWith),
merge(classes + other.classes, Class::mergeWith),
- docTags + other.docTags,
- descriptors + other.descriptors
+ expectDescriptor?.mergeWith(other.expectDescriptor),
+ (actualDescriptors + other.actualDescriptors).merge()
)
fun Parameter.mergeWith(other: Parameter) = Parameter(
dri,
name,
- docTags + other.docTags,
- descriptors + other.descriptors
+ (actualDescriptors + other.actualDescriptors).merge()
)
+
+fun Package.mergeWith(other: Package) = Package(
+ dri,
+ merge(functions + other.functions, Function::mergeWith),
+ merge(properties + other.properties, Property::mergeWith),
+ merge(classes + other.classes, Class::mergeWith)
+) \ No newline at end of file