From e155d101a52f62b0c8c10778fdf0068549b413be Mon Sep 17 00:00:00 2001 From: Ilya Ryzhenkov Date: Sat, 12 Jul 2014 02:29:55 +0400 Subject: Implement resolution scope chaining for all scopes except imported packages. --- src/Model/DocumentationModel.kt | 6 +++--- src/Model/DocumentationNodeBuilder.kt | 16 ++++++++++++++++ src/Model/DocumentationResolver.kt | 10 +++++++++- 3 files changed, 28 insertions(+), 4 deletions(-) (limited to 'src/Model') diff --git a/src/Model/DocumentationModel.kt b/src/Model/DocumentationModel.kt index aa8d9a6b..83aa911f 100644 --- a/src/Model/DocumentationModel.kt +++ b/src/Model/DocumentationModel.kt @@ -40,8 +40,8 @@ public open class DocumentationNode(val name: String, val scope: JetScope) { private val references = arrayListOf() - public val owner: DocumentationNode - get() = references(DocumentationReferenceKind.Owner).single().to + public val owner: DocumentationNode? + get() = references(DocumentationReferenceKind.Owner).firstOrNull()?.to // TODO: should be singleOrNull, but bugz! public val details: List get() = references(DocumentationReferenceKind.Detail).map { it.to } public val members: List @@ -62,7 +62,7 @@ public open class DocumentationNode(val name: String, public fun allReferences(): List = references public override fun toString(): String { - return "$kind $name" + return "$kind:$name" } } diff --git a/src/Model/DocumentationNodeBuilder.kt b/src/Model/DocumentationNodeBuilder.kt index aa0c4700..d32edbc5 100644 --- a/src/Model/DocumentationNodeBuilder.kt +++ b/src/Model/DocumentationNodeBuilder.kt @@ -19,6 +19,10 @@ class DocumentationNodeBuilder(val context: BindingContext) : DeclarationDescrip override fun visitReceiverParameterDescriptor(descriptor: ReceiverParameterDescriptor?, data: DocumentationNode?): DocumentationNode? { val node = DocumentationNode(descriptor!!.getName().asString(), "", DocumentationNodeKind.Receiver, context.getResolutionScope(descriptor)) data!!.addReferenceTo(node, DocumentationReferenceKind.Detail) + + val typeNode = DocumentationNode(descriptor.getType().toString(), "", DocumentationNodeKind.UpperBound, context.getResolutionScope(descriptor)) + node.addReferenceTo(typeNode, DocumentationReferenceKind.Detail) + node.addReferenceTo(data, DocumentationReferenceKind.Owner) return node } @@ -27,6 +31,10 @@ class DocumentationNodeBuilder(val context: BindingContext) : DeclarationDescrip val doc = context.getDocumentation(descriptor!!) val node = DocumentationNode(descriptor.getName().asString(), doc, DocumentationNodeKind.Parameter, context.getResolutionScope(descriptor)) data!!.addReferenceTo(node, DocumentationReferenceKind.Detail) + + val typeNode = DocumentationNode(descriptor.getType().toString(), "", DocumentationNodeKind.UpperBound, context.getResolutionScope(descriptor)) + node.addReferenceTo(typeNode, DocumentationReferenceKind.Detail) + node.addReferenceTo(data, DocumentationReferenceKind.Owner) return node } @@ -47,6 +55,10 @@ class DocumentationNodeBuilder(val context: BindingContext) : DeclarationDescrip val doc = context.getDocumentation(descriptor!!) val node = DocumentationNode(descriptor.getName().asString(), doc, DocumentationNodeKind.Function, context.getResolutionScope(descriptor)) data!!.addReferenceTo(node, DocumentationReferenceKind.Member) + + val typeNode = DocumentationNode(descriptor.getReturnType().toString(), "", DocumentationNodeKind.UpperBound, context.getResolutionScope(descriptor)) + node.addReferenceTo(typeNode, DocumentationReferenceKind.Detail) + node.addReferenceTo(data, DocumentationReferenceKind.Owner) return node } @@ -76,6 +88,10 @@ class DocumentationNodeBuilder(val context: BindingContext) : DeclarationDescrip val doc = context.getDocumentation(descriptor!!) val node = DocumentationNode(descriptor.getName().asString(), doc, DocumentationNodeKind.Property, context.getResolutionScope(descriptor)) data!!.addReferenceTo(node, DocumentationReferenceKind.Member) + + val typeNode = DocumentationNode(descriptor.getType().toString(), "", DocumentationNodeKind.UpperBound, context.getResolutionScope(descriptor)) + node.addReferenceTo(typeNode, DocumentationReferenceKind.Detail) + node.addReferenceTo(data, DocumentationReferenceKind.Owner) return node } diff --git a/src/Model/DocumentationResolver.kt b/src/Model/DocumentationResolver.kt index e69a70f8..b5b6b1a2 100644 --- a/src/Model/DocumentationResolver.kt +++ b/src/Model/DocumentationResolver.kt @@ -23,10 +23,18 @@ fun DocumentationNode.checkResolve() { } if (symbol == null) - throw IllegalStateException("Cannot resolve $item in $this") + println("WARNING: Cannot resolve $item in ${path(this)}") } for (reference in allReferences().filterNot { it.kind == DocumentationReferenceKind.Owner }) { reference.to.checkResolve() } +} + +fun path(node: DocumentationNode) : String { + val owner = node.owner + if (owner != null) + return "$node in ${path(owner)}" + else + return "$node" } \ No newline at end of file -- cgit