From 89038227d86576956aeb36bd4d3dc5b58d3d6d2f Mon Sep 17 00:00:00 2001 From: James Strachan Date: Thu, 29 Mar 2012 08:58:58 +0100 Subject: [PATCH] first spike attempting to implement KT-1453 though hit a compiler error --- .../org/jetbrains/kotlin/doc/KDocCompiler.kt | 18 +++-- .../doc/highlighter/HtmlCompilerPlugin.kt | 23 ++++++ .../doc/highlighter/HtmlKotlinVisitor.kt | 72 +++++++++++++++++++ .../test/kotlin/kdoc/HtmlVisitorTest.kt | 31 ++++++++ libraries/kdoc/src/test/sample/Hello.kt | 8 +++ 5 files changed, 146 insertions(+), 6 deletions(-) create mode 100644 libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/highlighter/HtmlCompilerPlugin.kt create mode 100644 libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/highlighter/HtmlKotlinVisitor.kt create mode 100644 libraries/kdoc/src/test/kotlin/test/kotlin/kdoc/HtmlVisitorTest.kt create mode 100644 libraries/kdoc/src/test/sample/Hello.kt diff --git a/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDocCompiler.kt b/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDocCompiler.kt index 1ce3e6f6467..a88d5701fcc 100644 --- a/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDocCompiler.kt +++ b/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDocCompiler.kt @@ -1,14 +1,15 @@ package org.jetbrains.kotlin.doc +import java.io.File +import java.io.PrintStream +import org.jetbrains.jet.cli.CompilerArguments import org.jetbrains.jet.cli.KotlinCompiler import org.jetbrains.jet.compiler.CompileEnvironment -import org.jetbrains.jet.cli.CompilerArguments -import java.io.PrintStream -import java.io.File +import org.jetbrains.kotlin.doc.highlighter.HtmlCompilerPlugin /** - * Main for running the KDocCompiler - */ +* Main for running the KDocCompiler +*/ fun main(args: Array): Unit { KotlinCompiler.doMain(KDocCompiler(), args); } @@ -39,7 +40,12 @@ class KDocCompiler() : KotlinCompiler() { if (arguments is KDocArguments) { kdoc.config = arguments.apply() } - coreEnvironment.getCompilerPlugins().orEmpty().add(kdoc); + val plugins = coreEnvironment.getCompilerPlugins().orEmpty() +/* + val sourcePlugin = HtmlCompilerPlugin() + plugins.add(sourcePlugin) +*/ + plugins.add(kdoc); } } diff --git a/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/highlighter/HtmlCompilerPlugin.kt b/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/highlighter/HtmlCompilerPlugin.kt new file mode 100644 index 00000000000..7665f371fef --- /dev/null +++ b/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/highlighter/HtmlCompilerPlugin.kt @@ -0,0 +1,23 @@ +package org.jetbrains.kotlin.doc.highlighter + +import org.jetbrains.jet.compiler.CompilerPlugin +import org.jetbrains.jet.lang.resolve.BindingContext +import java.util.List +import org.jetbrains.jet.lang.psi.JetFile + +/** + */ +class HtmlCompilerPlugin : CompilerPlugin { + + override fun processFiles(bindingContext: BindingContext?, files: List?) { + if (files != null && bindingContext != null) { + for (file in files) { + if (file != null) { + val visitor = HtmlKotlinVisitor() + file.accept(visitor) + } + } + } + } + +} \ No newline at end of file diff --git a/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/highlighter/HtmlKotlinVisitor.kt b/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/highlighter/HtmlKotlinVisitor.kt new file mode 100644 index 00000000000..22a39deed60 --- /dev/null +++ b/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/highlighter/HtmlKotlinVisitor.kt @@ -0,0 +1,72 @@ +package org.jetbrains.kotlin.doc.highlighter + +import com.intellij.psi.PsiFile +import org.jetbrains.jet.lang.psi.* +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiWhiteSpace +import com.intellij.psi.PsiComment + +class HtmlKotlinVisitor: JetTreeVisitor() { + + override fun visitFile(file: PsiFile?) { + if (file is JetFile) { + val data = StringBuilder() + visitJetFile(file, data) + } + } + override fun visitJetFile(file: JetFile?, data: StringBuilder?): Void? { + if (file != null) { + println("============ Jet File ${file.getName()}") + val data = StringBuilder() + acceptChildren(file, data) + } + return null + } + + + override fun visitClassObject(classObject: JetClassObject?, data: StringBuilder?): Void? { + println("============ class $classObject data $data") + return super.visitClassObject(classObject, data) + } + + override fun visitClass(klass: JetClass?, data: StringBuilder?): Void? { + println("============ class $klass") + if (klass != null) { + acceptChildren(klass, data) + return null + } else { + return super.visitClass(klass, data) + } + } + + + override fun visitClassBody(classBody: JetClassBody?, data: StringBuilder?): Void? { + println("============ class body $classBody data $data") + return super.visitClassBody(classBody, data) + } + + + override fun visitFunctionType(fnType: JetFunctionType?, data: StringBuilder?): Void? { + println("======================= function Type $fnType") + return super.visitFunctionType(fnType, data) + } + + protected fun accept(child: PsiElement?, data: StringBuilder?): Unit { + if (child is JetElement) { + child.accept(this, data) + } else { + if (child is PsiComment || child is PsiWhiteSpace) { + // ignore + } else { + println("------- Child $child of type ${child.javaClass}") + } + child?.accept(this) + } + } + + protected fun acceptChildren(element: PsiElement, data: StringBuilder?): Unit { + for (child in element.getChildren()) { + accept(child, data) + } + } +} \ No newline at end of file diff --git a/libraries/kdoc/src/test/kotlin/test/kotlin/kdoc/HtmlVisitorTest.kt b/libraries/kdoc/src/test/kotlin/test/kotlin/kdoc/HtmlVisitorTest.kt new file mode 100644 index 00000000000..2c9a8977659 --- /dev/null +++ b/libraries/kdoc/src/test/kotlin/test/kotlin/kdoc/HtmlVisitorTest.kt @@ -0,0 +1,31 @@ +package test.kotlin.kdoc + +import java.io.File +import kotlin.test.assertTrue +import org.jetbrains.jet.cli.CompilerArguments +import org.jetbrains.jet.cli.KotlinCompiler +import org.jetbrains.kotlin.doc.highlighter.HtmlCompilerPlugin +import org.junit.Test + +class HtmlVisitorTest { + + Test fun generateHtmlFromSource() { + val src = "src/test/sample" + var dir = File(".") + if (!File(dir, src).exists()) { + dir = File("kdoc") + assertTrue(File(dir, src).exists(), "Cannot find file $src") + } + val srcDir = File(dir, src) + val outDir = File(dir, "target/htmldocs") + println("Generating source HTML to $outDir") + + val args = CompilerArguments() + args.setSrc(srcDir.toString()) + args.setOutputDir(File(dir, "target/classes-htmldocs").toString()) + args.getCompilerPlugins()?.add(HtmlCompilerPlugin()) + + val compiler = KotlinCompiler() + compiler.exec(System.out, args) + } +} \ No newline at end of file diff --git a/libraries/kdoc/src/test/sample/Hello.kt b/libraries/kdoc/src/test/sample/Hello.kt new file mode 100644 index 00000000000..c6ae3c70c87 --- /dev/null +++ b/libraries/kdoc/src/test/sample/Hello.kt @@ -0,0 +1,8 @@ +package sample + +/** A Comment */ +class Person(val name: String, val city: String) { + fun toString(): String = "Person($name, $city)" + + fun hello(): String = "Hello $name" +} \ No newline at end of file