[Gradle] Fix friendArtifactResolver for External Targets API

It was failing with ClassCastException in an attempt of using it.

Also added a test case to cover the logic with friendArtifactResolver

^KT-66431 Verification Pending
This commit is contained in:
Anton Lakotka
2024-03-08 14:45:43 +01:00
committed by Space Team
parent 5873127342
commit e2336e1752
4 changed files with 54 additions and 1 deletions
@@ -7,6 +7,7 @@
package org.jetbrains.kotlin.gradle.android 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.KotlinCommonOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions
@@ -27,5 +28,7 @@ class PrototypeAndroidCompilation(delegate: Delegate) : DecoratedExternalKotlinC
get() = super.compilerOptions as HasCompilerOptions<KotlinJvmCompilerOptions> get() = super.compilerOptions as HasCompilerOptions<KotlinJvmCompilerOptions>
var androidCompilationSpecificStuff = 10 var androidCompilationSpecificStuff = 10
val extraFriendPaths: ConfigurableFileCollection = project.files()
} }
@@ -25,6 +25,10 @@ internal fun PrototypeAndroidTarget.createAndroidCompilation(name: String): Prot
compilationFactory = CompilationFactory(::PrototypeAndroidCompilation) compilationFactory = CompilationFactory(::PrototypeAndroidCompilation)
compileTaskName = camelCase("prototype", "compile", targetName, name) compileTaskName = camelCase("prototype", "compile", targetName, name)
friendArtifactResolver = ExternalKotlinCompilationDescriptor.FriendArtifactResolver { compilation ->
compilation.extraFriendPaths
}
/* /*
Replace Kotlin's compilation association (main <-> test) with noop, Replace Kotlin's compilation association (main <-> test) with noop,
since Android goes through adding a dependency on the project itself since Android goes through adding a dependency on the project itself
@@ -61,7 +61,7 @@ fun <T : DecoratedExternalKotlinCompilation> DecoratedExternalKotlinTarget.creat
descriptor.friendArtifactResolver?.let { declaredResolver -> descriptor.friendArtifactResolver?.let { declaredResolver ->
DefaultKotlinCompilationFriendPathsResolver.FriendArtifactResolver { compilation -> DefaultKotlinCompilationFriendPathsResolver.FriendArtifactResolver { compilation ->
@Suppress("unchecked_cast") @Suppress("unchecked_cast")
declaredResolver.resolveFriendPaths(compilation as T) declaredResolver.resolveFriendPaths(compilation.decoratedInstance as T)
} }
} }
) )
@@ -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.anyDependency
import org.jetbrains.kotlin.gradle.idea.testFixtures.tcs.assertMatches import org.jetbrains.kotlin.gradle.idea.testFixtures.tcs.assertMatches
import org.jetbrains.kotlin.gradle.idea.testFixtures.tcs.binaryCoordinates 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.plugin.ide.kotlinIdeMultiplatformImport
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.gradle.util.* import org.jetbrains.kotlin.gradle.util.*
import org.jetbrains.kotlin.gradle.utils.getByType import org.jetbrains.kotlin.gradle.utils.getByType
import org.jetbrains.kotlin.util.assertDoesNotThrow
import org.junit.Test import org.junit.Test
import kotlin.test.BeforeTest import kotlin.test.BeforeTest
import kotlin.test.assertEquals import kotlin.test.assertEquals
@@ -96,4 +99,47 @@ class ExternalAndroidTargetPrototypeSmokeTest {
anyDependency() 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()}")
}
} }