[Gradle][MPP] Ensure presence of .defaultSourceSet when creating kotlinCompilations

This will finally make calls to KotlinCompilation.defaultSourceSet
or sourceSets.getByName(compilation.defaultSourceSetName) safe.

This will also enable removing the `kotlinSourceSetsIncludingDefault`
pitfall

^KT-52726 Verification Pending
This commit is contained in:
Sebastian Sellmair
2022-09-09 13:16:07 +02:00
committed by Space
parent 5f085f0448
commit f4eba62f8c
30 changed files with 217 additions and 198 deletions
@@ -33,7 +33,8 @@ interface KotlinCompilation<out T : KotlinCommonOptions> : Named, HasAttributes,
val allKotlinSourceSets: Set<KotlinSourceSet> val allKotlinSourceSets: Set<KotlinSourceSet>
val defaultSourceSetName: String @Deprecated("Use defaultSourceSet.name instead", ReplaceWith("defaultSourceSet.name"))
val defaultSourceSetName: String get() = defaultSourceSet.name
val defaultSourceSet: KotlinSourceSet val defaultSourceSet: KotlinSourceSet
@@ -8,21 +8,20 @@ package org.jetbrains.kotlin.gradle.plugin.mpp
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.plugin.sources.internal
import org.jetbrains.kotlin.gradle.utils.MutableObservableSet
import org.jetbrains.kotlin.gradle.utils.MutableObservableSetImpl import org.jetbrains.kotlin.gradle.utils.MutableObservableSetImpl
import org.jetbrains.kotlin.gradle.utils.ObservableSet import org.jetbrains.kotlin.gradle.utils.ObservableSet
abstract class AbstractCompilationDetails<T : KotlinCommonOptions> : CompilationDetails<T> { abstract class AbstractCompilationDetails<T : KotlinCommonOptions>(
private val directlyIncludedKotlinSourceSetsImpl: MutableObservableSetImpl<KotlinSourceSet> by lazy { final override val defaultSourceSet: KotlinSourceSet
MutableObservableSetImpl(defaultSourceSet) ) : CompilationDetails<T> {
} private val directlyIncludedKotlinSourceSetsImpl: MutableObservableSet<KotlinSourceSet> = MutableObservableSetImpl(defaultSourceSet)
final override val directlyIncludedKotlinSourceSets: ObservableSet<KotlinSourceSet> final override val directlyIncludedKotlinSourceSets: ObservableSet<KotlinSourceSet>
get() = directlyIncludedKotlinSourceSetsImpl get() = directlyIncludedKotlinSourceSetsImpl
private val allKotlinSourceSetsImpl: MutableObservableSetImpl<KotlinSourceSet> by lazy { private val allKotlinSourceSetsImpl: MutableObservableSet<KotlinSourceSet> = MutableObservableSetImpl<KotlinSourceSet>().also { set ->
MutableObservableSetImpl<KotlinSourceSet>().also { set -> defaultSourceSet.internal.withDependsOnClosure.forAll(set::add)
defaultSourceSet.internal.withDependsOnClosure.forAll(set::add)
}
} }
final override val allKotlinSourceSets: ObservableSet<KotlinSourceSet> final override val allKotlinSourceSets: ObservableSet<KotlinSourceSet>
@@ -13,7 +13,6 @@ import org.gradle.api.file.FileCollection
import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinCompile import org.jetbrains.kotlin.gradle.dsl.KotlinCompile
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinCompilationData import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinCompilationData
import org.jetbrains.kotlin.gradle.tasks.locateTask import org.jetbrains.kotlin.gradle.tasks.locateTask
@@ -60,7 +59,9 @@ abstract class AbstractKotlinCompilation<T : KotlinCommonOptions>(
final override var compileDependencyFiles: FileCollection final override var compileDependencyFiles: FileCollection
get() = compilationDetails.compileDependencyFilesHolder.dependencyFiles get() = compilationDetails.compileDependencyFilesHolder.dependencyFiles
set(value) { compilationDetails.compileDependencyFilesHolder.dependencyFiles = value } set(value) {
compilationDetails.compileDependencyFilesHolder.dependencyFiles = value
}
final override val kotlinSourceSets: ObservableSet<KotlinSourceSet> final override val kotlinSourceSets: ObservableSet<KotlinSourceSet>
get() = compilationDetails.directlyIncludedKotlinSourceSets get() = compilationDetails.directlyIncludedKotlinSourceSets
@@ -68,7 +69,7 @@ abstract class AbstractKotlinCompilation<T : KotlinCommonOptions>(
override val allKotlinSourceSets: ObservableSet<KotlinSourceSet> override val allKotlinSourceSets: ObservableSet<KotlinSourceSet>
get() = compilationDetails.allKotlinSourceSets get() = compilationDetails.allKotlinSourceSets
final override val defaultSourceSetName: String get() = compilationDetails.defaultSourceSetName override val defaultSourceSet: KotlinSourceSet get() = compilationDetails.defaultSourceSet
final override val compilationName: String get() = compilationDetails.compilationData.compilationPurpose final override val compilationName: String get() = compilationDetails.compilationData.compilationPurpose
@@ -87,9 +88,6 @@ abstract class AbstractKotlinCompilation<T : KotlinCommonOptions>(
override fun getAttributes(): AttributeContainer = attributeContainer override fun getAttributes(): AttributeContainer = attributeContainer
override val defaultSourceSet: KotlinSourceSet
get() = target.project.kotlinExtension.sourceSets.getByName(defaultSourceSetName)
override fun defaultSourceSet(configure: KotlinSourceSet.() -> Unit) = defaultSourceSet.configure() override fun defaultSourceSet(configure: KotlinSourceSet.() -> Unit) = defaultSourceSet.configure()
override fun source(sourceSet: KotlinSourceSet) { override fun source(sourceSet: KotlinSourceSet) {
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.gradle.plugin.mpp package org.jetbrains.kotlin.gradle.plugin.mpp
import com.android.build.gradle.api.BaseVariant
import org.gradle.api.Action import org.gradle.api.Action
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.UnknownTaskException import org.gradle.api.UnknownTaskException
@@ -19,12 +20,8 @@ import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.internal.KotlinCompilationsModuleGroups import org.jetbrains.kotlin.gradle.plugin.mpp.internal.KotlinCompilationsModuleGroups
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.*
import org.jetbrains.kotlin.gradle.plugin.sources.android.kotlinAndroidSourceSetLayout import org.jetbrains.kotlin.gradle.plugin.sources.*
import org.jetbrains.kotlin.gradle.plugin.sources.defaultSourceSetLanguageSettingsChecker
import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations
import org.jetbrains.kotlin.gradle.plugin.sources.internal
import org.jetbrains.kotlin.gradle.plugin.sources.kpm.FragmentMappedKotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.sources.kpm.FragmentMappedKotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.sources.withDependsOnClosure
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
@@ -51,15 +48,17 @@ interface CompilationDetails<T : KotlinCommonOptions> {
fun source(sourceSet: KotlinSourceSet) fun source(sourceSet: KotlinSourceSet)
val directlyIncludedKotlinSourceSets: ObservableSet<KotlinSourceSet> val directlyIncludedKotlinSourceSets: ObservableSet<KotlinSourceSet>
val allKotlinSourceSets: ObservableSet<KotlinSourceSet> val allKotlinSourceSets: ObservableSet<KotlinSourceSet>
val defaultSourceSetName: String
val defaultSourceSet: KotlinSourceSet
@Deprecated("Use defaultSourceSet.name instead", ReplaceWith("defaultSourceSet.name"), level = DeprecationLevel.WARNING)
val defaultSourceSetName: String get() = defaultSourceSet.name
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
val compilation: KotlinCompilation<T> val compilation: KotlinCompilation<T>
get() = target.compilations.getByName(compilationData.compilationPurpose) as KotlinCompilation<T> get() = target.compilations.getByName(compilationData.compilationPurpose) as KotlinCompilation<T>
val defaultSourceSet: KotlinSourceSet
get() = target.project.kotlinExtension.sourceSets.getByName(defaultSourceSetName)
} }
interface CompilationDetailsWithRuntime<T : KotlinCommonOptions> : CompilationDetails<T> { interface CompilationDetailsWithRuntime<T : KotlinCommonOptions> : CompilationDetails<T> {
@@ -72,10 +71,9 @@ internal val CompilationDetails<*>.associateCompilationsClosure: Iterable<Compil
open class DefaultCompilationDetails<T : KotlinCommonOptions>( open class DefaultCompilationDetails<T : KotlinCommonOptions>(
final override val target: KotlinTarget, final override val target: KotlinTarget,
final override val compilationPurpose: String, final override val compilationPurpose: String,
createKotlinOptions: DefaultCompilationDetails<*>.() -> T defaultSourceSet: KotlinSourceSet,
) : AbstractCompilationDetails<T>(), KotlinCompilationData<T> { override val kotlinOptions: T
) : AbstractCompilationDetails<T>(defaultSourceSet), KotlinCompilationData<T> {
override val kotlinOptions: T by lazy { createKotlinOptions() }
final override val project: Project final override val project: Project
get() = target.project get() = target.project
@@ -105,16 +103,6 @@ open class DefaultCompilationDetails<T : KotlinCommonOptions>(
) )
) )
override val defaultSourceSetName: String
get() = lowerCamelCaseName(
target.disambiguationClassifier.takeIf { target !is KotlinMetadataTarget },
when {
isMainCompilationData() && target is KotlinMetadataTarget ->
KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME // corner case: main compilation of the metadata target compiles commonMain
else -> compilationPurpose
}
)
override val compilationClassifier: String? override val compilationClassifier: String?
get() = target.disambiguationClassifier get() = target.disambiguationClassifier
@@ -141,7 +129,7 @@ open class DefaultCompilationDetails<T : KotlinCommonOptions>(
) )
override val languageSettings: LanguageSettings override val languageSettings: LanguageSettings
get() = project.kotlinExtension.sourceSets.getByName(defaultSourceSetName).languageSettings get() = defaultSourceSet.languageSettings
override val platformType: KotlinPlatformType override val platformType: KotlinPlatformType
get() = target.platformType get() = target.platformType
@@ -325,8 +313,11 @@ open class DefaultCompilationDetails<T : KotlinCommonOptions>(
open class DefaultCompilationDetailsWithRuntime<T : KotlinCommonOptions>( open class DefaultCompilationDetailsWithRuntime<T : KotlinCommonOptions>(
target: KotlinTarget, target: KotlinTarget,
compilationPurpose: String, compilationPurpose: String,
createKotlinOptions: DefaultCompilationDetails<*>.() -> T defaultSourceSet: KotlinSourceSet,
) : DefaultCompilationDetails<T>(target, compilationPurpose, createKotlinOptions), CompilationDetailsWithRuntime<T> { kotlinOptions: T
) : DefaultCompilationDetails<T>(
target, compilationPurpose, defaultSourceSet, kotlinOptions
), CompilationDetailsWithRuntime<T> {
override val runtimeDependencyFilesHolder: GradleKpmDependencyFilesHolder = project.newDependencyFilesHolder( override val runtimeDependencyFilesHolder: GradleKpmDependencyFilesHolder = project.newDependencyFilesHolder(
lowerCamelCaseName( lowerCamelCaseName(
target.disambiguationClassifier, target.disambiguationClassifier,
@@ -339,11 +330,13 @@ open class DefaultCompilationDetailsWithRuntime<T : KotlinCommonOptions>(
open class NativeCompilationDetails( open class NativeCompilationDetails(
target: KotlinTarget, target: KotlinTarget,
compilationPurpose: String, compilationPurpose: String,
createKotlinOptions: DefaultCompilationDetails<*>.() -> KotlinCommonOptions defaultSourceSet: KotlinSourceSet,
kotlinOptions: KotlinCommonOptions
) : DefaultCompilationDetails<KotlinCommonOptions>( ) : DefaultCompilationDetails<KotlinCommonOptions>(
target, target,
compilationPurpose, compilationPurpose,
createKotlinOptions defaultSourceSet,
kotlinOptions
) { ) {
override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder = project.newDependencyFilesHolder( override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder = project.newDependencyFilesHolder(
lowerCamelCaseName( lowerCamelCaseName(
@@ -373,12 +366,14 @@ open class NativeCompilationDetails(
internal open class SharedNativeCompilationDetails( internal open class SharedNativeCompilationDetails(
target: KotlinTarget, target: KotlinTarget,
compilationPurpose: String, compilationPurpose: String,
createKotlinOptions: DefaultCompilationDetails<*>.() -> KotlinCommonOptions defaultSourceSet: KotlinSourceSet,
kotlinOptions: KotlinCommonOptions
) : ) :
DefaultCompilationDetails<KotlinCommonOptions>( DefaultCompilationDetails<KotlinCommonOptions>(
target, target,
compilationPurpose, compilationPurpose,
createKotlinOptions defaultSourceSet,
kotlinOptions
) { ) {
override val friendArtifacts: FileCollection override val friendArtifacts: FileCollection
@@ -399,8 +394,9 @@ internal open class SharedNativeCompilationDetails(
internal open class MetadataMappedCompilationDetails<T : KotlinCommonOptions>( internal open class MetadataMappedCompilationDetails<T : KotlinCommonOptions>(
override val target: KotlinMetadataTarget, override val target: KotlinMetadataTarget,
defaultSourceSet: KotlinSourceSet,
final override val compilationData: AbstractKotlinFragmentMetadataCompilationData<T> final override val compilationData: AbstractKotlinFragmentMetadataCompilationData<T>
) : AbstractCompilationDetails<T>() { ) : AbstractCompilationDetails<T>(defaultSourceSet) {
override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder = override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder =
GradleKpmDependencyFilesHolder.ofMetadataCompilationDependencies(compilationData) GradleKpmDependencyFilesHolder.ofMetadataCompilationDependencies(compilationData)
@@ -417,28 +413,18 @@ internal open class MetadataMappedCompilationDetails<T : KotlinCommonOptions>(
override fun whenSourceSetAdded(sourceSet: KotlinSourceSet) { override fun whenSourceSetAdded(sourceSet: KotlinSourceSet) {
throw UnsupportedOperationException("metadata compilations have predefined sources") throw UnsupportedOperationException("metadata compilations have predefined sources")
} }
private val underlyingSourceSet: FragmentMappedKotlinSourceSet
get() = target.project.kotlinExtension.sourceSets.withType<FragmentMappedKotlinSourceSet>().single {
it.underlyingFragment == compilationData.fragment
}
override val defaultSourceSetName: String
get() = underlyingSourceSet.name
} }
internal open class VariantMappedCompilationDetails<T : KotlinCommonOptions>( internal open class VariantMappedCompilationDetails<T : KotlinCommonOptions>(
open val variant: GradleKpmVariantInternal, open val variant: GradleKpmVariantInternal,
override val target: KotlinTarget override val target: KotlinTarget,
) : AbstractCompilationDetails<T>() { defaultSourceSet: FragmentMappedKotlinSourceSet,
) : AbstractCompilationDetails<T>(defaultSourceSet) {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
override val compilationData: KotlinCompilationData<T> override val compilationData: KotlinCompilationData<T>
get() = variant.compilationData as KotlinCompilationData<T> get() = variant.compilationData as KotlinCompilationData<T>
override val defaultSourceSetName: String
get() = variant.unambiguousNameInProject
override fun whenSourceSetAdded(sourceSet: KotlinSourceSet) { override fun whenSourceSetAdded(sourceSet: KotlinSourceSet) {
compilation.defaultSourceSet.dependsOn(sourceSet) compilation.defaultSourceSet.dependsOn(sourceSet)
} }
@@ -464,8 +450,9 @@ internal open class VariantMappedCompilationDetails<T : KotlinCommonOptions>(
internal open class VariantMappedCompilationDetailsWithRuntime<T : KotlinCommonOptions>( internal open class VariantMappedCompilationDetailsWithRuntime<T : KotlinCommonOptions>(
override val variant: GradleKpmVariantWithRuntimeInternal, override val variant: GradleKpmVariantWithRuntimeInternal,
target: KotlinTarget target: KotlinTarget,
) : VariantMappedCompilationDetails<T>(variant, target), defaultSourceSet: FragmentMappedKotlinSourceSet
) : VariantMappedCompilationDetails<T>(variant, target, defaultSourceSet),
CompilationDetailsWithRuntime<T> { CompilationDetailsWithRuntime<T> {
override val runtimeDependencyFilesHolder: GradleKpmDependencyFilesHolder override val runtimeDependencyFilesHolder: GradleKpmDependencyFilesHolder
get() = GradleKpmDependencyFilesHolder.ofVariantRuntimeDependencies(variant) get() = GradleKpmDependencyFilesHolder.ofVariantRuntimeDependencies(variant)
@@ -474,8 +461,9 @@ internal open class VariantMappedCompilationDetailsWithRuntime<T : KotlinCommonO
internal class WithJavaCompilationDetails<T : KotlinCommonOptions>( internal class WithJavaCompilationDetails<T : KotlinCommonOptions>(
target: KotlinTarget, target: KotlinTarget,
compilationPurpose: String, compilationPurpose: String,
createKotlinOptions: DefaultCompilationDetails<*>.() -> T defaultSourceSet: KotlinSourceSet,
) : DefaultCompilationDetailsWithRuntime<T>(target, compilationPurpose, createKotlinOptions) { kotlinOptions: T
) : DefaultCompilationDetailsWithRuntime<T>(target, compilationPurpose, defaultSourceSet, kotlinOptions) {
override val compilation: KotlinWithJavaCompilation<T> override val compilation: KotlinWithJavaCompilation<T>
get() = super.compilation as KotlinWithJavaCompilation<T> get() = super.compilation as KotlinWithJavaCompilation<T>
@@ -506,24 +494,21 @@ internal class WithJavaCompilationDetails<T : KotlinCommonOptions>(
class AndroidCompilationDetails( class AndroidCompilationDetails(
target: KotlinTarget, target: KotlinTarget,
compilationPurpose: String, compilationPurpose: String,
defaultSourceSet: KotlinSourceSet,
val androidVariant: BaseVariant,
/** Workaround mutual creation order: a compilation is not added to the target's compilations collection until some point, pass it here */ /** Workaround mutual creation order: a compilation is not added to the target's compilations collection until some point, pass it here */
private val getCompilationInstance: () -> KotlinJvmAndroidCompilation private val getCompilationInstance: () -> KotlinJvmAndroidCompilation
) : DefaultCompilationDetailsWithRuntime<KotlinJvmOptions>( ) : DefaultCompilationDetailsWithRuntime<KotlinJvmOptions>(
target, target,
compilationPurpose, compilationPurpose,
{ KotlinJvmOptionsImpl() } defaultSourceSet,
KotlinJvmOptionsImpl()
) { ) {
override val compilation: KotlinJvmAndroidCompilation get() = getCompilationInstance() override val compilation: KotlinJvmAndroidCompilation get() = getCompilationInstance()
val androidVariant get() = compilation.androidVariant
override val friendArtifacts: FileCollection override val friendArtifacts: FileCollection
get() = target.project.files(super.friendArtifacts, compilation.testedVariantArtifacts) get() = target.project.files(super.friendArtifacts, compilation.testedVariantArtifacts)
override val defaultSourceSetName: String by lazy {
project.kotlinAndroidSourceSetLayout.naming.defaultKotlinSourceSetName(this) ?: super.defaultSourceSetName
}
/* /*
* Example of how multiplatform dependencies from common would get to Android test classpath: * Example of how multiplatform dependencies from common would get to Android test classpath:
* commonMainImplementation -> androidDebugImplementation -> debugImplementation -> debugAndroidTestCompileClasspath * commonMainImplementation -> androidDebugImplementation -> debugImplementation -> debugAndroidTestCompileClasspath
@@ -554,11 +539,16 @@ class AndroidCompilationDetails(
} }
} }
internal class MetadataCompilationDetails(target: KotlinTarget, name: String) : internal class MetadataCompilationDetails(
target: KotlinTarget,
name: String,
defaultSourceSet: KotlinSourceSet,
) :
DefaultCompilationDetails<KotlinMultiplatformCommonOptions>( DefaultCompilationDetails<KotlinMultiplatformCommonOptions>(
target, target,
name, name,
{ KotlinMultiplatformCommonOptionsImpl() } defaultSourceSet,
KotlinMultiplatformCommonOptionsImpl()
) { ) {
override val friendArtifacts: FileCollection override val friendArtifacts: FileCollection
@@ -572,7 +562,10 @@ internal class MetadataCompilationDetails(target: KotlinTarget, name: String) :
internal open class JsCompilationDetails( internal open class JsCompilationDetails(
target: KotlinTarget, target: KotlinTarget,
compilationPurpose: String, compilationPurpose: String,
) : DefaultCompilationDetailsWithRuntime<KotlinJsOptions>(target, compilationPurpose, { KotlinJsOptionsImpl() }) { defaultSourceSet: KotlinSourceSet,
) : DefaultCompilationDetailsWithRuntime<KotlinJsOptions>(
target, compilationPurpose, defaultSourceSet, KotlinJsOptionsImpl()
) {
internal abstract class JsCompilationDependenciesHolder @Inject constructor( internal abstract class JsCompilationDependenciesHolder @Inject constructor(
val target: KotlinTarget, val target: KotlinTarget,
@@ -616,39 +609,17 @@ internal open class JsCompilationDetails(
override val kotlinDependenciesHolder: HasKotlinDependencies override val kotlinDependenciesHolder: HasKotlinDependencies
get() = target.project.objects.newInstance(JsCompilationDependenciesHolder::class.java, target, compilationPurpose) get() = target.project.objects.newInstance(JsCompilationDependenciesHolder::class.java, target, compilationPurpose)
override val defaultSourceSetName: String
get() {
val classifier = if (target is KotlinJsTarget && target.irTarget != null)
target.disambiguationClassifierInPlatform
else target.disambiguationClassifier
return lowerCamelCaseName(
classifier,
compilationPurpose
)
}
} }
internal class JsIrCompilationDetails(target: KotlinTarget, compilationPurpose: String) : internal class JsIrCompilationDetails(
JsCompilationDetails(target, compilationPurpose) { target: KotlinTarget, compilationPurpose: String, defaultSourceSet: KotlinSourceSet
) : JsCompilationDetails(target, compilationPurpose, defaultSourceSet) {
override fun addSourcesToCompileTask(sourceSet: KotlinSourceSet, addAsCommonSources: Lazy<Boolean>) { override fun addSourcesToCompileTask(sourceSet: KotlinSourceSet, addAsCommonSources: Lazy<Boolean>) {
super.addSourcesToCompileTask(sourceSet, addAsCommonSources) super.addSourcesToCompileTask(sourceSet, addAsCommonSources)
(compilation as KotlinJsIrCompilation).allSources.add(sourceSet.kotlin) (compilation as KotlinJsIrCompilation).allSources.add(sourceSet.kotlin)
} }
override val defaultSourceSetName: String
get() {
val target = target as KotlinJsIrTarget
return lowerCamelCaseName(
if (target.mixedMode)
target.disambiguationClassifierInPlatform
else
target.disambiguationClassifier,
compilationPurpose
)
}
internal abstract class JsIrCompilationDependencyHolder @Inject constructor(target: KotlinTarget, compilationPurpose: String) : internal abstract class JsIrCompilationDependencyHolder @Inject constructor(target: KotlinTarget, compilationPurpose: String) :
JsCompilationDependenciesHolder(target, compilationPurpose) { JsCompilationDependenciesHolder(target, compilationPurpose) {
override val disambiguationClassifierInPlatform: String? override val disambiguationClassifierInPlatform: String?
@@ -7,18 +7,41 @@
package org.jetbrains.kotlin.gradle.plugin.mpp package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.NamedDomainObjectFactory import org.gradle.api.NamedDomainObjectFactory
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
interface KotlinCompilationFactory<T : KotlinCompilation<*>> : NamedDomainObjectFactory<T> { interface KotlinCompilationFactory<T : KotlinCompilation<*>> : NamedDomainObjectFactory<T> {
val project: Project get() = target.project
val target: KotlinTarget
val itemClass: Class<T> val itemClass: Class<T>
fun defaultSourceSetName(compilationName: String): String = lowerCamelCaseName(
target.disambiguationClassifier.takeIf { target !is KotlinMetadataTarget },
when {
// corner case: main compilation of the metadata target compiles commonMain
compilationName == KotlinCompilation.MAIN_COMPILATION_NAME &&
target is KotlinMetadataTarget -> KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME
else -> compilationName
}
)
}
internal fun KotlinCompilationFactory<*>.getOrCreateDefaultSourceSet(compilationName: String): KotlinSourceSet {
return project.kotlinExtension.sourceSets.maybeCreate(defaultSourceSetName(compilationName))
} }
class KotlinCommonCompilationFactory( class KotlinCommonCompilationFactory(
val target: KotlinOnlyTarget<*> override val target: KotlinOnlyTarget<*>
) : KotlinCompilationFactory<KotlinCommonCompilation> { ) : KotlinCompilationFactory<KotlinCommonCompilation> {
override val itemClass: Class<KotlinCommonCompilation> override val itemClass: Class<KotlinCommonCompilation>
get() = KotlinCommonCompilation::class.java get() = KotlinCommonCompilation::class.java
override fun create(name: String): KotlinCommonCompilation = override fun create(name: String): KotlinCommonCompilation = target.project.objects.newInstance(
target.project.objects.newInstance(KotlinCommonCompilation::class.java, MetadataCompilationDetails(target, name)) KotlinCommonCompilation::class.java, MetadataCompilationDetails(target, name, getOrCreateDefaultSourceSet(name))
} )
}
@@ -6,11 +6,6 @@
package org.jetbrains.kotlin.gradle.plugin.mpp package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.execution.TaskExecutionListener
import org.gradle.api.plugins.ExtraPropertiesExtension
import org.gradle.api.provider.Property
import org.gradle.api.tasks.TaskState
import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.dsl.*
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
@@ -8,10 +8,10 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.filterModuleName
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.archivesName import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.archivesName
import org.jetbrains.kotlin.gradle.plugin.sources.kpm.FragmentMappedKotlinSourceSet
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
import javax.inject.Inject import javax.inject.Inject
@@ -62,7 +62,9 @@ internal class KotlinMappedJvmCompilationFactory(
return target.project.objects.newInstance( return target.project.objects.newInstance(
KotlinJvmCompilation::class.java, KotlinJvmCompilation::class.java,
VariantMappedCompilationDetailsWithRuntime<KotlinJvmOptions>(variant, target) VariantMappedCompilationDetailsWithRuntime<KotlinJvmOptions>(
variant, target, getOrCreateDefaultSourceSet(name) as FragmentMappedKotlinSourceSet
)
) )
} }
} }
@@ -25,5 +25,5 @@ internal class GradleKpmNativeVariantCompilationData(
override val owner: GradleKpmNativeVariant override val owner: GradleKpmNativeVariant
get() = variant get() = variant
override val kotlinOptions: KotlinCommonOptions = NativeCompileOptions { variant.languageSettings } override val kotlinOptions: KotlinCommonOptions = NativeCompileOptions(variant.languageSettings)
} }
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.publishedConfigurationName import org.jetbrains.kotlin.gradle.plugin.sources.kpm.FragmentMappedKotlinSourceSet
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
abstract class GradleKpmNativeVariantInternal( abstract class GradleKpmNativeVariantInternal(
@@ -57,7 +57,9 @@ internal class KotlinMappedNativeCompilationFactory(
return target.project.objects.newInstance( return target.project.objects.newInstance(
KotlinNativeCompilation::class.java, KotlinNativeCompilation::class.java,
target.konanTarget, target.konanTarget,
VariantMappedCompilationDetails<KotlinCommonOptions>(variant, target) VariantMappedCompilationDetails<KotlinCommonOptions>(
variant, target, getOrCreateDefaultSourceSet(name) as FragmentMappedKotlinSourceSet
)
) )
} }
} }
@@ -10,9 +10,13 @@ import org.gradle.api.Project
import org.gradle.api.file.FileCollection import org.gradle.api.file.FileCollection
import org.gradle.api.file.SourceDirectorySet import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformCommonOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformCommonOptionsImpl import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformCommonOptionsImpl
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.dsl.topLevelExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationOutput
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder
import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.archivesName import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.archivesName
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName
@@ -78,7 +82,7 @@ internal abstract class AbstractKotlinFragmentMetadataCompilationData<T : Kotlin
project.provider { project.buildDir.resolve("processedResources/${fragment.disambiguateName("metadata")}") } project.provider { project.buildDir.resolve("processedResources/${fragment.disambiguateName("metadata")}") }
) )
override val languageSettings: LanguageSettingsBuilder = fragment.languageSettings final override val languageSettings: LanguageSettingsBuilder = fragment.languageSettings
override val platformType: KotlinPlatformType override val platformType: KotlinPlatformType
get() = KotlinPlatformType.common get() = KotlinPlatformType.common
@@ -118,7 +122,8 @@ internal open class KotlinCommonFragmentMetadataCompilationDataImpl(
module, module,
compileAllTask, compileAllTask,
metadataCompilationRegistry, metadataCompilationRegistry,
resolvedMetadataFiles), KotlinCommonFragmentMetadataCompilationData { resolvedMetadataFiles
), KotlinCommonFragmentMetadataCompilationData {
override val isActive: Boolean override val isActive: Boolean
get() = !fragment.isNativeShared() && get() = !fragment.isNativeShared() &&
@@ -164,7 +169,7 @@ internal open class KotlinNativeFragmentMetadataCompilationDataImpl(
override val isActive: Boolean override val isActive: Boolean
get() = fragment.isNativeShared() && fragment.containingVariants.count() > 1 get() = fragment.isNativeShared() && fragment.containingVariants.count() > 1
override val kotlinOptions: NativeCompileOptions = NativeCompileOptions { languageSettings } override val kotlinOptions: NativeCompileOptions = NativeCompileOptions(languageSettings)
override val konanTarget: KonanTarget override val konanTarget: KonanTarget
get() { get() {
@@ -5,8 +5,9 @@
package org.jetbrains.kotlin.gradle.plugin.sources.android package org.jetbrains.kotlin.gradle.plugin.sources.android
import com.android.build.gradle.api.BaseVariant
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.mpp.AndroidCompilationDetails import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
internal interface KotlinAndroidSourceSetNaming { internal interface KotlinAndroidSourceSetNaming {
@@ -24,5 +25,5 @@ internal interface KotlinAndroidSourceSetNaming {
* Returns `null`, if this naming schema does not know about it. In this case, the * Returns `null`, if this naming schema does not know about it. In this case, the
* 'default' defaultSourceSetName will be constructed by the compilation. * 'default' defaultSourceSetName will be constructed by the compilation.
*/ */
fun defaultKotlinSourceSetName(compilation: AndroidCompilationDetails): String? = null fun defaultKotlinSourceSetName(target: KotlinAndroidTarget, variant: BaseVariant): String? = null
} }
@@ -5,8 +5,9 @@
package org.jetbrains.kotlin.gradle.plugin.sources.android package org.jetbrains.kotlin.gradle.plugin.sources.android
import com.android.build.gradle.api.BaseVariant
import org.gradle.api.logging.Logging import org.gradle.api.logging.Logging
import org.jetbrains.kotlin.gradle.plugin.mpp.AndroidCompilationDetails import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
internal object MultiplatformLayoutV2KotlinAndroidSourceSetNaming : KotlinAndroidSourceSetNaming { internal object MultiplatformLayoutV2KotlinAndroidSourceSetNaming : KotlinAndroidSourceSetNaming {
@@ -28,20 +29,20 @@ internal object MultiplatformLayoutV2KotlinAndroidSourceSetNaming : KotlinAndroi
return lowerCamelCaseName(disambiguationClassifier, replaceAndroidBaseSourceSetName(androidSourceSetName, knownType)) return lowerCamelCaseName(disambiguationClassifier, replaceAndroidBaseSourceSetName(androidSourceSetName, knownType))
} }
override fun defaultKotlinSourceSetName(compilation: AndroidCompilationDetails): String? { override fun defaultKotlinSourceSetName(target: KotlinAndroidTarget, variant: BaseVariant): String? {
val kotlinSourceSetName: String? = run { val kotlinSourceSetName: String? = run {
val baseSourceSetName = compilation.androidVariant.type.androidBaseSourceSetName ?: return@run null val baseSourceSetName = variant.type.androidBaseSourceSetName ?: return@run null
val androidSourceSetName = lowerCamelCaseName( val androidSourceSetName = lowerCamelCaseName(
baseSourceSetName.takeIf { it != AndroidBaseSourceSetName.Main }?.name, baseSourceSetName.takeIf { it != AndroidBaseSourceSetName.Main }?.name,
compilation.androidVariant.flavorName, variant.flavorName,
compilation.androidVariant.buildType.name variant.buildType.name
) )
val androidSourceSet = compilation.androidVariant.sourceSets.find { it.name == androidSourceSetName } ?: return@run null val androidSourceSet = variant.sourceSets.find { it.name == androidSourceSetName } ?: return@run null
compilation.project.findKotlinSourceSet(androidSourceSet)?.name target.project.findKotlinSourceSet(androidSourceSet)?.name
} }
if (kotlinSourceSetName == null) { if (kotlinSourceSetName == null) {
logger.warn("Can't determine 'defaultKotlinSourceSet' for android compilation: ${compilation.androidVariant.name}") logger.warn("Can't determine 'defaultKotlinSourceSet' for android compilation: ${variant.name}")
} }
return kotlinSourceSetName return kotlinSourceSetName
} }
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.gradle.logging.kotlinDebug
import org.jetbrains.kotlin.gradle.plugin.android.AndroidGradleWrapper import org.jetbrains.kotlin.gradle.plugin.android.AndroidGradleWrapper
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilationFactory
import org.jetbrains.kotlin.gradle.plugin.sources.android.KotlinAndroidSourceSets.applyKotlinAndroidSourceSetLayout import org.jetbrains.kotlin.gradle.plugin.sources.android.KotlinAndroidSourceSets.applyKotlinAndroidSourceSetLayout
import org.jetbrains.kotlin.gradle.plugin.sources.android.findKotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.sources.android.findKotlinSourceSet
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
@@ -74,14 +75,13 @@ internal class AndroidProjectHandler(
androidPluginIds.joinToString("\n\t") { "* $it" }) androidPluginIds.joinToString("\n\t") { "* $it" })
project.forEachVariant { variant -> project.forEachVariant { variant ->
val compilationFactory = KotlinJvmAndroidCompilationFactory(kotlinAndroidTarget, variant)
val variantName = getVariantName(variant) val variantName = getVariantName(variant)
// Create the compilation and configure it first, then add to the compilations container. As this code is executed // Create the compilation and configure it first, then add to the compilations container. As this code is executed
// in afterEvaluate, a user's build script might have already attached item handlers to the compilations container, and those // in afterEvaluate, a user's build script might have already attached item handlers to the compilations container, and those
// handlers might break when fired on a compilation that is not yet properly configured (e.g. KT-29964): // handlers might break when fired on a compilation that is not yet properly configured (e.g. KT-29964):
kotlinAndroidTarget.compilationFactory.create(variantName).let { compilation -> compilationFactory.create(variantName).let { compilation ->
compilation.androidVariant = variant
setUpDependencyResolution(variant, compilation) setUpDependencyResolution(variant, compilation)
preprocessVariant(variant, compilation, project, kotlinOptions, kotlinConfigurationTools.kotlinTasksProvider) preprocessVariant(variant, compilation, project, kotlinOptions, kotlinConfigurationTools.kotlinTasksProvider)
@@ -29,10 +29,8 @@ abstract class KotlinAndroidTarget @Inject constructor(
override val platformType: KotlinPlatformType override val platformType: KotlinPlatformType
get() = KotlinPlatformType.androidJvm get() = KotlinPlatformType.androidJvm
internal val compilationFactory = KotlinJvmAndroidCompilationFactory(project, this)
override val compilations: NamedDomainObjectContainer<out KotlinJvmAndroidCompilation> = override val compilations: NamedDomainObjectContainer<out KotlinJvmAndroidCompilation> =
project.container(compilationFactory.itemClass, compilationFactory) project.container(KotlinJvmAndroidCompilation::class.java)
/** Names of the Android library variants that should be published from the target's project within the default publications which are /** Names of the Android library variants that should be published from the target's project within the default publications which are
* set up if the `maven-publish` Gradle plugin is applied. * set up if the `maven-publish` Gradle plugin is applied.
@@ -6,17 +6,13 @@
@file:Suppress("PackageDirectoryMismatch") // Old package for compatibility @file:Suppress("PackageDirectoryMismatch") // Old package for compatibility
package org.jetbrains.kotlin.gradle.plugin.mpp package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation
class KotlinJsCompilationFactory( class KotlinJsCompilationFactory(
val project: Project, override val target: KotlinOnlyTarget<KotlinJsCompilation>,
val target: KotlinOnlyTarget<KotlinJsCompilation>,
val irTarget: KotlinOnlyTarget<KotlinJsIrCompilation>?
) : KotlinCompilationFactory<KotlinJsCompilation> { ) : KotlinCompilationFactory<KotlinJsCompilation> {
override val itemClass: Class<KotlinJsCompilation> override val itemClass: Class<KotlinJsCompilation>
get() = KotlinJsCompilation::class.java get() = KotlinJsCompilation::class.java
override fun create(name: String): KotlinJsCompilation = override fun create(name: String): KotlinJsCompilation = target.project.objects.newInstance(
target.project.objects.newInstance(KotlinJsCompilation::class.java, JsCompilationDetails(target, name)) KotlinJsCompilation::class.java, JsCompilationDetails(target, name, getOrCreateDefaultSourceSet(name))
)
} }
@@ -96,7 +96,7 @@ open class KotlinJsTargetPreset(
} }
override fun createCompilationFactory(forTarget: KotlinJsTarget): KotlinJsCompilationFactory { override fun createCompilationFactory(forTarget: KotlinJsTarget): KotlinJsCompilationFactory {
return KotlinJsCompilationFactory(project, forTarget, irPreset?.let { forTarget.irTarget }) return KotlinJsCompilationFactory(forTarget)
} }
companion object { companion object {
@@ -6,16 +6,14 @@
package org.jetbrains.kotlin.gradle.targets.js.ir package org.jetbrains.kotlin.gradle.targets.js.ir
import org.gradle.api.file.SourceDirectorySet import org.gradle.api.file.SourceDirectorySet
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.JsIrCompilationDetails import org.jetbrains.kotlin.gradle.plugin.mpp.JsIrCompilationDetails
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.dukat.ExternalsOutputFormat import org.jetbrains.kotlin.gradle.targets.js.dukat.ExternalsOutputFormat
import javax.inject.Inject import javax.inject.Inject
abstract class KotlinJsIrCompilation @Inject constructor( abstract class KotlinJsIrCompilation @Inject internal constructor(
target: KotlinTarget, compilationDetails: JsIrCompilationDetails
name: String ) : KotlinJsCompilation(compilationDetails) {
) : KotlinJsCompilation(JsIrCompilationDetails(target, name)) {
override val externalsOutputFormat: ExternalsOutputFormat = ExternalsOutputFormat.SOURCE override val externalsOutputFormat: ExternalsOutputFormat = ExternalsOutputFormat.SOURCE
@@ -5,17 +5,31 @@
package org.jetbrains.kotlin.gradle.targets.js.ir package org.jetbrains.kotlin.gradle.targets.js.ir
import org.gradle.api.Project import org.jetbrains.kotlin.gradle.plugin.mpp.JsIrCompilationDetails
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCompilationFactory import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCompilationFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.getOrCreateDefaultSourceSet
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
class KotlinJsIrCompilationFactory( class KotlinJsIrCompilationFactory(
val project: Project, override val target: KotlinOnlyTarget<KotlinJsIrCompilation>
val target: KotlinOnlyTarget<KotlinJsIrCompilation>
) : KotlinCompilationFactory<KotlinJsIrCompilation> { ) : KotlinCompilationFactory<KotlinJsIrCompilation> {
override val itemClass: Class<KotlinJsIrCompilation> override val itemClass: Class<KotlinJsIrCompilation>
get() = KotlinJsIrCompilation::class.java get() = KotlinJsIrCompilation::class.java
override fun defaultSourceSetName(compilationName: String): String {
val target = target as KotlinJsIrTarget
return lowerCamelCaseName(
if (target.mixedMode)
target.disambiguationClassifierInPlatform
else
target.disambiguationClassifier,
compilationName
)
}
override fun create(name: String): KotlinJsIrCompilation = override fun create(name: String): KotlinJsIrCompilation =
target.project.objects.newInstance(KotlinJsIrCompilation::class.java, target, name) target.project.objects.newInstance(
KotlinJsIrCompilation::class.java, JsIrCompilationDetails(target, name, getOrCreateDefaultSourceSet(name))
)
} }
@@ -80,7 +80,7 @@ open class KotlinJsIrTargetPreset(
public override fun createCompilationFactory( public override fun createCompilationFactory(
forTarget: KotlinJsIrTarget forTarget: KotlinJsIrTarget
): KotlinCompilationFactory<KotlinJsIrCompilation> = ): KotlinCompilationFactory<KotlinJsIrCompilation> =
KotlinJsIrCompilationFactory(project, forTarget) KotlinJsIrCompilationFactory(forTarget)
companion object { companion object {
val JS_PRESET_NAME = lowerCamelCaseName( val JS_PRESET_NAME = lowerCamelCaseName(
@@ -6,7 +6,9 @@
package org.jetbrains.kotlin.gradle.targets.js.ir package org.jetbrains.kotlin.gradle.targets.js.ir
import org.gradle.api.Project import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCompilationFactory import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCompilationFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTargetPreset import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTargetPreset
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.PublicationRegistrationMode import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.PublicationRegistrationMode
@@ -64,7 +66,7 @@ class KotlinWasmTargetPreset(
public override fun createCompilationFactory( public override fun createCompilationFactory(
forTarget: KotlinJsIrTarget forTarget: KotlinJsIrTarget
): KotlinCompilationFactory<KotlinJsIrCompilation> = ): KotlinCompilationFactory<KotlinJsIrCompilation> =
KotlinJsIrCompilationFactory(project, forTarget) KotlinJsIrCompilationFactory(forTarget)
companion object { companion object {
private const val WASM_PRESET_NAME = "wasm" private const val WASM_PRESET_NAME = "wasm"
@@ -12,21 +12,17 @@ import org.gradle.api.provider.Property
import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.compile.JavaCompile import org.gradle.api.tasks.compile.JavaCompile
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.getJavaTaskProvider import org.jetbrains.kotlin.gradle.plugin.getJavaTaskProvider
import org.jetbrains.kotlin.gradle.plugin.getTestedVariantData
import javax.inject.Inject import javax.inject.Inject
abstract class KotlinJvmAndroidCompilation @Inject constructor( abstract class KotlinJvmAndroidCompilation @Inject constructor(
compilationDetails: AndroidCompilationDetails final override val compilationDetails: AndroidCompilationDetails
) : AbstractKotlinCompilationToRunnableFiles<KotlinJvmOptions>(compilationDetails) { ) : AbstractKotlinCompilationToRunnableFiles<KotlinJvmOptions>(compilationDetails) {
lateinit var androidVariant: BaseVariant val androidVariant: BaseVariant = compilationDetails.androidVariant
internal set
@Suppress("UnstableApiUsage") internal val testedVariantArtifacts: Property<FileCollection> =
internal val testedVariantArtifacts: Property<FileCollection> = target.project.objects.property(FileCollection::class.java) compilationDetails.target.project.objects.property(FileCollection::class.java)
override val compileKotlinTask: org.jetbrains.kotlin.gradle.tasks.KotlinCompile override val compileKotlinTask: org.jetbrains.kotlin.gradle.tasks.KotlinCompile
get() = super.compileKotlinTask as org.jetbrains.kotlin.gradle.tasks.KotlinCompile get() = super.compileKotlinTask as org.jetbrains.kotlin.gradle.tasks.KotlinCompile
@@ -6,20 +6,28 @@
@file:Suppress("PackageDirectoryMismatch") // Old package for compatibility @file:Suppress("PackageDirectoryMismatch") // Old package for compatibility
package org.jetbrains.kotlin.gradle.plugin.mpp package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.Project import com.android.build.gradle.api.BaseVariant
import org.jetbrains.kotlin.gradle.plugin.sources.android.kotlinAndroidSourceSetLayout
class KotlinJvmAndroidCompilationFactory( class KotlinJvmAndroidCompilationFactory(
val project: Project, override val target: KotlinAndroidTarget,
val target: KotlinAndroidTarget private val variant: BaseVariant,
) : KotlinCompilationFactory<KotlinJvmAndroidCompilation> { ) : KotlinCompilationFactory<KotlinJvmAndroidCompilation> {
override val itemClass: Class<KotlinJvmAndroidCompilation> override val itemClass: Class<KotlinJvmAndroidCompilation>
get() = KotlinJvmAndroidCompilation::class.java get() = KotlinJvmAndroidCompilation::class.java
override fun defaultSourceSetName(compilationName: String): String {
return project.kotlinAndroidSourceSetLayout.naming.defaultKotlinSourceSetName(target, variant)
?: super.defaultSourceSetName(compilationName)
}
override fun create(name: String): KotlinJvmAndroidCompilation { override fun create(name: String): KotlinJvmAndroidCompilation {
lateinit var result: KotlinJvmAndroidCompilation lateinit var result: KotlinJvmAndroidCompilation
val details = AndroidCompilationDetails(target, name) { result } val details = AndroidCompilationDetails(target, name, getOrCreateDefaultSourceSet(name), variant) { result }
result = project.objects.newInstance(KotlinJvmAndroidCompilation::class.java, details) result = project.objects.newInstance(KotlinJvmAndroidCompilation::class.java, details)
return result return result
} }
} }
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
open class KotlinJvmCompilationFactory( open class KotlinJvmCompilationFactory(
val target: KotlinJvmTarget override val target: KotlinJvmTarget
) : KotlinCompilationFactory<KotlinJvmCompilation> { ) : KotlinCompilationFactory<KotlinJvmCompilation> {
override val itemClass: Class<KotlinJvmCompilation> override val itemClass: Class<KotlinJvmCompilation>
get() = KotlinJvmCompilation::class.java get() = KotlinJvmCompilation::class.java
@@ -18,6 +18,8 @@ open class KotlinJvmCompilationFactory(
override fun create(name: String): KotlinJvmCompilation = override fun create(name: String): KotlinJvmCompilation =
target.project.objects.newInstance( target.project.objects.newInstance(
KotlinJvmCompilation::class.java, KotlinJvmCompilation::class.java,
DefaultCompilationDetailsWithRuntime(target, name) { KotlinJvmOptionsImpl() } DefaultCompilationDetailsWithRuntime(
target, name, getOrCreateDefaultSourceSet(name), KotlinJvmOptionsImpl()
)
) )
} }
@@ -11,6 +11,7 @@ import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.compile.JavaCompile import org.gradle.api.tasks.compile.JavaCompile
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationWithResources import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationWithResources
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
import org.jetbrains.kotlin.gradle.utils.named import org.jetbrains.kotlin.gradle.utils.named
import javax.inject.Inject import javax.inject.Inject
@@ -18,9 +19,11 @@ import javax.inject.Inject
abstract class KotlinWithJavaCompilation<KotlinOptionsType : KotlinCommonOptions> @Inject constructor( abstract class KotlinWithJavaCompilation<KotlinOptionsType : KotlinCommonOptions> @Inject constructor(
target: KotlinWithJavaTarget<KotlinOptionsType>, target: KotlinWithJavaTarget<KotlinOptionsType>,
name: String, name: String,
override val defaultSourceSet: KotlinSourceSet,
kotlinOptions: KotlinOptionsType kotlinOptions: KotlinOptionsType
) : AbstractKotlinCompilationToRunnableFiles<KotlinOptionsType>(WithJavaCompilationDetails(target, name) { kotlinOptions }), ) : AbstractKotlinCompilationToRunnableFiles<KotlinOptionsType>(
KotlinCompilationWithResources<KotlinOptionsType> { WithJavaCompilationDetails(target, name, defaultSourceSet, kotlinOptions)
), KotlinCompilationWithResources<KotlinOptionsType> {
lateinit var javaSourceSet: SourceSet lateinit var javaSourceSet: SourceSet
override val processResourcesTaskName: String override val processResourcesTaskName: String
@@ -6,12 +6,10 @@
@file:Suppress("PackageDirectoryMismatch") // Old package for compatibility @file:Suppress("PackageDirectoryMismatch") // Old package for compatibility
package org.jetbrains.kotlin.gradle.plugin.mpp package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
class KotlinWithJavaCompilationFactory<KotlinOptionsType : KotlinCommonOptions>( class KotlinWithJavaCompilationFactory<KotlinOptionsType : KotlinCommonOptions>(
val project: Project, override val target: KotlinWithJavaTarget<KotlinOptionsType>,
val target: KotlinWithJavaTarget<KotlinOptionsType>,
val kotlinOptionsFactory: () -> KotlinOptionsType val kotlinOptionsFactory: () -> KotlinOptionsType
) : KotlinCompilationFactory<KotlinWithJavaCompilation<KotlinOptionsType>> { ) : KotlinCompilationFactory<KotlinWithJavaCompilation<KotlinOptionsType>> {
@@ -25,6 +23,7 @@ class KotlinWithJavaCompilationFactory<KotlinOptionsType : KotlinCommonOptions>(
KotlinWithJavaCompilation::class.java, KotlinWithJavaCompilation::class.java,
target, target,
name, name,
getOrCreateDefaultSourceSet(name),
kotlinOptionsFactory() kotlinOptionsFactory()
) as KotlinWithJavaCompilation<KotlinOptionsType> ) as KotlinWithJavaCompilation<KotlinOptionsType>
} }
@@ -44,7 +44,7 @@ abstract class KotlinWithJavaTarget<KotlinOptionsType : KotlinCommonOptions> @In
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
project.container( project.container(
KotlinWithJavaCompilation::class.java as Class<KotlinWithJavaCompilation<KotlinOptionsType>>, KotlinWithJavaCompilation::class.java as Class<KotlinWithJavaCompilation<KotlinOptionsType>>,
KotlinWithJavaCompilationFactory(project, this, kotlinOptionsFactory) KotlinWithJavaCompilationFactory(this, kotlinOptionsFactory)
) )
private val layout = project.layout private val layout = project.layout
@@ -7,13 +7,11 @@ package org.jetbrains.kotlin.gradle.targets.metadata
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformCommonOptions import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformCommonOptions
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataMappedCompilationDetails
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmAwareTargetConfigurator import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.unambiguousNameInProject
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.kpmModules
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.metadataCompilationRegistryByModuleId
import org.jetbrains.kotlin.gradle.plugin.whenEvaluated import org.jetbrains.kotlin.gradle.plugin.whenEvaluated
import org.jetbrains.kotlin.project.model.utils.variantsContainingFragment import org.jetbrains.kotlin.project.model.utils.variantsContainingFragment
@@ -45,7 +43,8 @@ internal class GradleKpmMetadataTargetConfigurator(private val metadataTargetCon
val compilationData = metadataCompilations.getForFragmentOrNull(fragment) ?: return@forEach val compilationData = metadataCompilations.getForFragmentOrNull(fragment) ?: return@forEach
if (!compilationData.isActive) return@forEach if (!compilationData.isActive) return@forEach
val compilationDetails = MetadataMappedCompilationDetails(target, compilationData) val defaultSourceSet = target.project.kotlinExtension.sourceSets.maybeCreate(fragment.unambiguousNameInProject)
val compilationDetails = MetadataMappedCompilationDetails(target, defaultSourceSet, compilationData)
val isNative = compilationData is KotlinNativeFragmentMetadataCompilationData val isNative = compilationData is KotlinNativeFragmentMetadataCompilationData
@@ -60,6 +59,7 @@ internal class GradleKpmMetadataTargetConfigurator(private val metadataTargetCon
compilationDetails as CompilationDetails<KotlinCommonOptions> compilationDetails as CompilationDetails<KotlinCommonOptions>
) )
} }
else -> target.project.objects else -> target.project.objects
.newInstance( .newInstance(
KotlinCommonCompilation::class.java, KotlinCommonCompilation::class.java,
@@ -21,8 +21,7 @@ import java.io.File
import java.util.concurrent.Callable import java.util.concurrent.Callable
import javax.inject.Inject import javax.inject.Inject
internal class NativeCompileOptions(languageSettingsProvider: () -> LanguageSettingsBuilder) : KotlinCommonOptions { internal class NativeCompileOptions(private val languageSettings: LanguageSettingsBuilder) : KotlinCommonOptions {
private val languageSettings: LanguageSettingsBuilder by lazy(languageSettingsProvider)
override var apiVersion: String? override var apiVersion: String?
get() = languageSettings.apiVersion get() = languageSettings.apiVersion
@@ -9,36 +9,42 @@ package org.jetbrains.kotlin.gradle.plugin.mpp
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
open class KotlinNativeCompilationFactory( open class KotlinNativeCompilationFactory(
val target: KotlinNativeTarget override val target: KotlinNativeTarget
) : KotlinCompilationFactory<KotlinNativeCompilation> { ) : KotlinCompilationFactory<KotlinNativeCompilation> {
override val itemClass: Class<KotlinNativeCompilation> override val itemClass: Class<KotlinNativeCompilation>
get() = KotlinNativeCompilation::class.java get() = KotlinNativeCompilation::class.java
override fun create(name: String): KotlinNativeCompilation = override fun create(name: String): KotlinNativeCompilation {
// TODO: Validate compilation free args using the [CompilationFreeArgsValidator] // TODO: Validate compilation free args using the [CompilationFreeArgsValidator]
// when the compilation and the link args are separated (see KT-33717). // when the compilation and the link args are separated (see KT-33717).
// Note: such validation should be done in the whenEvaluate block because // Note: such validation should be done in the whenEvaluate block because
// a user can change args during project configuration. // a user can change args during project configuration.
target.project.objects.newInstance( val defaultSourceSet = getOrCreateDefaultSourceSet(name)
return target.project.objects.newInstance(
KotlinNativeCompilation::class.java, KotlinNativeCompilation::class.java,
target.konanTarget, target.konanTarget,
NativeCompilationDetails(target, name) { NativeCompileOptions { defaultSourceSet.languageSettings } } NativeCompilationDetails(
target, name, defaultSourceSet, NativeCompileOptions(defaultSourceSet.languageSettings)
)
) )
}
} }
class KotlinSharedNativeCompilationFactory( class KotlinSharedNativeCompilationFactory(
val target: KotlinMetadataTarget, override val target: KotlinMetadataTarget,
val konanTargets: List<KonanTarget> val konanTargets: List<KonanTarget>
): KotlinCompilationFactory<KotlinSharedNativeCompilation> { ) : KotlinCompilationFactory<KotlinSharedNativeCompilation> {
override val itemClass: Class<KotlinSharedNativeCompilation> override val itemClass: Class<KotlinSharedNativeCompilation>
get() = KotlinSharedNativeCompilation::class.java get() = KotlinSharedNativeCompilation::class.java
override fun create(name: String): KotlinSharedNativeCompilation = override fun create(name: String): KotlinSharedNativeCompilation {
target.project.objects.newInstance( val defaultSourceSet = getOrCreateDefaultSourceSet(name)
return target.project.objects.newInstance(
KotlinSharedNativeCompilation::class.java, KotlinSharedNativeCompilation::class.java,
konanTargets, konanTargets,
SharedNativeCompilationDetails(target, name) { NativeCompileOptions { defaultSourceSet.languageSettings } } SharedNativeCompilationDetails(target, name, defaultSourceSet, NativeCompileOptions(defaultSourceSet.languageSettings))
) )
}
} }
@@ -14,7 +14,6 @@ import org.gradle.api.internal.project.ProjectInternal
import org.gradle.testfixtures.ProjectBuilder import org.gradle.testfixtures.ProjectBuilder
import org.jetbrains.kotlin.gradle.applyMultiplatformPlugin import org.jetbrains.kotlin.gradle.applyMultiplatformPlugin
import org.jetbrains.kotlin.gradle.plugin.forEachVariant import org.jetbrains.kotlin.gradle.plugin.forEachVariant
import org.jetbrains.kotlin.gradle.plugin.mpp.AndroidCompilationDetails
import org.jetbrains.kotlin.gradle.plugin.sources.android.* import org.jetbrains.kotlin.gradle.plugin.sources.android.*
import org.jetbrains.kotlin.gradle.setMultiplatformAndroidSourceSetLayoutVersion import org.jetbrains.kotlin.gradle.setMultiplatformAndroidSourceSetLayoutVersion
import org.jetbrains.kotlin.gradle.utils.androidExtension import org.jetbrains.kotlin.gradle.utils.androidExtension
@@ -271,11 +270,12 @@ class MultiplatformAndroidSourceSetLayoutV2Test {
project.evaluate() project.evaluate()
kotlin.android().compilations.all { compilation -> kotlin.android().compilations.all { compilation ->
val compilationDetails = compilation.compilationDetails as AndroidCompilationDetails val defaultKotlinSourceSetName = multiplatformAndroidSourceSetLayoutV2.naming
val defaultKotlinSourceSetName = multiplatformAndroidSourceSetLayoutV2.naming.defaultKotlinSourceSetName(compilationDetails) .defaultKotlinSourceSetName(kotlin.android(), compilation.androidVariant)
assertNotNull( assertNotNull(
defaultKotlinSourceSetName, defaultKotlinSourceSetName,
"Expected non-null 'defaultKotlinSourceSetName' for compilation ${compilationDetails.compilation.name}" "Expected non-null 'defaultKotlinSourceSetName' for compilation ${compilation.name}"
) )
val kotlinSourceSet = kotlin.sourceSets.getByName(defaultKotlinSourceSetName) val kotlinSourceSet = kotlin.sourceSets.getByName(defaultKotlinSourceSetName)