diff options
author | Błażej Kardyś <bkardys@virtuslab.com> | 2019-10-31 11:44:03 +0100 |
---|---|---|
committer | Błażej Kardyś <bkardys@virtuslab.com> | 2019-10-31 11:44:03 +0100 |
commit | c33e8e16a0e446b78496cbcd878ba76ea51c0940 (patch) | |
tree | 7362b668c5ee48255e46a7efcb8db3f2525d1e8f /core/src/main/kotlin/Model/DocumentationNode.kt | |
parent | 14a290009098b777521b1dedb551047fb66ba73b (diff) | |
download | dokka-c33e8e16a0e446b78496cbcd878ba76ea51c0940.tar.gz dokka-c33e8e16a0e446b78496cbcd878ba76ea51c0940.tar.bz2 dokka-c33e8e16a0e446b78496cbcd878ba76ea51c0940.zip |
Temp changes
Diffstat (limited to 'core/src/main/kotlin/Model/DocumentationNode.kt')
-rw-r--r-- | core/src/main/kotlin/Model/DocumentationNode.kt | 339 |
1 files changed, 42 insertions, 297 deletions
diff --git a/core/src/main/kotlin/Model/DocumentationNode.kt b/core/src/main/kotlin/Model/DocumentationNode.kt index 66ee33e1..19ba22a6 100644 --- a/core/src/main/kotlin/Model/DocumentationNode.kt +++ b/core/src/main/kotlin/Model/DocumentationNode.kt @@ -1,330 +1,75 @@ package org.jetbrains.dokka -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import java.util.* -import kotlin.reflect.KClass -import kotlin.reflect.full.primaryConstructor +import org.jetbrains.dokka.links.ClassReference +import org.jetbrains.kotlin.descriptors.* class DocumentationNodes { - class Unknown(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) + class Module(name: String, parent: DocumentationNode<*>? = null): + DocumentationNode<Nothing>(name, parent = parent) - class Package(name: String) : - DocumentationNode(name) + class Package(name: String, parent: DocumentationNode<*>): + DocumentationNode<Nothing>(name, parent = parent) - class Class(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) { + class Class(name: String, descriptor: ClassDescriptor, parent: DocumentationNode<*>? = null) : + DocumentationNode<ClassDescriptor>(name, descriptor, parent) { override val classLike: Boolean = true - } - - class Interface(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) { - override val classLike: Boolean = true - override val superclassType: DocumentationNode? = null - } - - class Enum(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) { - override val classLike: Boolean = true - } - - class AnnotationClass(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) { - override val classLike: Boolean = true - } - - class Exception(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) { - override val classLike: Boolean = true - } - - class EnumItem(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) { - override val memberLike = true - } - - class Object(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) { - override val classLike: Boolean = true - } - - class TypeAlias(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) - - class Constructor(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) { + 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 Function(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) { + class Function(name: String, descriptor: FunctionDescriptor) : + DocumentationNode<FunctionDescriptor>(name, descriptor) { override val memberLike = true } - class Property(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) { + class Property(name: String, descriptor: PropertyDescriptor) : + DocumentationNode<PropertyDescriptor>(name, descriptor) { override val memberLike = true } - - class Field(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) { +/* + class Field(name: String, descriptor: FieldDescriptor) : + DocumentationNode<FieldDescriptor>(name, descriptor) { override val memberLike = true - } - - class CompanionObjectProperty(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) { - override val memberLike = true - } - - class CompanionObjectFunction(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) { - override val memberLike = true - } - - class Parameter(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) - - class Receiver(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) - - class TypeParameter(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) - - class Type(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) - - class Supertype(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) { - override val superclassType: DocumentationNode? = - (links + listOfNotNull(externalType)).firstOrNull { it.classLike }?.superclassType - } - - class UpperBound(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) - - class LowerBound(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) - - class TypeAliasUnderlyingType(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) - - class NullabilityModifier(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) - - class Module(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) - - class ExternalClass(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) - - class Annotation(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) - - class Value(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) - - class SourceUrl(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) - - class SourcePosition(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) - - class ExternalLink(name: String) : DocumentationNode(name) - - class QualifiedName(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) + }*/ - class Platform(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) - - class AllTypes(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) - - class OverloadGroupNote(name: String, descriptor: DeclarationDescriptor?) : - DocumentationNode(name, descriptor) + class Parameter(name: String, descriptor: ParameterDescriptor?) : + DocumentationNode<ParameterDescriptor>(name, descriptor) +/* + class Annotation(name: String, descriptor: AnnotationDescriptor?) : + DocumentationNode<AnnotationDescriptor>(name, descriptor)*/ } -abstract class DocumentationNode( +abstract class DocumentationNode<T: DeclarationDescriptor>( var name: String, - val descriptor: DeclarationDescriptor? = null + val descriptor: T? = null, + val parent: DocumentationNode<*>? = null ) { - private val references = LinkedHashSet<DocumentationReference>() + private val children = mutableListOf<DocumentationNode<*>>() open val classLike = false open val memberLike = false - val owner: DocumentationNode? - get() = references(RefKind.Owner).singleOrNull()?.to - val details: List<DocumentationNode> - get() = references(RefKind.Detail).map { it.to } - val members: List<DocumentationNode> - get() = references(RefKind.Member).map { it.to } - val origins: List<DocumentationNode> - get() = references(RefKind.Origin).map { it.to } - - val inheritedMembers: List<DocumentationNode> - get() = references(RefKind.InheritedMember).map { it.to } - val allInheritedMembers: List<DocumentationNode> - get() = recursiveInheritedMembers() - val inheritedCompanionObjectMembers: List<DocumentationNode> - get() = references(RefKind.InheritedCompanionObjectMember).map { it.to } - val extensions: List<DocumentationNode> - get() = references(RefKind.Extension).map { it.to } - val inheritors: List<DocumentationNode> - get() = references(RefKind.Inheritor).map { it.to } - val overrides: List<DocumentationNode> - get() = references(RefKind.Override).map { it.to } - val links: List<DocumentationNode> - get() = references(RefKind.Link).map { it.to } - val hiddenLinks: List<DocumentationNode> - get() = references(RefKind.HiddenLink).map { it.to } - val annotations: List<DocumentationNode> - get() = references(RefKind.Annotation).map { it.to } - val deprecation: DocumentationNode? - get() = references(RefKind.Deprecation).singleOrNull()?.to - val platforms: List<String> - get() = references(RefKind.Platform).map { it.to.name } - val externalType: DocumentationNode? - get() = references(RefKind.ExternalType).map { it.to }.firstOrNull() - - open val superclassType: DocumentationNode? - get() = if (classLike) { - supertypes.firstOrNull { - (it.links + listOfNotNull(it.externalType)).any { it.isSuperclassFor(this) } - } - } else null - - val superclassTypeSequence: Sequence<DocumentationNode> - get() = generateSequence(superclassType) { - it.superclassType - } - - // TODO: Should we allow node mutation? Model merge will copy by ref, so references are transparent, which could nice - fun addReferenceTo(to: DocumentationNode, kind: RefKind) { - references.add(DocumentationReference(this, to, kind)) - } - - fun addReference(reference: DocumentationReference) { - references.add(reference) - } - - fun dropReferences(predicate: (DocumentationReference) -> Boolean) { - references.removeAll(predicate) - } - - fun addAllReferencesFrom(other: DocumentationNode) { - references.addAll(other.references) - } - - private fun Collection<DocumentationNode>.filterByKind(kind: KClass<out DocumentationNode>) = - filter { node: DocumentationNode -> node::class == kind } - - private fun Collection<DocumentationNode>.singleByKind(kind: KClass<out DocumentationNode>) = - single { node: DocumentationNode -> node::class == kind } - - fun details(kind: KClass<out DocumentationNode>) = details.filterByKind(kind) - fun members(kind: KClass<out DocumentationNode>) = members.filterByKind(kind) - fun inheritedMembers(kind: KClass<out DocumentationNode>): List<DocumentationNode> = - inheritedMembers.filterByKind(kind) - - fun inheritedCompanionObjectMembers(kind: KClass<out DocumentationNode>): List<DocumentationNode> = - inheritedCompanionObjectMembers.filterByKind(kind) - - fun links(kind: KClass<out DocumentationNode>): List<DocumentationNode> = links.filterByKind(kind) - - fun detail(kind: KClass<out DocumentationNode>): DocumentationNode = details.singleByKind(kind) - fun detailOrNull(kind: KClass<out DocumentationNode>): DocumentationNode? = - details.singleOrNull { it::class == kind } - - fun member(kind: KClass<out DocumentationNode>): DocumentationNode = members.singleByKind(kind) - fun link(kind: KClass<out DocumentationNode>): DocumentationNode = links.singleByKind(kind) - - - fun references(kind: RefKind): List<DocumentationReference> = references.filter { it.kind == kind } - fun allReferences(): Set<DocumentationReference> = references + fun addChild(child: DocumentationNode<*>) = + children.add(child) override fun toString(): String { return "${javaClass.name}:$name" } -} - -fun KClass<out DocumentationNode>.createNode(name: String, descriptor: DeclarationDescriptor? = null) = - primaryConstructor?.call(name, descriptor) - ?: throw IllegalArgumentException("Cannot create node of type ${this::class}: invalid primary constructor") - -val DocumentationNode.supertypes: List<DocumentationNode> - get() = details(DocumentationNodes.Supertype::class) - -class DocumentationModule(name: String) : DocumentationNode(name) - -val DocumentationNode.path: List<DocumentationNode> - get() { - val parent = owner ?: return listOf(this) - return parent.path + this - } - -fun DocumentationNode.append(child: DocumentationNode, kind: RefKind) { - addReferenceTo(child, kind) - when (kind) { - RefKind.Detail -> child.addReferenceTo(this, RefKind.Owner) - RefKind.Member -> child.addReferenceTo(this, RefKind.Owner) - RefKind.Owner -> child.addReferenceTo(this, RefKind.Member) - RefKind.Origin -> child.addReferenceTo(this, RefKind.Owner) - else -> { /* Do not add any links back for other types */ - } - } -} - -fun DocumentationNode.appendTextNode( - text: String, - kind: KClass<out DocumentationNode>, - descriptor: DeclarationDescriptor? = null, - refKind: RefKind = RefKind.Detail -) { - append(kind.createNode(text, descriptor), refKind) -} - -fun DocumentationNode.qualifiedName(): String { - if (this is DocumentationNodes.Type) { - return qualifiedNameFromType() - } else if (this is DocumentationNodes.Package) { - return name - } - return path.dropWhile { it is DocumentationNodes.Module }.map { it.name }.filter { it.isNotEmpty() } - .joinToString(".") -} - -fun DocumentationNode.simpleName() = name.substringAfterLast('.') - -private fun DocumentationNode.recursiveInheritedMembers(): List<DocumentationNode> { - val allInheritedMembers = mutableListOf<DocumentationNode>() - recursiveInheritedMembers(allInheritedMembers) - return allInheritedMembers -} - -private fun DocumentationNode.recursiveInheritedMembers(allInheritedMembers: MutableList<DocumentationNode>) { - allInheritedMembers.addAll(inheritedMembers) - System.out.println(allInheritedMembers.size) - inheritedMembers.groupBy { it.owner!! }.forEach { (node, _) -> - node.recursiveInheritedMembers(allInheritedMembers) - } -} - -private fun DocumentationNode.isSuperclassFor(node: DocumentationNode): Boolean { - return when (node) { - is DocumentationNodes.Object, - is DocumentationNodes.Class, - is DocumentationNodes.Enum -> this is DocumentationNodes.Class - is DocumentationNodes.Exception -> this is DocumentationNodes.Class || this is DocumentationNodes.Exception - else -> false - } -} - -fun DocumentationNode.classNodeNameWithOuterClass(): String { - assert(classLike) - return path.dropWhile { it is DocumentationNodes.Package || it is DocumentationNodes.Module } - .joinToString(separator = ".") { it.name } }
\ No newline at end of file |