[Gradle] Implement KotlinCommonCompilation with underlying KotlinCompilationImpl

KT-54312
This commit is contained in:
Sebastian Sellmair
2022-10-04 09:55:29 +02:00
committed by Space Team
parent 4cbd715b17
commit 0729d7519c
7 changed files with 82 additions and 24 deletions
@@ -1,36 +1,38 @@
/*
* Copyright 2010-2018 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.
*/
/*
* Copyright 2010-2018 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
import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.dsl.*
import org.jetbrains.kotlin.gradle.dsl.CompilerMultiplatformCommonOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationImpl
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
import org.jetbrains.kotlin.gradle.tasks.KotlinCompileCommon
import javax.inject.Inject
interface KotlinMetadataCompilation<T : KotlinCommonOptions> : KotlinCompilation<T>
abstract class KotlinCommonCompilation @Inject constructor(
compilationDetails: CompilationDetails<KotlinMultiplatformCommonOptions>
) : AbstractKotlinCompilation<KotlinMultiplatformCommonOptions>(compilationDetails),
KotlinMetadataCompilation<KotlinMultiplatformCommonOptions> {
interface KotlinMetadataCompilation<T : KotlinCommonOptions> : KotlinCompilation<T>
open class KotlinCommonCompilation @Inject internal constructor(
private val compilation: KotlinCompilationImpl
) : InternalKotlinCompilation<KotlinCommonOptions> by compilation,
KotlinMetadataCompilation<KotlinCommonOptions> {
@Suppress("DEPRECATION")
@Deprecated("Accessing task instance directly is deprecated", replaceWith = ReplaceWith("compileTaskProvider"))
override val compileKotlinTask: KotlinCompileCommon
get() = super.compileKotlinTask as KotlinCompileCommon
get() = compilation.compileKotlinTask as KotlinCompileCommon
@Suppress("UNCHECKED_CAST")
override val compileTaskProvider: TaskProvider<KotlinCompilationTask<KotlinMultiplatformCommonCompilerOptions>>
get() = super.compileTaskProvider as TaskProvider<KotlinCompilationTask<KotlinMultiplatformCommonCompilerOptions>>
override val compileTaskProvider: TaskProvider<KotlinCompilationTask<CompilerMultiplatformCommonOptions>>
get() = compilation.compileTaskProvider as TaskProvider<KotlinCompilationTask<CompilerMultiplatformCommonOptions>>
internal val isKlibCompilation: Boolean
get() = target.project.isKotlinGranularMetadataEnabled && !forceCompilationToKotlinMetadata
internal var forceCompilationToKotlinMetadata: Boolean = false
}
@@ -5,15 +5,37 @@
package org.jetbrains.kotlin.gradle.plugin.mpp
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationDetailsImpl.MetadataCompilationDetails
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationFriendPathsResolver
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationSourceSetsContainer
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.CommonCompilerOptionsFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.DefaultKotlinCompilationDependencyConfigurationsFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinCompilationImplFactory
class KotlinCommonCompilationFactory(
override val target: KotlinOnlyTarget<*>
class KotlinCommonCompilationFactory internal constructor(
override val target: KotlinOnlyTarget<*>,
private val defaultSourceSet: KotlinSourceSet,
private val compilationFactory: KotlinCompilationImplFactory =
KotlinCompilationImplFactory(
compilationDependencyConfigurationsFactory = DefaultKotlinCompilationDependencyConfigurationsFactory.WithoutRuntime,
compilerOptionsFactory = CommonCompilerOptionsFactory,
compilationFriendPathsResolver = DefaultKotlinCompilationFriendPathsResolver(
friendArtifactResolver = DefaultKotlinCompilationFriendPathsResolver.FriendArtifactResolver.composite(
DefaultKotlinCompilationFriendPathsResolver.DefaultFriendArtifactResolver,
DefaultKotlinCompilationFriendPathsResolver.AdditionalMetadataFriendArtifactResolver
)
),
/*
Metadata compilations are created *because* of a pre-existing SourceSet.
We therefore can create the container inline
*/
compilationSourceSetsContainerFactory = { _, _ -> KotlinCompilationSourceSetsContainer(defaultSourceSet) }
)
) : KotlinCompilationFactory<KotlinCommonCompilation> {
override val itemClass: Class<KotlinCommonCompilation>
get() = KotlinCommonCompilation::class.java
override fun create(name: String): KotlinCommonCompilation = target.project.objects.newInstance(
KotlinCommonCompilation::class.java, MetadataCompilationDetails(target, name, getOrCreateDefaultSourceSet(name))
itemClass, compilationFactory.create(target, name)
)
}
@@ -0,0 +1,29 @@
/*
* 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.jetbrains.kotlin.gradle.dsl.CompilerCommonOptions
import org.jetbrains.kotlin.gradle.dsl.CompilerMultiplatformCommonOptions
import org.jetbrains.kotlin.gradle.dsl.CompilerMultiplatformCommonOptionsDefault
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
import org.jetbrains.kotlin.gradle.plugin.HasCompilerOptions
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
internal object CommonCompilerOptionsFactory : KotlinCompilationImplFactory.CompilerOptionsFactory {
override fun create(target: KotlinTarget, compilationName: String): KotlinCompilationImplFactory.CompilerOptionsFactory.Options {
val compilerOptions = object : HasCompilerOptions<CompilerMultiplatformCommonOptions> {
override val options: CompilerMultiplatformCommonOptions =
target.project.objects.newInstance(CompilerMultiplatformCommonOptionsDefault::class.java)
}
val kotlinOptions = object : KotlinCommonOptions {
override val options: CompilerCommonOptions
get() = compilerOptions.options
}
return KotlinCompilationImplFactory.CompilerOptionsFactory.Options(compilerOptions, kotlinOptions)
}
}
@@ -21,3 +21,5 @@ internal object JvmCompilerOptionsFactory : KotlinCompilationImplFactory.Compile
return KotlinCompilationImplFactory.CompilerOptionsFactory.Options(compilerOptions, kotlinOptions)
}
}
@@ -306,7 +306,9 @@ class KotlinMetadataTargetConfigurator :
defaultSourceSet = sourceSet
)
else -> KotlinCommonCompilationFactory(target)
else -> KotlinCommonCompilationFactory(
target = target, defaultSourceSet = sourceSet
)
}
return compilationFactory.create(compilationName).apply {
@@ -26,8 +26,11 @@ class KotlinMetadataTargetPreset(
override val itemClass: Class<KotlinCompilation<*>>
get() = KotlinCompilation::class.java
override fun create(name: String): AbstractKotlinCompilation<*> = when (name) {
KotlinCompilation.MAIN_COMPILATION_NAME -> KotlinCommonCompilationFactory(forTarget).create(name)
override fun create(name: String): InternalKotlinCompilation<*> = when (name) {
KotlinCompilation.MAIN_COMPILATION_NAME -> KotlinCommonCompilationFactory(
forTarget, getOrCreateDefaultSourceSet(name)
).create(name)
else -> error("Can't create custom metadata compilations by name")
}
}
@@ -41,9 +41,7 @@ open class KotlinSharedNativeCompilationFactory internal constructor(
Metadata compilations are created *because* of a pre-existing SourceSet.
We therefore can create the container inline
*/
compilationSourceSetsContainerFactory = KotlinCompilationImplFactory.KotlinCompilationSourceSetsContainerFactory { _, _ ->
KotlinCompilationSourceSetsContainer(defaultSourceSet)
}
compilationSourceSetsContainerFactory = { _, _ -> KotlinCompilationSourceSetsContainer(defaultSourceSet) }
)
) : KotlinCompilationFactory<KotlinSharedNativeCompilation> {