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)
This commit is contained in:
Sergey Igushkin
2017-05-12 16:09:16 +03:00
committed by Alexey Tsvetkov
parent 7fae7c1d55
commit 1bc0e8a276
4 changed files with 19 additions and 7 deletions
@@ -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()
@@ -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<SourceProvider> =
@@ -375,6 +375,7 @@ abstract class AbstractAndroidProjectHandler<V>(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<List<String>?>) { friendClasspathEntries = lazyEntries }
protected val logger = Logging.getLogger(this.javaClass)
@@ -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<T : CommonCompilerArguments>() : 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<List<String>?> = lazyOf(null)
override fun compile() {
assert(false, { "unexpected call to compile()" })
}
@@ -223,7 +226,9 @@ open class KotlinCompile : AbstractKotlinCompile<K2JVMCompilerArguments>(), 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}")
}