From abe72e5adc424b7ab9f42c8442cd48280c8f8638 Mon Sep 17 00:00:00 2001 From: James Strachan Date: Thu, 29 Mar 2012 20:48:06 +0100 Subject: [PATCH] added a spike of a pure Java set of kotlin maven plugins which use the kotlin-compiler, build tools and associated dependencies from the Ant build. The kotlin-install module installs all the Ant build stuff into the local mvn repo, so they can be shaded and included into the plugin itself so it can be easily used from any mvn like build --- libraries/kotlin-install/pom.xml | 129 ++++++++++++++ libraries/kotlin-maven-plugin/ReadMe.md | 2 +- libraries/kotlin-maven-plugin/pom.xml | 159 +++++++++++++----- .../kotlin/maven/K2JSCompilerMojo.java | 30 ++++ .../kotlin/maven/K2JSCompilerPlugin.java | 79 +++++++++ .../kotlin/maven/KotlinBaseMojo.java | 51 ++++++ .../kotlin/maven/KotlinCompileMojo.kt | 17 -- .../kotlin/maven/KotlinMojoSupport.kt | 15 -- .../org/jetbrains/kotlin/maven/MojoTest.java | 10 ++ .../src/test/kotlin/MojoTest.kt | 9 - libraries/pom.xml | 3 + 11 files changed, 423 insertions(+), 81 deletions(-) create mode 100644 libraries/kotlin-install/pom.xml create mode 100644 libraries/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerMojo.java create mode 100644 libraries/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerPlugin.java create mode 100644 libraries/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinBaseMojo.java delete mode 100644 libraries/kotlin-maven-plugin/src/main/kotlin/org/jetbrains/kotlin/maven/KotlinCompileMojo.kt delete mode 100644 libraries/kotlin-maven-plugin/src/main/kotlin/org/jetbrains/kotlin/maven/KotlinMojoSupport.kt create mode 100644 libraries/kotlin-maven-plugin/src/test/java/org/jetbrains/kotlin/maven/MojoTest.java delete mode 100644 libraries/kotlin-maven-plugin/src/test/kotlin/MojoTest.kt diff --git a/libraries/kotlin-install/pom.xml b/libraries/kotlin-install/pom.xml new file mode 100644 index 00000000000..7f4d8058f67 --- /dev/null +++ b/libraries/kotlin-install/pom.xml @@ -0,0 +1,129 @@ + + + + 4.0.0 + + 1.4.1 + 3.0.4 + + + + org.jetbrains.kotlin + kotlin-project + 1.0-SNAPSHOT + + + kotlin-install + pom + + Installs the Kotlin runtime dependencies into the local maven repo + + + + + org.apache.maven.plugins + maven-install-plugin + + + org.jetbrains.kotlin:kotlin-compiler + verify + + install-file + + + org.jetbrains.kotlin + kotlin-compiler + ${project.version} + jar + ${kotlin-sdk}/lib/kotlin-compiler.jar + true + true + + + + org.jetbrains.kotlin:kotlin-build-tools + verify + + install-file + + + org.jetbrains.kotlin + kotlin-build-tools + ${project.version} + jar + ${kotlin-sdk}/lib/kotlin-build-tools.jar + true + true + + + + org.jetbrains.kotlin:intellij-core + verify + + install-file + + + org.jetbrains.kotlin + intellij-core + ${project.version} + jar + ${kotlin-sdk}/lib/intellij-core.jar + true + true + + + + org.jetbrains.kotlin:intellij-annotations + verify + + install-file + + + org.jetbrains.kotlin + intellij-annotations + ${project.version} + jar + ${kotlin-sdk}/lib/annotations.jar + true + true + + + + org.jetbrains.kotlin:trove4j + verify + + install-file + + + org.jetbrains.kotlin + trove4j + ${project.version} + jar + ${kotlin-sdk}/lib/trove4j.jar + true + true + + + + org.jetbrains.kotlin:picocontainer + verify + + install-file + + + org.jetbrains.kotlin + picocontainer + ${project.version} + jar + ${kotlin-sdk}/lib/picocontainer.jar + true + true + + + + + + + diff --git a/libraries/kotlin-maven-plugin/ReadMe.md b/libraries/kotlin-maven-plugin/ReadMe.md index 942e776a84c..88a32b84cf1 100644 --- a/libraries/kotlin-maven-plugin/ReadMe.md +++ b/libraries/kotlin-maven-plugin/ReadMe.md @@ -1,4 +1,4 @@ -## NOTE - this is just an initial spike so far as Kotlin doesn't support value annotations yet +## NOTE - this is just an initial spike of some maven plugins Until this plugin is working, please use this maven plugin: http://evgeny-goldin.com/wiki/Kotlin-maven-plugin \ No newline at end of file diff --git a/libraries/kotlin-maven-plugin/pom.xml b/libraries/kotlin-maven-plugin/pom.xml index 7ad2fd28444..1c097731cf1 100644 --- a/libraries/kotlin-maven-plugin/pom.xml +++ b/libraries/kotlin-maven-plugin/pom.xml @@ -16,61 +16,142 @@ kotlin-maven-plugin + maven-plugin - - org.jfrog.maven.annomojo - maven-plugin-anno - ${maven-plugin-anno.version} - org.apache.maven maven-plugin-api ${maven.version} + + + + org.jetbrains.kotlin + stdlib + ${project.version} + + + org.jetbrains.kotlin + kotlin-compiler + ${project.version} + + + org.jetbrains.kotlin + kotlin-build-tools + ${project.version} + + + org.jetbrains.kotlin + intellij-core + ${project.version} + + + org.jetbrains.kotlin + intellij-annotations + ${project.version} + + + + com.google.guava + guava + ${guava.version} + + + asm + asm + ${asm.version} + + + asm + asm-tree + ${asm.version} + + + asm + asm-commons + ${asm.version} + + + asm + asm-util + ${asm.version} + + + org.jetbrains.kotlin + trove4j + ${project.version} + + + + org.jetbrains.kotlin + picocontainer + ${project.version} + + - - - + src/main/java + src/test/java - - - - + + + org.apache.maven.plugins + maven-compiler-plugin + org.apache.maven.plugins maven-plugin-plugin 2.9 - - - org.apache.maven.plugin-tools - maven-plugin-tools-api - 2.9 - - - org.jfrog.maven.annomojo - maven-plugin-tools-anno - ${maven-plugin-anno.version} - runtime - - + + + + org.apache.maven.plugins + maven-shade-plugin + 1.6 + + + package + + shade + + + + + + org.jetbrains.kotlin:* + + + org.jetbrains.kotlin:stdlib + + + + + - - - - download - - - jfrog-plugins - jfrog-plugins-dist - http://repo.jfrog.org/artifactory/plugins-releases - - - - - diff --git a/libraries/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerMojo.java b/libraries/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerMojo.java new file mode 100644 index 00000000000..f94c5924849 --- /dev/null +++ b/libraries/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerMojo.java @@ -0,0 +1,30 @@ +package org.jetbrains.kotlin.maven; + +import org.jetbrains.jet.cli.CompilerArguments; + +/** + * Converts Kotlin to JavaScript code + * + * @goal js + * @phase compile + */ +public class K2JSCompilerMojo extends KotlinBaseMojo { + + private String outFile; + + @Override + protected void configureCompilerArguments(CompilerArguments arguments) { + super.configureCompilerArguments(arguments); + K2JSCompilerPlugin plugin = new K2JSCompilerPlugin(); + plugin.setOutFile(outFile); + arguments.getCompilerPlugins().add(plugin); + getLog().info("Compiling Kotlin src from " + arguments.getSrc() + " to JavaScript at: " + outFile); + } + + @Override + protected CompilerArguments createCompilerArguments() { + CompilerArguments answer = new CompilerArguments(); + return answer; + + } +} diff --git a/libraries/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerPlugin.java b/libraries/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerPlugin.java new file mode 100644 index 00000000000..5396e79b0d9 --- /dev/null +++ b/libraries/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerPlugin.java @@ -0,0 +1,79 @@ +package org.jetbrains.kotlin.maven; + +import com.intellij.openapi.project.Project; +import jet.Function1; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.compiler.CompilerPlugin; +import org.jetbrains.jet.compiler.CompilerPluginContext; +import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.k2js.config.Config; +import org.jetbrains.k2js.facade.K2JSTranslator; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.List; + +import static kotlin.io.namespace.use; + +/** + * Compiles Kotlin code to JavaScript + */ +public class K2JSCompilerPlugin implements CompilerPlugin { + + /** + * @required + * @parameter default-value="${project.build.directory}/target/js/${project.artifactId}.js" + */ + private String outFile = "target/js/program.js"; + + public void processFiles(CompilerPluginContext context) { + if (context != null) { + Project project = context.getProject(); + BindingContext bindingContext = context.getContext(); + List sources = context.getFiles(); + if (bindingContext != null && sources != null && project != null) { + Config config = new Config(project) { + @NotNull + @Override + public List getLibFiles() { + // TODO + return null; + } + }; + K2JSTranslator translator = new K2JSTranslator(config); + final String code = translator.generateProgramCode(sources); + File file = new File(outFile); + File outDir = file.getParentFile(); + if (outDir != null && !outDir.exists()) { + outDir.mkdirs(); + } + try { + use(new FileWriter(file), new Function1() { + @Override + public Object invoke(FileWriter writer) { + try { + writer.write(code); + } catch (IOException e) { + throw new RuntimeException(e); + } + return null; + } + }); + } catch (IOException e) { + System.out.println("Error: " + e); + e.printStackTrace(); + } + } + } + } + + public String getOutFile() { + return outFile; + } + + public void setOutFile(String outFile) { + this.outFile = outFile; + } +} diff --git a/libraries/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinBaseMojo.java b/libraries/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinBaseMojo.java new file mode 100644 index 00000000000..1e39b85a749 --- /dev/null +++ b/libraries/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinBaseMojo.java @@ -0,0 +1,51 @@ +package org.jetbrains.kotlin.maven; + +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.jetbrains.jet.cli.CompilerArguments; +import org.jetbrains.jet.cli.KotlinCompiler; + +/** + * Abstract base class for Kotlin maven plugins + */ +public abstract class KotlinBaseMojo extends AbstractMojo { + private KotlinCompiler compiler = new KotlinCompiler(); + private CompilerArguments arguments; + + /** + * The source directory to compile + * + * @required + * @parameter default-value="${basedir}/src/main/kotlin" + */ + private String src; + + @Override + public void execute() throws MojoExecutionException, MojoFailureException { + arguments = createCompilerArguments(); + + if (src != null) { + arguments.setSrc(src); + } + configureCompilerArguments(arguments); + + compiler.exec(System.err, arguments); + } + + + /** + * Derived classes can create custom compiler argument implementations + * such as for KDoc + */ + protected CompilerArguments createCompilerArguments() { + return new CompilerArguments(); + } + + /** + * Derived classes can register custom plugins or configurations + */ + protected void configureCompilerArguments(CompilerArguments arguments) { + } + +} diff --git a/libraries/kotlin-maven-plugin/src/main/kotlin/org/jetbrains/kotlin/maven/KotlinCompileMojo.kt b/libraries/kotlin-maven-plugin/src/main/kotlin/org/jetbrains/kotlin/maven/KotlinCompileMojo.kt deleted file mode 100644 index e93cbddeeb1..00000000000 --- a/libraries/kotlin-maven-plugin/src/main/kotlin/org/jetbrains/kotlin/maven/KotlinCompileMojo.kt +++ /dev/null @@ -1,17 +0,0 @@ -package org.jetbrains.kotlin.maven - -import org.jfrog.maven.annomojo.annotations.* -import org.apache.maven.plugin.AbstractMojo - -/** - * Kotlin compiler mojo - */ -[MojoGoal("compile")] -[MojoPhase( "compile" )] -[MojoRequiresDependencyResolution( "compile" )] -class KotlinCompileMojo() : KotlinMojoSupport() { - - override fun execute() { - println("===== Kotlin maven compiler!!! src = $src") - } -} \ No newline at end of file diff --git a/libraries/kotlin-maven-plugin/src/main/kotlin/org/jetbrains/kotlin/maven/KotlinMojoSupport.kt b/libraries/kotlin-maven-plugin/src/main/kotlin/org/jetbrains/kotlin/maven/KotlinMojoSupport.kt deleted file mode 100644 index c32c40b9484..00000000000 --- a/libraries/kotlin-maven-plugin/src/main/kotlin/org/jetbrains/kotlin/maven/KotlinMojoSupport.kt +++ /dev/null @@ -1,15 +0,0 @@ -package org.jetbrains.kotlin.maven - -import org.jfrog.maven.annomojo.annotations.* - -/** - * Base class for Kotlin compiler plugins - */ -import org.apache.maven.plugin.AbstractMojo -import java.lang.String - -abstract class KotlinMojoSupport : AbstractMojo() { - - [MojoParameter(required = false)] - public var src: String? = null -} \ No newline at end of file diff --git a/libraries/kotlin-maven-plugin/src/test/java/org/jetbrains/kotlin/maven/MojoTest.java b/libraries/kotlin-maven-plugin/src/test/java/org/jetbrains/kotlin/maven/MojoTest.java new file mode 100644 index 00000000000..e7ed736d099 --- /dev/null +++ b/libraries/kotlin-maven-plugin/src/test/java/org/jetbrains/kotlin/maven/MojoTest.java @@ -0,0 +1,10 @@ +package org.jetbrains.kotlin.maven; + +import org.junit.Test; + +public class MojoTest { + @Test + public void dummy() { + + } +} diff --git a/libraries/kotlin-maven-plugin/src/test/kotlin/MojoTest.kt b/libraries/kotlin-maven-plugin/src/test/kotlin/MojoTest.kt deleted file mode 100644 index a14d98d9c19..00000000000 --- a/libraries/kotlin-maven-plugin/src/test/kotlin/MojoTest.kt +++ /dev/null @@ -1,9 +0,0 @@ -package test.org.jetbrains.kotlin.maven - -import junit.framework.TestCase - -class MojoTest: TestCase() { - fun testFoo() { - - } -} \ No newline at end of file diff --git a/libraries/pom.xml b/libraries/pom.xml index ad71a7cf210..a11003cbb27 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -21,6 +21,8 @@ 1.1.0 2.5 2.4 + 3.3.1 + 11.0.2 @@ -41,6 +43,7 @@ + kotlin-install kunit stdlib kdoc