KT-5219 Kotlin build fails when using Android Gradle plugin 0.11

#KT-5219 Fixed
This commit is contained in:
Michael Bogdanov
2014-06-11 11:26:14 +04:00
parent fe09bd4fd8
commit de530be45d
2 changed files with 44 additions and 22 deletions
@@ -30,7 +30,6 @@ import com.android.build.gradle.BasePlugin
import com.android.build.gradle.api.LibraryVariant import com.android.build.gradle.api.LibraryVariant
import com.android.build.gradle.api.ApkVariant import com.android.build.gradle.api.ApkVariant
import com.android.builder.model.BuildType import com.android.builder.model.BuildType
import com.android.builder.BuilderConstants
import com.android.build.gradle.api.TestVariant import com.android.build.gradle.api.TestVariant
import org.gradle.api.plugins.JavaPlugin import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.artifacts.dsl.DependencyHandler import org.gradle.api.artifacts.dsl.DependencyHandler
@@ -142,9 +141,8 @@ open class KotlinAndroidPlugin [Inject] (val scriptHandler: ScriptHandler): Plug
val kotlinDirSet = kotlinSourceSet.getKotlin() val kotlinDirSet = kotlinSourceSet.getKotlin()
kotlinDirSet.srcDir(project.file("src/${sourceSetName}/kotlin")) kotlinDirSet.srcDir(project.file("src/${sourceSetName}/kotlin"))
sourceSet.getAllJava().source(kotlinDirSet) AndroidGradleWrapper.srcDir(sourceSet, kotlinDirSet)
sourceSet.getAllSource().source(kotlinDirSet) AndroidGradleWrapper.getResourceFilter(sourceSet)?.exclude(KSpec({ elem ->
sourceSet.getResources()?.getFilter()?.exclude(KSpec({ elem ->
kotlinDirSet.contains(elem.getFile()) kotlinDirSet.contains(elem.getFile())
})) }))
project.getLogger().debug("Created kotlin sourceDirectorySet at ${kotlinDirSet.getSrcDirs()}") project.getLogger().debug("Created kotlin sourceDirectorySet at ${kotlinDirSet.getSrcDirs()}")
@@ -178,7 +176,8 @@ open class KotlinAndroidPlugin [Inject] (val scriptHandler: ScriptHandler): Plug
val logger = project.getLogger() val logger = project.getLogger()
val kotlinOptions = getExtention<K2JVMCompilerArguments>(androidExt, "kotlinOptions") val kotlinOptions = getExtention<K2JVMCompilerArguments>(androidExt, "kotlinOptions")
val sourceSets = androidExt.getSourceSets() val sourceSets = androidExt.getSourceSets()
val mainSourceSet = sourceSets.getByName(BuilderConstants.MAIN) //TODO: change to BuilderConstants.MAIN - it was relocated in 0.11 plugin
val mainSourceSet = sourceSets.getByName("main")
val testSourceSet = try { val testSourceSet = try {
sourceSets.getByName("instrumentTest") sourceSets.getByName("instrumentTest")
} catch (e: UnknownDomainObjectException) { } catch (e: UnknownDomainObjectException) {
@@ -187,13 +186,8 @@ open class KotlinAndroidPlugin [Inject] (val scriptHandler: ScriptHandler): Plug
for (variant in variants) { for (variant in variants) {
if (variant is LibraryVariant || variant is ApkVariant) { if (variant is LibraryVariant || variant is ApkVariant) {
val buildType: BuildType = if (variant is LibraryVariant) { val buildTypeSourceSetName = AndroidGradleWrapper.getVariantName(variant)
variant.getBuildType()
} else {
(variant as ApkVariant).getBuildType()
}
val buildTypeSourceSetName = buildType.getName()
logger.debug("Variant build type is [$buildTypeSourceSetName]") logger.debug("Variant build type is [$buildTypeSourceSetName]")
val buildTypeSourceSet : AndroidSourceSet? = sourceSets.findByName(buildTypeSourceSetName) val buildTypeSourceSet : AndroidSourceSet? = sourceSets.findByName(buildTypeSourceSetName)
@@ -216,17 +210,17 @@ open class KotlinAndroidPlugin [Inject] (val scriptHandler: ScriptHandler): Plug
val javaSourceList = ArrayList<Any?>() val javaSourceList = ArrayList<Any?>()
if (variant is TestVariant) { if (variant is TestVariant) {
javaSourceList.addAll(testSourceSet.getJava().getSrcDirs()) javaSourceList.addAll(AndroidGradleWrapper.getJavaSrcDirs(testSourceSet))
val testKotlinSource = getExtention<KotlinSourceSet>(testSourceSet, "kotlin") val testKotlinSource = getExtention<KotlinSourceSet>(testSourceSet, "kotlin")
kotlinTask.source(testKotlinSource.getKotlin()) kotlinTask.source(testKotlinSource.getKotlin())
} else { } else {
javaSourceList.addAll(mainSourceSet.getJava().getSrcDirs()) javaSourceList.addAll(AndroidGradleWrapper.getJavaSrcDirs(mainSourceSet))
val mainKotlinSource = getExtention<KotlinSourceSet>(mainSourceSet, "kotlin") val mainKotlinSource = getExtention<KotlinSourceSet>(mainSourceSet, "kotlin")
kotlinTask.source(mainKotlinSource.getKotlin()) kotlinTask.source(mainKotlinSource.getKotlin())
} }
if (null != buildTypeSourceSet) { if (null != buildTypeSourceSet) {
javaSourceList.add(buildTypeSourceSet.getJava().getSrcDirs()) javaSourceList.add(AndroidGradleWrapper.getJavaSrcDirs(buildTypeSourceSet))
kotlinTask.source(getExtention<KotlinSourceSet>(buildTypeSourceSet, "kotlin").getKotlin()) kotlinTask.source(getExtention<KotlinSourceSet>(buildTypeSourceSet, "kotlin").getKotlin())
} }
javaSourceList.add(Callable<File?>{ variant.getProcessResources().getSourceOutputDir() }) javaSourceList.add(Callable<File?>{ variant.getProcessResources().getSourceOutputDir() })
@@ -239,7 +233,7 @@ open class KotlinAndroidPlugin [Inject] (val scriptHandler: ScriptHandler): Plug
val flavourSourceSetName = buildTypeSourceSetName + flavour.getName() val flavourSourceSetName = buildTypeSourceSetName + flavour.getName()
val flavourSourceSet : AndroidSourceSet? = sourceSets.findByName(flavourSourceSetName) val flavourSourceSet : AndroidSourceSet? = sourceSets.findByName(flavourSourceSetName)
if (flavourSourceSet != null) { if (flavourSourceSet != null) {
javaSourceList.add(flavourSourceSet.getJava()) javaSourceList.add(AndroidGradleWrapper.getJavaSrcDirs(flavourSourceSet))
kotlinTask.source((buildTypeSourceSet as ExtensionAware).getExtensions().getByName("kotlin")) kotlinTask.source((buildTypeSourceSet as ExtensionAware).getExtensions().getByName("kotlin"))
} }
} }
@@ -1,14 +1,42 @@
package org.jetbrains.kotlin.gradle.plugin.android package org.jetbrains.kotlin.gradle.plugin.android
import com.android.build.gradle.BasePlugin import com.android.build.gradle.BasePlugin
import org.gradle.api.tasks.util.PatternFilterable
import org.jetbrains.annotations.NotNull
class AndroidGradleWrapper { class AndroidGradleWrapper {
static def getRuntimeJars(BasePlugin basePlugin) { static def getRuntimeJars(BasePlugin basePlugin) {
if (basePlugin.getMetaClass().getMetaMethod("getRuntimeJarList")) { if (basePlugin.getMetaClass().getMetaMethod("getRuntimeJarList")) {
return basePlugin.getRuntimeJarList() return basePlugin.getRuntimeJarList()
}
else {
return basePlugin.getBootClasspath()
}
} }
else {
return basePlugin.getBootClasspath()
}
}
static def srcDir(Object androidSourceSet, Object kotlinDirSet) {
/*before 0.11 gradle android plugin there was:
androidSourceSet.getAllJava().source(kotlinDirSet)
androidSourceSet.getAllSource().source(kotlinDirSet)
but those methods were removed so as temporary hack next code was suggested*/
androidSourceSet.getJava().srcDir(kotlinDirSet)
}
static def PatternFilterable getResourceFilter(Object androidSourceSet) {
def resources = androidSourceSet.getResources()
if (resources != null) {
return resources.getFilter()
}
return null
}
@NotNull
static def String getVariantName(Object variant) {
return variant.getBuildType().getName()
}
@NotNull
static def Set<File> getJavaSrcDirs(Object androidSourceSet) {
return androidSourceSet.getJava().getSrcDirs()
}
} }