Support java-library plugin: register Kotlin output for consumers
Issue #KT-18497 Fixed
This commit is contained in:
+47
-5
@@ -6,9 +6,7 @@ import com.android.build.gradle.api.AndroidSourceSet
|
|||||||
import com.android.builder.model.SourceProvider
|
import com.android.builder.model.SourceProvider
|
||||||
import groovy.lang.Closure
|
import groovy.lang.Closure
|
||||||
import org.apache.tools.ant.util.ReflectUtil.newInstance
|
import org.apache.tools.ant.util.ReflectUtil.newInstance
|
||||||
import org.gradle.api.InvalidUserDataException
|
import org.gradle.api.*
|
||||||
import org.gradle.api.Plugin
|
|
||||||
import org.gradle.api.Project
|
|
||||||
import org.gradle.api.artifacts.Configuration
|
import org.gradle.api.artifacts.Configuration
|
||||||
import org.gradle.api.file.ConfigurableFileCollection
|
import org.gradle.api.file.ConfigurableFileCollection
|
||||||
import org.gradle.api.file.FileCollection
|
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.internal.Kapt3KotlinGradleSubplugin.Companion.getKaptClasssesDir
|
||||||
import org.jetbrains.kotlin.gradle.tasks.*
|
import org.jetbrains.kotlin.gradle.tasks.*
|
||||||
import org.jetbrains.kotlin.gradle.utils.ParsedGradleVersion
|
import org.jetbrains.kotlin.gradle.utils.ParsedGradleVersion
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.checkedReflection
|
||||||
import org.jetbrains.kotlin.incremental.configureMultiProjectIncrementalCompilation
|
import org.jetbrains.kotlin.incremental.configureMultiProjectIncrementalCompilation
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
@@ -164,14 +163,25 @@ internal class Kotlin2JvmSourceSetProcessor(
|
|||||||
|
|
||||||
configureJavaTask(kotlinTask, javaTask, logger)
|
configureJavaTask(kotlinTask, javaTask, logger)
|
||||||
|
|
||||||
|
var syncOutputTask: SyncOutputTask? = null
|
||||||
|
|
||||||
if (!isSeparateClassesDirSupported) {
|
if (!isSeparateClassesDirSupported) {
|
||||||
createSyncOutputTask(project, kotlinTask, javaTask, kotlinAfterJavaTask, sourceSetName)
|
syncOutputTask = createSyncOutputTask(project, kotlinTask, javaTask, kotlinAfterJavaTask, sourceSetName)
|
||||||
}
|
}
|
||||||
|
|
||||||
val artifactFile = project.tryGetSingleArtifact()
|
val artifactFile = project.tryGetSingleArtifact()
|
||||||
configureMultiProjectIncrementalCompilation(project, kotlinTask, javaTask, kotlinAfterJavaTask,
|
configureMultiProjectIncrementalCompilation(project, kotlinTask, javaTask, kotlinAfterJavaTask,
|
||||||
kotlinGradleBuildServices.artifactDifferenceRegistryProvider,
|
kotlinGradleBuildServices.artifactDifferenceRegistryProvider,
|
||||||
artifactFile)
|
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
|
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(
|
internal fun SourceSetOutput.tryAddClassesDir(
|
||||||
@@ -615,7 +655,7 @@ internal fun createSyncOutputTask(
|
|||||||
javaTask: AbstractCompile,
|
javaTask: AbstractCompile,
|
||||||
kotlinAfterJavaTask: KotlinCompile?,
|
kotlinAfterJavaTask: KotlinCompile?,
|
||||||
variantName: String
|
variantName: String
|
||||||
) {
|
): SyncOutputTask {
|
||||||
// if kotlinAfterJavaTask is not null then kotlinTask compiles stubs, so don't sync them
|
// if kotlinAfterJavaTask is not null then kotlinTask compiles stubs, so don't sync them
|
||||||
val kotlinCompile = kotlinAfterJavaTask ?: kotlinTask
|
val kotlinCompile = kotlinAfterJavaTask ?: kotlinTask
|
||||||
val kotlinDir = kotlinCompile.destinationDir
|
val kotlinDir = kotlinCompile.destinationDir
|
||||||
@@ -635,6 +675,8 @@ internal fun createSyncOutputTask(
|
|||||||
previousTask.finalizedByIfNotFailed(syncTask)
|
previousTask.finalizedByIfNotFailed(syncTask)
|
||||||
|
|
||||||
project.logger.kotlinDebug { "Created task ${syncTask.path} to copy kotlin classes from $kotlinDir to $javaDir" }
|
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()
|
private val KOTLIN_ANNOTATION_PROCESSING_FILE_REGEX = "kotlin-annotation-processing-[\\-0-9A-Za-z.]+\\.jar".toRegex()
|
||||||
|
|||||||
Reference in New Issue
Block a user