From b59bf3b8c0677b3b192ce9ddebbf34a0688b9fc3 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Mon, 13 Feb 2017 16:28:04 -0800 Subject: [PATCH] Groovy plug-in. --- .../beust/kobalt/internal/BaseJvmPlugin.kt | 3 +- .../kobalt/plugin/groovy/GroovyCompiler.kt | 45 ++++++++++++++++ .../kobalt/plugin/groovy/GroovyPlugin.kt | 54 +++++++++++++++++++ .../resources/META-INF/kobalt-core-plugin.xml | 3 +- 4 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/com/beust/kobalt/plugin/groovy/GroovyCompiler.kt create mode 100644 src/main/kotlin/com/beust/kobalt/plugin/groovy/GroovyPlugin.kt diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/BaseJvmPlugin.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/BaseJvmPlugin.kt index f45b4565..a079f833 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/BaseJvmPlugin.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/BaseJvmPlugin.kt @@ -26,7 +26,8 @@ abstract class BaseJvmPlugin(open val configActor: ConfigActor) : // IBuildConfigContributor protected fun sourceFileCount(project: Project) - = KFiles.findSourceFiles(project.directory, project.sourceDirectories, sourceSuffixes()).size + = KFiles.findSourceFiles(project.directory, project.sourceDirectories, sourceSuffixes()).size + + KFiles.findSourceFiles(project.directory, project.sourceDirectoriesTest, sourceSuffixes()).size fun affinity(project: Project) = sourceFileCount(project) diff --git a/src/main/kotlin/com/beust/kobalt/plugin/groovy/GroovyCompiler.kt b/src/main/kotlin/com/beust/kobalt/plugin/groovy/GroovyCompiler.kt new file mode 100644 index 00000000..82369b3b --- /dev/null +++ b/src/main/kotlin/com/beust/kobalt/plugin/groovy/GroovyCompiler.kt @@ -0,0 +1,45 @@ +package com.beust.kobalt.plugin.groovy + +import com.beust.kobalt.TaskResult +import com.beust.kobalt.api.CompilerActionInfo +import com.beust.kobalt.api.ICompiler +import com.beust.kobalt.api.KobaltContext +import com.beust.kobalt.api.Project +import com.beust.kobalt.internal.ICompilerAction +import com.beust.kobalt.internal.JvmCompiler +import com.beust.kobalt.internal.ParallelLogger +import com.beust.kobalt.misc.Strings +import com.beust.kobalt.misc.log +import com.google.inject.Inject +import com.google.inject.Singleton +import groovy.lang.GroovyClassLoader +import org.codehaus.groovy.control.CompilerConfiguration +import java.io.File + +@Singleton +class GroovyCompiler @Inject constructor(val kobaltLog: ParallelLogger, val jvmCompiler: JvmCompiler) : ICompiler { + + override fun compile(project: Project, context: KobaltContext, info: CompilerActionInfo) : TaskResult { + kobaltLog.log(project.name, 1, + " Groovy compiling " + Strings.pluralizeAll(info.sourceFiles.size, "file")) + + val compilerAction = object: ICompilerAction { + override fun compile(project: Project?, info: CompilerActionInfo): TaskResult { + val groovyClasspath = info.dependencies.map { it.jarFile.get().absolutePath } + val compiler = org.codehaus.groovy.tools.Compiler(CompilerConfiguration().apply { + targetDirectory = info.outputDir + setClasspathList(groovyClasspath) + verbose = true + debug = true + }) + // Will throw if there are any errors + compiler.compile(info.sourceFiles.map(::File).toTypedArray()) + return TaskResult() + } + } + + val flags = listOf() + return jvmCompiler.doCompile(project, context, compilerAction, info, flags) + } + +} diff --git a/src/main/kotlin/com/beust/kobalt/plugin/groovy/GroovyPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/groovy/GroovyPlugin.kt new file mode 100644 index 00000000..3cd9e2f7 --- /dev/null +++ b/src/main/kotlin/com/beust/kobalt/plugin/groovy/GroovyPlugin.kt @@ -0,0 +1,54 @@ +package com.beust.kobalt.plugin.groovy + +import com.beust.kobalt.api.* +import com.beust.kobalt.api.annotation.Directive +import com.beust.kobalt.internal.BaseJvmPlugin +import java.io.File +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class GroovyPlugin @Inject constructor(val groovyCompiler: GroovyCompiler, + override val configActor: ConfigActor) + : BaseJvmPlugin(configActor), ICompilerContributor, ISourceDirectoryContributor { + + companion object { + val PLUGIN_NAME = "Groovy" + val SOURCE_SUFFIXES = listOf("groovy") + } + + override val name = PLUGIN_NAME + + override fun sourceSuffixes() = SOURCE_SUFFIXES + + // IDocContributor + override fun affinity(project: Project, context: KobaltContext) = sourceFileCount(project) + + // ICompilerFlagsContributor + override fun compilerFlagsFor(project: Project, context: KobaltContext, currentFlags: List, + suffixesBeingCompiled: List) = + maybeCompilerArgs(compiler.sourceSuffixes, suffixesBeingCompiled, + configurationFor(project)?.compilerArgs ?: listOf()) + + // ICompilerContributor + val compiler = CompilerDescription(PLUGIN_NAME, "groovy", SOURCE_SUFFIXES, groovyCompiler) + + // ISourceDirectoryContributor + override fun sourceDirectoriesFor(project: Project, context: KobaltContext) + = listOf(File("src/main/groovy", "src/test/groovy")) + + override fun compilersFor(project: Project, context: KobaltContext) + = if (sourceFileCount(project) > 0) listOf(compiler) else emptyList() +} + +class GroovyConfig(val project: Project) { + val compilerArgs = arrayListOf() + fun args(vararg options: String) = compilerArgs.addAll(options) +} + +@Directive +fun Project.groovyCompiler(init: GroovyConfig.() -> Unit) = let { + val config = GroovyConfig(it) + config.init() + (Kobalt.findPlugin(GroovyPlugin.PLUGIN_NAME) as GroovyPlugin).addConfiguration(this, config) +} diff --git a/src/main/resources/META-INF/kobalt-core-plugin.xml b/src/main/resources/META-INF/kobalt-core-plugin.xml index 63b5df77..4a2b359b 100644 --- a/src/main/resources/META-INF/kobalt-core-plugin.xml +++ b/src/main/resources/META-INF/kobalt-core-plugin.xml @@ -2,7 +2,7 @@ kobalt com.beust.kobalt.internal.GuiceFactory - + com.beust.kobalt.plugin.java.JavaPlugin com.beust.kobalt.plugin.application.ApplicationPlugin @@ -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.groovy.GroovyPlugin com.beust.kobalt.internal.JvmCompilerPlugin com.beust.kobalt.internal.BuildListeners