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