diff --git a/src/main/kotlin/com/beust/kobalt/api/BasePlugin.kt b/src/main/kotlin/com/beust/kobalt/api/BasePlugin.kt index ce878347..0a16005a 100644 --- a/src/main/kotlin/com/beust/kobalt/api/BasePlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/api/BasePlugin.kt @@ -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() override fun accept(project: Project) = true var plugins : Plugins by Delegates.notNull() + + protected val projects = arrayListOf() + + fun addProject(project: Project, dependsOn: Array) { + projects.add(ProjectDescription(project, dependsOn.toList())) + } + } diff --git a/src/main/kotlin/com/beust/kobalt/api/Kobalt.kt b/src/main/kotlin/com/beust/kobalt/api/Kobalt.kt index 07813e4e..99fea77f 100644 --- a/src/main/kotlin/com/beust/kobalt/api/Kobalt.kt +++ b/src/main/kotlin/com/beust/kobalt/api/Kobalt.kt @@ -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() - - /** - * Used by projects to specify that they depend on other projects, e.g. - * val p = javaProject(project1, project2) { ... } - */ - fun declareProjectDependencies(project: Project, projects: Array) { - topologicalProjects.addEdge(project, projects) - } - - /** - * @return the projects sorted topologically. - */ - fun sortProjects(allProjects: ArrayList) = topologicalProjects.sort(allProjects) - fun findPlugin(name: String) = Plugins.findPlugin(name) } } diff --git a/src/main/kotlin/com/beust/kobalt/api/KobaltPluginFile.kt b/src/main/kotlin/com/beust/kobalt/api/KobaltPluginFile.kt new file mode 100644 index 00000000..5e4351a9 --- /dev/null +++ b/src/main/kotlin/com/beust/kobalt/api/KobaltPluginFile.kt @@ -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) + +interface IProjectContributor { + fun projects() : List +} + +class KobaltPluginFile { + fun instanceOf(c: Class) = Kobalt.INJECTOR.getInstance(c) + val projectContributors : List> = + arrayListOf(JavaPlugin::class.java, KotlinPlugin::class.java) +} \ No newline at end of file diff --git a/src/main/kotlin/com/beust/kobalt/api/Plugin.kt b/src/main/kotlin/com/beust/kobalt/api/Plugin.kt index 81129662..a9def0ae 100644 --- a/src/main/kotlin/com/beust/kobalt/api/Plugin.kt +++ b/src/main/kotlin/com/beust/kobalt/api/Plugin.kt @@ -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 diff --git a/src/main/kotlin/com/beust/kobalt/kotlin/BuildFileCompiler.kt b/src/main/kotlin/com/beust/kobalt/kotlin/BuildFileCompiler.kt index a9e116cd..88483d8f 100644 --- a/src/main/kotlin/com/beust/kobalt/kotlin/BuildFileCompiler.kt +++ b/src/main/kotlin/com/beust/kobalt/kotlin/BuildFileCompiler.kt @@ -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, - val files: KFiles, val plugins: Plugins) { + val files: KFiles, val plugins: Plugins, val kobaltPluginFile: KobaltPluginFile) { interface IFactory { fun create(@Assisted("buildFiles") buildFiles: List) : 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().let { topologicalProjects -> + val all = hashSetOf() + 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 + } } } 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 6361cfb6..4367bf62 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/java/JavaPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/java/JavaPlugin.kt @@ -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) } } 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 f7804ecf..213174cc 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinPlugin.kt @@ -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) } }