Fix incorrect apidoc for 'kotlin'

KDoc was confused because now there are two package fragments for package
'kotlin' (built-ins and stdlib). KDoc's KPackage now has a list of descriptors,
not only one.

This fixes missing documentation for top-level members in package 'kotlin' in
the apidoc

 #KT-2521 Fixed
This commit is contained in:
Alexander Udalov
2014-03-14 22:08:21 +04:00
parent 93db022059
commit 338bc2f9ec
2 changed files with 40 additions and 48 deletions
+2
View File
@@ -40,6 +40,8 @@
<version>${project.version}</version> <version>${project.version}</version>
<configuration> <configuration>
<sources> <sources>
<source>${basedir}/../../../core/builtins/native</source>
<source>${basedir}/../../../core/builtins/src</source>
<source>${basedir}/../../stdlib/src</source> <source>${basedir}/../../stdlib/src</source>
<source>${basedir}/../../kunit/src/main/kotlin</source> <source>${basedir}/../../kunit/src/main/kotlin</source>
<source>${basedir}/../../kotlin-jdbc/src/main/kotlin</source> <source>${basedir}/../../kotlin-jdbc/src/main/kotlin</source>
@@ -132,7 +132,7 @@ fun extensionProperties(properties: Collection<KProperty>): Map<KClass, List<KPr
return map return map
} }
abstract class KClassOrPackage(model: KModel, declarationDescriptor: DeclarationDescriptor): KAnnotated(model, declarationDescriptor) { abstract class KClassOrPackage(model: KModel, descriptor: DeclarationDescriptor): KAnnotated(model, descriptor) {
open val functions = sortedSetOf<KFunction>() open val functions = sortedSetOf<KFunction>()
open val properties = sortedSetOf<KProperty>() open val properties = sortedSetOf<KProperty>()
@@ -158,9 +158,9 @@ class KModel(val context: BindingContext, val config: KDocConfig, val sourceDirs
val allPackages: Collection<KPackage> val allPackages: Collection<KPackage>
get() = packageMap.values() get() = packageMap.values()
/** Returns the local packages */ /** Returns the packages that should be included in the report */
val packages: Collection<KPackage> val packages: Collection<KPackage>
get() = allPackages.filter { it.local && config.includePackage(it) } get() = allPackages.filter { config.includePackage(it) }
val classes: Collection<KClass> val classes: Collection<KClass>
get() = packages.flatMap { it.classes } get() = packages.flatMap { it.classes }
@@ -226,14 +226,14 @@ class KModel(val context: BindingContext, val config: KDocConfig, val sourceDirs
warning("No PackageFragmentDescriptor for source $source") warning("No PackageFragmentDescriptor for source $source")
} }
} }
val allClasses = HashSet<KClass>()
for (packageFragment in allPackageFragments) { for ((name, packageFragments) in allPackageFragments.groupBy { qualifiedName(it) }) {
getPackage(packageFragment) createPackage(packageFragments, name)
for (descriptor in packageFragment.getMemberScope().getAllDescriptors()) {
if (descriptor is ClassDescriptor) { for (packageFragment in packageFragments) {
val klass = getClass(descriptor) for (descriptor in packageFragment.getMemberScope().getAllDescriptors()) {
if (klass != null) { if (descriptor is ClassDescriptor) {
allClasses.add(klass) getClass(descriptor)
} }
} }
} }
@@ -264,27 +264,31 @@ class KModel(val context: BindingContext, val config: KDocConfig, val sourceDirs
fun getPackage(name: String): KPackage? = packageMap.get(name) fun getPackage(name: String): KPackage? = packageMap.get(name)
/** Returns the package for the given descriptor, creating one if its not available */ /** Returns the package for the given descriptor, creating one if its not available */
fun getPackage(descriptor: PackageFragmentDescriptor): KPackage { fun getOrCreatePackage(descriptor: PackageFragmentDescriptor): KPackage {
val name = qualifiedName(descriptor) val name = qualifiedName(descriptor)
var created = false
val pkg = packageMap.getOrPut(name) {
created = true
KPackage(this, descriptor, name)
}
if (created) {
configureComments(pkg, descriptor)
val scope = descriptor.getMemberScope()
addFunctions(pkg, scope)
pkg.local = isLocal(descriptor)
pkg.useExternalLink = pkg.model.config.resolveLink(pkg.name, false).isNotEmpty()
if (pkg.wikiDescription.isEmpty()) { val pkg = packageMap[name]
// lets try find a custom doc if (pkg != null) return pkg
var file = config.packageDescriptionFiles[name]
loadWikiDescription(pkg, file) return createPackage(listOf(descriptor), name)
} }
private fun createPackage(descriptors: List<PackageFragmentDescriptor>, name: String): KPackage {
val pkg = KPackage(this, descriptors, name, config.resolveLink(name, false).isNotEmpty())
assert(!packageMap.containsKey(name)) { "packageMap entry created earlier for package $name: old=${packageMap[name]}, new=$pkg" }
packageMap[name] = pkg
for (descriptor in descriptors) {
addFunctions(pkg, descriptor.getMemberScope())
} }
return pkg;
// lets try find a custom doc
var file = config.packageDescriptionFiles[name]
loadWikiDescription(pkg, file)
return pkg
} }
protected fun loadWikiDescription(pkg: KPackage, file: String?): Unit { protected fun loadWikiDescription(pkg: KPackage, file: String?): Unit {
@@ -345,19 +349,6 @@ class KModel(val context: BindingContext, val config: KDocConfig, val sourceDirs
return null return null
} }
protected fun isLocal(descriptor: DeclarationDescriptor): Boolean {
return if (descriptor is ModuleDescriptor) {
true
} else {
val parent = descriptor.getContainingDeclaration()
if (parent != null) {
isLocal(parent)
} else {
false
}
}
}
fun addFunctions(owner: KClassOrPackage, scope: JetScope): Unit { fun addFunctions(owner: KClassOrPackage, scope: JetScope): Unit {
try { try {
val descriptors = scope.getAllDescriptors() val descriptors = scope.getAllDescriptors()
@@ -685,7 +676,7 @@ $highlight"""
while (dec != null) { while (dec != null) {
val container = dec val container = dec
if (container is PackageFragmentDescriptor) { if (container is PackageFragmentDescriptor) {
val pkg = getPackage(container) val pkg = getOrCreatePackage(container)
return pkg.getClass(classElement) return pkg.getClass(classElement)
} else { } else {
dec = dec?.getContainingDeclaration() dec = dec?.getContainingDeclaration()
@@ -732,7 +723,7 @@ class TemplateLinkRenderer(val annotated: KAnnotated, val template: KDocTemplate
// TODO really dirty hack alert!!! // TODO really dirty hack alert!!!
// until the resolver is working, lets try adding a few prefixes :) // until the resolver is working, lets try adding a few prefixes :)
for (prefix in listOf("java.lang", "java.util", "java.util.concurrent", "java.util.regex", "java.io", for (prefix in listOf("java.lang", "java.util", "java.util.concurrent", "java.util.regex", "java.io",
"java.awt", "java.awt.event", "java.sql", "java.beans", "kotlin", "java.awt", "java.awt.event", "java.sql", "java.beans",
"javax.swing", "javax.swing.event", "javax.swing", "javax.swing.event",
"org.w3c.dom", "org.w3c.dom",
"kotlin.template")) { "kotlin.template")) {
@@ -894,11 +885,10 @@ abstract class KNamed(val name: String, model: KModel, descriptor: DeclarationDe
class KPackage( class KPackage(
model: KModel, model: KModel,
descriptor: PackageFragmentDescriptor, descriptors: List<PackageFragmentDescriptor>,
val name: String, val name: String,
var local: Boolean = false, val useExternalLink: Boolean = false
var useExternalLink: Boolean = false ): KClassOrPackage(model, descriptors.first()), Comparable<KPackage> {
): KClassOrPackage(model, descriptor), Comparable<KPackage> {
val classMap = sortedMapOf<String, KClass>() val classMap = sortedMapOf<String, KClass>()
val classes: Collection<KClass> val classes: Collection<KClass>