Support variants in Android Extensions (compiler plugin)

This commit is contained in:
Yan Zhulanow
2015-10-21 21:56:52 +03:00
parent a6e9ee9323
commit 161d8b105f
100 changed files with 806 additions and 143 deletions
@@ -19,8 +19,12 @@ package org.jetbrains.kotlin.android
import org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin
import org.gradle.api.Project
import com.android.build.gradle.BaseExtension
import com.android.build.gradle.api.AndroidSourceSet
import org.gradle.api.tasks.compile.AbstractCompile
import org.jetbrains.kotlin.gradle.plugin.SubpluginOption
import org.w3c.dom.Document
import java.io.File
import javax.xml.parsers.DocumentBuilderFactory
public class AndroidSubplugin : KotlinGradleSubplugin {
@@ -28,20 +32,37 @@ public class AndroidSubplugin : KotlinGradleSubplugin {
val androidExtension = project.extensions.getByName("android") as? BaseExtension ?: return null
val sourceSets = androidExtension.sourceSets
val pluginOptions = arrayListOf<SubpluginOption>()
val mainSourceSet = sourceSets.getByName("main")
val resourceDirs = mainSourceSet.res.srcDirs
val manifestFile = mainSourceSet.manifest.srcFile
val applicationPackage = androidExtension.defaultConfig.applicationId
?: getApplicationPackageFromManifest(manifestFile) ?: ""
pluginOptions += SubpluginOption("package", applicationPackage)
if (resourceDirs.isNotEmpty()) {
val resourceDirOptions = resourceDirs.map { resourceDir ->
resourceDir.listFiles { it.isDirectory && it.name.startsWith("layout") }?.forEach { task.source(it) }
SubpluginOption("androidRes", resourceDir.absolutePath)
}
return listOf(SubpluginOption("androidManifest", manifestFile.absolutePath)) + resourceDirOptions
fun addVariant(sourceSet: AndroidSourceSet) {
pluginOptions += SubpluginOption("variant", sourceSet.name + ';' +
mainSourceSet.res.srcDirs.joinToString(";") { it.absolutePath })
}
return null
addVariant(mainSourceSet)
val flavorSourceSets = androidExtension.productFlavors.map { sourceSets.findByName(it.name) }.filterNotNull()
for (sourceSet in flavorSourceSets) {
addVariant(sourceSet)
}
return pluginOptions
}
private fun getApplicationPackageFromManifest(manifestFile: File): String? {
try {
return manifestFile.parseXml().documentElement.getAttribute("package")
}
catch (e: Exception) {
return null
}
}
override fun getPluginName() = "org.jetbrains.kotlin.android"
@@ -49,4 +70,10 @@ public class AndroidSubplugin : KotlinGradleSubplugin {
override fun getGroupName() = "org.jetbrains.kotlin"
override fun getArtifactName() = "kotlin-android-extensions"
fun File.parseXml(): Document {
val factory = DocumentBuilderFactory.newInstance()
val builder = factory.newDocumentBuilder()
return builder.parse(this)
}
}