mirror of
https://github.com/ethauvin/kobalt.git
synced 2025-04-26 08:27:12 -07:00
Compilers are now plug-in actors.
This commit is contained in:
parent
fd5fb983e2
commit
87975284d9
15 changed files with 88 additions and 33 deletions
18
src/main/kotlin/com/beust/kobalt/api/IAffinity.kt
Normal file
18
src/main/kotlin/com/beust/kobalt/api/IAffinity.kt
Normal file
|
@ -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
|
||||
}
|
16
src/main/kotlin/com/beust/kobalt/api/ICompilerContributor.kt
Normal file
16
src/main/kotlin/com/beust/kobalt/api/ICompilerContributor.kt
Normal file
|
@ -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<IClasspathDependency>,
|
||||
val sourceFiles: List<String>,
|
||||
val outputDir: File,
|
||||
val compilerArgs: List<String>)
|
||||
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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<IClasspathDependency>) = findTestClasses(project, classpath)
|
||||
|
|
|
@ -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<IClasspathDependency>,
|
||||
val sourceFiles: List<String>, val outputDir: File, val compilerArgs: List<String>)
|
||||
|
||||
interface ICompilerAction {
|
||||
fun compile(info: CompilerActionInfo): TaskResult
|
||||
}
|
|
@ -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 <T : IAffinity> selectAffinityActor(project: Project, actors: List<T>) : T? =
|
||||
actors.maxBy { it.affinity(project, context) }
|
||||
|
||||
@Task(name = JavaPlugin.TASK_JAVADOC, description = "Run Javadoc")
|
||||
fun taskJavadoc(project: Project) = doJavadoc(project, createCompilerActionInfo(project, context))
|
||||
|
||||
|
|
|
@ -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<IRunnerContributor>()
|
||||
val testRunnerContributors = arrayListOf<IRunnerContributor>()
|
||||
val classpathInterceptors = arrayListOf<IClasspathInterceptor>()
|
||||
val compilerContributors = arrayListOf<ICompilerContributor>()
|
||||
|
||||
// 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) {
|
||||
|
|
|
@ -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<IClasspathDependency>) = arrayListOf<String>().apply {
|
||||
|
|
|
@ -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<IClasspathDependency>): TaskResult {
|
||||
|
|
|
@ -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<IClasspathDependency>): TaskResult {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -48,4 +48,8 @@
|
|||
<classpath-interceptors>
|
||||
<class-name>com.beust.kobalt.plugin.android.AndroidPlugin</class-name>
|
||||
</classpath-interceptors>
|
||||
<compiler-contributors>
|
||||
<class-name>com.beust.kobalt.plugin.java.JavaPlugin</class-name>
|
||||
<class-name>com.beust.kobalt.plugin.kotlin.KotlinPlugin</class-name>
|
||||
</compiler-contributors>
|
||||
</kobalt-plugin>
|
Loading…
Add table
Add a link
Reference in a new issue