From beedd364561a08c3f875358672c963c4508dc6f8 Mon Sep 17 00:00:00 2001 From: James Strachan Date: Thu, 29 Mar 2012 16:35:58 +0100 Subject: [PATCH] refactored out the KDocLoader stuff from the KotlinCompiler; also introduced CompilerPluginContext to wrap up the Project, BindingContext and List in case a plugin were to need any of those things (or we added extra stuff later like the environment) --- build-tools/build.xml | 6 ++ build.xml | 3 + .../jetbrains/jet/cli/CompilerArguments.java | 11 -- .../src/org/jetbrains/jet/cli/KDocLoader.java | 100 ------------------ .../org/jetbrains/jet/cli/KotlinCompiler.java | 4 +- .../jet/compiler/CompilerPlugin.java | 20 ++-- .../jet/compiler/CompilerPluginContext.java | 51 +++++++++ .../kotlin/org/jetbrains/kotlin/doc/KDoc.kt | 3 +- .../org/jetbrains/kotlin/doc/KDocCompiler.kt | 22 +--- .../org/jetbrains/kotlin/doc/KDocConfig.kt | 5 + .../doc/highlighter/HtmlCompilerPlugin.kt | 27 ++--- .../kotlin/doc/model/KModelCompilerPlugin.kt | 49 +++------ .../test/kotlin/test/kotlin/kdoc/KDocTest.kt | 2 +- .../jetbrains/kotlin/site/GenerateSiteTest.kt | 4 +- 14 files changed, 108 insertions(+), 199 deletions(-) delete mode 100644 compiler/cli/src/org/jetbrains/jet/cli/KDocLoader.java create mode 100644 compiler/cli/src/org/jetbrains/jet/compiler/CompilerPluginContext.java diff --git a/build-tools/build.xml b/build-tools/build.xml index eab64cdbe34..50e4caf01d9 100644 --- a/build-tools/build.xml +++ b/build-tools/build.xml @@ -468,14 +468,20 @@ + + + + + diff --git a/build.xml b/build.xml index 6cd1595e29e..223da993e32 100644 --- a/build.xml +++ b/build.xml @@ -170,6 +170,9 @@ + + + diff --git a/compiler/cli/src/org/jetbrains/jet/cli/CompilerArguments.java b/compiler/cli/src/org/jetbrains/jet/cli/CompilerArguments.java index 1b2e31f153c..047e7c3cdd6 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/CompilerArguments.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/CompilerArguments.java @@ -32,9 +32,6 @@ public class CompilerArguments { @Argument(value = "output", description = "output directory") public String outputDir; - @Argument(value = "docOutput", description = "KDoc output directory") - public String docOutputDir; - @Argument(value = "jar", description = "jar file name") public String jar; @@ -77,14 +74,6 @@ public class CompilerArguments { this.classpath = classpath; } - public String getDocOutputDir() { - return docOutputDir; - } - - public void setDocOutputDir(String docOutputDir) { - this.docOutputDir = docOutputDir; - } - public boolean isHelp() { return help; } diff --git a/compiler/cli/src/org/jetbrains/jet/cli/KDocLoader.java b/compiler/cli/src/org/jetbrains/jet/cli/KDocLoader.java deleted file mode 100644 index c1850b27448..00000000000 --- a/compiler/cli/src/org/jetbrains/jet/cli/KDocLoader.java +++ /dev/null @@ -1,100 +0,0 @@ -/** - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.jet.cli; - -import com.google.common.collect.Lists; -import com.intellij.lang.ASTNode; -import com.intellij.openapi.Disposable; -import com.intellij.psi.PsiElement; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.compiler.CompilerPlugin; -import org.jetbrains.jet.compiler.JetCoreEnvironment; -import org.jetbrains.jet.lang.descriptors.ClassDescriptor; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.psi.JetFile; -import org.jetbrains.jet.lang.psi.JetPsiFactory; -import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.lexer.JetTokens; -import org.jetbrains.jet.resolve.DescriptorRenderer; - -import java.io.File; -import java.lang.reflect.Constructor; -import java.util.Collection; -import java.util.List; - -/** - * A simple facade to auto-detect the KDoc processor if its available on the classpath - */ -public class KDocLoader { - - private final String outputDir; - - public KDocLoader(String outputDir) { - this.outputDir = outputDir; - } - - public CompilerPlugin createCompilerPlugin() { - // lets see if we can see the KDoc class - String name = "org.jetbrains.kotlin.doc.KDoc"; - Class aClass = null; - try { - aClass = loadClass(name); - } catch (ClassNotFoundException e) { - System.out.println("Could not find class: " + name); - return null; - } - if (aClass != null) { - try { - File dir = new File(outputDir); - Constructor constructor = aClass.getConstructor(File.class); - if (constructor != null) { - return (CompilerPlugin) constructor.newInstance(dir); - } - } catch (Exception e) { - System.out.println("Failed to create Processor: " + e); - } - } - return null; - } - - public static Class loadClass(String name) throws ClassNotFoundException { - try { - return Class.forName(name); - } catch (ClassNotFoundException e) { - try { - return Thread.currentThread().getContextClassLoader().loadClass(name); - } catch (ClassNotFoundException e1) { - return KDocLoader.class.getClassLoader().loadClass(name); - } - } - } - - /** - * Installs the KDoc compiler plugin if it can be created - */ - public static boolean install(String docOutputDir, JetCoreEnvironment environment) { - KDocLoader loader = new KDocLoader(docOutputDir); - CompilerPlugin processor = loader.createCompilerPlugin(); - if (processor != null) { - environment.getCompilerPlugins().add(processor); - return true; - } else { - return false; - } - } -} diff --git a/compiler/cli/src/org/jetbrains/jet/cli/KotlinCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/KotlinCompiler.java index 33c9df6b514..c7ea21b4323 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/KotlinCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/KotlinCompiler.java @@ -166,13 +166,13 @@ public class KotlinCompiler { environment.setStubs(arguments.stubs); if (arguments.docOutputDir != null) { - KDocLoader.install(arguments.docOutputDir, environment.getEnvironment()); + KDocLoader.install(arguments.docOutputDir, environment.getMyEnvironment()); } // install any compiler plugins List plugins = arguments.getCompilerPlugins(); if (plugins != null) { - environment.getEnvironment().getCompilerPlugins().addAll(plugins); + environment.getMyEnvironment().getCompilerPlugins().addAll(plugins); } if (arguments.stdlib != null) { diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/CompilerPlugin.java b/compiler/cli/src/org/jetbrains/jet/compiler/CompilerPlugin.java index 24905cda477..bc2db80c71e 100644 --- a/compiler/cli/src/org/jetbrains/jet/compiler/CompilerPlugin.java +++ b/compiler/cli/src/org/jetbrains/jet/compiler/CompilerPlugin.java @@ -1,11 +1,9 @@ -/** +/* + * Copyright 2010-2012 JetBrains s.r.o. * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * @@ -15,17 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.jetbrains.jet.compiler; -import org.jetbrains.jet.lang.psi.JetFile; -import org.jetbrains.jet.lang.resolve.BindingContext; - -import java.util.List; - /** * A simple interface for compiler plugins to run after the compiler has finished such as for things like * generating documentation or code generation etc */ public interface CompilerPlugin { - void processFiles(BindingContext context, List sources); + void processFiles(CompilerPluginContext context); } diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/CompilerPluginContext.java b/compiler/cli/src/org/jetbrains/jet/compiler/CompilerPluginContext.java new file mode 100644 index 00000000000..8ce1d7ef805 --- /dev/null +++ b/compiler/cli/src/org/jetbrains/jet/compiler/CompilerPluginContext.java @@ -0,0 +1,51 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.compiler; + +import com.intellij.openapi.project.Project; +import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.resolve.BindingContext; + +import java.util.List; + +/** + * Represents the context of available state in which a {@link CompilerPlugin} runs such as + * the {@link Project}, the {@link BindingContext} and the underlying {@link JetFile} files. + */ +public class CompilerPluginContext { + private final Project project; + private final BindingContext context; + private final List files; + + public CompilerPluginContext(Project project, BindingContext context, List files) { + this.project = project; + this.context = context; + this.files = files; + } + + public BindingContext getContext() { + return context; + } + + public List getFiles() { + return files; + } + + public Project getProject() { + return project; + } +} diff --git a/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDoc.kt b/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDoc.kt index 24baf88596e..9e0c94a173c 100644 --- a/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDoc.kt +++ b/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDoc.kt @@ -32,12 +32,13 @@ import org.jetbrains.jet.util.slicedmap.WritableSlice import org.jetbrains.jet.lang.resolve.BindingContextUtils /** Generates the Kotlin Documentation for the model */ -class KDoc(val outputDir: File) : KModelCompilerPlugin() { +class KDoc() : KModelCompilerPlugin() { override fun processModel(model: KModel) { // TODO allow this to be configured; maybe we use configuration on the KotlinModule // to define what doclets to use? val generator = JavadocStyleHtmlDoclet() + val outputDir = File(config.docOutputDir) generator.generate(model, outputDir) } } 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 a88d5701fcc..3bb81a3502d 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 @@ -14,7 +14,6 @@ fun main(args: Array): Unit { KotlinCompiler.doMain(KDocCompiler(), args); } - /** * A version of the [[KotlinCompiler]] which includes the [[KDoc]] compiler plugin and allows * command line validation or for the configuration to be provided via [[KDocArguments]] @@ -22,20 +21,10 @@ fun main(args: Array): Unit { class KDocCompiler() : KotlinCompiler() { override fun configureEnvironment(environment : CompileEnvironment?, arguments : CompilerArguments?, errStream : PrintStream?) { - // TODO lets clear the docOutput as a temporary hack while - // KotlinCompiler has a KDoc hook... - val docOutputDir = if (arguments != null) { - val answer = arguments.docOutputDir - arguments.docOutputDir = null - answer - } else null - super.configureEnvironment(environment, arguments, errStream) val coreEnvironment = environment?.getMyEnvironment() if (coreEnvironment != null) { - // now lets add the KDoc plugin - val outDir = File(docOutputDir ?: "target/apidocs") - val kdoc = KDoc(outDir) + val kdoc = KDoc() if (arguments is KDocArguments) { kdoc.config = arguments.apply() @@ -69,13 +58,4 @@ class KDocArguments() : CompilerArguments() { // TODO... return docConfig } - - - /** - * Add more configurations here when value attributes supported - * see: KT-1522 - - @Argument(value = "docOutput", description = "KDoc output directory") - public String docOutputDir; - */ } diff --git a/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDocConfig.kt b/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDocConfig.kt index 8940de717b6..50065d41567 100644 --- a/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDocConfig.kt +++ b/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDocConfig.kt @@ -10,6 +10,11 @@ import org.jetbrains.kotlin.doc.model.KPackage */ class KDocConfig() { + /** + * Returns the directory to use to output the API docs + */ + public var docOutputDir: String = "target/site/apidocs" + /** * Returns the name of the documentation set */ 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 index 7665f371fef..1e178aa2ad0 100644 --- 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 @@ -1,23 +1,26 @@ 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 +import org.jetbrains.jet.compiler.CompilerPluginContext /** - */ -class HtmlCompilerPlugin : CompilerPlugin { +*/ +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) + override fun processFiles(context: CompilerPluginContext?) { + if (context != null) { + val bindingContext = context.getContext() + val files = context.getFiles() + if (bindingContext != null && files != null) { + 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/model/KModelCompilerPlugin.kt b/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/model/KModelCompilerPlugin.kt index 90dc4352335..6696e3168cc 100644 --- a/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/model/KModelCompilerPlugin.kt +++ b/libraries/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/model/KModelCompilerPlugin.kt @@ -1,48 +1,25 @@ package org.jetbrains.kotlin.doc.model -import kotlin.* -import kotlin.util.* - -import org.jetbrains.kotlin.doc.KDocConfig -import org.jetbrains.kotlin.doc.templates.* -import org.jetbrains.kotlin.template.TextTemplate - -import java.io.File -import java.util.List -import java.util.HashSet -import java.util.Collection - -import com.intellij.psi.PsiElement -import org.jetbrains.jet.lang.resolve.BindingContext -import org.jetbrains.jet.lang.resolve.BindingContext.* import org.jetbrains.jet.compiler.CompilerPlugin -import org.jetbrains.jet.lang.psi.JetFile -import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor -import org.jetbrains.jet.lexer.JetTokens -import org.jetbrains.jet.lang.descriptors.ClassDescriptor -import org.jetbrains.jet.lang.descriptors.CallableDescriptor -import org.jetbrains.jet.lang.types.JetType -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor -import org.jetbrains.jet.lang.descriptors.ModuleDescriptor -import org.jetbrains.jet.lang.resolve.java.JavaNamespaceDescriptor -import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor -import org.jetbrains.jet.lang.resolve.scopes.JetScope -import org.jetbrains.jet.lang.resolve.scopes.receivers.ExtensionReceiver -import org.jetbrains.jet.util.slicedmap.WritableSlice -import org.jetbrains.jet.lang.resolve.BindingContextUtils - +import org.jetbrains.jet.compiler.CompilerPluginContext +import org.jetbrains.kotlin.doc.KDocConfig /** Base class for any compiler plugin which needs to process a KModel */ -abstract class KModelCompilerPlugin : CompilerPlugin { +abstract class KModelCompilerPlugin: CompilerPlugin { public open var config: KDocConfig = KDocConfig() - override fun processFiles(context: BindingContext?, sources: List?) { - if (context != null && sources != null) { - val model = KModel(context, config) - model.load(sources) - processModel(model) + override fun processFiles(context: CompilerPluginContext?) { + if (context != null) { + val bindingContext = context.getContext() + val sources = context.getFiles() + if (bindingContext != null && sources != null) { + val model = KModel(bindingContext, config) + model.load(sources) + + processModel(model) + } } } diff --git a/libraries/kdoc/src/test/kotlin/test/kotlin/kdoc/KDocTest.kt b/libraries/kdoc/src/test/kotlin/test/kotlin/kdoc/KDocTest.kt index ed26d2d3887..e860b62f44e 100644 --- a/libraries/kdoc/src/test/kotlin/test/kotlin/kdoc/KDocTest.kt +++ b/libraries/kdoc/src/test/kotlin/test/kotlin/kdoc/KDocTest.kt @@ -24,10 +24,10 @@ class KDocTest { val args = KDocArguments() args.setModule(moduleName) - args.setDocOutputDir(outDir.toString()) args.setOutputDir("target/classes-stdlib") val config = args.docConfig + config.docOutputDir = outDir.toString()!! config.title = "Kotlin API" config.ignorePackages.add("org.jetbrains.kotlin") config.ignorePackages.add("java") diff --git a/libraries/website/src/test/kotlin/org/jetbrains/kotlin/site/GenerateSiteTest.kt b/libraries/website/src/test/kotlin/org/jetbrains/kotlin/site/GenerateSiteTest.kt index 62e5b0c6c86..a4e9e3ec629 100644 --- a/libraries/website/src/test/kotlin/org/jetbrains/kotlin/site/GenerateSiteTest.kt +++ b/libraries/website/src/test/kotlin/org/jetbrains/kotlin/site/GenerateSiteTest.kt @@ -24,10 +24,10 @@ class GenerateSiteTest : TestCase() { copyDocResources(outDir) val args = KDocArguments() args.setModule("../kdoc/ApiDocsModule.kt") - args.setDocOutputDir(outDir.toString()) args.setOutputDir("target/classes-stdlib") val config = args.docConfig + config.docOutputDir = outDir.getPath()!! config.title = "Kotlin API ($version)" config.version = version config.ignorePackages.add("kotlin.support") @@ -49,10 +49,10 @@ class GenerateSiteTest : TestCase() { copyDocResources(outDir) val args = KDocArguments() args.setModule("../../js/js.libraries/module.kt") - args.setDocOutputDir(outDir.toString()) args.setOutputDir("target/classes-js") val config = args.docConfig + config.docOutputDir = outDir.getPath()!! config.title = "Kotlin JS API ($version)" config.version = version config.ignorePackages.add("java")