From 338bc2f9ec7ab1216067d06713e4e2e02b590668 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 14 Mar 2014 22:08:21 +0400 Subject: [PATCH] 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 --- libraries/docs/apidoc/pom.xml | 2 + .../jetbrains/kotlin/doc/model/KotlinModel.kt | 86 ++++++++----------- 2 files changed, 40 insertions(+), 48 deletions(-) diff --git a/libraries/docs/apidoc/pom.xml b/libraries/docs/apidoc/pom.xml index 759e4239a70..f9e323e708d 100644 --- a/libraries/docs/apidoc/pom.xml +++ b/libraries/docs/apidoc/pom.xml @@ -40,6 +40,8 @@ ${project.version} + ${basedir}/../../../core/builtins/native + ${basedir}/../../../core/builtins/src ${basedir}/../../stdlib/src ${basedir}/../../kunit/src/main/kotlin ${basedir}/../../kotlin-jdbc/src/main/kotlin diff --git a/libraries/tools/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/model/KotlinModel.kt b/libraries/tools/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/model/KotlinModel.kt index 083ba6c3e0b..29ff98e6fd2 100644 --- a/libraries/tools/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/model/KotlinModel.kt +++ b/libraries/tools/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/model/KotlinModel.kt @@ -132,7 +132,7 @@ fun extensionProperties(properties: Collection): Map() open val properties = sortedSetOf() @@ -158,9 +158,9 @@ class KModel(val context: BindingContext, val config: KDocConfig, val sourceDirs val allPackages: Collection get() = packageMap.values() - /** Returns the local packages */ + /** Returns the packages that should be included in the report */ val packages: Collection - get() = allPackages.filter { it.local && config.includePackage(it) } + get() = allPackages.filter { config.includePackage(it) } val classes: Collection 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") } } - val allClasses = HashSet() - for (packageFragment in allPackageFragments) { - getPackage(packageFragment) - for (descriptor in packageFragment.getMemberScope().getAllDescriptors()) { - if (descriptor is ClassDescriptor) { - val klass = getClass(descriptor) - if (klass != null) { - allClasses.add(klass) + + for ((name, packageFragments) in allPackageFragments.groupBy { qualifiedName(it) }) { + createPackage(packageFragments, name) + + for (packageFragment in packageFragments) { + for (descriptor in packageFragment.getMemberScope().getAllDescriptors()) { + if (descriptor is ClassDescriptor) { + getClass(descriptor) } } } @@ -264,27 +264,31 @@ class KModel(val context: BindingContext, val config: KDocConfig, val sourceDirs fun getPackage(name: String): KPackage? = packageMap.get(name) /** 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) - 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()) { - // lets try find a custom doc - var file = config.packageDescriptionFiles[name] - loadWikiDescription(pkg, file) - } + val pkg = packageMap[name] + if (pkg != null) return pkg + + return createPackage(listOf(descriptor), name) + } + + private fun createPackage(descriptors: List, 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 { @@ -345,19 +349,6 @@ class KModel(val context: BindingContext, val config: KDocConfig, val sourceDirs 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 { try { val descriptors = scope.getAllDescriptors() @@ -685,7 +676,7 @@ $highlight""" while (dec != null) { val container = dec if (container is PackageFragmentDescriptor) { - val pkg = getPackage(container) + val pkg = getOrCreatePackage(container) return pkg.getClass(classElement) } else { dec = dec?.getContainingDeclaration() @@ -732,7 +723,7 @@ class TemplateLinkRenderer(val annotated: KAnnotated, val template: KDocTemplate // TODO really dirty hack alert!!! // 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", - "java.awt", "java.awt.event", "java.sql", "java.beans", + "kotlin", "java.awt", "java.awt.event", "java.sql", "java.beans", "javax.swing", "javax.swing.event", "org.w3c.dom", "kotlin.template")) { @@ -894,11 +885,10 @@ abstract class KNamed(val name: String, model: KModel, descriptor: DeclarationDe class KPackage( model: KModel, - descriptor: PackageFragmentDescriptor, + descriptors: List, val name: String, - var local: Boolean = false, - var useExternalLink: Boolean = false -): KClassOrPackage(model, descriptor), Comparable { + val useExternalLink: Boolean = false +): KClassOrPackage(model, descriptors.first()), Comparable { val classMap = sortedMapOf() val classes: Collection