diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Variant.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Variant.kt index 5bb96999..4b8c5441 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Variant.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Variant.kt @@ -5,6 +5,7 @@ import com.beust.kobalt.internal.ActorUtils import com.beust.kobalt.misc.KFiles import com.beust.kobalt.misc.log import java.io.File +import java.util.* /** * Capture the product flavor and the build type of a build. @@ -41,11 +42,7 @@ class Variant(val initialProductFlavor: ProductFlavorConfig? = null, context.pluginInfo.compilerContributors) compilerContributors.forEach { it.compilersFor(project, context).forEach { compiler -> - val sourceSuffixes = compiler.sourceSuffixes - val suffixes = sourceSuffixes.flatMap { thisSuffix -> - sourceDirectories(project, thisSuffix) - } - result.addAll(suffixes) + result.addAll(sourceDirectories(project, compiler.sourceDirectory, variantFirst = true)) } } @@ -55,23 +52,21 @@ class Variant(val initialProductFlavor: ProductFlavorConfig? = null, /** * Might be used by plug-ins. */ - fun resourceDirectories(project: Project) = sourceDirectories(project, "resources") + fun resourceDirectories(project: Project) = sourceDirectories(project, "resources", variantFirst = false) /** - * suffix is either "java" (to find source files) or "resources" (to find resources) + * suffix is either "java" (to find source files) or "resources" (to find resources). + * The priority directory is always returned first. For example, if a "pro" product flavor + * is requested, "src/pro/kotlin" will appear in the result before "src/main/kotlin". Later, + * files that have already been seen get skipped, which is how compilation and resources + * receive the correct priority in the final jar. */ - private fun sourceDirectories(project: Project, suffix: String) : Set { - val result = hashSetOf() + private fun sourceDirectories(project: Project, suffix: String, variantFirst: Boolean) : List { + val result = arrayListOf() val sourceDirectories = project.sourceDirectories.map { File(it) } if (isDefault) { result.addAll(sourceDirectories) } else { - result.addAll(allDirectories(project).map { - File(KFiles.joinDir("src", it, suffix)) - }.filter { - it.exists() - }) - // // The ordering of files is: 1) build type 2) product flavor 3) default buildType.let { val dir = File(KFiles.joinDir("src", it.name, suffix)) @@ -84,9 +79,14 @@ class Variant(val initialProductFlavor: ProductFlavorConfig? = null, result.add(dir) } + result.addAll(allDirectories(project).map { + File(KFiles.joinDir("src", it, suffix)) + }.filter { + it.exists() + }) + // Now that all the variant source directories have been added, add the project's default ones result.addAll(sourceDirectories) - return result.filter { it.exists() }.toHashSet() } // Generated directory, if applicable @@ -94,7 +94,10 @@ class Variant(val initialProductFlavor: ProductFlavorConfig? = null, result.add(it) } - return result.filter { File(project.directory, it.path).exists() }.toHashSet() + val filteredResult = result.filter { File(project.directory, it.path).exists() } + val sortedResult = if (variantFirst) filteredResult + else filteredResult.reversed().toList() + return LinkedHashSet(sortedResult).toList() } fun archiveName(project: Project, archiveName: String?, suffix: String) : String { diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ICompilerContributor.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ICompilerContributor.kt index 1d6ee3a6..395e249a 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ICompilerContributor.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ICompilerContributor.kt @@ -8,6 +8,11 @@ interface ICompiler { */ val sourceSuffixes: List + /** + * The trailing end of the source directory (e.g. "kotlin" in "src/main/kotlin") + */ + val sourceDirectory: String + /** * Run the compilation based on the info. */ diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/TaskContributor.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/TaskContributor.kt index e958ccba..e2a4a30c 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/TaskContributor.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/TaskContributor.kt @@ -46,6 +46,7 @@ class TaskContributor @Inject constructor(val incrementalManager: IncrementalMan runTask: (Project) -> IncrementalTaskInfo) { Variant.allVariants(project).forEach { variant -> val variantTaskName = variant.toTask(taskName) + context.variant = variant dynamicTasks.add(DynamicTask(plugin, variantTaskName, variantTaskName, runBefore = runBefore.map { variant.toTask(it) }, runAfter = runAfter.map { variant.toTask(it) }, 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 29c305df..e7274fa3 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/java/JavaPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/java/JavaPlugin.kt @@ -56,6 +56,8 @@ class JavaPlugin @Inject constructor(val javaCompiler: JavaCompiler) val compiler = object: ICompiler { override val sourceSuffixes = listOf("java") + override val sourceDirectory = "java" + override fun compile(project: Project, context: KobaltContext, info: CompilerActionInfo): TaskResult { val result = if (info.sourceFiles.size > 0) { 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 55263b6f..c400a05c 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinPlugin.kt @@ -115,6 +115,8 @@ class KotlinPlugin @Inject constructor(val executors: KobaltExecutors) val compiler = object: ICompiler { override val sourceSuffixes = listOf("kt") + override val sourceDirectory = "kotlin" + override fun compile(project: Project, context: KobaltContext, info: CompilerActionInfo): TaskResult { val result = if (info.sourceFiles.size > 0) {