1
0
Fork 0
mirror of https://github.com/ethauvin/kobalt.git synced 2025-04-27 00:38:11 -07:00

Better IClasspathContributor handling.

This commit is contained in:
Cedric Beust 2015-11-03 09:51:45 -08:00
parent d388291427
commit bcbcfa3144
8 changed files with 62 additions and 41 deletions

View file

@ -1,11 +0,0 @@
package com.beust.kobalt.api
import com.beust.kobalt.maven.IClasspathDependency
/**
* Implement this interface in order to add your own entries to the classpath. A list of contributors
* can be found on the `KobaltContext`.
*/
interface IClasspathContributor {
fun entriesFor(project: Project) : Collection<IClasspathDependency>
}

View file

@ -2,11 +2,10 @@ package com.beust.kobalt.api
import com.beust.kobalt.Args import com.beust.kobalt.Args
import com.beust.kobalt.Plugins import com.beust.kobalt.Plugins
import java.util.*
public class KobaltContext(val args: Args) { public class KobaltContext(val args: Args) {
fun findPlugin(name: String) = Plugins.findPlugin(name) fun findPlugin(name: String) = Plugins.findPlugin(name)
val classpathContributors: ArrayList<IClasspathContributor> = arrayListOf() var pluginFile: KobaltPluginFile? = null
// sourceContributors // sourceContributors
// projectContributors // projectContributors
// compilerContributors // compilerContributors

View file

@ -1,7 +1,9 @@
package com.beust.kobalt.api package com.beust.kobalt.api
import com.beust.kobalt.maven.IClasspathDependency
import com.beust.kobalt.plugin.java.JavaPlugin import com.beust.kobalt.plugin.java.JavaPlugin
import com.beust.kobalt.plugin.kotlin.KotlinPlugin import com.beust.kobalt.plugin.kotlin.KotlinPlugin
import java.util.*
class ProjectDescription(val project: Project, val dependsOn: List<Project>) class ProjectDescription(val project: Project, val dependsOn: List<Project>)
@ -9,11 +11,23 @@ interface IProjectContributor {
fun projects() : List<ProjectDescription> fun projects() : List<ProjectDescription>
} }
/**
* Implement this interface in order to add your own entries to the classpath. A list of contributors
* can be found on the `KobaltContext`.
*/
interface IClasspathContributor {
fun entriesFor(project: Project) : Collection<IClasspathDependency>
}
class KobaltPluginFile { class KobaltPluginFile {
fun <T> instanceOf(c: Class<T>) = Kobalt.INJECTOR.getInstance(c) fun <T> instanceOf(c: Class<T>) : T = Kobalt.INJECTOR.getInstance(c)
val projectContributors : List<Class<out IProjectContributor>> =
val projectContributors : ArrayList<Class<out IProjectContributor>> =
arrayListOf(JavaPlugin::class.java, KotlinPlugin::class.java) arrayListOf(JavaPlugin::class.java, KotlinPlugin::class.java)
val classpathContributors: ArrayList<Class<out IClasspathContributor>> =
arrayListOf(KotlinPlugin::class.java)
// Future contributors: // Future contributors:
// compilerArgs // compilerArgs
// source files // source files

View file

@ -1,5 +1,6 @@
package com.beust.kobalt.internal package com.beust.kobalt.internal
import com.beust.kobalt.api.IClasspathContributor
import com.beust.kobalt.api.KobaltContext import com.beust.kobalt.api.KobaltContext
import com.beust.kobalt.api.Project import com.beust.kobalt.api.Project
import com.beust.kobalt.maven.DependencyManager import com.beust.kobalt.maven.DependencyManager
@ -54,9 +55,15 @@ class JvmCompiler @Inject constructor(val dependencyManager: DependencyManager)
private fun runClasspathContributors(context: KobaltContext?, project: Project) : private fun runClasspathContributors(context: KobaltContext?, project: Project) :
Collection<IClasspathDependency> { Collection<IClasspathDependency> {
val result = arrayListOf<IClasspathDependency>() val result = arrayListOf<IClasspathDependency>()
context?.classpathContributors?.forEach { val classes : List<Class<out IClasspathContributor>>? = context?.pluginFile?.classpathContributors
if (classes != null) {
val contributors: List<IClasspathContributor> = classes.map {
context?.pluginFile?.instanceOf(it)!!
}
contributors.forEach { it: IClasspathContributor ->
result.addAll(it.entriesFor(project)) result.addAll(it.entriesFor(project))
} }
}
return result return result
} }

View file

@ -37,6 +37,7 @@ public class BuildFileCompiler @Inject constructor(@Assisted("buildFiles") val b
fun compileBuildFiles(args: Args): List<Project> { fun compileBuildFiles(args: Args): List<Project> {
val context = KobaltContext(args) val context = KobaltContext(args)
context.pluginFile = kobaltPluginFile
Kobalt.context = context Kobalt.context = context
val allProjects = findProjects() val allProjects = findProjects()

View file

@ -46,7 +46,7 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler) :
if (accept(project)) { if (accept(project)) {
project.compileDependencies.add(FileDependency(androidJar(project).toString())) project.compileDependencies.add(FileDependency(androidJar(project).toString()))
} }
context.classpathContributors.add(this) context.pluginFile?.classpathContributors?.add(this.javaClass)
// TODO: Find a more flexible way of enabling this, e.g. creating a contributor for it // TODO: Find a more flexible way of enabling this, e.g. creating a contributor for it
(Kobalt.findPlugin("java") as JvmCompilerPlugin).addCompilerArgs("-target", "1.6", "-source", "1.6") (Kobalt.findPlugin("java") as JvmCompilerPlugin).addCompilerArgs("-target", "1.6", "-source", "1.6")

View file

@ -7,7 +7,10 @@ import com.beust.kobalt.internal.CompilerActionInfo
import com.beust.kobalt.internal.ICompilerAction import com.beust.kobalt.internal.ICompilerAction
import com.beust.kobalt.internal.JvmCompiler import com.beust.kobalt.internal.JvmCompiler
import com.beust.kobalt.internal.TaskResult import com.beust.kobalt.internal.TaskResult
import com.beust.kobalt.maven.* import com.beust.kobalt.maven.DepFactory
import com.beust.kobalt.maven.FileDependency
import com.beust.kobalt.maven.IClasspathDependency
import com.beust.kobalt.maven.LocalRepo
import com.beust.kobalt.misc.KobaltExecutors import com.beust.kobalt.misc.KobaltExecutors
import com.beust.kobalt.misc.log import com.beust.kobalt.misc.log
import org.jetbrains.kotlin.cli.common.CLICompiler import org.jetbrains.kotlin.cli.common.CLICompiler
@ -27,7 +30,9 @@ class KotlinCompiler @Inject constructor(val localRepo : LocalRepo,
val depFactory: DepFactory, val depFactory: DepFactory,
val executors: KobaltExecutors, val executors: KobaltExecutors,
val jvmCompiler: JvmCompiler) { val jvmCompiler: JvmCompiler) {
private val KOTLIN_VERSION = "1.0.0-beta-1038" companion object {
val KOTLIN_VERSION = "1.0.0-beta-1038"
}
val compilerAction = object: ICompilerAction { val compilerAction = object: ICompilerAction {
override fun compile(info: CompilerActionInfo): TaskResult { override fun compile(info: CompilerActionInfo): TaskResult {
@ -44,13 +49,6 @@ class KotlinCompiler @Inject constructor(val localRepo : LocalRepo,
} }
} }
private fun getKotlinCompilerJar(name: String) : String {
val id = "org.jetbrains.kotlin:$name:$KOTLIN_VERSION"
val dep = MavenDependency.create(id, executors.miscExecutor)
val result = dep.jarFile.get().absolutePath
return result
}
/** /**
* Create an ICompilerAction based on the parameters and send it to JvmCompiler.doCompile(). * Create an ICompilerAction based on the parameters and send it to JvmCompiler.doCompile().
*/ */
@ -66,12 +64,12 @@ class KotlinCompiler @Inject constructor(val localRepo : LocalRepo,
executor.shutdown() executor.shutdown()
val classpathList = arrayListOf( // val classpathList = arrayListOf(
getKotlinCompilerJar("kotlin-stdlib"), // getKotlinCompilerJar("kotlin-stdlib"),
getKotlinCompilerJar("kotlin-compiler-embeddable")) // getKotlinCompilerJar("kotlin-compiler-embeddable"))
.map { FileDependency(it) } // .map { FileDependency(it) }
val dependencies = compileDependencies + classpathList + otherClasspath.map { FileDependency(it)} val dependencies = compileDependencies + otherClasspath.map { FileDependency(it)}
val info = CompilerActionInfo(project?.directory, dependencies, sourceFiles, outputDir, args) val info = CompilerActionInfo(project?.directory, dependencies, sourceFiles, outputDir, args)
return jvmCompiler.doCompile(project, context, compilerAction, info) return jvmCompiler.doCompile(project, context, compilerAction, info)
} }

View file

@ -1,18 +1,12 @@
package com.beust.kobalt.plugin.kotlin package com.beust.kobalt.plugin.kotlin
import com.beust.kobalt.api.BasePlugin import com.beust.kobalt.api.*
import com.beust.kobalt.api.IProjectContributor
import com.beust.kobalt.api.Kobalt
import com.beust.kobalt.api.Project
import com.beust.kobalt.api.annotation.Directive import com.beust.kobalt.api.annotation.Directive
import com.beust.kobalt.api.annotation.Task import com.beust.kobalt.api.annotation.Task
import com.beust.kobalt.internal.JvmCompiler import com.beust.kobalt.internal.JvmCompiler
import com.beust.kobalt.internal.JvmCompilerPlugin import com.beust.kobalt.internal.JvmCompilerPlugin
import com.beust.kobalt.internal.TaskResult import com.beust.kobalt.internal.TaskResult
import com.beust.kobalt.maven.DepFactory import com.beust.kobalt.maven.*
import com.beust.kobalt.maven.DependencyManager
import com.beust.kobalt.maven.IClasspathDependency
import com.beust.kobalt.maven.LocalRepo
import com.beust.kobalt.misc.KFiles import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.misc.KobaltExecutors import com.beust.kobalt.misc.KobaltExecutors
import java.io.File import java.io.File
@ -28,7 +22,7 @@ class KotlinPlugin @Inject constructor(
override val executors: KobaltExecutors, override val executors: KobaltExecutors,
override val jvmCompiler: JvmCompiler) override val jvmCompiler: JvmCompiler)
: JvmCompilerPlugin(localRepo, files, depFactory, dependencyManager, executors, jvmCompiler), : JvmCompilerPlugin(localRepo, files, depFactory, dependencyManager, executors, jvmCompiler),
IProjectContributor { IProjectContributor, IClasspathContributor {
init { init {
Kobalt.registerCompiler(KotlinCompilerInfo()) Kobalt.registerCompiler(KotlinCompilerInfo())
@ -91,7 +85,26 @@ class KotlinPlugin @Inject constructor(
}.compile(project, context) }.compile(project, context)
} }
// interface IProjectContributor
override fun projects() = projects override fun projects() = projects
private fun getKotlinCompilerJar(name: String) : String {
val id = "org.jetbrains.kotlin:$name:${KotlinCompiler.KOTLIN_VERSION}"
val dep = MavenDependency.create(id, executors.miscExecutor)
val result = dep.jarFile.get().absolutePath
return result
}
// interface IClasspathContributor
override fun entriesFor(project: Project) : List<IClasspathDependency> =
if (project is KotlinProject) {
// All Kotlin projects automatically get the Kotlin runtime added to their class path
arrayListOf(getKotlinCompilerJar("kotlin-stdlib"), getKotlinCompilerJar("kotlin-compiler-embeddable"))
.map { FileDependency(it) }
} else {
arrayListOf()
}
} }
/** /**