diff --git a/libraries/tools/kotlin-gradle-plugin-tcs-android/src/main/kotlin/org/jetbrains/kotlin/gradle/android/PrototypeAndroidCompilation.kt b/libraries/tools/kotlin-gradle-plugin-tcs-android/src/main/kotlin/org/jetbrains/kotlin/gradle/android/PrototypeAndroidCompilation.kt index a20b194b21e..2f8992033e4 100644 --- a/libraries/tools/kotlin-gradle-plugin-tcs-android/src/main/kotlin/org/jetbrains/kotlin/gradle/android/PrototypeAndroidCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin-tcs-android/src/main/kotlin/org/jetbrains/kotlin/gradle/android/PrototypeAndroidCompilation.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.android +import org.gradle.api.file.ConfigurableFileCollection import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions @@ -27,5 +28,7 @@ class PrototypeAndroidCompilation(delegate: Delegate) : DecoratedExternalKotlinC get() = super.compilerOptions as HasCompilerOptions var androidCompilationSpecificStuff = 10 + + val extraFriendPaths: ConfigurableFileCollection = project.files() } diff --git a/libraries/tools/kotlin-gradle-plugin-tcs-android/src/main/kotlin/org/jetbrains/kotlin/gradle/android/createAndroidCompilation.kt b/libraries/tools/kotlin-gradle-plugin-tcs-android/src/main/kotlin/org/jetbrains/kotlin/gradle/android/createAndroidCompilation.kt index 15b42bfe08a..316bc1228a1 100644 --- a/libraries/tools/kotlin-gradle-plugin-tcs-android/src/main/kotlin/org/jetbrains/kotlin/gradle/android/createAndroidCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin-tcs-android/src/main/kotlin/org/jetbrains/kotlin/gradle/android/createAndroidCompilation.kt @@ -25,6 +25,10 @@ internal fun PrototypeAndroidTarget.createAndroidCompilation(name: String): Prot compilationFactory = CompilationFactory(::PrototypeAndroidCompilation) compileTaskName = camelCase("prototype", "compile", targetName, name) + friendArtifactResolver = ExternalKotlinCompilationDescriptor.FriendArtifactResolver { compilation -> + compilation.extraFriendPaths + } + /* Replace Kotlin's compilation association (main <-> test) with noop, since Android goes through adding a dependency on the project itself diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/createExternalKotlinCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/createExternalKotlinCompilation.kt index 058ad88d970..b77fe0ed60a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/createExternalKotlinCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/createExternalKotlinCompilation.kt @@ -61,7 +61,7 @@ fun DecoratedExternalKotlinTarget.creat descriptor.friendArtifactResolver?.let { declaredResolver -> DefaultKotlinCompilationFriendPathsResolver.FriendArtifactResolver { compilation -> @Suppress("unchecked_cast") - declaredResolver.resolveFriendPaths(compilation as T) + declaredResolver.resolveFriendPaths(compilation.decoratedInstance as T) } } ) diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/tcs/ExternalAndroidTargetPrototypeSmokeTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/tcs/ExternalAndroidTargetPrototypeSmokeTest.kt index 042b158ab8d..6c660880361 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/tcs/ExternalAndroidTargetPrototypeSmokeTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/tcs/ExternalAndroidTargetPrototypeSmokeTest.kt @@ -16,9 +16,12 @@ import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.idea.testFixtures.tcs.anyDependency import org.jetbrains.kotlin.gradle.idea.testFixtures.tcs.assertMatches import org.jetbrains.kotlin.gradle.idea.testFixtures.tcs.binaryCoordinates +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer.CreateCompilerArgumentsContext.Companion.default import org.jetbrains.kotlin.gradle.plugin.ide.kotlinIdeMultiplatformImport +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.util.* import org.jetbrains.kotlin.gradle.utils.getByType +import org.jetbrains.kotlin.util.assertDoesNotThrow import org.junit.Test import kotlin.test.BeforeTest import kotlin.test.assertEquals @@ -96,4 +99,47 @@ class ExternalAndroidTargetPrototypeSmokeTest { anyDependency() ) } + + @Test + fun `test compile task arguments created without failures`() { + val project = buildProject { + enableDefaultStdlibDependency(false) + enableDependencyVerification(false) + applyMultiplatformPlugin() + repositories.mavenLocal() + repositories.mavenCentralCacheRedirector() + } + setAndroidSdkDirProperty(project) + project.androidLibrary { compileSdk = 31 } + val androidTargetPrototype = project.multiplatformExtension.androidTargetPrototype() + project.evaluate() + + androidTargetPrototype.compilations.forEach { compilation -> + val compileTask = compilation.compileTaskProvider.get() as KotlinCompile + assertDoesNotThrow { compileTask.createCompilerArguments(default) } + } + } + + @Test + fun `test extra friend-path is added correctly to compiler args`() { + val project = buildProject { + enableDefaultStdlibDependency(false) + enableDependencyVerification(false) + applyMultiplatformPlugin() + repositories.mavenLocal() + repositories.mavenCentralCacheRedirector() + } + setAndroidSdkDirProperty(project) + project.androidLibrary { compileSdk = 31 } + val androidTargetPrototype = project.multiplatformExtension.androidTargetPrototype() + project.evaluate() + + val unitTest = androidTargetPrototype.compilations.getByName("unitTest") + val file = project.file("foo.jar") + unitTest.extraFriendPaths.from(file) + + val compileTask = unitTest.compileTaskProvider.get() as KotlinCompile + val args = compileTask.createCompilerArguments(default) + if (file.absolutePath !in args.friendPaths!!) fail("File $file was not found int the friend paths ${args.friendPaths!!.toList()}") + } }