From bb130c128c54cf485fa15ae8ac62777863709a4b Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Sun, 6 Dec 2015 00:06:38 -0800 Subject: [PATCH] Retrolambda plug-in. --- .../plugin/retrolambda/RetrolambdaPlugin.kt | 72 +++++++++++++++++++ src/main/resources/META-INF/kobalt-plugin.xml | 1 + 2 files changed, 73 insertions(+) create mode 100644 src/main/kotlin/com/beust/kobalt/plugin/retrolambda/RetrolambdaPlugin.kt diff --git a/src/main/kotlin/com/beust/kobalt/plugin/retrolambda/RetrolambdaPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/retrolambda/RetrolambdaPlugin.kt new file mode 100644 index 00000000..f1782e01 --- /dev/null +++ b/src/main/kotlin/com/beust/kobalt/plugin/retrolambda/RetrolambdaPlugin.kt @@ -0,0 +1,72 @@ +package com.beust.kobalt.plugin.retrolambda + +import com.beust.kobalt.Plugins +import com.beust.kobalt.TaskResult +import com.beust.kobalt.api.ConfigPlugin +import com.beust.kobalt.api.IClasspathContributor +import com.beust.kobalt.api.Project +import com.beust.kobalt.api.annotation.Directive +import com.beust.kobalt.api.annotation.Task +import com.beust.kobalt.internal.JvmCompilerPlugin +import com.beust.kobalt.maven.DependencyManager +import com.beust.kobalt.maven.dependency.MavenDependency +import com.beust.kobalt.misc.RunCommand +import com.google.inject.Inject +import com.google.inject.Singleton +import java.io.File + +/** + * Run Retrolambda on the classes right after "compile". This plug-in automatically downloads and uses + * the most recent retrolambda.jar and it can be configured with the `retrolambda{}` directive. + */ +@Singleton +class RetrolambdaPlugin @Inject constructor(val dependencyManager: DependencyManager) + : ConfigPlugin(), IClasspathContributor { + + override val name = PLUGIN_NAME + + companion object { + const val PLUGIN_NAME = "Retrolambda" + const val ID = "net.orfjackal.retrolambda:retrolambda:" + val JAR = MavenDependency.create(ID) + } + + override fun entriesFor(project: Project?) = listOf(JAR) + + @Task(name = "retrolambda", description = "Run Retrolambda", + alwaysRunAfter = arrayOf(JvmCompilerPlugin.TASK_COMPILE)) + fun taskRetrolambda(project: Project): TaskResult { + val config = configurationFor(project) + val result = if (config != null) { + val classpath = dependencyManager.transitiveClosure(project.compileDependencies).map { + it.jarFile.get() + }.joinToString(File.separator) + + val args = listOf( + "-Dretrolambda.inputDir=" + project.classesDir(context), + "-Dretrolambda.classpath=" + classpath, + "-Dretrolambda.bytecodeVersion=${config.byteCodeVersion}", + "-jar", JAR.jarFile.get().path) + + val result = RunCommand("java").apply { + directory = File(project.directory) + }.run(args) + TaskResult(result == 0) + } else { + TaskResult() + } + + return result + } +} + +class RetrolambdaConfig(var byteCodeVersion: Int = 50) { +} + +@Directive +fun Project.retrolambda(init: RetrolambdaConfig.() -> Unit) = let { + RetrolambdaConfig().apply { + init() + (Plugins.findPlugin(RetrolambdaPlugin.PLUGIN_NAME) as RetrolambdaPlugin).addConfiguration(it, this) + } +} diff --git a/src/main/resources/META-INF/kobalt-plugin.xml b/src/main/resources/META-INF/kobalt-plugin.xml index d1e464ef..1c9f72b5 100644 --- a/src/main/resources/META-INF/kobalt-plugin.xml +++ b/src/main/resources/META-INF/kobalt-plugin.xml @@ -12,6 +12,7 @@ com.beust.kobalt.plugin.packaging.PackagingPlugin com.beust.kobalt.plugin.publish.PublishPlugin com.beust.kobalt.plugin.apt.AptPlugin + com.beust.kobalt.plugin.retrolambda.RetrolambdaPlugin com.beust.kobalt.plugin.java.JavaBuildGenerator