From de530be45d1ac6b2d170b4fae9d45310b7f4e739 Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Wed, 11 Jun 2014 11:26:14 +0400 Subject: [PATCH] KT-5219 Kotlin build fails when using Android Gradle plugin 0.11 #KT-5219 Fixed --- .../kotlin/gradle/plugin/KotlinPlugin.kt | 24 ++++------- .../android/AndroidGradleWrapper.groovy | 42 +++++++++++++++---- 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index 1c6318c6bc3..de920727157 100644 --- a/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -30,7 +30,6 @@ import com.android.build.gradle.BasePlugin import com.android.build.gradle.api.LibraryVariant import com.android.build.gradle.api.ApkVariant import com.android.builder.model.BuildType -import com.android.builder.BuilderConstants import com.android.build.gradle.api.TestVariant import org.gradle.api.plugins.JavaPlugin import org.gradle.api.artifacts.dsl.DependencyHandler @@ -142,9 +141,8 @@ open class KotlinAndroidPlugin [Inject] (val scriptHandler: ScriptHandler): Plug val kotlinDirSet = kotlinSourceSet.getKotlin() kotlinDirSet.srcDir(project.file("src/${sourceSetName}/kotlin")) - sourceSet.getAllJava().source(kotlinDirSet) - sourceSet.getAllSource().source(kotlinDirSet) - sourceSet.getResources()?.getFilter()?.exclude(KSpec({ elem -> + AndroidGradleWrapper.srcDir(sourceSet, kotlinDirSet) + AndroidGradleWrapper.getResourceFilter(sourceSet)?.exclude(KSpec({ elem -> kotlinDirSet.contains(elem.getFile()) })) 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 kotlinOptions = getExtention(androidExt, "kotlinOptions") 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 { sourceSets.getByName("instrumentTest") } catch (e: UnknownDomainObjectException) { @@ -187,13 +186,8 @@ open class KotlinAndroidPlugin [Inject] (val scriptHandler: ScriptHandler): Plug for (variant in variants) { if (variant is LibraryVariant || variant is ApkVariant) { - val buildType: BuildType = if (variant is LibraryVariant) { - variant.getBuildType() - } else { - (variant as ApkVariant).getBuildType() - } + val buildTypeSourceSetName = AndroidGradleWrapper.getVariantName(variant) - val buildTypeSourceSetName = buildType.getName() logger.debug("Variant build type is [$buildTypeSourceSetName]") val buildTypeSourceSet : AndroidSourceSet? = sourceSets.findByName(buildTypeSourceSetName) @@ -216,17 +210,17 @@ open class KotlinAndroidPlugin [Inject] (val scriptHandler: ScriptHandler): Plug val javaSourceList = ArrayList() if (variant is TestVariant) { - javaSourceList.addAll(testSourceSet.getJava().getSrcDirs()) + javaSourceList.addAll(AndroidGradleWrapper.getJavaSrcDirs(testSourceSet)) val testKotlinSource = getExtention(testSourceSet, "kotlin") kotlinTask.source(testKotlinSource.getKotlin()) } else { - javaSourceList.addAll(mainSourceSet.getJava().getSrcDirs()) + javaSourceList.addAll(AndroidGradleWrapper.getJavaSrcDirs(mainSourceSet)) val mainKotlinSource = getExtention(mainSourceSet, "kotlin") kotlinTask.source(mainKotlinSource.getKotlin()) } if (null != buildTypeSourceSet) { - javaSourceList.add(buildTypeSourceSet.getJava().getSrcDirs()) + javaSourceList.add(AndroidGradleWrapper.getJavaSrcDirs(buildTypeSourceSet)) kotlinTask.source(getExtention(buildTypeSourceSet, "kotlin").getKotlin()) } javaSourceList.add(Callable{ variant.getProcessResources().getSourceOutputDir() }) @@ -239,7 +233,7 @@ open class KotlinAndroidPlugin [Inject] (val scriptHandler: ScriptHandler): Plug val flavourSourceSetName = buildTypeSourceSetName + flavour.getName() val flavourSourceSet : AndroidSourceSet? = sourceSets.findByName(flavourSourceSetName) if (flavourSourceSet != null) { - javaSourceList.add(flavourSourceSet.getJava()) + javaSourceList.add(AndroidGradleWrapper.getJavaSrcDirs(flavourSourceSet)) kotlinTask.source((buildTypeSourceSet as ExtensionAware).getExtensions().getByName("kotlin")) } } diff --git a/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/android/AndroidGradleWrapper.groovy b/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/android/AndroidGradleWrapper.groovy index b452248999b..99ac1fe1e46 100644 --- a/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/android/AndroidGradleWrapper.groovy +++ b/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/android/AndroidGradleWrapper.groovy @@ -1,14 +1,42 @@ package org.jetbrains.kotlin.gradle.plugin.android import com.android.build.gradle.BasePlugin +import org.gradle.api.tasks.util.PatternFilterable +import org.jetbrains.annotations.NotNull class AndroidGradleWrapper { - static def getRuntimeJars(BasePlugin basePlugin) { - if (basePlugin.getMetaClass().getMetaMethod("getRuntimeJarList")) { - return basePlugin.getRuntimeJarList() - } - else { - return basePlugin.getBootClasspath() - } + static def getRuntimeJars(BasePlugin basePlugin) { + if (basePlugin.getMetaClass().getMetaMethod("getRuntimeJarList")) { + return basePlugin.getRuntimeJarList() } + 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 getJavaSrcDirs(Object androidSourceSet) { + return androidSourceSet.getJava().getSrcDirs() + } }