diff --git a/kdoc/kdoc.iml b/kdoc/kdoc.iml
index a6c8df4a9f8..5d99e712211 100644
--- a/kdoc/kdoc.iml
+++ b/kdoc/kdoc.iml
@@ -54,15 +54,6 @@
-
-
-
-
-
-
-
-
-
@@ -108,6 +99,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/JavadocStyleHtmlDoclet.kt b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/JavadocStyleHtmlDoclet.kt
index d84e9352687..a8cbe7bdfda 100644
--- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/JavadocStyleHtmlDoclet.kt
+++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/JavadocStyleHtmlDoclet.kt
@@ -53,7 +53,7 @@ class JavadocStyleHtmlDoclet() : Doclet {
if (c != null) {
val functions = map.get(c).notNull()
val properties = pmap.get(c).notNull()
- run("${p.nameAsPath}/${c.simpleName}-extensions.html",
+ run("${p.nameAsPath}/${c.nameAsPath}-extensions.html",
ClassExtensionsTemplate(model, p, c, functions, properties))
}
}
diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/KDocTemplate.kt b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/KDocTemplate.kt
index 45a9899dabb..ccf1644101d 100644
--- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/KDocTemplate.kt
+++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/KDocTemplate.kt
@@ -1,5 +1,7 @@
package org.jetbrains.kotlin.doc.templates
+import std.*
+import std.util.*
import org.jetbrains.kotlin.model.KClass
import org.jetbrains.kotlin.model.KAnnotation
import org.jetbrains.kotlin.model.KPackage
@@ -7,6 +9,7 @@ import org.jetbrains.kotlin.template.TextTemplate
import org.jetbrains.kotlin.model.KFunction
import java.util.Collection
import org.jetbrains.kotlin.model.KProperty
+import org.jetbrains.kotlin.model.KType
abstract class KDocTemplate() : TextTemplate() {
open fun rootHref(pkg: KPackage): String {
@@ -65,6 +68,22 @@ abstract class KDocTemplate() : TextTemplate() {
return "$prefix$name"
}
+ open fun link(t: KType, fullName: Boolean = false): String {
+ val c = t.klass
+ return if (c != null) {
+ val prefix = if (c.isAnnotation()) "@" else ""
+ val name = if (fullName) c.name else c.simpleName
+ "$prefix$name${typeArguments(t)}"
+ } else {
+ t.name
+ }
+ }
+
+ open fun typeArguments(t: KType): String {
+ val text = t.arguments.map() { it.name + typeArguments(it) }.join(", ")
+ return if (text.length() == 0) "" else "<$text>"
+ }
+
open fun link(p: KPackage): String {
return "${p.name}"
}
diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageTemplateSupport.kt b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageTemplateSupport.kt
index ef19d6a32b7..c0d22cb2e92 100644
--- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageTemplateSupport.kt
+++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageTemplateSupport.kt
@@ -27,7 +27,7 @@ abstract class PackageTemplateSupport(open val pkg: KPackage) : KDocTemplate() {
|
-Method Summary |
+Function Summary
""")
for (f in functions) {
@@ -53,7 +53,6 @@ abstract class PackageTemplateSupport(open val pkg: KPackage) : KDocTemplate() {
printTypeParameters(function)
println("""
""")
print(link(function.returnType))
- printTypeParameterNames(function.returnType.typeParameters)
println("""
""")
@@ -80,7 +79,7 @@ abstract class PackageTemplateSupport(open val pkg: KPackage) : KDocTemplate() {
|
- Method Detail |
+ Function Detail
""")
@@ -101,7 +100,6 @@ abstract class PackageTemplateSupport(open val pkg: KPackage) : KDocTemplate() {
printTypeParameters(function)
print(link(function.returnType))
- printTypeParameterNames(function.returnType.typeParameters)
print(""" ${function.name}""")
printParameters(function)
@@ -218,24 +216,12 @@ abstract class PackageTemplateSupport(open val pkg: KPackage) : KDocTemplate() {
for (p in method.parameters) {
if (first) first = false else print(", ")
print("${p.name}: ")
- print(link(p.klass))
- printTypeParameterNames(method.typeParameters)
+ print(link(p.aType))
}
print(")")
}
- fun printTypeParameterNames(typeParameters: List): Unit {
- if (!typeParameters.isEmpty()) {
- print("<")
- var separator = ""
- for (t in typeParameters) {
- print(separator)
- separator = ", "
- print(t.name)
- }
- print(">")
- }
- }
+
fun printAnnotations(annotations: Collection): Unit {
for (a in annotations) {
println(link(a))
diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/model/KotlinModel.kt b/kdoc/src/main/kotlin/org/jetbrains/kotlin/model/KotlinModel.kt
index 603e097218d..4aef0fd4d52 100644
--- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/model/KotlinModel.kt
+++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/model/KotlinModel.kt
@@ -25,11 +25,14 @@ import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor
fun containerName(descriptor: DeclarationDescriptor): String = qualifiedName(descriptor.containingDeclaration)
fun qualifiedName(descriptor: DeclarationDescriptor?): String {
- if (descriptor == null || descriptor is ModuleDescriptor || descriptor is JavaNamespaceDescriptor) {
+ if (descriptor == null || descriptor is ModuleDescriptor) {
return ""
} else {
val parent = containerName(descriptor)
- val name = descriptor.getName() ?: ""
+ var name = descriptor.getName() ?: ""
+ if (name.startsWith("<")) {
+ name = ""
+ }
val answer = if (parent.length() > 0) parent + "." + name else name
return if (answer.startsWith(".")) answer.substring(1) else answer
}
@@ -172,28 +175,40 @@ class KModel(var context: BindingContext, var title: String = "Documentation", v
}
if (created) {
pkg.description = commentsFor(descriptor)
- addFunctions(pkg, descriptor.getMemberScope())
- if (pkg.functions.notEmpty()) {
- pkg.local = true
- }
+ val scope = descriptor.getMemberScope()
+ addFunctions(pkg, scope)
+ pkg.local = isLocal(descriptor)
}
return pkg;
}
+ protected fun isLocal(descriptor: DeclarationDescriptor): Boolean {
+ return if (descriptor is ModuleDescriptor) {
+ true
+ } else {
+ val parent = descriptor.getContainingDeclaration()
+ if (parent != null) {
+ isLocal(parent)
+ } else {
+ false
+ }
+ }
+ }
+
protected fun addFunctions(owner: KClassOrPackage, scope: JetScope): Unit {
try {
val descriptors = scope.getAllDescriptors()
for (descriptor in descriptors) {
if (descriptor is PropertyDescriptor) {
val name = descriptor.getName()
- val returnType = getClass(descriptor.getReturnType())
+ val returnType = getType(descriptor.getReturnType())
if (returnType != null) {
val receiver = descriptor.getReceiverParameter()
val extensionClass = if (receiver is ExtensionReceiver) {
- getClass(receiver.getType())
+ getType(receiver.getType())
} else null
- val property = KProperty(owner, descriptor, name, returnType, extensionClass)
+ val property = KProperty(owner, descriptor, name, returnType, extensionClass?.klass)
owner.properties.add(property)
}
} else if (descriptor is CallableDescriptor) {
@@ -210,7 +225,7 @@ class KModel(var context: BindingContext, var title: String = "Documentation", v
}
protected fun createFunction(owner: KClassOrPackage, descriptor: CallableDescriptor): KFunction? {
- val returnType = getClass(descriptor.getReturnType())
+ val returnType = getType(descriptor.getReturnType())
if (returnType != null) {
val function = KFunction(owner, descriptor.getName() ?: "null", returnType)
addTypeParameters(function.typeParameters, descriptor.getTypeParameters())
@@ -226,7 +241,7 @@ class KModel(var context: BindingContext, var title: String = "Documentation", v
}
val receiver = descriptor.getReceiverParameter()
if (receiver is ExtensionReceiver) {
- function.extensionClass = getClass(receiver.getType())
+ function.extensionClass = getType(receiver.getType())?.klass
}
return function
}
@@ -252,7 +267,7 @@ class KModel(var context: BindingContext, var title: String = "Documentation", v
}
protected fun createParameter(descriptor: ValueParameterDescriptor): KParameter? {
- val returnType = getClass(descriptor.getReturnType())
+ val returnType = getType(descriptor.getReturnType())
if (returnType != null) {
val name = descriptor.getName()
val answer = KParameter(name, returnType)
@@ -290,12 +305,13 @@ class KModel(var context: BindingContext, var title: String = "Documentation", v
}
- fun getClass(aType: JetType?): KClass? {
+ fun getType(aType: JetType?): KType? {
if (aType != null) {
val classifierDescriptor = aType.constructor.declarationDescriptor
- if (classifierDescriptor is ClassDescriptor) {
- return getClass(classifierDescriptor)
- }
+ val klass = if (classifierDescriptor is ClassDescriptor) {
+ getClass(classifierDescriptor)
+ } else null
+ return KType(aType, this, klass)
}
return null
}
@@ -332,6 +348,16 @@ abstract class KAnnotated {
public open var deprecated: Boolean = false
}
+abstract class KNamed(val name: String) : KAnnotated(), Comparable {
+
+ override fun compareTo(other: KNamed): Int = name.compareTo(other.name)
+
+ fun equals(other: KPackage) = name == other.name
+
+ fun toString() = name
+}
+
+
class KPackage(val model: KModel, val descriptor: NamespaceDescriptor,
val name: String, var external: Boolean = false,
var local: Boolean = false) : KClassOrPackage(), Comparable {
@@ -349,17 +375,17 @@ class KPackage(val model: KModel, val descriptor: NamespaceDescriptor,
KClass(this, descriptor, name)
}
if (created) {
- local = true
klass.description = model.commentsFor(descriptor)
val typeConstructor = descriptor.getTypeConstructor()
val superTypes = typeConstructor.getSupertypes()
for (st in superTypes) {
- val sc = model.getClass(st)
+ val sc = model.getType(st)
if (sc != null) {
klass.baseClasses.add(sc)
}
}
- model.addFunctions(klass, descriptor.getDefaultType().getMemberScope())
+ val scope = descriptor.getDefaultType().getMemberScope()
+ model.addFunctions(klass, scope)
model.addTypeParameters(klass.typeParameters, typeConstructor.getParameters())
}
return klass
@@ -422,6 +448,24 @@ class KPackage(val model: KModel, val descriptor: NamespaceDescriptor,
fun packageFunctions() = functions.filter{ it.extensionClass == null }
}
+class KType(val jetType: JetType, val model: KModel, val klass: KClass?, val arguments: List = ArrayList()) : KNamed(klass?.name ?: jetType.toString()) {
+ {
+ if (klass != null) {
+ this.description = klass.description
+ this.detailedDescription = klass.detailedDescription
+ }
+ for (arg in jetType.arguments) {
+ if (arg != null) {
+ val argJetType = arg.getType()
+ val t = model.getType(argJetType)
+ if (t != null) {
+ $arguments.add(t)
+ }
+ }
+ }
+ }
+}
+
class KClass(val pkg: KPackage, val descriptor: ClassDescriptor,
val simpleName: String,
var kind: String = "class", var group: String = "Other",
@@ -429,7 +473,7 @@ class KClass(val pkg: KPackage, val descriptor: ClassDescriptor,
var typeParameters: List = arrayList(),
var since: String = "",
var authors: List = arrayList(),
- var baseClasses: List = arrayList(),
+ var baseClasses: List = arrayList(),
var nestedClasses: List = arrayList(),
var sourceLine: Int = 2) : KClassOrPackage(), Comparable {
@@ -447,6 +491,9 @@ class KClass(val pkg: KPackage, val descriptor: ClassDescriptor,
}
public val name: String = pkg.qualifiedName(simpleName)
+
+ public val model: KModel = pkg.model
+
public val packageName: String = pkg.name
/** Returns the name as a directory using '/' instead of '.' */
@@ -459,16 +506,19 @@ class KClass(val pkg: KPackage, val descriptor: ClassDescriptor,
/** Returns all of the base classes and all of their descendants */
fun descendants(answer: Set = LinkedHashSet()): Set {
- answer.addAll(baseClasses)
for (b in baseClasses) {
- b.descendants(answer)
+ val c = b.klass
+ if (c != null) {
+ answer.add(c)
+ c.descendants(answer)
+ }
}
return answer
}
}
class KFunction(val owner: KClassOrPackage, val name: String,
- var returnType: KClass,
+ var returnType: KType,
var extensionClass: KClass? = null,
var modifiers: List = arrayList(),
var typeParameters: List = arrayList(),
@@ -507,7 +557,7 @@ class KFunction(val owner: KClassOrPackage, val name: String,
}
class KProperty(val owner: KClassOrPackage, val descriptor: PropertyDescriptor, val name: String,
- val returnType: KClass, val extensionClass: KClass?) : KAnnotated(), Comparable {
+ val returnType: KType, val extensionClass: KClass?) : KAnnotated(), Comparable {
override fun compareTo(other: KProperty): Int = name.compareTo(other.name)
@@ -519,14 +569,14 @@ class KProperty(val owner: KClassOrPackage, val descriptor: PropertyDescriptor,
}
class KParameter(val name: String,
- var klass: KClass) : KAnnotated() {
+ var aType: KType) : KAnnotated() {
- fun toString() = "$name: ${klass.name}"
+ fun toString() = "$name: ${aType.name}"
}
class KTypeParameter(val name: String,
- val descriptor: TypeParameterDescriptor,
- var extends: List = arrayList()) : KAnnotated() {
+ val descriptor: TypeParameterDescriptor,
+ var extends: List = arrayList()) : KAnnotated() {
fun toString() = "$name"
}