Support java-library plugin: register Kotlin output for consumers

Issue #KT-18497 Fixed
This commit is contained in:
Sergey Igushkin
2017-08-16 21:38:08 +03:00
parent f941186f75
commit 1848bc1840
@@ -6,9 +6,7 @@ import com.android.build.gradle.api.AndroidSourceSet
import com.android.builder.model.SourceProvider
import groovy.lang.Closure
import org.apache.tools.ant.util.ReflectUtil.newInstance
import org.gradle.api.InvalidUserDataException
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.*
import org.gradle.api.artifacts.Configuration
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.FileCollection
@@ -31,6 +29,7 @@ import org.jetbrains.kotlin.gradle.internal.*
import org.jetbrains.kotlin.gradle.internal.Kapt3KotlinGradleSubplugin.Companion.getKaptClasssesDir
import org.jetbrains.kotlin.gradle.tasks.*
import org.jetbrains.kotlin.gradle.utils.ParsedGradleVersion
import org.jetbrains.kotlin.gradle.utils.checkedReflection
import org.jetbrains.kotlin.incremental.configureMultiProjectIncrementalCompilation
import java.io.File
import java.net.URL
@@ -164,14 +163,25 @@ internal class Kotlin2JvmSourceSetProcessor(
configureJavaTask(kotlinTask, javaTask, logger)
var syncOutputTask: SyncOutputTask? = null
if (!isSeparateClassesDirSupported) {
createSyncOutputTask(project, kotlinTask, javaTask, kotlinAfterJavaTask, sourceSetName)
syncOutputTask = createSyncOutputTask(project, kotlinTask, javaTask, kotlinAfterJavaTask, sourceSetName)
}
val artifactFile = project.tryGetSingleArtifact()
configureMultiProjectIncrementalCompilation(project, kotlinTask, javaTask, kotlinAfterJavaTask,
kotlinGradleBuildServices.artifactDifferenceRegistryProvider,
artifactFile)
if (project.pluginManager.hasPlugin("java-library") && sourceSetName == SourceSet.MAIN_SOURCE_SET_NAME) {
val (classesProviderTask, classesDirectory) = when {
isSeparateClassesDirSupported -> (kotlinAfterJavaTask ?: kotlinTask).let { it to it.destinationDir }
else -> syncOutputTask!!.let { it to it.javaOutputDir }
}
registerKotlinOutputForJavaLibrary(classesDirectory, classesProviderTask)
}
}
}
}
@@ -191,6 +201,36 @@ internal class Kotlin2JvmSourceSetProcessor(
return if (artifacts.size == 1) artifacts.first() else null
}
private fun registerKotlinOutputForJavaLibrary(outputDir: File, taskDependency: Task): Boolean {
val configuration = project.configurations.getByName("apiElements")
checkedReflection({
val getOutgoing = configuration.javaClass.getMethod("getOutgoing")
val outgoing = getOutgoing(configuration)
val getVariants = outgoing.javaClass.getMethod("getVariants")
val variants = getVariants(outgoing) as NamedDomainObjectCollection<*>
val variant = variants.getByName("classes")
val artifactMethod = variant.javaClass.getMethod("artifact", Any::class.java)
val artifactMap = mapOf(
"file" to outputDir,
"type" to "java-classes-directory",
"builtBy" to taskDependency
)
artifactMethod(variant, artifactMap)
return true
}, { reflectException ->
logger.kotlinWarn("Could not register Kotlin output of source set $sourceSetName for java-library: $reflectException")
return false
})
}
}
internal fun SourceSetOutput.tryAddClassesDir(
@@ -615,7 +655,7 @@ internal fun createSyncOutputTask(
javaTask: AbstractCompile,
kotlinAfterJavaTask: KotlinCompile?,
variantName: String
) {
): SyncOutputTask {
// if kotlinAfterJavaTask is not null then kotlinTask compiles stubs, so don't sync them
val kotlinCompile = kotlinAfterJavaTask ?: kotlinTask
val kotlinDir = kotlinCompile.destinationDir
@@ -635,6 +675,8 @@ internal fun createSyncOutputTask(
previousTask.finalizedByIfNotFailed(syncTask)
project.logger.kotlinDebug { "Created task ${syncTask.path} to copy kotlin classes from $kotlinDir to $javaDir" }
return syncTask
}
private val KOTLIN_ANNOTATION_PROCESSING_FILE_REGEX = "kotlin-annotation-processing-[\\-0-9A-Za-z.]+\\.jar".toRegex()