[Gradle][Minor] Move KotlinSourceSetProcessor into separate source file
KT-54312
This commit is contained in:
committed by
Space Team
parent
712abe5763
commit
10ca5d7f2a
-94
@@ -11,8 +11,6 @@ import org.gradle.api.attributes.Category
|
|||||||
import org.gradle.api.attributes.Usage
|
import org.gradle.api.attributes.Usage
|
||||||
import org.gradle.api.file.Directory
|
import org.gradle.api.file.Directory
|
||||||
import org.gradle.api.file.FileCollection
|
import org.gradle.api.file.FileCollection
|
||||||
import org.gradle.api.file.SourceDirectorySet
|
|
||||||
import org.gradle.api.logging.Logging
|
|
||||||
import org.gradle.api.plugins.JavaPlugin
|
import org.gradle.api.plugins.JavaPlugin
|
||||||
import org.gradle.api.provider.Provider
|
import org.gradle.api.provider.Provider
|
||||||
import org.gradle.api.publish.PublishingExtension
|
import org.gradle.api.publish.PublishingExtension
|
||||||
@@ -35,7 +33,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinCompilationData
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.isMainCompilationData
|
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.isMainCompilationData
|
||||||
import org.jetbrains.kotlin.gradle.scripting.internal.ScriptingGradleSubplugin
|
import org.jetbrains.kotlin.gradle.scripting.internal.ScriptingGradleSubplugin
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.ir.*
|
import org.jetbrains.kotlin.gradle.targets.js.ir.*
|
||||||
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
|
|
||||||
import org.jetbrains.kotlin.gradle.tasks.*
|
import org.jetbrains.kotlin.gradle.tasks.*
|
||||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||||
import org.jetbrains.kotlin.gradle.tasks.configuration.*
|
import org.jetbrains.kotlin.gradle.tasks.configuration.*
|
||||||
@@ -54,97 +51,6 @@ val KOTLIN_DSL_NAME = "kotlin"
|
|||||||
val KOTLIN_JS_DSL_NAME = "kotlin2js"
|
val KOTLIN_JS_DSL_NAME = "kotlin2js"
|
||||||
val KOTLIN_OPTIONS_DSL_NAME = "kotlinOptions"
|
val KOTLIN_OPTIONS_DSL_NAME = "kotlinOptions"
|
||||||
|
|
||||||
internal abstract class KotlinSourceSetProcessor<T : AbstractKotlinCompile<*>>(
|
|
||||||
val tasksProvider: KotlinTasksProvider,
|
|
||||||
val taskDescription: String,
|
|
||||||
kotlinCompilation: KotlinCompilationData<*>
|
|
||||||
) : KotlinCompilationProcessor<T>(kotlinCompilation) {
|
|
||||||
protected abstract fun doTargetSpecificProcessing()
|
|
||||||
protected val logger = Logging.getLogger(this.javaClass)!!
|
|
||||||
|
|
||||||
protected val sourceSetName: String = kotlinCompilation.compilationPurpose
|
|
||||||
|
|
||||||
override val kotlinTask: TaskProvider<out T> = prepareKotlinCompileTask()
|
|
||||||
|
|
||||||
protected val javaSourceSet: SourceSet?
|
|
||||||
get() {
|
|
||||||
val compilation = kotlinCompilation
|
|
||||||
return (compilation as? KotlinWithJavaCompilation<*, *>)?.javaSourceSet
|
|
||||||
?: kotlinCompilation.owner.let {
|
|
||||||
if (it is KotlinJvmTarget && it.withJavaEnabled && compilation is KotlinJvmCompilation)
|
|
||||||
project.gradle.variantImplementationFactory<JavaSourceSetsAccessor.JavaSourceSetsAccessorVariantFactory>()
|
|
||||||
.getInstance(project)
|
|
||||||
.sourceSets
|
|
||||||
.maybeCreate(compilation.name)
|
|
||||||
else null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun prepareKotlinCompileTask(): TaskProvider<out T> =
|
|
||||||
doRegisterTask(project, kotlinCompilation.compileKotlinTaskName).also { task ->
|
|
||||||
kotlinCompilation.output.classesDirs.from(task.flatMap { it.destinationDirectory })
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun run() {
|
|
||||||
addKotlinDirectoriesToJavaSourceSet()
|
|
||||||
doTargetSpecificProcessing()
|
|
||||||
|
|
||||||
if (kotlinCompilation is KotlinWithJavaCompilation<*, *>) {
|
|
||||||
createAdditionalClassesTaskForIdeRunner()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun addKotlinDirectoriesToJavaSourceSet() {
|
|
||||||
val java = javaSourceSet ?: return
|
|
||||||
|
|
||||||
// Try to avoid duplicate Java sources in allSource; run lazily to allow changing the directory set:
|
|
||||||
val kotlinSrcDirsToAdd = Callable {
|
|
||||||
kotlinCompilation.kotlinSourceDirectoriesByFragmentName.values.map { filterOutJavaSrcDirsIfPossible(it) }
|
|
||||||
}
|
|
||||||
|
|
||||||
java.allJava.srcDirs(kotlinSrcDirsToAdd)
|
|
||||||
java.allSource.srcDirs(kotlinSrcDirsToAdd)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun filterOutJavaSrcDirsIfPossible(sourceDirectories: SourceDirectorySet): FileCollection {
|
|
||||||
val java = javaSourceSet ?: return sourceDirectories
|
|
||||||
|
|
||||||
// Build a lazily-resolved file collection that filters out Java sources from sources of this sourceDirectorySet
|
|
||||||
return sourceDirectories.sourceDirectories.minus(java.java.sourceDirectories)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createAdditionalClassesTaskForIdeRunner() {
|
|
||||||
val kotlinCompilation = kotlinCompilation as? KotlinCompilation<*> ?: return
|
|
||||||
|
|
||||||
open class IDEClassesTask : DefaultTask()
|
|
||||||
// Workaround: as per KT-26641, when there's a Kotlin compilation with a Java source set, we create another task
|
|
||||||
// that has a name composed as '<IDE module name>Classes`, where the IDE module name is the default source set name:
|
|
||||||
val expectedClassesTaskName = "${kotlinCompilation.defaultSourceSetName}Classes"
|
|
||||||
project.tasks.run {
|
|
||||||
val shouldCreateTask = expectedClassesTaskName !in names
|
|
||||||
if (shouldCreateTask) {
|
|
||||||
project.registerTask(expectedClassesTaskName, IDEClassesTask::class.java) {
|
|
||||||
it.dependsOn(getByName(kotlinCompilation.compileAllTaskName))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected fun applyStandardTaskConfiguration(taskConfiguration: AbstractKotlinCompileConfig<*>) {
|
|
||||||
taskConfiguration.configureTask {
|
|
||||||
it.description = taskDescription
|
|
||||||
if (it is Kotlin2JsCompile) {
|
|
||||||
it.defaultDestinationDirectory.convention(defaultKotlinDestinationDir)
|
|
||||||
} else {
|
|
||||||
it.destinationDirectory.convention(defaultKotlinDestinationDir)
|
|
||||||
}
|
|
||||||
it.libraries.from({ kotlinCompilation.compileDependencyFiles })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract fun doRegisterTask(project: Project, taskName: String): TaskProvider<out T>
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class Kotlin2JvmSourceSetProcessor(
|
internal class Kotlin2JvmSourceSetProcessor(
|
||||||
tasksProvider: KotlinTasksProvider,
|
tasksProvider: KotlinTasksProvider,
|
||||||
kotlinCompilation: KotlinCompilationData<*>
|
kotlinCompilation: KotlinCompilationData<*>
|
||||||
|
|||||||
+116
@@ -0,0 +1,116 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.plugin
|
||||||
|
|
||||||
|
import org.gradle.api.DefaultTask
|
||||||
|
import org.gradle.api.Project
|
||||||
|
import org.gradle.api.file.FileCollection
|
||||||
|
import org.gradle.api.file.SourceDirectorySet
|
||||||
|
import org.gradle.api.logging.Logging
|
||||||
|
import org.gradle.api.tasks.SourceSet
|
||||||
|
import org.gradle.api.tasks.TaskProvider
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessor
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmCompilation
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaCompilation
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinCompilationData
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
|
||||||
|
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
|
||||||
|
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
|
||||||
|
import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
|
||||||
|
import org.jetbrains.kotlin.gradle.tasks.configuration.AbstractKotlinCompileConfig
|
||||||
|
import org.jetbrains.kotlin.gradle.tasks.registerTask
|
||||||
|
import java.util.concurrent.Callable
|
||||||
|
|
||||||
|
internal abstract class KotlinSourceSetProcessor<T : AbstractKotlinCompile<*>>(
|
||||||
|
val tasksProvider: KotlinTasksProvider,
|
||||||
|
val taskDescription: String,
|
||||||
|
kotlinCompilation: KotlinCompilationData<*>
|
||||||
|
) : KotlinCompilationProcessor<T>(kotlinCompilation) {
|
||||||
|
protected abstract fun doTargetSpecificProcessing()
|
||||||
|
protected val logger = Logging.getLogger(this.javaClass)!!
|
||||||
|
|
||||||
|
protected val sourceSetName: String = kotlinCompilation.compilationPurpose
|
||||||
|
|
||||||
|
override val kotlinTask: TaskProvider<out T> = prepareKotlinCompileTask()
|
||||||
|
|
||||||
|
protected val javaSourceSet: SourceSet?
|
||||||
|
get() {
|
||||||
|
val compilation = kotlinCompilation
|
||||||
|
return (compilation as? KotlinWithJavaCompilation<*, *>)?.javaSourceSet
|
||||||
|
?: kotlinCompilation.owner.let {
|
||||||
|
if (it is KotlinJvmTarget && it.withJavaEnabled && compilation is KotlinJvmCompilation)
|
||||||
|
project.gradle.variantImplementationFactory<JavaSourceSetsAccessor.JavaSourceSetsAccessorVariantFactory>()
|
||||||
|
.getInstance(project)
|
||||||
|
.sourceSets
|
||||||
|
.maybeCreate(compilation.name)
|
||||||
|
else null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun prepareKotlinCompileTask(): TaskProvider<out T> =
|
||||||
|
doRegisterTask(project, kotlinCompilation.compileKotlinTaskName).also { task ->
|
||||||
|
kotlinCompilation.output.classesDirs.from(task.flatMap { it.destinationDirectory })
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun run() {
|
||||||
|
addKotlinDirectoriesToJavaSourceSet()
|
||||||
|
doTargetSpecificProcessing()
|
||||||
|
|
||||||
|
if (kotlinCompilation is KotlinWithJavaCompilation<*, *>) {
|
||||||
|
createAdditionalClassesTaskForIdeRunner()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun addKotlinDirectoriesToJavaSourceSet() {
|
||||||
|
val java = javaSourceSet ?: return
|
||||||
|
|
||||||
|
// Try to avoid duplicate Java sources in allSource; run lazily to allow changing the directory set:
|
||||||
|
val kotlinSrcDirsToAdd = Callable {
|
||||||
|
kotlinCompilation.kotlinSourceDirectoriesByFragmentName.values.map { filterOutJavaSrcDirsIfPossible(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
java.allJava.srcDirs(kotlinSrcDirsToAdd)
|
||||||
|
java.allSource.srcDirs(kotlinSrcDirsToAdd)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun filterOutJavaSrcDirsIfPossible(sourceDirectories: SourceDirectorySet): FileCollection {
|
||||||
|
val java = javaSourceSet ?: return sourceDirectories
|
||||||
|
|
||||||
|
// Build a lazily-resolved file collection that filters out Java sources from sources of this sourceDirectorySet
|
||||||
|
return sourceDirectories.sourceDirectories.minus(java.java.sourceDirectories)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createAdditionalClassesTaskForIdeRunner() {
|
||||||
|
val kotlinCompilation = kotlinCompilation as? KotlinCompilation<*> ?: return
|
||||||
|
|
||||||
|
open class IDEClassesTask : DefaultTask()
|
||||||
|
// Workaround: as per KT-26641, when there's a Kotlin compilation with a Java source set, we create another task
|
||||||
|
// that has a name composed as '<IDE module name>Classes`, where the IDE module name is the default source set name:
|
||||||
|
val expectedClassesTaskName = "${kotlinCompilation.defaultSourceSetName}Classes"
|
||||||
|
project.tasks.run {
|
||||||
|
val shouldCreateTask = expectedClassesTaskName !in names
|
||||||
|
if (shouldCreateTask) {
|
||||||
|
project.registerTask(expectedClassesTaskName, IDEClassesTask::class.java) {
|
||||||
|
it.dependsOn(getByName(kotlinCompilation.compileAllTaskName))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun applyStandardTaskConfiguration(taskConfiguration: AbstractKotlinCompileConfig<*>) {
|
||||||
|
taskConfiguration.configureTask {
|
||||||
|
it.description = taskDescription
|
||||||
|
if (it is Kotlin2JsCompile) {
|
||||||
|
it.defaultDestinationDirectory.convention(defaultKotlinDestinationDir)
|
||||||
|
} else {
|
||||||
|
it.destinationDirectory.convention(defaultKotlinDestinationDir)
|
||||||
|
}
|
||||||
|
it.libraries.from({ kotlinCompilation.compileDependencyFiles })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract fun doRegisterTask(project: Project, taskName: String): TaskProvider<out T>
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user