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 56b5f2dd6ce..247e3ab8714 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 @@ -75,7 +75,7 @@ open class KotlinAndroid36GradleIT : KotlinAndroid33GradleIT() { } @Test - fun testAndroidWithNewMppApp() = with(Project("new-mpp-android", GradleVersionRequired.FOR_MPP_SUPPORT)) { + fun testAndroidWithNewMppApp() = with(Project("new-mpp-android")) { build("assemble", "compileDebugUnitTestJavaWithJavac", "printCompilerPluginOptions") { assertSuccessful() @@ -114,7 +114,10 @@ open class KotlinAndroid36GradleIT : KotlinAndroid33GradleIT() { compilerPluginArgsRegex.findAll(output).associate { it.groupValues[1] to it.groupValues[2] } compilerPluginOptionsBySourceSet.entries.forEach { (sourceSetName, argsString) -> - val shouldHaveAndroidExtensionArgs = sourceSetName.startsWith("androidApp") + val shouldHaveAndroidExtensionArgs = + sourceSetName.startsWith("androidApp") && ( + androidGradlePluginVersion < AGPVersion.v7_0_0 || !sourceSetName.contains("AndroidTestRelease") + ) if (shouldHaveAndroidExtensionArgs) assertTrue("$sourceSetName is an Android source set and should have Android Extensions in the args") { "plugin:org.jetbrains.kotlin.android" in argsString @@ -260,7 +263,7 @@ open class KotlinAndroid36GradleIT : KotlinAndroid33GradleIT() { } @Test - fun testAndroidMppProductionDependenciesInTests() = with(Project("new-mpp-android", GradleVersionRequired.FOR_MPP_SUPPORT)) { + fun testAndroidMppProductionDependenciesInTests() = with(Project("new-mpp-android")) { // Test the fix for KT-29343 setupWorkingDir() @@ -314,7 +317,7 @@ open class KotlinAndroid36GradleIT : KotlinAndroid33GradleIT() { } @Test - fun testCustomAttributesInAndroidTargets() = with(Project("new-mpp-android", GradleVersionRequired.FOR_MPP_SUPPORT)) { + fun testCustomAttributesInAndroidTargets() = with(Project("new-mpp-android")) { // Test the fix for KT-27714 setupWorkingDir() @@ -346,6 +349,16 @@ open class KotlinAndroid36GradleIT : KotlinAndroid33GradleIT() { run { val appBuildScriptBackup = gradleBuildScript("app").readText() + gradleBuildScript("lib").appendText( + "\n" + """ + kotlin.targets.all { + attributes.attribute( + Attribute.of("com.example.target", String), + targetName + ) + } + """.trimIndent() + ) gradleBuildScript("app").appendText( "\n" + """ kotlin.targets.androidApp.attributes.attribute( @@ -357,9 +370,24 @@ open class KotlinAndroid36GradleIT : KotlinAndroid33GradleIT() { build(":app:compileDebugKotlinAndroidApp") { assertFailed() // dependency resolution should fail - assertContains("Required com.example.target 'notAndroidLib'") + assertTrue( + "Required com.example.target 'notAndroidLib'" in output || + "attribute 'com.example.target' with value 'notAndroidLib'" in output + ) } + gradleBuildScript("lib").writeText( + appBuildScriptBackup + "\n" + """ + kotlin.targets.all { + compilations.all { + attributes.attribute( + Attribute.of("com.example.compilation", String), + targetName + compilationName.capitalize() + ) + } + } + """.trimIndent() + ) gradleBuildScript("app").writeText( appBuildScriptBackup + "\n" + """ kotlin.targets.androidApp.compilations.all { @@ -373,7 +401,10 @@ open class KotlinAndroid36GradleIT : KotlinAndroid33GradleIT() { build(":app:compileDebugKotlinAndroidApp") { assertFailed() - assertContains("Required com.example.compilation 'notDebug'") + assertTrue( + "Required com.example.compilation 'notDebug'" in output || + "attribute 'com.example.compilation' with value 'notDebug'" in output + ) } } } @@ -405,6 +436,20 @@ open class KotlinAndroid36GradleIT : KotlinAndroid33GradleIT() { } } +open class KotlinAndroid70GradleIT : KotlinAndroid36GradleIT() { + override val androidGradlePluginVersion: AGPVersion + get() = AGPVersion.v7_0_0 + + override val defaultGradleVersion: GradleVersionRequired + get() = GradleVersionRequired.AtLeast("6.8") + + override fun defaultBuildOptions(): BuildOptions { + val javaHome = File(System.getProperty("jdk11Home")!!) + Assume.assumeTrue("JDK 11 should be available", javaHome.isDirectory) + return super.defaultBuildOptions().copy(javaHome = javaHome, warningMode = WarningMode.Summary) + } +} + open class KotlinAndroid32GradleIT : KotlinAndroid3GradleIT() { override val androidGradlePluginVersion: AGPVersion get() = AGPVersion.v3_2_0 diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/AGPVersion.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/AGPVersion.kt index 75b04c88c68..0fba0bacefc 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/AGPVersion.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/AGPVersion.kt @@ -26,5 +26,6 @@ class AGPVersion private constructor(private val versionNumber: VersionNumber) { val v3_6_0 = fromString("3.6.0") val v4_1_0 = fromString("4.1.0-beta02") val v4_2_0 = fromString("4.2.0-alpha10") + val v7_0_0 = fromString("7.0.0-alpha03") } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/build.gradle index a53f35cae83..19fae98ebd1 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/app/build.gradle @@ -10,7 +10,7 @@ android { defaultConfig { applicationId "app.example.com.app_sample" minSdkVersion 21 - targetSdkVersion 27 + targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/build.gradle index ca9a42518bd..d9d555d50c1 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-android/lib/build.gradle @@ -10,7 +10,7 @@ android { defaultConfig { minSdkVersion 21 - targetSdkVersion 27 + targetSdkVersion 29 versionCode 1 versionName "1.0" 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 288ea2be08f..6d28b3110eb 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 @@ -855,7 +855,17 @@ abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationTool compileOnlyConfigurationName: String, runtimeOnlyConfigurationName: String ) { - project.addExtendsFromRelation(androidSourceSet.apiConfigurationName, apiConfigurationName) + if (project.configurations.findByName(androidSourceSet.apiConfigurationName) != null) { + project.addExtendsFromRelation(androidSourceSet.apiConfigurationName, apiConfigurationName) + } else { + // If any dependency is added to this configuration, report an error: + project.configurations.getByName(apiConfigurationName).dependencies.all { dependency -> + throw InvalidUserCodeException( + "API dependencies are not allowed for Android source set ${androidSourceSet.name}. " + + "Please use an implementation dependency instead." + ) + } + } project.addExtendsFromRelation(androidSourceSet.implementationConfigurationName, implementationConfigurationName) project.addExtendsFromRelation(androidSourceSet.compileOnlyConfigurationName, compileOnlyConfigurationName) project.addExtendsFromRelation(androidSourceSet.runtimeOnlyConfigurationName, runtimeOnlyConfigurationName)