diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinCompilation.kt b/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinCompilation.kt index 86b61124dd4..4fac84e4d61 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinCompilation.kt @@ -33,7 +33,8 @@ interface KotlinCompilation : Named, HasAttributes, val allKotlinSourceSets: Set - val defaultSourceSetName: String + @Deprecated("Use defaultSourceSet.name instead", ReplaceWith("defaultSourceSet.name")) + val defaultSourceSetName: String get() = defaultSourceSet.name val defaultSourceSet: KotlinSourceSet diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractCompilationDetails.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractCompilationDetails.kt index 9382e203007..e737c3b629d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractCompilationDetails.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractCompilationDetails.kt @@ -8,21 +8,20 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet 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.ObservableSet -abstract class AbstractCompilationDetails : CompilationDetails { - private val directlyIncludedKotlinSourceSetsImpl: MutableObservableSetImpl by lazy { - MutableObservableSetImpl(defaultSourceSet) - } +abstract class AbstractCompilationDetails( + final override val defaultSourceSet: KotlinSourceSet +) : CompilationDetails { + private val directlyIncludedKotlinSourceSetsImpl: MutableObservableSet = MutableObservableSetImpl(defaultSourceSet) final override val directlyIncludedKotlinSourceSets: ObservableSet get() = directlyIncludedKotlinSourceSetsImpl - private val allKotlinSourceSetsImpl: MutableObservableSetImpl by lazy { - MutableObservableSetImpl().also { set -> - defaultSourceSet.internal.withDependsOnClosure.forAll(set::add) - } + private val allKotlinSourceSetsImpl: MutableObservableSet = MutableObservableSetImpl().also { set -> + defaultSourceSet.internal.withDependsOnClosure.forAll(set::add) } final override val allKotlinSourceSets: ObservableSet diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractKotlinCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractKotlinCompilation.kt index 3756849d4d0..b847be627ec 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractKotlinCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/AbstractKotlinCompilation.kt @@ -13,7 +13,6 @@ import org.gradle.api.file.FileCollection import org.gradle.api.tasks.TaskProvider import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions 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.mpp.pm20.KotlinCompilationData import org.jetbrains.kotlin.gradle.tasks.locateTask @@ -60,7 +59,9 @@ abstract class AbstractKotlinCompilation( final override var compileDependencyFiles: FileCollection get() = compilationDetails.compileDependencyFilesHolder.dependencyFiles - set(value) { compilationDetails.compileDependencyFilesHolder.dependencyFiles = value } + set(value) { + compilationDetails.compileDependencyFilesHolder.dependencyFiles = value + } final override val kotlinSourceSets: ObservableSet get() = compilationDetails.directlyIncludedKotlinSourceSets @@ -68,7 +69,7 @@ abstract class AbstractKotlinCompilation( override val allKotlinSourceSets: ObservableSet 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 @@ -87,9 +88,6 @@ abstract class AbstractKotlinCompilation( 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 source(sourceSet: KotlinSourceSet) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt index 846fb8c6cc0..696192096ec 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp +import com.android.build.gradle.api.BaseVariant import org.gradle.api.Action import org.gradle.api.Project 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.pm20.* 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.defaultSourceSetLanguageSettingsChecker -import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations -import org.jetbrains.kotlin.gradle.plugin.sources.internal +import org.jetbrains.kotlin.gradle.plugin.sources.* 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.ir.KotlinJsIrCompilation import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget @@ -51,15 +48,17 @@ interface CompilationDetails { fun source(sourceSet: KotlinSourceSet) val directlyIncludedKotlinSourceSets: ObservableSet + val allKotlinSourceSets: ObservableSet - 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") val compilation: KotlinCompilation get() = target.compilations.getByName(compilationData.compilationPurpose) as KotlinCompilation - - val defaultSourceSet: KotlinSourceSet - get() = target.project.kotlinExtension.sourceSets.getByName(defaultSourceSetName) } interface CompilationDetailsWithRuntime : CompilationDetails { @@ -72,10 +71,9 @@ internal val CompilationDetails<*>.associateCompilationsClosure: Iterable( final override val target: KotlinTarget, final override val compilationPurpose: String, - createKotlinOptions: DefaultCompilationDetails<*>.() -> T -) : AbstractCompilationDetails(), KotlinCompilationData { - - override val kotlinOptions: T by lazy { createKotlinOptions() } + defaultSourceSet: KotlinSourceSet, + override val kotlinOptions: T +) : AbstractCompilationDetails(defaultSourceSet), KotlinCompilationData { final override val project: Project get() = target.project @@ -105,16 +103,6 @@ open class DefaultCompilationDetails( ) ) - 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? get() = target.disambiguationClassifier @@ -141,7 +129,7 @@ open class DefaultCompilationDetails( ) override val languageSettings: LanguageSettings - get() = project.kotlinExtension.sourceSets.getByName(defaultSourceSetName).languageSettings + get() = defaultSourceSet.languageSettings override val platformType: KotlinPlatformType get() = target.platformType @@ -325,8 +313,11 @@ open class DefaultCompilationDetails( open class DefaultCompilationDetailsWithRuntime( target: KotlinTarget, compilationPurpose: String, - createKotlinOptions: DefaultCompilationDetails<*>.() -> T -) : DefaultCompilationDetails(target, compilationPurpose, createKotlinOptions), CompilationDetailsWithRuntime { + defaultSourceSet: KotlinSourceSet, + kotlinOptions: T +) : DefaultCompilationDetails( + target, compilationPurpose, defaultSourceSet, kotlinOptions +), CompilationDetailsWithRuntime { override val runtimeDependencyFilesHolder: GradleKpmDependencyFilesHolder = project.newDependencyFilesHolder( lowerCamelCaseName( target.disambiguationClassifier, @@ -339,11 +330,13 @@ open class DefaultCompilationDetailsWithRuntime( open class NativeCompilationDetails( target: KotlinTarget, compilationPurpose: String, - createKotlinOptions: DefaultCompilationDetails<*>.() -> KotlinCommonOptions + defaultSourceSet: KotlinSourceSet, + kotlinOptions: KotlinCommonOptions ) : DefaultCompilationDetails( target, compilationPurpose, - createKotlinOptions + defaultSourceSet, + kotlinOptions ) { override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder = project.newDependencyFilesHolder( lowerCamelCaseName( @@ -373,12 +366,14 @@ open class NativeCompilationDetails( internal open class SharedNativeCompilationDetails( target: KotlinTarget, compilationPurpose: String, - createKotlinOptions: DefaultCompilationDetails<*>.() -> KotlinCommonOptions + defaultSourceSet: KotlinSourceSet, + kotlinOptions: KotlinCommonOptions ) : DefaultCompilationDetails( target, compilationPurpose, - createKotlinOptions + defaultSourceSet, + kotlinOptions ) { override val friendArtifacts: FileCollection @@ -399,8 +394,9 @@ internal open class SharedNativeCompilationDetails( internal open class MetadataMappedCompilationDetails( override val target: KotlinMetadataTarget, + defaultSourceSet: KotlinSourceSet, final override val compilationData: AbstractKotlinFragmentMetadataCompilationData -) : AbstractCompilationDetails() { +) : AbstractCompilationDetails(defaultSourceSet) { override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder = GradleKpmDependencyFilesHolder.ofMetadataCompilationDependencies(compilationData) @@ -417,28 +413,18 @@ internal open class MetadataMappedCompilationDetails( override fun whenSourceSetAdded(sourceSet: KotlinSourceSet) { throw UnsupportedOperationException("metadata compilations have predefined sources") } - - private val underlyingSourceSet: FragmentMappedKotlinSourceSet - get() = target.project.kotlinExtension.sourceSets.withType().single { - it.underlyingFragment == compilationData.fragment - } - - override val defaultSourceSetName: String - get() = underlyingSourceSet.name } internal open class VariantMappedCompilationDetails( open val variant: GradleKpmVariantInternal, - override val target: KotlinTarget -) : AbstractCompilationDetails() { + override val target: KotlinTarget, + defaultSourceSet: FragmentMappedKotlinSourceSet, +) : AbstractCompilationDetails(defaultSourceSet) { @Suppress("UNCHECKED_CAST") override val compilationData: KotlinCompilationData get() = variant.compilationData as KotlinCompilationData - override val defaultSourceSetName: String - get() = variant.unambiguousNameInProject - override fun whenSourceSetAdded(sourceSet: KotlinSourceSet) { compilation.defaultSourceSet.dependsOn(sourceSet) } @@ -464,8 +450,9 @@ internal open class VariantMappedCompilationDetails( internal open class VariantMappedCompilationDetailsWithRuntime( override val variant: GradleKpmVariantWithRuntimeInternal, - target: KotlinTarget -) : VariantMappedCompilationDetails(variant, target), + target: KotlinTarget, + defaultSourceSet: FragmentMappedKotlinSourceSet +) : VariantMappedCompilationDetails(variant, target, defaultSourceSet), CompilationDetailsWithRuntime { override val runtimeDependencyFilesHolder: GradleKpmDependencyFilesHolder get() = GradleKpmDependencyFilesHolder.ofVariantRuntimeDependencies(variant) @@ -474,8 +461,9 @@ internal open class VariantMappedCompilationDetailsWithRuntime( target: KotlinTarget, compilationPurpose: String, - createKotlinOptions: DefaultCompilationDetails<*>.() -> T -) : DefaultCompilationDetailsWithRuntime(target, compilationPurpose, createKotlinOptions) { + defaultSourceSet: KotlinSourceSet, + kotlinOptions: T +) : DefaultCompilationDetailsWithRuntime(target, compilationPurpose, defaultSourceSet, kotlinOptions) { override val compilation: KotlinWithJavaCompilation get() = super.compilation as KotlinWithJavaCompilation @@ -506,24 +494,21 @@ internal class WithJavaCompilationDetails( class AndroidCompilationDetails( target: KotlinTarget, 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 */ private val getCompilationInstance: () -> KotlinJvmAndroidCompilation ) : DefaultCompilationDetailsWithRuntime( target, compilationPurpose, - { KotlinJvmOptionsImpl() } + defaultSourceSet, + KotlinJvmOptionsImpl() ) { override val compilation: KotlinJvmAndroidCompilation get() = getCompilationInstance() - val androidVariant get() = compilation.androidVariant - override val friendArtifacts: FileCollection 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: * 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( target, name, - { KotlinMultiplatformCommonOptionsImpl() } + defaultSourceSet, + KotlinMultiplatformCommonOptionsImpl() ) { override val friendArtifacts: FileCollection @@ -572,7 +562,10 @@ internal class MetadataCompilationDetails(target: KotlinTarget, name: String) : internal open class JsCompilationDetails( target: KotlinTarget, compilationPurpose: String, -) : DefaultCompilationDetailsWithRuntime(target, compilationPurpose, { KotlinJsOptionsImpl() }) { + defaultSourceSet: KotlinSourceSet, +) : DefaultCompilationDetailsWithRuntime( + target, compilationPurpose, defaultSourceSet, KotlinJsOptionsImpl() +) { internal abstract class JsCompilationDependenciesHolder @Inject constructor( val target: KotlinTarget, @@ -616,39 +609,17 @@ internal open class JsCompilationDetails( override val kotlinDependenciesHolder: HasKotlinDependencies 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) : - JsCompilationDetails(target, compilationPurpose) { +internal class JsIrCompilationDetails( + target: KotlinTarget, compilationPurpose: String, defaultSourceSet: KotlinSourceSet +) : JsCompilationDetails(target, compilationPurpose, defaultSourceSet) { override fun addSourcesToCompileTask(sourceSet: KotlinSourceSet, addAsCommonSources: Lazy) { super.addSourcesToCompileTask(sourceSet, addAsCommonSources) (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) : JsCompilationDependenciesHolder(target, compilationPurpose) { override val disambiguationClassifierInPlatform: String? diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinCompilationFactory.kt index 7271e0b1ee1..6fabf1a2418 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinCompilationFactory.kt @@ -7,18 +7,41 @@ package org.jetbrains.kotlin.gradle.plugin.mpp 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.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.KotlinTarget +import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName interface KotlinCompilationFactory> : NamedDomainObjectFactory { + val project: Project get() = target.project + val target: KotlinTarget val itemClass: Class + + 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( - val target: KotlinOnlyTarget<*> + override val target: KotlinOnlyTarget<*> ) : KotlinCompilationFactory { override val itemClass: Class get() = KotlinCommonCompilation::class.java - override fun create(name: String): KotlinCommonCompilation = - target.project.objects.newInstance(KotlinCommonCompilation::class.java, MetadataCompilationDetails(target, name)) -} \ No newline at end of file + override fun create(name: String): KotlinCommonCompilation = target.project.objects.newInstance( + KotlinCommonCompilation::class.java, MetadataCompilationDetails(target, name, getOrCreateDefaultSourceSet(name)) + ) +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt index 79a4e1fb968..9b9c111e3ad 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt @@ -6,11 +6,6 @@ package org.jetbrains.kotlin.gradle.plugin.mpp 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.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmJvmVariant.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmJvmVariant.kt index 1fa859d6013..408404bbaa5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmJvmVariant.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmJvmVariant.kt @@ -8,10 +8,10 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 import org.gradle.api.artifacts.Configuration import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions 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.filterModuleName 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 javax.inject.Inject @@ -62,7 +62,9 @@ internal class KotlinMappedJvmCompilationFactory( return target.project.objects.newInstance( KotlinJvmCompilation::class.java, - VariantMappedCompilationDetailsWithRuntime(variant, target) + VariantMappedCompilationDetailsWithRuntime( + variant, target, getOrCreateDefaultSourceSet(name) as FragmentMappedKotlinSourceSet + ) ) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmNativeVariantCompilationData.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmNativeVariantCompilationData.kt index 31026c7dd4b..a338ac697fb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmNativeVariantCompilationData.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmNativeVariantCompilationData.kt @@ -25,5 +25,5 @@ internal class GradleKpmNativeVariantCompilationData( override val owner: GradleKpmNativeVariant get() = variant - override val kotlinOptions: KotlinCommonOptions = NativeCompileOptions { variant.languageSettings } + override val kotlinOptions: KotlinCommonOptions = NativeCompileOptions(variant.languageSettings) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmNativeVariantInternal.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmNativeVariantInternal.kt index a2a92ea1103..60e074b3ef2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmNativeVariantInternal.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmNativeVariantInternal.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 import org.gradle.api.artifacts.Configuration import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions 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 abstract class GradleKpmNativeVariantInternal( @@ -57,7 +57,9 @@ internal class KotlinMappedNativeCompilationFactory( return target.project.objects.newInstance( KotlinNativeCompilation::class.java, target.konanTarget, - VariantMappedCompilationDetails(variant, target) + VariantMappedCompilationDetails( + variant, target, getOrCreateDefaultSourceSet(name) as FragmentMappedKotlinSourceSet + ) ) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinMetadataCompilationData.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinMetadataCompilationData.kt index 159c4267f76..53a76f096b3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinMetadataCompilationData.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinMetadataCompilationData.kt @@ -10,9 +10,13 @@ import org.gradle.api.Project import org.gradle.api.file.FileCollection import org.gradle.api.file.SourceDirectorySet 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.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.pm20.util.archivesName import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName @@ -78,7 +82,7 @@ internal abstract class AbstractKotlinFragmentMetadataCompilationData 1 - override val kotlinOptions: NativeCompileOptions = NativeCompileOptions { languageSettings } + override val kotlinOptions: NativeCompileOptions = NativeCompileOptions(languageSettings) override val konanTarget: KonanTarget get() { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/android/KotlinAndroidSourceSetNaming.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/android/KotlinAndroidSourceSetNaming.kt index 8719462e59c..7c5dc8e1ab9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/android/KotlinAndroidSourceSetNaming.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/android/KotlinAndroidSourceSetNaming.kt @@ -5,8 +5,9 @@ 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.mpp.AndroidCompilationDetails +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget 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 * 'default' defaultSourceSetName will be constructed by the compilation. */ - fun defaultKotlinSourceSetName(compilation: AndroidCompilationDetails): String? = null + fun defaultKotlinSourceSetName(target: KotlinAndroidTarget, variant: BaseVariant): String? = null } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/android/MultiplatformLayoutV2KotlinAndroidSourceSetNaming.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/android/MultiplatformLayoutV2KotlinAndroidSourceSetNaming.kt index b0d44d26c96..2f73813b499 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/android/MultiplatformLayoutV2KotlinAndroidSourceSetNaming.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/android/MultiplatformLayoutV2KotlinAndroidSourceSetNaming.kt @@ -5,8 +5,9 @@ package org.jetbrains.kotlin.gradle.plugin.sources.android +import com.android.build.gradle.api.BaseVariant 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 internal object MultiplatformLayoutV2KotlinAndroidSourceSetNaming : KotlinAndroidSourceSetNaming { @@ -28,20 +29,20 @@ internal object MultiplatformLayoutV2KotlinAndroidSourceSetNaming : KotlinAndroi 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 baseSourceSetName = compilation.androidVariant.type.androidBaseSourceSetName ?: return@run null + val baseSourceSetName = variant.type.androidBaseSourceSetName ?: return@run null val androidSourceSetName = lowerCamelCaseName( baseSourceSetName.takeIf { it != AndroidBaseSourceSetName.Main }?.name, - compilation.androidVariant.flavorName, - compilation.androidVariant.buildType.name + variant.flavorName, + variant.buildType.name ) - val androidSourceSet = compilation.androidVariant.sourceSets.find { it.name == androidSourceSetName } ?: return@run null - compilation.project.findKotlinSourceSet(androidSourceSet)?.name + val androidSourceSet = variant.sourceSets.find { it.name == androidSourceSetName } ?: return@run null + target.project.findKotlinSourceSet(androidSourceSet)?.name } 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 } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/AndroidProjectHandler.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/AndroidProjectHandler.kt index a8f5d972260..ba49b7ccf3a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/AndroidProjectHandler.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/AndroidProjectHandler.kt @@ -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.mpp.KotlinAndroidTarget 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.findKotlinSourceSet import org.jetbrains.kotlin.gradle.tasks.KotlinCompile @@ -74,14 +75,13 @@ internal class AndroidProjectHandler( androidPluginIds.joinToString("\n\t") { "* $it" }) project.forEachVariant { variant -> + val compilationFactory = KotlinJvmAndroidCompilationFactory(kotlinAndroidTarget, variant) val variantName = getVariantName(variant) // 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 // handlers might break when fired on a compilation that is not yet properly configured (e.g. KT-29964): - kotlinAndroidTarget.compilationFactory.create(variantName).let { compilation -> - compilation.androidVariant = variant - + compilationFactory.create(variantName).let { compilation -> setUpDependencyResolution(variant, compilation) preprocessVariant(variant, compilation, project, kotlinOptions, kotlinConfigurationTools.kotlinTasksProvider) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt index 1e961ce2baa..c6c663766fb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt @@ -29,10 +29,8 @@ abstract class KotlinAndroidTarget @Inject constructor( override val platformType: KotlinPlatformType get() = KotlinPlatformType.androidJvm - internal val compilationFactory = KotlinJvmAndroidCompilationFactory(project, this) - override val compilations: NamedDomainObjectContainer = - 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 * set up if the `maven-publish` Gradle plugin is applied. diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilationFactory.kt index db45daa14f1..49eee391ba2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilationFactory.kt @@ -6,17 +6,13 @@ @file:Suppress("PackageDirectoryMismatch") // Old package for compatibility package org.jetbrains.kotlin.gradle.plugin.mpp -import org.gradle.api.Project -import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation - class KotlinJsCompilationFactory( - val project: Project, - val target: KotlinOnlyTarget, - val irTarget: KotlinOnlyTarget? + override val target: KotlinOnlyTarget, ) : KotlinCompilationFactory { override val itemClass: Class get() = KotlinJsCompilation::class.java - override fun create(name: String): KotlinJsCompilation = - target.project.objects.newInstance(KotlinJsCompilation::class.java, JsCompilationDetails(target, name)) + override fun create(name: String): KotlinJsCompilation = target.project.objects.newInstance( + KotlinJsCompilation::class.java, JsCompilationDetails(target, name, getOrCreateDefaultSourceSet(name)) + ) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt index d20a80f7968..fedf4682937 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt @@ -96,7 +96,7 @@ open class KotlinJsTargetPreset( } override fun createCompilationFactory(forTarget: KotlinJsTarget): KotlinJsCompilationFactory { - return KotlinJsCompilationFactory(project, forTarget, irPreset?.let { forTarget.irTarget }) + return KotlinJsCompilationFactory(forTarget) } companion object { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilation.kt index 6792bc26975..4cffe0de1f5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilation.kt @@ -6,16 +6,14 @@ package org.jetbrains.kotlin.gradle.targets.js.ir 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.KotlinJsCompilation import org.jetbrains.kotlin.gradle.targets.js.dukat.ExternalsOutputFormat import javax.inject.Inject -abstract class KotlinJsIrCompilation @Inject constructor( - target: KotlinTarget, - name: String -) : KotlinJsCompilation(JsIrCompilationDetails(target, name)) { +abstract class KotlinJsIrCompilation @Inject internal constructor( + compilationDetails: JsIrCompilationDetails +) : KotlinJsCompilation(compilationDetails) { override val externalsOutputFormat: ExternalsOutputFormat = ExternalsOutputFormat.SOURCE diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt index 00aa4879b97..2b18d82befe 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt @@ -5,17 +5,31 @@ 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.KotlinOnlyTarget +import org.jetbrains.kotlin.gradle.plugin.mpp.getOrCreateDefaultSourceSet +import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName class KotlinJsIrCompilationFactory( - val project: Project, - val target: KotlinOnlyTarget + override val target: KotlinOnlyTarget ) : KotlinCompilationFactory { override val itemClass: Class 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 = - target.project.objects.newInstance(KotlinJsIrCompilation::class.java, target, name) + target.project.objects.newInstance( + KotlinJsIrCompilation::class.java, JsIrCompilationDetails(target, name, getOrCreateDefaultSourceSet(name)) + ) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt index f50967663b1..a1312f5cd27 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt @@ -80,7 +80,7 @@ open class KotlinJsIrTargetPreset( public override fun createCompilationFactory( forTarget: KotlinJsIrTarget ): KotlinCompilationFactory = - KotlinJsIrCompilationFactory(project, forTarget) + KotlinJsIrCompilationFactory(forTarget) companion object { val JS_PRESET_NAME = lowerCamelCaseName( diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinWasmTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinWasmTargetPreset.kt index 83c256cab47..6a44259b629 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinWasmTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinWasmTargetPreset.kt @@ -6,7 +6,9 @@ package org.jetbrains.kotlin.gradle.targets.js.ir 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.KotlinOnlyTargetPreset import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.PublicationRegistrationMode @@ -64,7 +66,7 @@ class KotlinWasmTargetPreset( public override fun createCompilationFactory( forTarget: KotlinJsIrTarget ): KotlinCompilationFactory = - KotlinJsIrCompilationFactory(project, forTarget) + KotlinJsIrCompilationFactory(forTarget) companion object { private const val WASM_PRESET_NAME = "wasm" diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmAndroidCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmAndroidCompilation.kt index 3b6401686a5..db88cb47219 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmAndroidCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmAndroidCompilation.kt @@ -12,21 +12,17 @@ import org.gradle.api.provider.Property import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.compile.JavaCompile 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.getTestedVariantData import javax.inject.Inject abstract class KotlinJvmAndroidCompilation @Inject constructor( - compilationDetails: AndroidCompilationDetails + final override val compilationDetails: AndroidCompilationDetails ) : AbstractKotlinCompilationToRunnableFiles(compilationDetails) { - lateinit var androidVariant: BaseVariant - internal set + val androidVariant: BaseVariant = compilationDetails.androidVariant - @Suppress("UnstableApiUsage") - internal val testedVariantArtifacts: Property = target.project.objects.property(FileCollection::class.java) + internal val testedVariantArtifacts: Property = + compilationDetails.target.project.objects.property(FileCollection::class.java) override val compileKotlinTask: org.jetbrains.kotlin.gradle.tasks.KotlinCompile get() = super.compileKotlinTask as org.jetbrains.kotlin.gradle.tasks.KotlinCompile diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmAndroidCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmAndroidCompilationFactory.kt index c92e6f1fe5a..6dc467e7b64 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmAndroidCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmAndroidCompilationFactory.kt @@ -6,20 +6,28 @@ @file:Suppress("PackageDirectoryMismatch") // Old package for compatibility 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( - val project: Project, - val target: KotlinAndroidTarget + override val target: KotlinAndroidTarget, + private val variant: BaseVariant, ) : KotlinCompilationFactory { override val itemClass: Class 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 { 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) return result } + } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmCompilationFactory.kt index f2e655e244e..f16103901fa 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmCompilationFactory.kt @@ -10,7 +10,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget open class KotlinJvmCompilationFactory( - val target: KotlinJvmTarget + override val target: KotlinJvmTarget ) : KotlinCompilationFactory { override val itemClass: Class get() = KotlinJvmCompilation::class.java @@ -18,6 +18,8 @@ open class KotlinJvmCompilationFactory( override fun create(name: String): KotlinJvmCompilation = target.project.objects.newInstance( KotlinJvmCompilation::class.java, - DefaultCompilationDetailsWithRuntime(target, name) { KotlinJvmOptionsImpl() } + DefaultCompilationDetailsWithRuntime( + target, name, getOrCreateDefaultSourceSet(name), KotlinJvmOptionsImpl() + ) ) } \ No newline at end of file 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 921e9a38399..0b0e6fccfa8 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 @@ -11,6 +11,7 @@ import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.compile.JavaCompile import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions 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.utils.named import javax.inject.Inject @@ -18,9 +19,11 @@ import javax.inject.Inject abstract class KotlinWithJavaCompilation @Inject constructor( target: KotlinWithJavaTarget, name: String, + override val defaultSourceSet: KotlinSourceSet, kotlinOptions: KotlinOptionsType -) : AbstractKotlinCompilationToRunnableFiles(WithJavaCompilationDetails(target, name) { kotlinOptions }), - KotlinCompilationWithResources { +) : AbstractKotlinCompilationToRunnableFiles( + WithJavaCompilationDetails(target, name, defaultSourceSet, kotlinOptions) +), KotlinCompilationWithResources { lateinit var javaSourceSet: SourceSet override val processResourcesTaskName: String 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 c5c119e55f2..98af3594924 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,12 +6,10 @@ @file:Suppress("PackageDirectoryMismatch") // Old package for compatibility package org.jetbrains.kotlin.gradle.plugin.mpp -import org.gradle.api.Project import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions class KotlinWithJavaCompilationFactory( - val project: Project, - val target: KotlinWithJavaTarget, + override val target: KotlinWithJavaTarget, val kotlinOptionsFactory: () -> KotlinOptionsType ) : KotlinCompilationFactory> { @@ -25,6 +23,7 @@ class KotlinWithJavaCompilationFactory( KotlinWithJavaCompilation::class.java, target, name, + getOrCreateDefaultSourceSet(name), kotlinOptionsFactory() ) 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/KotlinWithJavaTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaTarget.kt index 5c9adb41f49..cd094ceb18f 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 @@ -44,7 +44,7 @@ abstract class KotlinWithJavaTarget @In @Suppress("UNCHECKED_CAST") project.container( KotlinWithJavaCompilation::class.java as Class>, - KotlinWithJavaCompilationFactory(project, this, kotlinOptionsFactory) + KotlinWithJavaCompilationFactory(this, kotlinOptionsFactory) ) private val layout = project.layout diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/GradleKpmMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/GradleKpmMetadataTargetConfigurator.kt index 3ee019152b1..04642eb92d6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/GradleKpmMetadataTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/GradleKpmMetadataTargetConfigurator.kt @@ -7,13 +7,11 @@ package org.jetbrains.kotlin.gradle.targets.metadata import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions 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.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.GradleKpmAwareTargetConfigurator -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.kpmModules -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.metadataCompilationRegistryByModuleId +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.unambiguousNameInProject import org.jetbrains.kotlin.gradle.plugin.whenEvaluated 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 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 @@ -60,6 +59,7 @@ internal class GradleKpmMetadataTargetConfigurator(private val metadataTargetCon compilationDetails as CompilationDetails ) } + else -> target.project.objects .newInstance( KotlinCommonCompilation::class.java, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt index 12faf0e1167..48bf8eb749d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt @@ -21,8 +21,7 @@ import java.io.File import java.util.concurrent.Callable import javax.inject.Inject -internal class NativeCompileOptions(languageSettingsProvider: () -> LanguageSettingsBuilder) : KotlinCommonOptions { - private val languageSettings: LanguageSettingsBuilder by lazy(languageSettingsProvider) +internal class NativeCompileOptions(private val languageSettings: LanguageSettingsBuilder) : KotlinCommonOptions { override var apiVersion: String? get() = languageSettings.apiVersion diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilationFactory.kt index 3fc9237f969..0e53c2a52e7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilationFactory.kt @@ -9,36 +9,42 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.jetbrains.kotlin.konan.target.KonanTarget open class KotlinNativeCompilationFactory( - val target: KotlinNativeTarget + override val target: KotlinNativeTarget ) : KotlinCompilationFactory { override val itemClass: Class get() = KotlinNativeCompilation::class.java - override fun create(name: String): KotlinNativeCompilation = - // TODO: Validate compilation free args using the [CompilationFreeArgsValidator] - // when the compilation and the link args are separated (see KT-33717). - // Note: such validation should be done in the whenEvaluate block because + override fun create(name: String): KotlinNativeCompilation { + // TODO: Validate compilation free args using the [CompilationFreeArgsValidator] + // when the compilation and the link args are separated (see KT-33717). + // Note: such validation should be done in the whenEvaluate block because // a user can change args during project configuration. - target.project.objects.newInstance( + val defaultSourceSet = getOrCreateDefaultSourceSet(name) + return target.project.objects.newInstance( KotlinNativeCompilation::class.java, target.konanTarget, - NativeCompilationDetails(target, name) { NativeCompileOptions { defaultSourceSet.languageSettings } } + NativeCompilationDetails( + target, name, defaultSourceSet, NativeCompileOptions(defaultSourceSet.languageSettings) + ) ) + } } class KotlinSharedNativeCompilationFactory( - val target: KotlinMetadataTarget, + override val target: KotlinMetadataTarget, val konanTargets: List -): KotlinCompilationFactory { +) : KotlinCompilationFactory { override val itemClass: Class get() = KotlinSharedNativeCompilation::class.java - override fun create(name: String): KotlinSharedNativeCompilation = - target.project.objects.newInstance( + override fun create(name: String): KotlinSharedNativeCompilation { + val defaultSourceSet = getOrCreateDefaultSourceSet(name) + return target.project.objects.newInstance( KotlinSharedNativeCompilation::class.java, konanTargets, - SharedNativeCompilationDetails(target, name) { NativeCompileOptions { defaultSourceSet.languageSettings } } + SharedNativeCompilationDetails(target, name, defaultSourceSet, NativeCompileOptions(defaultSourceSet.languageSettings)) ) + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/android/MultiplatformAndroidSourceSetLayoutV2Test.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/android/MultiplatformAndroidSourceSetLayoutV2Test.kt index e5a66efe9e7..fdc1f517ec8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/android/MultiplatformAndroidSourceSetLayoutV2Test.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/android/MultiplatformAndroidSourceSetLayoutV2Test.kt @@ -14,7 +14,6 @@ import org.gradle.api.internal.project.ProjectInternal import org.gradle.testfixtures.ProjectBuilder import org.jetbrains.kotlin.gradle.applyMultiplatformPlugin 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.setMultiplatformAndroidSourceSetLayoutVersion import org.jetbrains.kotlin.gradle.utils.androidExtension @@ -271,11 +270,12 @@ class MultiplatformAndroidSourceSetLayoutV2Test { project.evaluate() kotlin.android().compilations.all { compilation -> - val compilationDetails = compilation.compilationDetails as AndroidCompilationDetails - val defaultKotlinSourceSetName = multiplatformAndroidSourceSetLayoutV2.naming.defaultKotlinSourceSetName(compilationDetails) + val defaultKotlinSourceSetName = multiplatformAndroidSourceSetLayoutV2.naming + .defaultKotlinSourceSetName(kotlin.android(), compilation.androidVariant) + assertNotNull( defaultKotlinSourceSetName, - "Expected non-null 'defaultKotlinSourceSetName' for compilation ${compilationDetails.compilation.name}" + "Expected non-null 'defaultKotlinSourceSetName' for compilation ${compilation.name}" ) val kotlinSourceSet = kotlin.sourceSets.getByName(defaultKotlinSourceSetName)