From af198825899df9943814e2cb54d39868fff399fb Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Tue, 4 Oct 2022 17:16:47 +0200 Subject: [PATCH] [Gradle] Implement KotlinWithJavaCompilation with underlying KotlinCompilationImpl KT-54312 --- .../gradle/plugin/AbstractKotlinPlugin.kt | 8 +- .../kotlin/gradle/plugin/Kotlin2JsPlugin.kt | 3 +- .../gradle/plugin/KotlinCommonPlugin.kt | 3 +- .../kotlin/gradle/plugin/KotlinJvmPlugin.kt | 2 +- .../WithJavaCompilationDetails.kt | 2 +- ...pilationDependencyConfigurationsFactory.kt | 117 ++++++++++++------ ...avaCompilationTaskNamesContainerFactory.kt | 17 +++ ...linCompilationTaskNamesContainerFactory.kt | 1 + .../targets/jvm/KotlinWithJavaCompilation.kt | 63 +++++----- .../jvm/KotlinWithJavaCompilationFactory.kt | 38 ++++-- .../jvm/KotlinWithJavaCompilationOutput.kt | 11 +- .../targets/jvm/KotlinWithJavaTarget.kt | 9 ++ 12 files changed, 177 insertions(+), 97 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/JvmWithJavaCompilationTaskNamesContainerFactory.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/AbstractKotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/AbstractKotlinPlugin.kt index bea29dd5145..74367f0539f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/AbstractKotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/AbstractKotlinPlugin.kt @@ -38,7 +38,7 @@ internal abstract class AbstractKotlinPlugin( internal abstract fun buildSourceSetProcessor( project: Project, - compilation: AbstractKotlinCompilation<*> + compilation: KotlinCompilation<*> ): KotlinSourceSetProcessor<*> override fun apply(project: Project) { @@ -150,7 +150,7 @@ internal abstract class AbstractKotlinPlugin( fun configureTarget( target: KotlinWithJavaTarget<*, *>, - buildSourceSetProcessor: (AbstractKotlinCompilation<*>) -> KotlinSourceSetProcessor<*> + buildSourceSetProcessor: (KotlinCompilation<*>) -> KotlinSourceSetProcessor<*> ) { setUpJavaSourceSets(target) configureSourceSetDefaults(target, buildSourceSetProcessor) @@ -179,7 +179,6 @@ internal abstract class AbstractKotlinPlugin( javaSourceSets.all { javaSourceSet -> val kotlinCompilation = compilationsUnderConstruction[javaSourceSet.name] ?: kotlinTarget.compilations.maybeCreate(javaSourceSet.name) - (kotlinCompilation as? KotlinWithJavaCompilation<*, *>)?.javaSourceSet = javaSourceSet if (duplicateJavaSourceSetsAsKotlinSourceSets) { val kotlinSourceSet = project.kotlinExtension.sourceSets.maybeCreate(kotlinCompilation.name) @@ -198,7 +197,6 @@ internal abstract class AbstractKotlinPlugin( kotlinTarget.compilations.all { kotlinCompilation -> val sourceSetName = kotlinCompilation.name compilationsUnderConstruction[sourceSetName] = kotlinCompilation - (kotlinCompilation as? KotlinWithJavaCompilation<*, *>)?.javaSourceSet = javaSourceSets.maybeCreate(sourceSetName) // Another Kotlin source set following the other convention, named according to the compilation, not the Java source set: val kotlinSourceSet = project.kotlinExtension.sourceSets.maybeCreate(kotlinCompilation.defaultSourceSetName) @@ -250,7 +248,7 @@ internal abstract class AbstractKotlinPlugin( private fun configureSourceSetDefaults( kotlinTarget: KotlinWithJavaTarget<*, *>, - buildSourceSetProcessor: (AbstractKotlinCompilation<*>) -> KotlinSourceSetProcessor<*> + buildSourceSetProcessor: (KotlinCompilation<*>) -> KotlinSourceSetProcessor<*> ) { kotlinTarget.compilations.all { compilation -> AbstractKotlinTargetConfigurator.defineConfigurationsForCompilation(compilation) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/Kotlin2JsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/Kotlin2JsPlugin.kt index 68ecf3bc737..646b60d6028 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/Kotlin2JsPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/Kotlin2JsPlugin.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.gradle.plugin import org.gradle.api.Project import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry import org.jetbrains.kotlin.gradle.dsl.* -import org.jetbrains.kotlin.gradle.plugin.mpp.AbstractKotlinCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider @@ -26,7 +25,7 @@ internal open class Kotlin2JsPlugin( override fun buildSourceSetProcessor( project: Project, - compilation: AbstractKotlinCompilation<*> + compilation: KotlinCompilation<*> ): KotlinSourceSetProcessor<*> = Kotlin2JsSourceSetProcessor(tasksProvider, KotlinCompilationProjection(compilation)) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinCommonPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinCommonPlugin.kt index c9054924edd..ec48ba3a9b8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinCommonPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinCommonPlugin.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.gradle.plugin import org.gradle.api.Project import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry import org.jetbrains.kotlin.gradle.dsl.* -import org.jetbrains.kotlin.gradle.plugin.mpp.AbstractKotlinCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider @@ -22,7 +21,7 @@ internal open class KotlinCommonPlugin( override fun buildSourceSetProcessor( project: Project, - compilation: AbstractKotlinCompilation<*> + compilation: KotlinCompilation<*> ): KotlinSourceSetProcessor<*> = KotlinCommonSourceSetProcessor(KotlinCompilationProjection(compilation), tasksProvider) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJvmPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJvmPlugin.kt index 637aff2c814..4374281a73b 100755 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJvmPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJvmPlugin.kt @@ -37,7 +37,7 @@ internal open class KotlinJvmPlugin( private const val targetName = "" // use empty suffix for the task names } - override fun buildSourceSetProcessor(project: Project, compilation: AbstractKotlinCompilation<*>) = + override fun buildSourceSetProcessor(project: Project, compilation: KotlinCompilation<*>) = Kotlin2JvmSourceSetProcessor(tasksProvider, KotlinCompilationProjection(compilation)) override fun apply(project: Project) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationDetailsImpl/WithJavaCompilationDetails.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationDetailsImpl/WithJavaCompilationDetails.kt index 222de89e286..57cddd99f23 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationDetailsImpl/WithJavaCompilationDetails.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationDetailsImpl/WithJavaCompilationDetails.kt @@ -28,7 +28,7 @@ internal class WithJavaCompilationDetails) : + KotlinCompilationImplFactory.KotlinCompilationDependencyConfigurationsFactory { + override fun create(target: KotlinTarget, compilationName: String): KotlinCompilationDependencyConfigurationsContainer { + val javaSourceSet = this.target.javaSourceSets.maybeCreate(compilationName) + return KotlinCompilationDependencyConfigurationsContainer( + target = target, compilationName = compilationName, withRuntime = true, + apiConfigurationName = javaSourceSet.apiConfigurationName, + implementationConfigurationName = javaSourceSet.implementationConfigurationName, + compileOnlyConfigurationName = javaSourceSet.compileOnlyConfigurationName, + runtimeOnlyConfigurationName = javaSourceSet.runtimeOnlyConfigurationName, + compileClasspathConfigurationName = javaSourceSet.compileClasspathConfigurationName, + runtimeClasspathConfigurationName = javaSourceSet.runtimeClasspathConfigurationName + ) + } +} + +private fun interface ConfigurationNaming { + fun name(vararg parts: String): String + + class Default( + private val target: KotlinTarget, + private val compilationName: String, + ) : ConfigurationNaming { + override fun name(vararg parts: String): String = lowerCamelCaseName( + target.disambiguationClassifier, compilationName.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME }, *parts ) } - private val KotlinTarget.disambiguationClassifierInPlatform: String? - get() = when (this) { - is KotlinJsTarget -> disambiguationClassifierInPlatform - is KotlinJsIrTarget -> disambiguationClassifierInPlatform - else -> error("Unexpected target type of $this") - } + class Js( + private val target: KotlinTarget, + private val compilationName: String + ) : ConfigurationNaming { + override fun name(vararg parts: String): String = lowerCamelCaseName( + target.disambiguationClassifierInPlatform, compilationName.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME }, *parts + ) + + private val KotlinTarget.disambiguationClassifierInPlatform: String? + get() = when (this) { + is KotlinJsTarget -> disambiguationClassifierInPlatform + is KotlinJsIrTarget -> disambiguationClassifierInPlatform + else -> error("Unexpected target type of $this") + } + } } +private const val compilation = "compilation" + private fun KotlinCompilationDependencyConfigurationsContainer( target: KotlinTarget, compilationName: String, withRuntime: Boolean, - configurationNamePrefix: String = lowerCamelCaseName( - target.disambiguationClassifier, compilationName.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME }, - ), - compileClasspathConfigurationSuffix: String = "compileClasspath", - runtimeClasspathConfigurationSuffix: String = "runtimeClasspath" + naming: ConfigurationNaming = ConfigurationNaming.Default(target, compilationName), + apiConfigurationName: String = naming.name(compilation, API), + implementationConfigurationName: String = naming.name(compilation, IMPLEMENTATION), + compileOnlyConfigurationName: String = naming.name(compilation, COMPILE_ONLY), + runtimeOnlyConfigurationName: String = naming.name(compilation, RUNTIME_ONLY), + compileClasspathConfigurationName: String = naming.name("compileClasspath"), + runtimeClasspathConfigurationName: String = naming.name("runtimeClasspath") ): KotlinCompilationDependencyConfigurationsContainer { val compilationCoordinates = "${target.disambiguationClassifier}/$compilationName" - val compilation = "compilation" - fun name(vararg parts: String) = lowerCamelCaseName(configurationNamePrefix, *parts) - - val apiConfiguration = target.project.configurations.maybeCreate(name(compilation, API)).apply { + val apiConfiguration = target.project.configurations.maybeCreate(apiConfigurationName).apply { isVisible = false isCanBeConsumed = false isCanBeResolved = false description = "API dependencies for $compilationCoordinates" } - val implementationConfiguration = target.project.configurations.maybeCreate(name(compilation, IMPLEMENTATION)).apply { + val implementationConfiguration = target.project.configurations.maybeCreate(implementationConfigurationName).apply { extendsFrom(apiConfiguration) isVisible = false isCanBeConsumed = false @@ -89,7 +133,7 @@ private fun KotlinCompilationDependencyConfigurationsContainer( description = "Implementation only dependencies for $compilationCoordinates." } - val compileOnlyConfiguration = target.project.configurations.maybeCreate(name(compilation, COMPILE_ONLY)).apply { + val compileOnlyConfiguration = target.project.configurations.maybeCreate(compileOnlyConfigurationName).apply { isCanBeConsumed = false setupAsLocalTargetSpecificConfigurationIfSupported(target) attributes.attribute(Category.CATEGORY_ATTRIBUTE, target.project.categoryByName(Category.LIBRARY)) @@ -98,14 +142,14 @@ private fun KotlinCompilationDependencyConfigurationsContainer( description = "Compile only dependencies for $compilationCoordinates." } - val runtimeOnlyConfiguration = target.project.configurations.maybeCreate(name(compilation, RUNTIME_ONLY)).apply { + val runtimeOnlyConfiguration = target.project.configurations.maybeCreate(runtimeOnlyConfigurationName).apply { isVisible = false isCanBeConsumed = false isCanBeResolved = false description = "Runtime only dependencies for $compilationCoordinates." } - val compileDependencyConfiguration = target.project.configurations.maybeCreate(name(compileClasspathConfigurationSuffix)).apply { + val compileDependencyConfiguration = target.project.configurations.maybeCreate(compileClasspathConfigurationName).apply { extendsFrom(compileOnlyConfiguration, implementationConfiguration) usesPlatformOf(target) isVisible = false @@ -117,20 +161,19 @@ private fun KotlinCompilationDependencyConfigurationsContainer( description = "Compile classpath for $compilationCoordinates." } - val runtimeDependencyConfiguration = if (withRuntime) target.project.configurations.maybeCreate( - name(runtimeClasspathConfigurationSuffix) - ).apply { - extendsFrom(runtimeOnlyConfiguration, implementationConfiguration) - usesPlatformOf(target) - isVisible = false - isCanBeConsumed = false - isCanBeResolved = true - attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerRuntimeUsage(target)) - if (target.platformType != KotlinPlatformType.androidJvm) { - attributes.attribute(Category.CATEGORY_ATTRIBUTE, target.project.categoryByName(Category.LIBRARY)) - } - description = "Runtime classpath of $compilationCoordinates." - } else null + val runtimeDependencyConfiguration = + if (withRuntime) target.project.configurations.maybeCreate(runtimeClasspathConfigurationName).apply { + extendsFrom(runtimeOnlyConfiguration, implementationConfiguration) + usesPlatformOf(target) + isVisible = false + isCanBeConsumed = false + isCanBeResolved = true + attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerRuntimeUsage(target)) + if (target.platformType != KotlinPlatformType.androidJvm) { + attributes.attribute(Category.CATEGORY_ATTRIBUTE, target.project.categoryByName(Category.LIBRARY)) + } + description = "Runtime classpath of $compilationCoordinates." + } else null return DefaultKotlinCompilationDependencyConfigurationsContainer( apiConfiguration = apiConfiguration, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/JvmWithJavaCompilationTaskNamesContainerFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/JvmWithJavaCompilationTaskNamesContainerFactory.kt new file mode 100644 index 00000000000..265ff9a5ca0 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/JvmWithJavaCompilationTaskNamesContainerFactory.kt @@ -0,0 +1,17 @@ +/* + * 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.mpp.compilationImpl.factory + +import org.gradle.api.tasks.SourceSet +import org.jetbrains.kotlin.gradle.plugin.KotlinTarget +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationTaskNamesContainer + +internal class JvmWithJavaCompilationTaskNamesContainerFactory(private val javaSourceSet: SourceSet) : + KotlinCompilationImplFactory.KotlinCompilationTaskNamesContainerFactory { + override fun create(target: KotlinTarget, compilationName: String): KotlinCompilationTaskNamesContainer = + DefaultKotlinCompilationTaskNamesContainerFactory.create(target, compilationName) + .copy(compileAllTaskName = javaSourceSet.classesTaskName) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/NativeKotlinCompilationTaskNamesContainerFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/NativeKotlinCompilationTaskNamesContainerFactory.kt index fd097ca5906..0cd57292750 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/NativeKotlinCompilationTaskNamesContainerFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/NativeKotlinCompilationTaskNamesContainerFactory.kt @@ -14,3 +14,4 @@ internal object NativeKotlinCompilationTaskNamesContainerFactory : DefaultKotlinCompilationTaskNamesContainerFactory.create(target, compilationName) .copy(compileAllTaskName = lowerCamelCaseName(target.disambiguationClassifier, compilationName, "klibrary")) } + diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilation.kt index 97d673a7e97..36d041519ae 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilation.kt @@ -3,49 +3,51 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -@file:Suppress("PackageDirectoryMismatch") // Old package for compatibility +@file:Suppress("PackageDirectoryMismatch", "UNCHECKED_CAST") // Old package for compatibility package org.jetbrains.kotlin.gradle.plugin.mpp +import org.gradle.api.file.FileCollection import org.gradle.api.tasks.SourceSet import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.compile.JavaCompile -import org.jetbrains.kotlin.gradle.dsl.* +import org.jetbrains.kotlin.gradle.dsl.CompilerCommonOptions +import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.plugin.HasCompilerOptions +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationToRunnableFiles import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationWithResources -import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet -import org.jetbrains.kotlin.gradle.plugin.mpp.compilationDetailsImpl.WithJavaCompilationDetails +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationImpl import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile import org.jetbrains.kotlin.gradle.utils.named import javax.inject.Inject -abstract class KotlinWithJavaCompilation @Inject constructor( - target: KotlinWithJavaTarget, - name: String, - override val defaultSourceSet: KotlinSourceSet, - compilerOptions: HasCompilerOptions, - kotlinOptions: KotlinOptionsType -) : AbstractKotlinCompilationToRunnableFiles( - WithJavaCompilationDetails(target, name, defaultSourceSet, { compilerOptions }, { kotlinOptions }) -), KotlinCompilationWithResources { - lateinit var javaSourceSet: SourceSet +open class KotlinWithJavaCompilation @Inject internal constructor( + private val compilation: KotlinCompilationImpl, + val javaSourceSet: SourceSet, +) : InternalKotlinCompilation by compilation as InternalKotlinCompilation, + KotlinCompilationWithResources, + KotlinCompilationToRunnableFiles { + + @Suppress("UNCHECKED_CAST") + override val compilerOptions: HasCompilerOptions = + compilation.compilerOptions as HasCompilerOptions + + @Suppress("UNCHECKED_CAST") + override val kotlinOptions: KotlinOptionsType + get() = compilation.kotlinOptions as KotlinOptionsType + + val compileJavaTaskProvider: TaskProvider + get() = target.project.tasks.withType(JavaCompile::class.java).named(javaSourceSet.compileJavaTaskName) + + override val runtimeDependencyConfigurationName: String + get() = compilation.runtimeDependencyConfigurationName ?: error("Missing 'runtimeDependencyConfigurationName'") + + override var runtimeDependencyFiles: FileCollection = compilation.runtimeDependencyFiles ?: error("Missing 'runtimeDependencyFiles'") override val processResourcesTaskName: String - get() = javaSourceSet.processResourcesTaskName + get() = compilation.processResourcesTaskName ?: error("Missing 'processResourcesTaskName'") - override val runtimeOnlyConfigurationName: String - get() = javaSourceSet.runtimeOnlyConfigurationName - - override val implementationConfigurationName: String - get() = javaSourceSet.implementationConfigurationName - - override val apiConfigurationName: String - get() = javaSourceSet.apiConfigurationName - - override val compileOnlyConfigurationName: String - get() = javaSourceSet.compileOnlyConfigurationName - - override val compileAllTaskName: String - get() = javaSourceSet.classesTaskName + override val relatedConfigurationNames: List + get() = compilation.relatedConfigurationNames fun source(javaSourceSet: SourceSet) { with(target.project) { @@ -56,7 +58,4 @@ abstract class KotlinWithJavaCompilation - get() = target.project.tasks.withType(JavaCompile::class.java).named(javaSourceSet.compileJavaTaskName) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilationFactory.kt index 38e9457fd50..9f07b381fa0 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilationFactory.kt @@ -6,30 +6,44 @@ @file:Suppress("PackageDirectoryMismatch") // Old package for compatibility package org.jetbrains.kotlin.gradle.plugin.mpp -import org.jetbrains.kotlin.gradle.dsl.* +import org.jetbrains.kotlin.gradle.dsl.CompilerCommonOptions +import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.plugin.HasCompilerOptions +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.JvmKotlinCompilationAssociator +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.JvmWithJavaCompilationDependencyConfigurationsFactory +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.JvmWithJavaCompilationTaskNamesContainerFactory +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinCompilationImplFactory -class KotlinWithJavaCompilationFactory( +class KotlinWithJavaCompilationFactory internal constructor( override val target: KotlinWithJavaTarget, val compilerOptionsFactory: () -> HasCompilerOptions, val kotlinOptionsFactory: (CO) -> KotlinOptionsType ) : KotlinCompilationFactory> { + @Suppress("UNCHECKED_CAST") override val itemClass: Class> - @Suppress("UNCHECKED_CAST") get() = KotlinWithJavaCompilation::class.java as Class> @Suppress("UNCHECKED_CAST") override fun create(name: String): KotlinWithJavaCompilation { - val compilerOptions = compilerOptionsFactory() - val kotlinOptions = kotlinOptionsFactory(compilerOptions.options) + val javaSourceSet = target.javaSourceSets.maybeCreate(name) + + val compilationImplFactory = KotlinCompilationImplFactory( + compilerOptionsFactory = { _, _ -> + val compilerOptions = compilerOptionsFactory() + val kotlinOptions = kotlinOptionsFactory(compilerOptions.options) + KotlinCompilationImplFactory.CompilerOptionsFactory.Options(compilerOptions, kotlinOptions) + }, + compilationAssociator = JvmKotlinCompilationAssociator, + compilationOutputFactory = { _, compilationName -> + KotlinWithJavaCompilationOutput(target.javaSourceSets.maybeCreate(compilationName)) + }, + compilationDependencyConfigurationsFactory = JvmWithJavaCompilationDependencyConfigurationsFactory(target), + compilationTaskNamesContainerFactory = JvmWithJavaCompilationTaskNamesContainerFactory(javaSourceSet), + ) + return project.objects.newInstance( - KotlinWithJavaCompilation::class.java, - target, - name, - getOrCreateDefaultSourceSet(name), - compilerOptions, - kotlinOptions + KotlinWithJavaCompilation::class.java, compilationImplFactory.create(target, name), javaSourceSet ) as KotlinWithJavaCompilation } -} \ No newline at end of file +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilationOutput.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilationOutput.kt index 74fe6d57bd5..add14a83c14 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilationOutput.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilationOutput.kt @@ -8,16 +8,17 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.FileCollection +import org.gradle.api.tasks.SourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationOutput import java.io.File import java.util.concurrent.Callable -class KotlinWithJavaCompilationOutput( - internal val compilation: KotlinWithJavaCompilation<*, *> +class KotlinWithJavaCompilationOutput internal constructor( + private val javaSourceSet: SourceSet ) : KotlinCompilationOutput, Callable { private val javaSourceSetOutput - get() = compilation.javaSourceSet.output + get() = javaSourceSet.output override val resourcesDir: File get() = javaSourceSetOutput.resourcesDir!! @@ -28,8 +29,8 @@ class KotlinWithJavaCompilationOutput( javaSourceSetOutput.setResourcesDir(value) } - override val classesDirs: ConfigurableFileCollection = - javaSourceSetOutput.classesDirs as ConfigurableFileCollection + override val classesDirs: ConfigurableFileCollection + get() = javaSourceSetOutput.classesDirs as ConfigurableFileCollection override val allOutputs: FileCollection get() = javaSourceSetOutput diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaTarget.kt index fcf13a89f93..05f037a6575 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaTarget.kt @@ -12,10 +12,13 @@ import org.gradle.api.artifacts.Dependency import org.gradle.api.file.Directory import org.gradle.api.plugins.JavaPlugin import org.gradle.api.provider.Provider +import org.gradle.api.tasks.SourceSetContainer import org.gradle.jvm.tasks.Jar import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.plugin.HasCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessor +import org.jetbrains.kotlin.gradle.plugin.variantImplementationFactory import org.jetbrains.kotlin.gradle.tasks.KOTLIN_BUILD_DIR_NAME import java.io.File import javax.inject.Inject @@ -61,3 +64,9 @@ abstract class KotlinWithJavaTarget.javaSourceSets: SourceSetContainer + get() = project.gradle + .variantImplementationFactory() + .getInstance(project) + .sourceSets \ No newline at end of file