From 87975284d9d86cf2b440def58c07b757e3e6afa7 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Sun, 29 Nov 2015 09:28:08 -0800 Subject: [PATCH] Compilers are now plug-in actors. --- .../kotlin/com/beust/kobalt/api/IAffinity.kt | 18 ++++++++++++++++++ .../beust/kobalt/api/ICompilerContributor.kt | 16 ++++++++++++++++ .../beust/kobalt/api/ICompilerInterceptor.kt | 2 -- .../com/beust/kobalt/internal/JUnitRunner.kt | 4 ++-- .../com/beust/kobalt/internal/JvmCompiler.kt | 5 +---- .../kobalt/internal/JvmCompilerPlugin.kt | 17 ++++++++++++----- .../beust/kobalt/internal/KobaltPluginXml.kt | 7 +++++++ .../com/beust/kobalt/internal/TestNgRunner.kt | 4 ++-- .../kobalt/plugin/android/AndroidPlugin.kt | 4 +--- .../plugin/application/ApplicationPlugin.kt | 2 +- .../beust/kobalt/plugin/java/JavaCompiler.kt | 2 +- .../beust/kobalt/plugin/java/JavaPlugin.kt | 15 ++++++++++----- .../kobalt/plugin/kotlin/KotlinCompiler.kt | 2 +- .../kobalt/plugin/kotlin/KotlinPlugin.kt | 19 ++++++++++++------- src/main/resources/META-INF/kobalt-plugin.xml | 4 ++++ 15 files changed, 88 insertions(+), 33 deletions(-) create mode 100644 src/main/kotlin/com/beust/kobalt/api/IAffinity.kt create mode 100644 src/main/kotlin/com/beust/kobalt/api/ICompilerContributor.kt diff --git a/src/main/kotlin/com/beust/kobalt/api/IAffinity.kt b/src/main/kotlin/com/beust/kobalt/api/IAffinity.kt new file mode 100644 index 00000000..5a2e8e60 --- /dev/null +++ b/src/main/kotlin/com/beust/kobalt/api/IAffinity.kt @@ -0,0 +1,18 @@ +package com.beust.kobalt.api + +interface IAffinity { + companion object { + /** + * The recommended default affinity if your plug-in can run this project. Use a higher + * number if you expect to compete against other actors and you'd like to win over them. + */ + const val DEFAULT_POSITIVE_AFFINITY = 100 + } + + /** + * @return an integer indicating the affinity of your actor for the given project. The actor that returns + * the highest affinity gets selectedyour affinity for running the current project. The runner with + * the highest affinity gets selected. + */ + fun affinity(project: Project, context: KobaltContext) : Int +} diff --git a/src/main/kotlin/com/beust/kobalt/api/ICompilerContributor.kt b/src/main/kotlin/com/beust/kobalt/api/ICompilerContributor.kt new file mode 100644 index 00000000..a6e3b714 --- /dev/null +++ b/src/main/kotlin/com/beust/kobalt/api/ICompilerContributor.kt @@ -0,0 +1,16 @@ +package com.beust.kobalt.api + +import com.beust.kobalt.TaskResult +import com.beust.kobalt.maven.dependency.IClasspathDependency +import java.io.File + +interface ICompilerContributor : IAffinity { + fun compile(project: Project, context: KobaltContext, info: CompilerActionInfo) : TaskResult +} + +data class CompilerActionInfo(val directory: String?, + val dependencies: List, + val sourceFiles: List, + val outputDir: File, + val compilerArgs: List) + diff --git a/src/main/kotlin/com/beust/kobalt/api/ICompilerInterceptor.kt b/src/main/kotlin/com/beust/kobalt/api/ICompilerInterceptor.kt index 1c62ce53..0a376257 100644 --- a/src/main/kotlin/com/beust/kobalt/api/ICompilerInterceptor.kt +++ b/src/main/kotlin/com/beust/kobalt/api/ICompilerInterceptor.kt @@ -1,7 +1,5 @@ package com.beust.kobalt.api -import com.beust.kobalt.internal.CompilerActionInfo - /** * Plug-ins can alter what is passed to the compiler by implementing this interface. */ diff --git a/src/main/kotlin/com/beust/kobalt/internal/JUnitRunner.kt b/src/main/kotlin/com/beust/kobalt/internal/JUnitRunner.kt index 7d17246e..b56df7e7 100644 --- a/src/main/kotlin/com/beust/kobalt/internal/JUnitRunner.kt +++ b/src/main/kotlin/com/beust/kobalt/internal/JUnitRunner.kt @@ -1,6 +1,6 @@ package com.beust.kobalt.internal -import com.beust.kobalt.api.IRunnerContributor +import com.beust.kobalt.api.IAffinity import com.beust.kobalt.api.KobaltContext import com.beust.kobalt.api.Project import com.beust.kobalt.maven.dependency.IClasspathDependency @@ -10,7 +10,7 @@ public class JUnitRunner() : GenericTestRunner() { override val mainClass = "org.junit.runner.JUnitCore" override fun affinity(project: Project, context: KobaltContext) = - if (project.testDependencies.any { it.id.contains("junit")}) IRunnerContributor.DEFAULT_POSITIVE_AFFINITY + if (project.testDependencies.any { it.id.contains("junit")}) IAffinity.DEFAULT_POSITIVE_AFFINITY else 0 override fun args(project: Project, classpath: List) = findTestClasses(project, classpath) diff --git a/src/main/kotlin/com/beust/kobalt/internal/JvmCompiler.kt b/src/main/kotlin/com/beust/kobalt/internal/JvmCompiler.kt index 60ba0787..3e0bddc0 100644 --- a/src/main/kotlin/com/beust/kobalt/internal/JvmCompiler.kt +++ b/src/main/kotlin/com/beust/kobalt/internal/JvmCompiler.kt @@ -2,10 +2,10 @@ package com.beust.kobalt.internal import com.beust.kobalt.KobaltException import com.beust.kobalt.TaskResult +import com.beust.kobalt.api.CompilerActionInfo import com.beust.kobalt.api.KobaltContext import com.beust.kobalt.api.Project import com.beust.kobalt.maven.DependencyManager -import com.beust.kobalt.maven.dependency.IClasspathDependency import com.google.inject.Inject import java.io.File import java.util.* @@ -51,9 +51,6 @@ class JvmCompiler @Inject constructor(val dependencyManager: DependencyManager) } } -data class CompilerActionInfo(val directory: String?, val dependencies: List, - val sourceFiles: List, val outputDir: File, val compilerArgs: List) - interface ICompilerAction { fun compile(info: CompilerActionInfo): TaskResult } \ No newline at end of file diff --git a/src/main/kotlin/com/beust/kobalt/internal/JvmCompilerPlugin.kt b/src/main/kotlin/com/beust/kobalt/internal/JvmCompilerPlugin.kt index 43cbf7de..e98cc4c6 100644 --- a/src/main/kotlin/com/beust/kobalt/internal/JvmCompilerPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/internal/JvmCompilerPlugin.kt @@ -1,10 +1,8 @@ package com.beust.kobalt.internal +import com.beust.kobalt.KobaltException import com.beust.kobalt.TaskResult -import com.beust.kobalt.api.BasePlugin -import com.beust.kobalt.api.IProjectContributor -import com.beust.kobalt.api.KobaltContext -import com.beust.kobalt.api.Project +import com.beust.kobalt.api.* import com.beust.kobalt.api.annotation.ExportedProjectProperty import com.beust.kobalt.api.annotation.Task import com.beust.kobalt.maven.DepFactory @@ -138,9 +136,18 @@ abstract class JvmCompilerPlugin @Inject constructor( @Task(name = JavaPlugin.TASK_COMPILE, description = "Compile the project") fun taskCompile(project: Project) : TaskResult { context.variant.maybeGenerateBuildConfig(project, context) - return doCompile(project, createCompilerActionInfo(project, context)) + val info = createCompilerActionInfo(project, context) + val compiler = selectAffinityActor(project, context.pluginInfo.compilerContributors) + if (compiler != null) { + return compiler.compile(project, context, info) + } else { + throw KobaltException("Couldn't find any compiler for project ${project.name}") + } } + private fun selectAffinityActor(project: Project, actors: List) : T? = + actors.maxBy { it.affinity(project, context) } + @Task(name = JavaPlugin.TASK_JAVADOC, description = "Run Javadoc") fun taskJavadoc(project: Project) = doJavadoc(project, createCompilerActionInfo(project, context)) diff --git a/src/main/kotlin/com/beust/kobalt/internal/KobaltPluginXml.kt b/src/main/kotlin/com/beust/kobalt/internal/KobaltPluginXml.kt index 6101da99..b1037c3a 100644 --- a/src/main/kotlin/com/beust/kobalt/internal/KobaltPluginXml.kt +++ b/src/main/kotlin/com/beust/kobalt/internal/KobaltPluginXml.kt @@ -70,6 +70,9 @@ class KobaltPluginXml { @XmlElement(name = "classpath-interceptors") @JvmField var classpathInterceptors: ClassNameXml? = null + + @XmlElement(name = "compiler-contributors") @JvmField + var compilerContributors: ClassNameXml? = null } class ContributorXml { @@ -100,6 +103,7 @@ class PluginInfo(val xml: KobaltPluginXml, val classLoader: ClassLoader?) { val runnerContributors = arrayListOf() val testRunnerContributors = arrayListOf() val classpathInterceptors = arrayListOf() + val compilerContributors = arrayListOf() // Future contributors: // source files @@ -182,6 +186,9 @@ class PluginInfo(val xml: KobaltPluginXml, val classLoader: ClassLoader?) { xml.classpathInterceptors?.className?.forEach { classpathInterceptors.add(factory.instanceOf(forName(it)) as IClasspathInterceptor) } + xml.compilerContributors?.className?.forEach { + compilerContributors.add(factory.instanceOf(forName(it)) as ICompilerContributor) + } } fun addPluginInfo(pluginInfo: PluginInfo) { diff --git a/src/main/kotlin/com/beust/kobalt/internal/TestNgRunner.kt b/src/main/kotlin/com/beust/kobalt/internal/TestNgRunner.kt index 0b683f98..d6a25f2e 100644 --- a/src/main/kotlin/com/beust/kobalt/internal/TestNgRunner.kt +++ b/src/main/kotlin/com/beust/kobalt/internal/TestNgRunner.kt @@ -1,6 +1,6 @@ package com.beust.kobalt.internal -import com.beust.kobalt.api.IRunnerContributor +import com.beust.kobalt.api.IAffinity import com.beust.kobalt.api.KobaltContext import com.beust.kobalt.api.Project import com.beust.kobalt.maven.dependency.IClasspathDependency @@ -12,7 +12,7 @@ public class TestNgRunner() : GenericTestRunner() { override val mainClass = "org.testng.TestNG" override fun affinity(project: Project, context: KobaltContext) = - if (project.testDependencies.any { it.id.contains("testng")}) IRunnerContributor.DEFAULT_POSITIVE_AFFINITY + if (project.testDependencies.any { it.id.contains("testng")}) IAffinity.DEFAULT_POSITIVE_AFFINITY else 0 override fun args(project: Project, classpath: List) = arrayListOf().apply { diff --git a/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidPlugin.kt index c30f9be6..269c5691 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidPlugin.kt @@ -4,7 +4,6 @@ import com.beust.kobalt.* import com.beust.kobalt.api.* import com.beust.kobalt.api.annotation.Directive import com.beust.kobalt.api.annotation.Task -import com.beust.kobalt.internal.CompilerActionInfo import com.beust.kobalt.maven.MavenId import com.beust.kobalt.maven.dependency.FileDependency import com.beust.kobalt.maven.dependency.IClasspathDependency @@ -129,7 +128,6 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler, v val androidJar = Paths.get(androidHome(project), "platforms", "android-$compileSdkVersion", "android.jar") val applicationId = configurationFor(project)?.applicationId!! val intermediates = AndroidFiles.intermediates(project) - val crunchedPngDir = KFiles.joinAndMakeDir(AndroidFiles.intermediates(project).toString(), "res") // AaptCommand(project, aapt, "crunch").call(listOf( // "-v", @@ -392,7 +390,7 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler, v // IRunContributor override fun affinity(project: Project, context: KobaltContext): Int { val manifest = AndroidFiles.manifest(project, context) - return if (File(manifest).exists()) IRunnerContributor.DEFAULT_POSITIVE_AFFINITY else 0 + return if (File(manifest).exists()) IAffinity.DEFAULT_POSITIVE_AFFINITY else 0 } override fun run(project: Project, context: KobaltContext, classpath: List): TaskResult { diff --git a/src/main/kotlin/com/beust/kobalt/plugin/application/ApplicationPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/application/ApplicationPlugin.kt index 6c9e71c7..6ea31b35 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/application/ApplicationPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/application/ApplicationPlugin.kt @@ -74,7 +74,7 @@ class ApplicationPlugin @Inject constructor(val executors: KobaltExecutors, // IRunContributor override fun affinity(project: Project, context: KobaltContext): Int { - return if (configurationFor(project) != null) IRunnerContributor.DEFAULT_POSITIVE_AFFINITY else 0 + return if (configurationFor(project) != null) IAffinity.DEFAULT_POSITIVE_AFFINITY else 0 } override fun run(project: Project, context: KobaltContext, classpath: List): TaskResult { diff --git a/src/main/kotlin/com/beust/kobalt/plugin/java/JavaCompiler.kt b/src/main/kotlin/com/beust/kobalt/plugin/java/JavaCompiler.kt index 714907a7..d2c6fdad 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/java/JavaCompiler.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/java/JavaCompiler.kt @@ -3,9 +3,9 @@ package com.beust.kobalt.plugin.java import com.beust.kobalt.JavaInfo import com.beust.kobalt.SystemProperties import com.beust.kobalt.TaskResult +import com.beust.kobalt.api.CompilerActionInfo import com.beust.kobalt.api.KobaltContext import com.beust.kobalt.api.Project -import com.beust.kobalt.internal.CompilerActionInfo import com.beust.kobalt.internal.ICompilerAction import com.beust.kobalt.internal.JvmCompiler import com.beust.kobalt.misc.KFiles diff --git a/src/main/kotlin/com/beust/kobalt/plugin/java/JavaPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/java/JavaPlugin.kt index 894c2cea..9267d847 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/java/JavaPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/java/JavaPlugin.kt @@ -1,12 +1,9 @@ package com.beust.kobalt.plugin.java import com.beust.kobalt.TaskResult -import com.beust.kobalt.api.BasePlugin -import com.beust.kobalt.api.Kobalt -import com.beust.kobalt.api.Project +import com.beust.kobalt.api.* import com.beust.kobalt.api.annotation.Directive import com.beust.kobalt.api.annotation.Task -import com.beust.kobalt.internal.CompilerActionInfo import com.beust.kobalt.internal.JvmCompiler import com.beust.kobalt.internal.JvmCompilerPlugin import com.beust.kobalt.maven.DepFactory @@ -30,7 +27,8 @@ class JavaPlugin @Inject constructor( override val executors: KobaltExecutors, val javaCompiler: JavaCompiler, override val jvmCompiler: JvmCompiler) - : JvmCompilerPlugin(localRepo, files, depFactory, dependencyManager, executors, jvmCompiler) { + : JvmCompilerPlugin(localRepo, files, depFactory, dependencyManager, executors, jvmCompiler), + ICompilerContributor { companion object { const val PLUGIN_NAME = "Java" const val TASK_COMPILE = "compile" @@ -91,6 +89,13 @@ class JavaPlugin @Inject constructor( } return result } + + // ICompilerContributor + + override fun affinity(project: Project, context: KobaltContext) = + if (project.sourceSuffix == ".java") 1 else 0 + + override fun compile(project: Project, context: KobaltContext, info: CompilerActionInfo) = doCompile(project, info) } @Directive diff --git a/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinCompiler.kt b/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinCompiler.kt index ebbe58dc..36f2dac0 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinCompiler.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinCompiler.kt @@ -1,10 +1,10 @@ package com.beust.kobalt.plugin.kotlin; import com.beust.kobalt.TaskResult +import com.beust.kobalt.api.CompilerActionInfo import com.beust.kobalt.api.Kobalt import com.beust.kobalt.api.KobaltContext import com.beust.kobalt.api.Project -import com.beust.kobalt.internal.CompilerActionInfo import com.beust.kobalt.internal.ICompilerAction import com.beust.kobalt.internal.JvmCompiler import com.beust.kobalt.maven.DepFactory diff --git a/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinPlugin.kt index 276003f1..6b86eb70 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinPlugin.kt @@ -1,16 +1,14 @@ package com.beust.kobalt.plugin.kotlin import com.beust.kobalt.TaskResult -import com.beust.kobalt.api.BasePlugin -import com.beust.kobalt.api.IClasspathContributor -import com.beust.kobalt.api.Kobalt -import com.beust.kobalt.api.Project +import com.beust.kobalt.api.* import com.beust.kobalt.api.annotation.Directive import com.beust.kobalt.api.annotation.Task -import com.beust.kobalt.internal.CompilerActionInfo import com.beust.kobalt.internal.JvmCompiler import com.beust.kobalt.internal.JvmCompilerPlugin -import com.beust.kobalt.maven.* +import com.beust.kobalt.maven.DepFactory +import com.beust.kobalt.maven.DependencyManager +import com.beust.kobalt.maven.LocalRepo import com.beust.kobalt.maven.dependency.FileDependency import com.beust.kobalt.maven.dependency.IClasspathDependency import com.beust.kobalt.maven.dependency.MavenDependency @@ -30,7 +28,7 @@ class KotlinPlugin @Inject constructor( override val executors: KobaltExecutors, override val jvmCompiler: JvmCompiler) : JvmCompilerPlugin(localRepo, files, depFactory, dependencyManager, executors, jvmCompiler), - IClasspathContributor { + IClasspathContributor, ICompilerContributor { companion object { const val PLUGIN_NAME = "Kotlin" @@ -111,6 +109,13 @@ class KotlinPlugin @Inject constructor( } else { listOf() } + + // ICompilerContributor + + override fun affinity(project: Project, context: KobaltContext) = + if (project.sourceSuffix == ".kt") 1 else 0 + + override fun compile(project: Project, context: KobaltContext, info: CompilerActionInfo) = doCompile(project, info) } /** diff --git a/src/main/resources/META-INF/kobalt-plugin.xml b/src/main/resources/META-INF/kobalt-plugin.xml index 6efbc7d7..d1cd9526 100644 --- a/src/main/resources/META-INF/kobalt-plugin.xml +++ b/src/main/resources/META-INF/kobalt-plugin.xml @@ -48,4 +48,8 @@ com.beust.kobalt.plugin.android.AndroidPlugin + + com.beust.kobalt.plugin.java.JavaPlugin + com.beust.kobalt.plugin.kotlin.KotlinPlugin + \ No newline at end of file