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 f6e6274c..f112f121 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 @@ -139,18 +139,23 @@ class Variant(val initialProductFlavor: ProductFlavorConfig? = null, ?: throw KobaltException( "packageName needs to be defined on the project in order to generate BuildConfig") - val code = project.projectInfo.generateBuildConfig(project, context, pkg, this, buildConfigs) - val result = KFiles.makeDir(KFiles.generatedSourceDir(project, this, "buildConfig")) - // Make sure the generatedSourceDirectory doesn't contain the project.directory since - // that directory will be added when trying to find recursively all the sources in it - generatedSourceDirectory = File(result.relativeTo(File(project.directory))) - val outputGeneratedSourceDirectory = File(result, pkg.replace('.', File.separatorChar)) - val compilers = ActorUtils.selectAffinityActors(project, context, context.pluginInfo.compilerContributors) - val outputDir = File(outputGeneratedSourceDirectory, - "BuildConfig" + compilers[0].sourceSuffixes[0]) - KFiles.saveFile(outputDir, code) - log(2, "Generated ${outputDir.path}") - return result + val contributor = ActorUtils.selectAffinityActor(context.pluginInfo.buildConfigContributors, project) + if (contributor != null) { + val code = contributor.generateBuildConfig(project, context, pkg, this, buildConfigs) + val result = KFiles.makeDir(KFiles.generatedSourceDir(project, this, "buildConfig")) + // Make sure the generatedSourceDirectory doesn't contain the project.directory since + // that directory will be added when trying to find recursively all the sources in it + generatedSourceDirectory = File(result.relativeTo(File(project.directory))) + val outputGeneratedSourceDirectory = File(result, pkg.replace('.', File.separatorChar)) + val compilers = ActorUtils.selectAffinityActors(project, context, context.pluginInfo.compilerContributors) + val outputDir = File(outputGeneratedSourceDirectory, + "BuildConfig" + compilers[0].sourceSuffixes[0]) + KFiles.saveFile(outputDir, code) + log(2, "Generated ${outputDir.path}") + return result + } else { + throw KobaltException("Couldn't find a contributor to generate BuildConfig") + } } else { return null } diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/IBuildConfigContributor.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/IBuildConfigContributor.kt new file mode 100644 index 00000000..b92ee92f --- /dev/null +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/IBuildConfigContributor.kt @@ -0,0 +1,11 @@ +package com.beust.kobalt.api + +import com.beust.kobalt.Variant + +/** + * Plug-ins that can generate a BuildConfig file. + */ +interface IBuildConfigContributor : ISimpleAffinity { + fun generateBuildConfig(project: Project, context: KobaltContext, packageName: String, variant: Variant, + buildConfigs: List) : String +} diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/Project.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/Project.kt index db448912..917fb053 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/Project.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/Project.kt @@ -2,7 +2,6 @@ package com.beust.kobalt.api import com.beust.kobalt.TestConfig import com.beust.kobalt.api.annotation.Directive -import com.beust.kobalt.internal.IProjectInfo import com.beust.kobalt.maven.dependency.MavenDependency import com.beust.kobalt.misc.KFiles import java.io.File @@ -21,8 +20,7 @@ open class Project( @Directive open var scm : Scm? = null, @Directive open var url: String? = null, @Directive open var licenses: List = arrayListOf(), - @Directive open var packageName: String? = group, - val projectInfo: IProjectInfo) : IBuildConfig { + @Directive open var packageName: String? = group) : IBuildConfig { class ProjectExtra(project: Project) { val suffixesFound : Set by lazy { diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/KobaltPluginXml.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/KobaltPluginXml.kt index 0b4f9e89..8b29a9d1 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/KobaltPluginXml.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/KobaltPluginXml.kt @@ -75,6 +75,8 @@ class PluginInfo(val xml: KobaltPluginXml, val classLoader: ClassLoader?) { val buildConfigFieldContributors = arrayListOf() val taskContributors = arrayListOf() + // Not documented yet + val buildConfigContributors = arrayListOf() val mavenIdInterceptors = arrayListOf() companion object { @@ -158,6 +160,7 @@ class PluginInfo(val xml: KobaltPluginXml, val classLoader: ClassLoader?) { // Not documented yet if (this is IMavenIdInterceptor) mavenIdInterceptors.add(this) if (this is ITestSourceDirectoryContributor) testSourceDirContributors.add(this) + if (this is IBuildConfigContributor) buildConfigContributors.add(this) } } } @@ -187,6 +190,7 @@ class PluginInfo(val xml: KobaltPluginXml, val classLoader: ClassLoader?) { taskContributors.addAll(pluginInfo.taskContributors) testSourceDirContributors.addAll(pluginInfo.testSourceDirContributors) mavenIdInterceptors.addAll(pluginInfo.mavenIdInterceptors) + buildConfigContributors.addAll(pluginInfo.buildConfigContributors) } } diff --git a/src/main/kotlin/com/beust/kobalt/app/java/JavaBuildGenerator.kt b/src/main/kotlin/com/beust/kobalt/app/java/JavaBuildGenerator.kt index 76adca91..e2fa17fa 100644 --- a/src/main/kotlin/com/beust/kobalt/app/java/JavaBuildGenerator.kt +++ b/src/main/kotlin/com/beust/kobalt/app/java/JavaBuildGenerator.kt @@ -1,10 +1,8 @@ package com.beust.kobalt.app.java import com.beust.kobalt.app.BuildGenerator -import com.beust.kobalt.plugin.java.JavaProjectInfo -import com.google.inject.Inject -public class JavaBuildGenerator @Inject constructor (val projectInfo: JavaProjectInfo) : BuildGenerator() { +public class JavaBuildGenerator: BuildGenerator() { override val defaultSourceDirectories = hashSetOf("src/main/java") override val defaultTestDirectories = hashSetOf("src/test/java") override val directive = "javaProject" diff --git a/src/main/kotlin/com/beust/kobalt/app/kotlin/KotlinBuildGenerator.kt b/src/main/kotlin/com/beust/kobalt/app/kotlin/KotlinBuildGenerator.kt index 22ace4eb..4f511bba 100644 --- a/src/main/kotlin/com/beust/kobalt/app/kotlin/KotlinBuildGenerator.kt +++ b/src/main/kotlin/com/beust/kobalt/app/kotlin/KotlinBuildGenerator.kt @@ -1,10 +1,8 @@ package com.beust.kobalt.app.kotlin import com.beust.kobalt.app.BuildGenerator -import com.beust.kobalt.plugin.kotlin.KotlinProjectInfo -import com.google.inject.Inject -public class KotlinBuildGenerator @Inject constructor (val projectInfo: KotlinProjectInfo) : BuildGenerator() { +public class KotlinBuildGenerator : BuildGenerator() { override val defaultSourceDirectories = hashSetOf("src/main/kotlin") override val defaultTestDirectories = hashSetOf("src/test/kotlin") override val directive = "kotlinProject" 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 3ad4ef01..3f0d3d5b 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/java/JavaPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/java/JavaPlugin.kt @@ -1,6 +1,7 @@ package com.beust.kobalt.plugin.java import com.beust.kobalt.TaskResult +import com.beust.kobalt.Variant import com.beust.kobalt.api.* import com.beust.kobalt.api.annotation.Directive import com.beust.kobalt.internal.BaseJvmPlugin @@ -11,7 +12,8 @@ import javax.inject.Singleton @Singleton class JavaPlugin @Inject constructor(val javaCompiler: JavaCompiler) - : BaseJvmPlugin(), IDocContributor, ICompilerContributor, ITestSourceDirectoryContributor { + : BaseJvmPlugin(), IDocContributor, ICompilerContributor, ITestSourceDirectoryContributor, + IBuildConfigContributor { companion object { const val PLUGIN_NAME = "Java" } @@ -57,6 +59,17 @@ class JavaPlugin @Inject constructor(val javaCompiler: JavaCompiler) override fun testSourceDirectoriesFor(project: Project, context: KobaltContext) = project.sourceDirectoriesTest.map { File(it) }.toList() + // IBuildConfigContributor + override fun affinity(project: Project): Int { + return if (project.projectExtra.suffixesFound.contains("java")) 1 else 0 + } + + override fun generateBuildConfig(project: Project, context: KobaltContext, packageName: String, + variant: Variant, buildConfigs: List): String { + return JavaProjectInfo().generateBuildConfig(project, context, packageName, variant, buildConfigs) + } + + } @Directive diff --git a/src/main/kotlin/com/beust/kobalt/plugin/java/JavaProject.kt b/src/main/kotlin/com/beust/kobalt/plugin/java/JavaProject.kt index 161a0830..c8ad6a29 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/java/JavaProject.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/java/JavaProject.kt @@ -24,8 +24,7 @@ public class JavaProject( override var dependencies: Dependencies? = null, @Directive override var packaging: String? = null) - : Project(name, version, directory, buildDirectory, group, artifactId, packaging, dependencies, - ".java", projectInfo = JavaProjectInfo()) { + : Project(name, version, directory, buildDirectory, group, artifactId, packaging, dependencies, ".java") { override public fun toString() = toString("JavaProject", "name", name) } 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 aa514aa6..43dea124 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinPlugin.kt @@ -1,6 +1,7 @@ package com.beust.kobalt.plugin.kotlin import com.beust.kobalt.TaskResult +import com.beust.kobalt.Variant import com.beust.kobalt.api.* import com.beust.kobalt.api.annotation.Directive import com.beust.kobalt.internal.BaseJvmPlugin @@ -15,7 +16,8 @@ import javax.inject.Singleton @Singleton class KotlinPlugin @Inject constructor(val executors: KobaltExecutors) - : BaseJvmPlugin(), IDocContributor, IClasspathContributor, ICompilerContributor { + : BaseJvmPlugin(), IDocContributor, IClasspathContributor, ICompilerContributor, + IBuildConfigContributor { companion object { const val PLUGIN_NAME = "Kotlin" @@ -122,6 +124,15 @@ class KotlinPlugin @Inject constructor(val executors: KobaltExecutors) log(2, "${project.name}: $s") } + // IBuildConfigContributor + override fun affinity(project: Project): Int { + return if (project.projectExtra.suffixesFound.contains("kotlin")) 2 else 0 + } + + override fun generateBuildConfig(project: Project, context: KobaltContext, packageName: String, + variant: Variant, buildConfigs: List): String { + return KotlinProjectInfo().generateBuildConfig(project, context, packageName, variant, buildConfigs) + } } /** diff --git a/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinProject.kt b/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinProject.kt index 1ff0a7de..b86577e5 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinProject.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinProject.kt @@ -24,8 +24,7 @@ public class KotlinProject( override var dependencies: Dependencies? = null, @Directive override var packaging: String? = null) - : Project(name, version, directory, buildDirectory, group, artifactId, packaging, dependencies, ".kt", - projectInfo = KotlinProjectInfo()) { + : Project(name, version, directory, buildDirectory, group, artifactId, packaging, dependencies, ".kt") { override public fun toString() = toString("KotlinProject", "name", name) }