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

IProjectContributor.

This commit is contained in:
Cedric Beust 2015-11-01 20:56:44 -08:00
parent 5027d48fce
commit acda49ec84
7 changed files with 64 additions and 35 deletions

View file

@ -1,12 +1,8 @@
package com.beust.kobalt.api
import com.beust.kobalt.BasePluginTask
import com.beust.kobalt.Plugins
import com.beust.kobalt.internal.TaskManager
import com.beust.kobalt.internal.TaskResult
import com.beust.kobalt.internal.TaskResult2
import java.util.ArrayList
import java.util.concurrent.Callable
import java.util.*
import kotlin.properties.Delegates
abstract public class BasePlugin : Plugin {
@ -15,4 +11,11 @@ abstract public class BasePlugin : Plugin {
override var methodTasks = arrayListOf<Plugin.MethodTask>()
override fun accept(project: Project) = true
var plugins : Plugins by Delegates.notNull()
protected val projects = arrayListOf<ProjectDescription>()
fun addProject(project: Project, dependsOn: Array<out Project>) {
projects.add(ProjectDescription(project, dependsOn.toList()))
}
}

View file

@ -1,7 +1,6 @@
package com.beust.kobalt.api
import com.beust.kobalt.Plugins
import com.beust.kobalt.misc.Topological
import com.google.inject.Injector
import java.io.File
import java.io.InputStream
@ -83,21 +82,6 @@ public class Kobalt {
val version = properties.getProperty(PROPERTY_KOBALT_VERSION)
val topologicalProjects = Topological<Project>()
/**
* Used by projects to specify that they depend on other projects, e.g.
* val p = javaProject(project1, project2) { ... }
*/
fun declareProjectDependencies(project: Project, projects: Array<out Project>) {
topologicalProjects.addEdge(project, projects)
}
/**
* @return the projects sorted topologically.
*/
fun sortProjects(allProjects: ArrayList<Project>) = topologicalProjects.sort(allProjects)
fun findPlugin(name: String) = Plugins.findPlugin(name)
}
}

View file

@ -0,0 +1,16 @@
package com.beust.kobalt.api
import com.beust.kobalt.plugin.java.JavaPlugin
import com.beust.kobalt.plugin.kotlin.KotlinPlugin
class ProjectDescription(val project: Project, val dependsOn: List<Project>)
interface IProjectContributor {
fun projects() : List<ProjectDescription>
}
class KobaltPluginFile {
fun <T> instanceOf(c: Class<T>) = Kobalt.INJECTOR.getInstance(c)
val projectContributors : List<Class<out IProjectContributor>> =
arrayListOf(JavaPlugin::class.java, KotlinPlugin::class.java)
}

View file

@ -6,7 +6,7 @@ import com.beust.kobalt.internal.TaskManager
import com.beust.kobalt.internal.TaskResult
import com.beust.kobalt.internal.TaskResult2
import java.lang.reflect.Method
import java.util.ArrayList
import java.util.*
public interface Plugin {
val name: String

View file

@ -2,13 +2,11 @@ package com.beust.kobalt.kotlin
import com.beust.kobalt.Args
import com.beust.kobalt.Plugins
import com.beust.kobalt.api.Kobalt
import com.beust.kobalt.api.KobaltContext
import com.beust.kobalt.api.Plugin
import com.beust.kobalt.api.Project
import com.beust.kobalt.api.*
import com.beust.kobalt.api.annotation.Task
import com.beust.kobalt.maven.KobaltException
import com.beust.kobalt.misc.KFiles
import com.beust.kobalt.misc.Topological
import com.beust.kobalt.misc.countChar
import com.beust.kobalt.misc.log
import com.beust.kobalt.plugin.kotlin.kotlinCompilePrivate
@ -22,11 +20,12 @@ import java.net.URL
import java.net.URLClassLoader
import java.nio.charset.Charset
import java.nio.file.Paths
import java.util.*
import java.util.jar.JarInputStream
import javax.inject.Inject
public class BuildFileCompiler @Inject constructor(@Assisted("buildFiles") val buildFiles: List<BuildFile>,
val files: KFiles, val plugins: Plugins) {
val files: KFiles, val plugins: Plugins, val kobaltPluginFile: KobaltPluginFile) {
interface IFactory {
fun create(@Assisted("buildFiles") buildFiles: List<BuildFile>) : BuildFileCompiler
@ -220,9 +219,27 @@ public class BuildFileCompiler @Inject constructor(@Assisted("buildFiles") val b
stream?.close()
}
// Now that we all the projects, sort them topologically
val result = BuildScriptInfo(Kobalt.sortProjects(projects), classLoader)
observable.onNext(result)
return result
//
// Now that the build file has run, fetch all the project contributors, grab the projects from them and sort
// them topologically
//
Topological<Project>().let { topologicalProjects ->
val all = hashSetOf<Project>()
kobaltPluginFile.projectContributors.forEach { cls ->
val ip: IProjectContributor = kobaltPluginFile.instanceOf(cls)
val descriptions = ip.projects()
descriptions.forEach { pd ->
all.add(pd.project)
pd.dependsOn.forEach { dependsOn ->
topologicalProjects.addEdge(pd.project, dependsOn)
all.add(dependsOn)
}
}
}
val result = BuildScriptInfo(topologicalProjects.sort(ArrayList(all)), classLoader)
observable.onNext(result)
return result
}
}
}

View file

@ -1,5 +1,7 @@
package com.beust.kobalt.plugin.java
import com.beust.kobalt.api.BasePlugin
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
@ -27,7 +29,8 @@ public 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),
IProjectContributor {
init {
Kobalt.registerCompiler(JavaCompilerInfo())
@ -104,13 +107,14 @@ public class JavaPlugin @Inject constructor(
compilerArgs.addAll(args)
}
override fun projects() = projects
}
@Directive
public fun javaProject(vararg project: Project, init: JavaProject.() -> Unit): JavaProject {
return JavaProject().apply {
init()
Kobalt.declareProjectDependencies(this, project)
(Kobalt.findPlugin("kotlin") as BasePlugin).addProject(this, project)
}
}

View file

@ -1,5 +1,7 @@
package com.beust.kobalt.plugin.kotlin
import com.beust.kobalt.api.BasePlugin
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
@ -25,7 +27,8 @@ class KotlinPlugin @Inject constructor(
override val dependencyManager: DependencyManager,
override val executors: KobaltExecutors,
override val jvmCompiler: JvmCompiler)
: JvmCompilerPlugin(localRepo, files, depFactory, dependencyManager, executors, jvmCompiler) {
: JvmCompilerPlugin(localRepo, files, depFactory, dependencyManager, executors, jvmCompiler),
IProjectContributor {
init {
Kobalt.registerCompiler(KotlinCompilerInfo())
@ -93,6 +96,8 @@ class KotlinPlugin @Inject constructor(
output = outputDirectory
}.compile(project, context)
}
override fun projects() = projects
}
/**
@ -102,7 +107,7 @@ class KotlinPlugin @Inject constructor(
fun kotlinProject(vararg project: Project, init: KotlinProject.() -> Unit): KotlinProject {
return KotlinProject().apply {
init()
Kobalt.declareProjectDependencies(this, project)
(Kobalt.findPlugin("kotlin") as BasePlugin).addProject(this, project)
}
}