diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt index e1141a66327..b888d0bddb0 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt @@ -358,14 +358,7 @@ fun getSomething() = 10 val options = defaultBuildOptions().copy(incremental = false) project.build("assemble", options = options) { - if (isLegacyAndroidGradleVersion(androidGradlePluginVersion)) { - // Library dependencies are not supported in older versions of Android Gradle plugin (< 3.0) - assertFailed() - assertContains("Unresolved reference: layout_in_library") - assertContains("Unresolved reference: text_view") - } else { - assertSuccessful() - } + assertSuccessful() } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/app/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/app/build.gradle index 1503f5b6373..1bb50397ab2 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/app/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/app/build.gradle @@ -42,5 +42,4 @@ androidExtensions { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - compile project(":library") } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/app/src/main/java/MainActivity.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/app/src/main/java/MainActivity.kt index 6bc4499268b..51624fea09f 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/app/src/main/java/MainActivity.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/app/src/main/java/MainActivity.kt @@ -3,7 +3,6 @@ package org.example.manyvariants import android.app.Activity import android.os.Bundle import kotlinx.android.synthetic.main.activity_main.* -import kotlinx.android.synthetic.main.layout_in_library.text_view import kotlinx.android.parcel.Parcelize import android.os.Parcelable @@ -12,7 +11,6 @@ class MainActivity : Activity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) viewMain - text_view } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/library/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/library/build.gradle deleted file mode 100755 index 4fb0d31e713..00000000000 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/library/build.gradle +++ /dev/null @@ -1,24 +0,0 @@ -apply plugin: 'com.android.library' -apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' - -android { - compileSdkVersion 23 - buildToolsVersion "25.0.2" - - defaultConfig { - minSdkVersion 15 - targetSdkVersion 23 - versionCode 1 - versionName "1.0" - - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - -} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/library/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/library/src/main/AndroidManifest.xml deleted file mode 100755 index 78138528809..00000000000 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/library/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/library/src/main/res/layout/layout_in_library.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/library/src/main/res/layout/layout_in_library.xml deleted file mode 100755 index 1e6ceceb4b7..00000000000 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/library/src/main/res/layout/layout_in_library.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/library/src/main/res/values/strings.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/library/src/main/res/values/strings.xml deleted file mode 100755 index 6d5185635a6..00000000000 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/library/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - Library - diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/settings.gradle index b0c8eaa09e0..e7b4def49cb 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/settings.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidExtensionsManyVariants/settings.gradle @@ -1 +1 @@ -include ':app', ':library' \ No newline at end of file +include ':app' diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AndroidSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AndroidSubplugin.kt index 70e2c4eca2b..4f03b779558 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AndroidSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AndroidSubplugin.kt @@ -28,6 +28,7 @@ import org.gradle.api.UnknownDomainObjectException import org.gradle.api.tasks.SourceSet import org.gradle.api.tasks.compile.AbstractCompile import org.jetbrains.kotlin.gradle.plugin.* +import org.jetbrains.kotlin.gradle.plugin.android.AndroidGradleWrapper import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.w3c.dom.Document import java.io.File @@ -160,53 +161,55 @@ class AndroidSubplugin : KotlinGradleSubplugin { AndroidExtensionsFeature.parseFeatures(androidExtensionsExtension.features).joinToString(",") { it.featureName }) pluginOptions += SubpluginOption("experimental", "true") - pluginOptions += SubpluginOption("defaultCacheImplementation", androidExtensionsExtension.defaultCacheImplementation.optionName) + pluginOptions += SubpluginOption("defaultCacheImplementation", + androidExtensionsExtension.defaultCacheImplementation.optionName) val mainSourceSet = androidExtension.sourceSets.getByName("main") pluginOptions += SubpluginOption("package", getApplicationPackage(project, mainSourceSet)) - val enabledVariants = getVariantComponentNames(variantData) - val allResDirectories = mutableMapOf>() - - androidProjectHandler.forEachVariant(project) { variant -> - val variantName = androidProjectHandler.getVariantName(variant) - if (androidProjectHandler.getTestedVariantData(variant) != null) { - return@forEachVariant - } - - allResDirectories[variantName] = androidProjectHandler.getResDirectories(variant) - } - fun addVariant(name: String, resDirectories: List) { val optionValue = buildString { - append(name).append(';') + append(name) + append(';') resDirectories.joinTo(this, separator = ";") { it.canonicalPath } } - - pluginOptions += CompositeSubpluginOption( - "variant", optionValue, listOf( + pluginOptions += CompositeSubpluginOption("variant", optionValue, listOf( SubpluginOption("variantName", name), // use INTERNAL option kind since the resources are tracked as sources (see below) - FilesSubpluginOption("resDirs", resDirectories) - ) - ) + FilesSubpluginOption("resDirs", resDirectories))) kotlinCompile.source(project.files(getLayoutDirectories(resDirectories))) } - val actualResDirectories = allResDirectories.filterKeys { it in enabledVariants } - val localProjectResDirs = actualResDirectories.values - .flatMap { it } - .filter { it.isProjectLibraryResDirectory() || it.isPackageResDirectory() } + fun addSourceSetAsVariant(name: String) { + val sourceSet = androidExtension.sourceSets.findByName(name) ?: return + val srcDirs = sourceSet.res.srcDirs.toList() + if (srcDirs.isNotEmpty()) { + addVariant(sourceSet.name, srcDirs) + } + } - val commonResDirectories = getCommonResDirectories(allResDirectories.values) + localProjectResDirs - addVariant("main", commonResDirectories.distinct().sorted()) + val resDirectoriesForAllVariants = mutableListOf>() - for (sourceSetName in enabledVariants) { - val srcDirs = androidExtension.sourceSets.findByName(sourceSetName) - ?.res?.srcDirs?.toList()?.takeIf { it.isNotEmpty() } ?: continue + androidProjectHandler.forEachVariant(project) { variant -> + if (androidProjectHandler.getTestedVariantData(variant) != null) return@forEachVariant + resDirectoriesForAllVariants += androidProjectHandler.getResDirectories(variant) + } - addVariant(sourceSetName, (srcDirs - commonResDirectories).sorted()) + val commonResDirectories = getCommonResDirectories(resDirectoriesForAllVariants) + + addVariant("main", commonResDirectories.toList()) + + getVariantComponentNames(variantData)?.let { (variantName, flavorName, buildTypeName) -> + addSourceSetAsVariant(buildTypeName) + + if (flavorName.isNotEmpty()) { + addSourceSetAsVariant(flavorName) + } + + if (buildTypeName != variantName && buildTypeName != flavorName) { + addSourceSetAsVariant(variantName) + } } project.logger.warn("Blah: " + allResDirectories) @@ -214,43 +217,20 @@ class AndroidSubplugin : KotlinGradleSubplugin { return wrapPluginOptions(pluginOptions, "configuration") } - private fun File.isPackageResDirectory(): Boolean { - val packagedResDir = parentFile ?: return false - val intermediatesDir = packagedResDir.parentFile ?: return false - val buildDir = intermediatesDir.parentFile ?: return false - - return packagedResDir.name == "packaged_res" && intermediatesDir.name == "intermediates" && buildDir.name == "build" - } - - private fun File.isProjectLibraryResDirectory(): Boolean { - if (name != "res") { - return false - } - - val bundlesDir = parentFile?.parentFile ?: return false - val intermediatesDir = bundlesDir.parentFile ?: return false - val buildDir = intermediatesDir.parentFile ?: return false - - return bundlesDir.name == "bundles" && intermediatesDir.name == "intermediates" && buildDir.name == "build" - } - // Android25ProjectHandler.KaptVariant actually contains BaseVariant, not BaseVariantData - private fun getVariantComponentNames(variantData: Any?): List = when(variantData) { - is KaptVariantData<*> -> getVariantComponentNames(variantData.variantData) - is TestVariantData -> getVariantComponentNames(variantData.testedVariantData) - is TestVariant -> getVariantComponentNames(variantData.testedVariant) - is BaseVariant -> listOfNotNull(variantData.name, variantData.flavorName, variantData.buildType.name).distinct() - is BaseVariantData<*> -> { - listOfNotNull( - variantData.name, - variantData.variantConfiguration.flavorName, - variantData.variantConfiguration.buildType.name - ).distinct() - } - else -> emptyList() + private fun getVariantComponentNames(flavorData: Any?): VariantComponentNames? = when(flavorData) { + is KaptVariantData<*> -> getVariantComponentNames(flavorData.variantData) + is TestVariantData -> getVariantComponentNames(flavorData.testedVariantData) + is TestVariant -> getVariantComponentNames(flavorData.testedVariant) + is BaseVariant -> VariantComponentNames(flavorData.name, flavorData.flavorName, flavorData.buildType.name) + is BaseVariantData<*> -> VariantComponentNames(flavorData.name, flavorData.variantConfiguration.flavorName, + flavorData.variantConfiguration.buildType.name) + else -> null } - private fun getCommonResDirectories(resDirectories: Iterable>): Set { + private data class VariantComponentNames(val variantName: String, val flavorName: String, val buildTypeName: String) + + private fun getCommonResDirectories(resDirectories: List>): Set { var common = resDirectories.firstOrNull()?.toSet() ?: return emptySet() for (resDirs in resDirectories.drop(1)) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index 38d9c16fb5a..6e27084a85a 100755 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -479,12 +479,12 @@ abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationT protected val logger = Logging.getLogger(this.javaClass) abstract fun forEachVariant(project: Project, action: (V) -> Unit): Unit - abstract fun getVariantName(variant: V): String abstract fun getTestedVariantData(variantData: V): V? abstract fun getResDirectories(variantData: V): List protected abstract fun getSourceProviders(variantData: V): Iterable protected abstract fun getAllJavaSources(variantData: V): Iterable + protected abstract fun getVariantName(variant: V): String protected abstract fun getJavaTask(variantData: V): AbstractCompile? protected abstract fun addJavaSourceDirectoryToVariantModel(variantData: V, javaSourceDirectory: File): Unit