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 c3b1baf69e2..c0d93717f1d 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 @@ -73,6 +73,18 @@ abstract class AbstractKotlinAndroidGradleTests( } } + @Test + fun testAssembleAndroidTestFirst() { + val project = Project("AndroidProject", gradleVersion) + + // Execute 'assembleAndroidTest' first, without 'build' side effects + project.build("assembleAndroidTest") { + assertSuccessful() + assertContains(":copyFlavor1DebugKotlinClasses") + assertContains(":copyFlavor2DebugKotlinClasses") + } + } + @Test fun testIncrementalCompile() { val project = Project("AndroidIncrementalSingleModuleProject", gradleVersion) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidJackProject/Android/src/androidTest/java/org/jetbrains/kotlin/gradle/InternalDummyApplicationTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidJackProject/Android/src/androidTest/java/org/jetbrains/kotlin/gradle/InternalDummyApplicationTest.kt index e7feb4b96b9..95e0e22de67 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidJackProject/Android/src/androidTest/java/org/jetbrains/kotlin/gradle/InternalDummyApplicationTest.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidJackProject/Android/src/androidTest/java/org/jetbrains/kotlin/gradle/InternalDummyApplicationTest.kt @@ -23,5 +23,8 @@ class InternalDummyApplicationTest : ApplicationTestCase(Applicatio init { val dummy = InternalDummy("World") assert("Hello World!" == dummy.greeting) { "Expected: 'Hello World!'. Actual value: ${dummy.greeting}" } + + // Check that the Java sources from the tested variant are available + val bar = foo.FooJavaClass() } } \ No newline at end of file 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 3a32c822cd3..b75be85dc9a 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 @@ -458,14 +458,16 @@ internal open class KotlinAndroidPlugin( variantDataName, rootKotlinOptions, subpluginEnvironment, tasksProvider) } - configureSources(kotlinTask, variantData) - if (isAndroidTestVariant) { - configureSources(kotlinTask, testedVariantData!!) + for (task in listOfNotNull(kotlinTask, kotlinAfterJavaTask)) { + configureSources(task, variantData) } - if (kotlinAfterJavaTask != null) { - configureSources(kotlinAfterJavaTask, variantData) + if (isAndroidTestVariant) { + // Android Gradle plugin bypasses the Gradle finalizedBy for its tasks in some cases, and + // the Kotlin classes may not be copied for the tested variant. Make sure they are. + kotlinTask.dependsOn(syncOutputTaskName(testedVariantData!!.name)) } + appliedPlugins .flatMap { it.getSubpluginKotlinTasks(project, kotlinTask) } .forEach { configureSources(it, variantData) } @@ -485,7 +487,8 @@ internal open class KotlinAndroidPlugin( } } - private fun configureSources(compileTask: AbstractCompile, variantData: BaseVariantData) { + private fun configureSources(compileTask: AbstractCompile, + variantData: BaseVariantData) { val logger = compileTask.project.logger for (provider in variantData.sourceProviders) { @@ -542,6 +545,8 @@ private fun configureJavaTask(kotlinTask: KotlinCompile, javaTask: AbstractCompi javaTask.appendClasspathDynamically(kotlinTask.destinationDir!!) } +private fun syncOutputTaskName(variantName: String) = "copy${variantName.capitalize()}KotlinClasses" + private fun createSyncOutputTask( project: Project, kotlinTask: KotlinCompile, @@ -553,7 +558,7 @@ private fun createSyncOutputTask( val kotlinCompile = kotlinAfterJavaTask ?: kotlinTask val kotlinDir = kotlinCompile.destinationDir val javaDir = javaTask.destinationDir - val taskName = "copy${variantName.capitalize()}KotlinClasses" + val taskName = syncOutputTaskName(variantName) val syncTask = project.tasks.create(taskName, SyncOutputTask::class.java) syncTask.kotlinOutputDir = kotlinDir