From c5ddfe5988a5b83e54ef25737f8bf31b0081bfae Mon Sep 17 00:00:00 2001 From: James Strachan Date: Wed, 22 Feb 2012 12:20:10 +0000 Subject: [PATCH] got a basic set of templates working to generate javadoc like output from a simple model of packages/classes/methods etc --- .../kotlin/org/jetbrains/kotlin/doc/KDoc.kt | 7 +- .../doc/templates/AllClassesFrameTemplate.kt | 5 +- .../kotlin/doc/templates/ClassTemplate.kt | 394 ++++++++++++++++++ .../kotlin/doc/templates/HelpDocTemplate.kt | 2 +- .../kotlin/doc/templates/HelperMethods.kt | 44 ++ .../kotlin/doc/templates/IndexTemplate.kt | 2 +- .../doc/templates/OverviewFrameTemplate.kt | 2 +- .../doc/templates/OverviewSummaryTemplate.kt | 2 +- .../doc/templates/OverviewTreeTemplate.kt | 2 +- .../doc/templates/PackageFrameTemplate.kt | 8 +- .../doc/templates/PackageListTemplate.kt | 2 +- .../doc/templates/PackageSummaryTemplate.kt | 40 +- .../org/jetbrains/kotlin/model/KotlinModel.kt | 96 ++++- .../test/kotlin/test/kotlin/doc/ModelTest.kt | 11 +- 14 files changed, 572 insertions(+), 45 deletions(-) create mode 100644 kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/ClassTemplate.kt create mode 100644 kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/HelperMethods.kt 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 94295682d1c..3ca1091696f 100644 --- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDoc.kt +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDoc.kt @@ -9,8 +9,8 @@ import java.io.File class KDocProcessor(val model: KModel, val outputDir: File) { fun execute(): Unit { - run("allclasses-frame.html", AllClassesFrameTemplate(model)) - run("allclasses-noframe.html", AllClassesFrameTemplate(model, " target=\"classFrame\"")) + run("allclasses-frame.html", AllClassesFrameTemplate(model, " target=\"classFrame\"")) + run("allclasses-noframe.html", AllClassesFrameTemplate(model)) // run("constant-values.html", ConstantValuesTemplate(model)) // run("deprecated-list.html", DeprecatedListTemplate(model)) run("help-doc.html", HelpDocTemplate(model)) @@ -29,6 +29,9 @@ class KDocProcessor(val model: KModel, val outputDir: File) { run("${p.nameAsPath}/package-summary.html", PackageSummaryTemplate(model, p)) //run("${p.nameAsPath}/package-tree.html", PackageTreeTemplate(model, p)) //run("${p.nameAsPath}/package-use.html", PackageUseTemplate(model, p)) + for (c in p.classes) { + run("${c.nameAsPath}.html", ClassTemplate(model, p, c)) + } } } diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/AllClassesFrameTemplate.kt b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/AllClassesFrameTemplate.kt index 8fabdfe12b9..972d4a3e071 100644 --- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/AllClassesFrameTemplate.kt +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/AllClassesFrameTemplate.kt @@ -7,7 +7,7 @@ import std.util.* import java.util.* import org.jetbrains.kotlin.model.KModel -class AllClassesFrameTemplate(val model: KModel, val classAttributes: String = "") : TextTemplate() { +class AllClassesFrameTemplate(val model: KModel, val classAttributes: String = "") : KDocTemplate() { override fun render() { // TODO could really do with templates in multi-line strings :) println(""" @@ -16,7 +16,8 @@ class AllClassesFrameTemplate(val model: KModel, val classAttributes: String = " """) println("") - println(""" + println(""" """) println("All Classes (${model.title})") print(""" 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 new file mode 100644 index 00000000000..fe7c95fb496 --- /dev/null +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/ClassTemplate.kt @@ -0,0 +1,394 @@ +package org.jetbrains.kotlin.doc.templates + +import std.* +import org.jetbrains.kotlin.template.* +import std.io.* +import std.util.* +import java.util.* +import org.jetbrains.kotlin.model.KModel +import org.jetbrains.kotlin.model.KPackage +import org.jetbrains.kotlin.model.KClass +import org.jetbrains.kotlin.model.KMethod +import org.jetbrains.kotlin.model.KAnnotation + +class ClassTemplate(val model: KModel, pkg: KPackage, val klass: KClass) : PackageTemplateSupport(pkg) { + override fun render() { + // TODO could really do with templates in multi-line strings :) + println(""" + + +""") + println("") + println(""" +""") + println("${klass.name} (${model.title})") + println(""" + + +""") + println("") + println(""" + + + + + + +
+ + + + + + + + + + + + +""") + + printPrevNextClass() + println(""" + + + + + +
+ +
+ + + +
+ +

+""") + println("${pkg.name}") + println("
") + println("Class ${klass.simpleName}

") + println("
")
+
+        // TODO base class...
+        val bc = klass.baseClass
+        if (bc != null) {
+            println(link(bc, true))
+        }
+        println("  \"extended${klass.name}")
+        println("""
+
+
""") + print("
")
+        printAnnotations(klass.annotations)
+        print("public class ${klass.simpleName}
") + if (bc != null) { + print("extends ") + println(link(bc)) + } + println("
") + println(""" + +

""") + println(klass.detailedDescription) + if (klass.since.size > 0 || klass.authors.size > 0) { + println("

") + println("

") + if (klass.since.size > 0) { + println("
Since:
") + println("
${klass.since}
") + } + for (author in klass.authors) { + println("
Author:
") + println("
${author}
") + } + println("
") + } + + println("""
+ +

""") + val nestedClasses = klass.nestedClasses + if (!nestedClasses.isEmpty()) { + println(""" + + + + + +""") + for (nc in nestedClasses) { + println(""" +""") + println("") + } + println(""" +
+Nested Class Summary
+static class${klass.simpleName}.${nc.simpleName}") + println("
") + println("          ${nc.description}") + println("
+ """) + } + + println(""" + + + + + +""") + + for (method in klass.methods) { + printMethodSummary(method) + } + + println("""
+Method Summary
+  +

+ + + + + + + + +
+Method Detail
+""") + for (method in klass.methods) { + printMethodDetail(method) + } + + println(""" +


+ + + + + + + + + + + +""") + printPrevNextClass() + println(""" + + + + + +
+ +
+ + + +
+Copyright © 2010-2012. All Rights Reserved. + +""") + } + + fun printPrevNextClass(): Unit { + println("""""") + val prev = pkg.previous(klass) + if (prev != null) { + println(" PREV CLASS ") + + } + val next = pkg.next(klass) + if (next != null) { + println(" NEXT CLASS") + } + println("""""") + } + + fun printMethodSummary(method: KMethod): Unit { + val deprecated = if (method.deprecated) "Deprecated." else "" + println(""" + + + + + + +
+""") + printTypeParameters(method) + + println("
") + print(link(method.returnType)) +println("""
+
""") + print("${method.name}") + printParameters(method) + println("") + println("") + println("
") + println("          ${deprecated} ${method.detailedDescription}") + println("") + } + + + fun printMethodDetail(method: KMethod): Unit { + println("

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

") +println("
")
+println("")
+        printAnnotations(method.annotations)
+        print("${method.modifiers.join(" ")} ")
+
+        printTypeParameters(method)
+        print(link(method.returnType))
+        print(" ${method.name}")
+        printParameters(method)
+        val exlist = method.exceptions
+        var first = true
+        if (!exlist.isEmpty()) {
+            println("                                throws ");
+            for (ex in exlist) {
+                if (first) first = false else print(", ")
+                print(link(ex))
+            }
+        }
+        println("
") + + /* TODO + println("""
+
Deprecated. TODO text +

+

Deprecated. +

+

+
+
Throws: +
${link(ex}
Since:
+
${since}
+
+
+
+*/ +println("
") + } + + fun printTypeParameters(method: KMethod): Unit { + val typeParameters = method.typeParameters + if (!typeParameters.isEmpty()) { + print("<") + var separator = "" + for (t in typeParameters) { + print(separator) + separator = ", " + print(t.name) + val elist = t.extends + if (!elist.isEmpty()) { + print(" extends ") + var esep = "" + for (e in elist) { + print(esep) + esep = " & " + print(link(e)) + } + } + } + print(">") + } + } + + fun printParameters(method: KMethod): Unit { + print("(") + var first = true + for (p in method.parameters) { + if (first) first = false else print(", ") + print("${p.name}: ") + print(link(p.klass)) + } + print(")") + } + + fun printAnnotations(annotations: Collection): Unit { + for (a in annotations) { + println(link(a)) + } + } +} diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/HelpDocTemplate.kt b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/HelpDocTemplate.kt index fb25a68f6b0..7a87904bf41 100644 --- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/HelpDocTemplate.kt +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/HelpDocTemplate.kt @@ -7,7 +7,7 @@ import std.util.* import java.util.* import org.jetbrains.kotlin.model.KModel -class HelpDocTemplate(val model: KModel) : TextTemplate() { +class HelpDocTemplate(val model: KModel) : KDocTemplate() { override fun render() { println(""" diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/HelperMethods.kt b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/HelperMethods.kt new file mode 100644 index 00000000000..e607137f5ac --- /dev/null +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/HelperMethods.kt @@ -0,0 +1,44 @@ +package org.jetbrains.kotlin.doc.templates + +import org.jetbrains.kotlin.model.KClass +import org.jetbrains.kotlin.model.KAnnotation +import org.jetbrains.kotlin.model.KPackage +import org.jetbrains.kotlin.template.TextTemplate + +abstract class KDocTemplate() : TextTemplate() { + fun href(pkg: KPackage): String { + return if (pkg.external) { + // TODO deal with external classes + "" + } else relativePrefix() + } + + fun href(c: KClass): String { + val postfix = if (c.pkg.external) "?is-external=true" else "" + return "${href(c.pkg)}${c.nameAsPath}.html$postfix" + } + + fun link(c: KClass, fullName: Boolean = false): String { + // TODO if a class is a generic type parameter, just return the name... + val prefix = if (c.isAnnotation()) "@" else "" + val name = if (fullName) c.name else c.simpleName + return "$prefix$name" + } + + fun link(a: KAnnotation): String { + val c = a.klass + return "@${c.simpleName}" + } + + protected open fun relativePrefix(): String = "" +} + +abstract class PackageTemplateSupport(private val _pkg: KPackage) : KDocTemplate() { + + // TODO this verbosity is to work around this bug: http://youtrack.jetbrains.com/issue/KT-1398 + public val pkg: KPackage + get() = _pkg + + protected override fun relativePrefix(): String = pkg.nameAsRelativePath + +} \ No newline at end of file diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/IndexTemplate.kt b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/IndexTemplate.kt index cf509056dfe..4a3e678049b 100644 --- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/IndexTemplate.kt +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/IndexTemplate.kt @@ -7,7 +7,7 @@ import std.util.* import java.util.* import org.jetbrains.kotlin.model.KModel -class IndexTemplate(val model: KModel) : TextTemplate() { +class IndexTemplate(val model: KModel) : KDocTemplate() { override fun render() { print(""" diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/OverviewFrameTemplate.kt b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/OverviewFrameTemplate.kt index d19a342a12c..be83a3bec56 100644 --- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/OverviewFrameTemplate.kt +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/OverviewFrameTemplate.kt @@ -7,7 +7,7 @@ import std.util.* import java.util.* import org.jetbrains.kotlin.model.KModel -class OverviewFrameTemplate(val model: KModel) : TextTemplate() { +class OverviewFrameTemplate(val model: KModel) : KDocTemplate() { override fun render() { // TODO could really do with templates in multi-line strings :) println(""" diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/OverviewSummaryTemplate.kt b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/OverviewSummaryTemplate.kt index 043ac5ded40..97a9d3bd58d 100644 --- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/OverviewSummaryTemplate.kt +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/OverviewSummaryTemplate.kt @@ -7,7 +7,7 @@ import std.util.* import java.util.* import org.jetbrains.kotlin.model.KModel -class OverviewSummaryTemplate(val model: KModel) : TextTemplate() { +class OverviewSummaryTemplate(val model: KModel) : KDocTemplate() { override fun render() { println(""" diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/OverviewTreeTemplate.kt b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/OverviewTreeTemplate.kt index 84f79c40033..963c5637809 100644 --- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/OverviewTreeTemplate.kt +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/OverviewTreeTemplate.kt @@ -7,7 +7,7 @@ import std.util.* import java.util.* import org.jetbrains.kotlin.model.KModel -class OverviewTreeTemplate(val model: KModel) : TextTemplate() { +class OverviewTreeTemplate(val model: KModel) : KDocTemplate() { override fun render() { println(""" diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageFrameTemplate.kt b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageFrameTemplate.kt index 4f0cdc42ecc..84450b5504d 100644 --- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageFrameTemplate.kt +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageFrameTemplate.kt @@ -8,7 +8,7 @@ import java.util.* import org.jetbrains.kotlin.model.KModel import org.jetbrains.kotlin.model.KPackage -class PackageFrameTemplate(val model: KModel, val pkg: KPackage) : TextTemplate() { +class PackageFrameTemplate(val model: KModel, p: KPackage) : PackageTemplateSupport(p) { override fun render() { // TODO could really do with templates in multi-line strings :) println(""" @@ -22,13 +22,13 @@ class PackageFrameTemplate(val model: KModel, val pkg: KPackage) : TextTemplate( println(""" """) -println("") +println("") println(""" """) - println("${pkg.name}") + println("${pkg.name}") printClasses("interface", "Interfaces") printClasses("class", "Classes") @@ -52,7 +52,7 @@ println("""
""") for (c in classes) { val formatted = if (kind == "interface") "${c.simpleName}" else c.simpleName - println("$formatted") + println("$formatted") println("
") } println(""" diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageListTemplate.kt b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageListTemplate.kt index c0096a43d7e..19109d99347 100644 --- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageListTemplate.kt +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageListTemplate.kt @@ -7,7 +7,7 @@ import std.util.* import java.util.* import org.jetbrains.kotlin.model.KModel -class PackageListTemplate(val model: KModel) : TextTemplate() { +class PackageListTemplate(val model: KModel) : KDocTemplate() { override fun render() { for (p in model.packages) { println(p.name) diff --git a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageSummaryTemplate.kt b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageSummaryTemplate.kt index ef1e8f1f8ff..91e537c8b3f 100644 --- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageSummaryTemplate.kt +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/templates/PackageSummaryTemplate.kt @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.model.KModel import org.jetbrains.kotlin.model.KPackage import org.jetbrains.kotlin.model.KClass -class PackageSummaryTemplate(val model: KModel, val pkg: KPackage) : TextTemplate() { +class PackageSummaryTemplate(val model: KModel, pkg: KPackage) : PackageTemplateSupport(pkg) { override fun render() { // TODO could really do with templates in multi-line strings :) println(""" @@ -24,7 +24,7 @@ class PackageSummaryTemplate(val model: KModel, val pkg: KPackage) : TextTemplat """) - println("") + println("") println(""" @@ -142,7 +142,7 @@ function windowTitle() println(""" """) @@ -167,14 +167,14 @@ function windowTitle() - + - - - + + +
@@ -188,17 +188,17 @@ function windowTitle() printNextPrevPackages() println("""""") - println(") FRAMES  ") + println(") FRAMES  ") println(""" NO FRAMES     @@ -227,7 +227,7 @@ Copyright © 2010-2012. All Rights Reserved. for (c in classes) { println("""""") - println("${c.simpleName}") + println("${c.simpleName}") println("${c.description}") println("") } @@ -244,11 +244,11 @@ Copyright © 2010-2012. All Rights Reserved. println("""""") val prev = model.previous(pkg) if (prev != null) { - println(" PREV PACKAGE ") + println(" PREV PACKAGE ") } val next = model.next(pkg) if (next != null) { - println(" NEXT PACKAGE") + println(" NEXT PACKAGE") } println("""""") 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 75c6e7aa7f1..367c2bcf21d 100644 --- a/kdoc/src/main/kotlin/org/jetbrains/kotlin/model/KotlinModel.kt +++ b/kdoc/src/main/kotlin/org/jetbrains/kotlin/model/KotlinModel.kt @@ -18,7 +18,7 @@ class KModel(var title: String = "Documentation", var version: String = "TODO") /* Returns the package for the given name, creating one if its not already been create yet */ fun getPackage(name: String): KPackage { - return packageMap.getOrPut(name){ KPackage(name) } + return packageMap.getOrPut(name){ KPackage(this, name) } } /* Returns the class for the given qualified name, creating one if its not already been created yet */ @@ -32,15 +32,18 @@ class KModel(var title: String = "Documentation", var version: String = "TODO") } fun previous(pkg: KPackage): KPackage? { + // TODO return null } fun next(pkg: KPackage): KPackage? { + // TODO return null } } -class KPackage(val name: String, var description: String = "", var detailedDescription: String = "") : Comparable { +class KPackage(val model: KModel, val name: String, var external: Boolean = false, + var description: String = "", var detailedDescription: String = "") : Comparable { override fun compareTo(other: KPackage): Int = name.compareTo(other.name) fun equals(other: KPackage) = name == other.name @@ -65,7 +68,10 @@ class KPackage(val name: String, var description: String = "", var detailedDescr /** Returns a relative path like ../.. for each path in the name */ public val nameAsRelativePath: String - get() = namePaths.map{ ".." }.join("/") + get() { + val answer = namePaths.map{ ".." }.join("/") + return if (answer.length == 0) "" else answer + "/" + } // TODO generates java.lang.NoSuchMethodError: std.util.namespace.hashMap(Ljet/TypeInfo;Ljet/TypeInfo;)Ljava/util/HashMap; //val classes = sortedMap() @@ -78,7 +84,9 @@ class KPackage(val name: String, var description: String = "", var detailedDescr /* Returns the class for the given name, creating one if its not already been create yet */ fun getClass(simpleName: String): KClass { - return classMap.getOrPut(simpleName){ KClass(this, simpleName) } + return classMap.getOrPut(simpleName) { + val base = if (simpleName == "Object" && name == "java.lang") null else model.getClass("java.lang.Object") + KClass(this, simpleName, base) } } fun qualifiedName(simpleName: String): String { @@ -89,13 +97,33 @@ class KPackage(val name: String, var description: String = "", var detailedDescr } } + + fun previous(pkg: KClass): KClass? { + // TODO + return null + } + + fun next(pkg: KClass): KClass? { + // TODO + return null + } + fun groupClassMap(): Map> { return classes.groupBy(TreeMap>()){it.group} } } -class KClass(val kpackage: KPackage, val simpleName: String, - var kind: String = "class", var group: String = "Other", var description: String = "") : Comparable { +class KClass(val pkg: KPackage, val simpleName: String, + var baseClass: KClass? = null, + var kind: String = "class", var group: String = "Other", + var description: String = "", var detailedDescription: String = "", + var annotations: List = arrayList(), + var since: String = "", + var authors: List = arrayList(), + var methods: List = arrayList(), + var nestedClasses: List = arrayList(), + var sourceLine: Int = 2) : Comparable { + override fun compareTo(other: KClass): Int = name.compareTo(other.name) fun equals(other: KClass) = name == other.name @@ -109,11 +137,63 @@ class KClass(val kpackage: KPackage, val simpleName: String, return $url } - public val name: String = kpackage.qualifiedName(simpleName) - public val packageName: String = kpackage.name + public val name: String = pkg.qualifiedName(simpleName) + public val packageName: String = pkg.name /** Returns the name as a directory using '/' instead of '.' */ public val nameAsPath: String get() = name.replace('.', '/') + + fun isAnnotation() = kind == "annotation" + fun isInterface() = kind == "interface" +} + +class KMethod(val name: String, + var returnType: KClass, + var description: String = "", var detailedDescription: String = "", + var deprecated: Boolean = false, + var modifiers: List = arrayList(), + var typeParameters: List = arrayList(), + var parameters: List = arrayList(), + var exceptions: List = arrayList(), + var annotations: List = arrayList()) : Comparable { + // TODO compare other things than just name :) + + override fun compareTo(other: KMethod): Int = name.compareTo(other.name) + + fun equals(other: KMethod) = name == other.name + + fun toString() = "fun ($name)" + + /** TODO generate a link with the argument type names */ + public val link: String = name + + /** Returns a list of generic type parameter names kinds like "A, I" */ + public val typeParametersText: String + get() = typeParameters.map{ it.name }.join(", ") +} + +class KParameter(val name: String, + var klass: KClass, + var description: String = "", var detailedDescription: String = "") { + + fun toString() = "$name: ${klass.name}" +} + +class KTypeParameter(val name: String, + var klass: KClass, + var extends: List = arrayList()) { + + fun toString() = if (extends.isEmpty()) name else { + "$name extends ${extends.map{it.name}.join(" & ")}" + } +} + +class KAnnotation(var klass: KClass, + var description: String = "", var detailedDescription: String = "") { + + // TODO add some parameter values? + + fun toString() = "@$klass.simpleName" } \ No newline at end of file diff --git a/kdoc/src/test/kotlin/test/kotlin/doc/ModelTest.kt b/kdoc/src/test/kotlin/test/kotlin/doc/ModelTest.kt index 91d961c2357..9438a0b4ca7 100644 --- a/kdoc/src/test/kotlin/test/kotlin/doc/ModelTest.kt +++ b/kdoc/src/test/kotlin/test/kotlin/doc/ModelTest.kt @@ -37,9 +37,14 @@ class ModelTest : TestCase() { } fun testModelWalk() { - model.getClass("something.else.Aaa") - model.getClass("something.else.Zzz") - model.getClass("another.Cheese") + val a = model.getClass("something.else.Aaa") + val z = model.getClass("something.else.Zzz") + val c = model.getClass("another.Cheese") + + c.methods.add(KMethod("addFoo", a, "add some foos")) + val m1 = KMethod("addZzzz", z, "add some zzz") + m1.parameters.add(KParameter("myz", z)) + c.methods.add(m1) // now lets iterate through the model println("Walking the model...")