From 1bc0e8a2762f2e97e12d2924807680a6efec4fc1 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Fri, 12 May 2017 16:09:16 +0300 Subject: [PATCH] Fix friend paths configuration with the new API for compile*Test tasks Add lazy `friendClasspathEntries` to KotlinCompile Set `friendClasspathEntries` in the Android25Pro Change to AGP 3.0.0-alpha1; (cherry picked from commit 1d6dd5c) (cherry picked from commit 6cdf501) --- libraries/tools/kotlin-gradle-plugin/build.gradle | 2 +- .../plugin/android/Android25ProjectHandler.kt | 14 ++++++++++---- .../jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt | 1 + .../org/jetbrains/kotlin/gradle/tasks/Tasks.kt | 9 +++++++-- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/build.gradle b/libraries/tools/kotlin-gradle-plugin/build.gradle index f706810fca0..d053b1ecffd 100644 --- a/libraries/tools/kotlin-gradle-plugin/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin/build.gradle @@ -44,7 +44,7 @@ dependencies { compileOnly 'org.codehaus.groovy:groovy-all:2.3.9' compileOnly 'org.jetbrains.kotlin:gradle-api:2.2' - agp25CompileOnly 'com.android.tools.build:gradle:3.0.0-dev' + agp25CompileOnly 'com.android.tools.build:gradle:3.0.0-alpha1' agp25CompileOnly 'org.codehaus.groovy:groovy-all:2.3.9' agp25CompileOnly gradleApi() diff --git a/libraries/tools/kotlin-gradle-plugin/src/agp25/kotlin/org/jetbrains/kotlin/gradle/plugin/android/Android25ProjectHandler.kt b/libraries/tools/kotlin-gradle-plugin/src/agp25/kotlin/org/jetbrains/kotlin/gradle/plugin/android/Android25ProjectHandler.kt index e9c9f6a0ff9..1a15dc2dd48 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/agp25/kotlin/org/jetbrains/kotlin/gradle/plugin/android/Android25ProjectHandler.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/agp25/kotlin/org/jetbrains/kotlin/gradle/plugin/android/Android25ProjectHandler.kt @@ -1,10 +1,7 @@ package org.jetbrains.kotlin.gradle.plugin import com.android.build.gradle.* -import com.android.build.gradle.api.BaseVariant -import com.android.build.gradle.api.SourceKind -import com.android.build.gradle.api.TestVariant -import com.android.build.gradle.api.UnitTestVariant +import com.android.build.gradle.api.* import com.android.builder.model.SourceProvider import org.gradle.api.Project import org.gradle.api.tasks.compile.AbstractCompile @@ -88,6 +85,15 @@ class Android25ProjectHandler(kotlinConfigurationTools: KotlinConfigurationTools // Then don't register kotlinTask output, but only use it for Java compilation javaTask.classpath = project.files(kotlinTask.destinationDir).from(javaTask.classpath) } + + getTestedVariantData(variantData)?.let { + // Find the classpath entry that comes from the tested variant and register it as the friend path, lazily + kotlinTask.setFriendClasspathEntries(lazy { + variantData.getCompileClasspathArtifacts(preJavaClasspathKey) + .filter { it.id.componentIdentifier is TestedComponentIdentifier } + .map { it.file.absolutePath } + }) + } } override fun getSourceProviders(variantData: BaseVariant): Iterable = 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 57ba10e6626..aa210c102e3 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 @@ -375,6 +375,7 @@ abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationT protected val KotlinCompile.annotationsFile: File? get() = kaptOptions.annotationsFile protected fun KotlinCompile.setJavaOutput(file: File) { javaOutputDir = file } + protected fun KotlinCompile.setFriendClasspathEntries(lazyEntries: Lazy?>) { friendClasspathEntries = lazyEntries } protected val logger = Logging.getLogger(this.javaClass) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index 51a9cf2854e..9f619ec07cf 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -38,9 +38,9 @@ import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.plugin.kotlinDebug import org.jetbrains.kotlin.gradle.plugin.kotlinInfo import org.jetbrains.kotlin.gradle.utils.ParsedGradleVersion -import org.jetbrains.kotlin.incremental.* import org.jetbrains.kotlin.incremental.multiproject.ArtifactDifferenceRegistry import org.jetbrains.kotlin.incremental.multiproject.ArtifactDifferenceRegistryProvider +import org.jetbrains.kotlin.incremental.* import org.jetbrains.kotlin.utils.LibraryUtils import java.io.File import java.util.* @@ -117,6 +117,9 @@ abstract class AbstractKotlinCompile() : AbstractCo internal val moduleName: String get() = "${project.name}_$sourceSetName" + // In case the friend classpath entries are known at the task configuration time, they will be set + internal var friendClasspathEntries: Lazy?> = lazyOf(null) + override fun compile() { assert(false, { "unexpected call to compile()" }) } @@ -223,7 +226,9 @@ open class KotlinCompile : AbstractKotlinCompile(), Kotl internal fun addFriendPathForTestTask(friendKotlinTaskName: String, args: K2JVMCompilerArguments) { val friendTask = project.getTasksByName(friendKotlinTaskName, /* recursive = */false).firstOrNull() as? KotlinCompile ?: return - args.friendPaths = arrayOf(friendTask.javaOutputDir!!.absolutePath) + args.friendPaths = arrayOf( + friendTask.javaOutputDir!!.absolutePath, + *friendClasspathEntries.value.orEmpty().toTypedArray()) args.moduleName = friendTask.moduleName logger.kotlinDebug("java destination directory for production = ${friendTask.javaOutputDir}") }