diff --git a/kdoc/kdoc.iml b/kdoc/kdoc.iml index 9d8f6d6a742..a6c8df4a9f8 100644 --- a/kdoc/kdoc.iml +++ b/kdoc/kdoc.iml @@ -36,6 +36,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDoc.kt b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDoc.kt index ffb19457bca..7386f11fb81 100644 --- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDoc.kt +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDoc.kt @@ -14,6 +14,13 @@ import java.util.HashSet import com.intellij.psi.PsiElement import org.jetbrains.jet.lexer.JetTokens import org.jetbrains.jet.lang.descriptors.ClassDescriptor +import org.jetbrains.kotlin.model.KMethod +import org.jetbrains.jet.lang.descriptors.CallableDescriptor +import org.jetbrains.jet.lang.types.JetType +import org.jetbrains.kotlin.model.KClass +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor +import org.jetbrains.jet.lang.descriptors.ModuleDescriptor +import org.jetbrains.jet.lang.resolve.java.JavaNamespaceDescriptor class KDoc(val outputDir: File) : KDocSupport() { val model = KModel() @@ -39,24 +46,73 @@ class KDoc(val outputDir: File) : KDocSupport() { override fun addClass(namespace: NamespaceDescriptor?, classElement: ClassDescriptor?) { if (namespace != null && classElement != null) { - //val docComment = getDocCommentFor(classElement.sure()) ?: ""; - val name = classElement.getName() - val namespaceName = namespace.getName() ?: "" - val pkg = model.getPackage(namespaceName) - if (name != null) { - println("Found namespace ${namespaceName} class: ${name}") - pkg.getClass(name) + val klass = getOrCreateClass(classElement) + if (klass != null) { + klass.pkg.local = true } } } - override fun generate() { - /* - for (classElement in allClasses) { - if (classElement != null) { + protected fun containerName(descriptor: DeclarationDescriptor): String { + val container = descriptor.containingDeclaration + if (container == null || container is ModuleDescriptor || container is JavaNamespaceDescriptor) { + return "" + } else { + val parent = containerName(container) + val name = container.getName() ?: "" + val answer = if (parent.length() > 0) parent + "." + name else name + return if (answer.startsWith(".")) answer.substring(1) else answer + } + } + + protected fun getOrCreateClass(classElement: ClassDescriptor): KClass? { + //val docComment = getDocCommentFor(classElement.sure()) ?: ""; + val container = classElement.containingDeclaration + val namespaceName = containerName(classElement) + val pkg = model.getPackage(namespaceName) + val name = classElement.getName() + if (name != null) { + val klass = pkg.getClass(name) + klass.initialise { + val descriptors = classElement.getDefaultType().getMemberScope().getAllDescriptors() + for (descriptor in descriptors) { + if (descriptor is CallableDescriptor) { + val method = createMethod(descriptor) + if (method != null) { + klass.methods.add(method) + } } } - */ + } + return klass + } + return null + } + + protected fun createMethod(descriptor: CallableDescriptor): KMethod? { + val returnType = getType(descriptor.getReturnType()) + if (returnType != null) { + val method = KMethod(descriptor.getName() ?: "null", returnType) + val params = descriptor.getValueParameters() + for (param in params) { + + } + return method + } + return null + } + + protected fun getType(aType: JetType?): KClass? { + if (aType != null) { + val classifierDescriptor = aType.constructor.declarationDescriptor + if (classifierDescriptor is ClassDescriptor) { + return getOrCreateClass(classifierDescriptor) + } + } + return null + } + + override fun generate() { if (!model.packages.isEmpty()) { val generator = KDocGenerator(model, outputDir) generator.execute() @@ -79,6 +135,7 @@ class KDoc(val outputDir: File) : KDocSupport() { class KDocGenerator(val model: KModel, val outputDir: File) { fun execute(): Unit { + println("Generating kdoc to $outputDir") run("allclasses-frame.html", AllClassesFrameTemplate(model, " target=\"classFrame\"")) run("allclasses-noframe.html", AllClassesFrameTemplate(model)) // run("constant-values.html", ConstantValuesTemplate(model)) diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDocSupport.java b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDocSupport.java index cf0377796d3..035cb9e52d4 100644 --- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDocSupport.java +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDocSupport.java @@ -35,7 +35,10 @@ import java.util.Set; * TODO This class is written in Java for now to work around a few gremlins in Kotlin... */ public abstract class KDocSupport implements CompilerPlugin { + protected BindingContext context; + public void processFiles(BindingContext context, List sources) { + this.context = context; Set allNamespaces = new HashSet(); for (JetFile source : sources) { // We retrieve a descriptor by a PSI element from the context diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/ClassTemplate.kt b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/ClassTemplate.kt index fe7c95fb496..e157ad5cf09 100644 --- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/ClassTemplate.kt +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/ClassTemplate.kt @@ -285,21 +285,24 @@ Copyright © 2010-2012. All Rights Reserved. fun printMethodSummary(method: KMethod): Unit { val deprecated = if (method.deprecated) "Deprecated." else "" - println(""" + print(""" - - - - + if (!method.typeParameters.isEmpty()) { + println("""
""") - printTypeParameters(method) - - println("
") - print(link(method.returnType)) -println("""
+ + -
+ """) + printTypeParameters(method) + println("
") + print(link(method.returnType)) + println("""
-
""") +""") + } else { + print(link(method.returnType)) + } + println("") print("${method.name}") printParameters(method) println("") @@ -312,9 +315,9 @@ println(""" fun printMethodDetail(method: KMethod): Unit { println("

") -println("${method.name}

") -println("
")
-println("")
+        println("${method.name}")
+        println("
")
+        println("")
         printAnnotations(method.annotations)
         print("${method.modifiers.join(" ")} ")
 
@@ -348,7 +351,7 @@ println("")
 
 
 */
-println("
") + println("
") } fun printTypeParameters(method: KMethod): Unit { 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 367c2bcf21d..e8cf66d5020 100644 --- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/model/KotlinModel.kt +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/model/KotlinModel.kt @@ -11,7 +11,12 @@ class KModel(var title: String = "Documentation", var version: String = "TODO") //val packages = sortedMap() public val packageMap: SortedMap = TreeMap() - public val packages: Collection = packageMap.values().sure() + public val allPackages: Collection + get() = packageMap.values().sure() + + /** Returns the local packages */ + public val packages: Collection + get() = allPackages.filter{ it.local } public val classes: Collection get() = packages.flatMap{ it.classes } @@ -43,7 +48,8 @@ class KModel(var title: String = "Documentation", var version: String = "TODO") } class KPackage(val model: KModel, val name: String, var external: Boolean = false, - var description: String = "", var detailedDescription: String = "") : Comparable { + var description: String = "", var detailedDescription: String = "", + var local: Boolean = false) : Comparable { override fun compareTo(other: KPackage): Int = name.compareTo(other.name) fun equals(other: KPackage) = name == other.name @@ -124,6 +130,16 @@ class KClass(val pkg: KPackage, val simpleName: String, var nestedClasses: List = arrayList(), var sourceLine: Int = 2) : Comparable { + private var _initialised = false + + /** Runs the initialisation block if this class has not yet been initialised */ + fun initialise(fn: () -> Unit): Unit { + if (!_initialised) { + _initialised = true + fn() + } + } + override fun compareTo(other: KClass): Int = name.compareTo(other.name) fun equals(other: KClass) = name == other.name