package org.jetbrains.dokka import org.jetbrains.dokka.links.Callable import org.jetbrains.dokka.links.DRI import org.jetbrains.dokka.links.withClass import org.jetbrains.kotlin.descriptors.* class Module(val packages: List) : DocumentationNode(DRI.topLevel, DRI.topLevel) { override val children: List get() = packages } class Package( val name: String, override val functions: List, override val properties: List, override val classes: List ) : ScopeNode(DRI(packageName = name), DRI.topLevel) class Class( val name: String, override val functions: List, override val properties: List, override val classes: List, override val descriptor: ClassDescriptor, parent: DRI ) : ScopeNode(parent.withClass(name), parent) class Function( val name: String, override val receiver: Parameter?, val parameters: List, override val descriptor: FunctionDescriptor, parent: DRI ) : CallableNode(parent, descriptor) { override val children: List get() = listOfNotNull(receiver) + parameters } class Property( val name: String, override val receiver: Parameter?, override val descriptor: PropertyDescriptor, parent: DRI ) : CallableNode(parent, descriptor) { override val children: List get() = listOfNotNull(receiver) } class Parameter( val name: String, override val descriptor: ParameterDescriptor, parent: DRI, index: Int ) : DocumentationNode(parent, parent.copy(target = index)) { override val children: List> get() = emptyList() } abstract class DocumentationNode( val dri: DRI, val parent: DRI ) { open val descriptor: T? = null abstract val children: List> override fun toString(): String { return "${javaClass.name}($dri)" } override fun equals(other: Any?) = other is DocumentationNode<*> && this.dri == other.dri override fun hashCode() = dri.hashCode() } abstract class ScopeNode( dri: DRI, parent: DRI ) : DocumentationNode(dri, parent) { abstract val functions: List abstract val properties: List abstract val classes: List override val children: List> get() = functions + properties + classes } abstract class CallableNode( parent: DRI, descriptor: CallableDescriptor ) : DocumentationNode(parent.copy(callable = Callable.from(descriptor)), parent) { abstract val receiver: Parameter? }