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 9d1938b9ebb..6fb128e1714 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 @@ -18,7 +18,6 @@ import org.jetbrains.kotlin.gradle.plugin.sources.* import org.jetbrains.kotlin.gradle.plugin.sources.kpm.FragmentMappedKotlinSourceSet import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget -import org.jetbrains.kotlin.gradle.targets.metadata.getMetadataCompilationForSourceSet import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.tooling.core.closure import java.util.* @@ -59,107 +58,6 @@ interface CompilationDetailsWithRuntime : CompilationDe internal val CompilationDetails<*>.associateCompilationsClosure: Iterable> get() = closure { it.associateCompilations } -open class NativeCompilationDetails( - target: KotlinTarget, - compilationPurpose: String, - defaultSourceSet: KotlinSourceSet, - @Suppress("DEPRECATION") - createCompilerOptions: DefaultCompilationDetails.() -> HasCompilerOptions, - @Suppress("DEPRECATION") - createKotlinOptions: DefaultCompilationDetails.() -> KotlinCommonOptions -) : DefaultCompilationDetails( - target, - compilationPurpose, - defaultSourceSet, - createCompilerOptions, - createKotlinOptions -) { - override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder = project.newDependencyFilesHolder( - lowerCamelCaseName( - target.disambiguationClassifier, - compilationPurpose.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME }.orEmpty(), - "compileKlibraries" - ) - ) - - override val compileAllTaskName: String - get() = lowerCamelCaseName(target.disambiguationClassifier, compilationPurpose, "klibrary") - - override fun addAssociateCompilationDependencies(other: KotlinCompilation<*>) { - compileDependencyFilesHolder.dependencyFiles += - other.output.classesDirs + project.filesProvider { other.compileDependencyFiles } - - target.project.configurations.named(compilation.implementationConfigurationName).configure { configuration -> - configuration.extendsFrom(target.project.configurations.findByName(other.implementationConfigurationName)) - } - } - - override fun addSourcesToCompileTask(sourceSet: KotlinSourceSet, addAsCommonSources: Lazy) { - addSourcesToKotlinNativeCompileTask(project, compileKotlinTaskName, { sourceSet.kotlin }, addAsCommonSources) - } -} - -internal open class SharedNativeCompilationDetails( - target: KotlinTarget, - compilationPurpose: String, - defaultSourceSet: KotlinSourceSet, - @Suppress("DEPRECATION") - createCompilerOptions: DefaultCompilationDetails.() -> HasCompilerOptions, - @Suppress("DEPRECATION") - createKotlinOptions: DefaultCompilationDetails.() -> KotlinCommonOptions -) : DefaultCompilationDetails( - target, - compilationPurpose, - defaultSourceSet, - createCompilerOptions, - createKotlinOptions -) { - - override val friendArtifacts: FileCollection - get() = super.friendArtifacts.plus(run { - val project = target.project - val friendSourceSets = getVisibleSourceSetsFromAssociateCompilations(defaultSourceSet).toMutableSet().apply { - // TODO: implement proper dependsOn/refines compiler args for Kotlin/Native and pass the dependsOn klibs separately; - // But for now, those dependencies don't have any special semantics, so passing all them as friends works, too - addAll(defaultSourceSet.internal.dependsOnClosure) - } - project.files(friendSourceSets.mapNotNull { project.getMetadataCompilationForSourceSet(it)?.output?.classesDirs }) - }) - - override fun addSourcesToCompileTask(sourceSet: KotlinSourceSet, addAsCommonSources: Lazy) { - addSourcesToKotlinNativeCompileTask(project, compileKotlinTaskName, { sourceSet.kotlin }, addAsCommonSources) - } -} - -internal open class MetadataMappedCompilationDetails( - override val target: KotlinMetadataTarget, - defaultSourceSet: KotlinSourceSet, - final override val compilationData: AbstractKotlinFragmentMetadataCompilationData -) : AbstractCompilationDetails(defaultSourceSet) { - - @Suppress("UNCHECKED_CAST") - override val compilation: KotlinCompilation - get() = target.compilations.getByName(defaultSourceSet.name) as KotlinCompilation - - override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder = - GradleKpmDependencyFilesHolder.ofMetadataCompilationDependencies(compilationData) - - override val kotlinDependenciesHolder: HasKotlinDependencies - get() = compilationData.fragment - - override fun associateWith(other: CompilationDetails<*>) { - throw UnsupportedOperationException("not supported in the mapped model") - } - - override val associateCompilations: Set> - get() = emptySet() - - override fun whenSourceSetAdded(sourceSet: KotlinSourceSet) { - if (sourceSet != defaultSourceSet) - throw UnsupportedOperationException("metadata compilations have predefined sources") - } -} - internal open class VariantMappedCompilationDetails( open val variant: GradleKpmVariantInternal, override val target: KotlinTarget, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataMappedCompilationDetails.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataMappedCompilationDetails.kt new file mode 100644 index 00000000000..7d303a439fc --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataMappedCompilationDetails.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.plugin.mpp + +import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions +import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.AbstractKotlinFragmentMetadataCompilationData +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.GradleKpmDependencyFilesHolder +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.ofMetadataCompilationDependencies + +internal open class MetadataMappedCompilationDetails( + override val target: KotlinMetadataTarget, + defaultSourceSet: KotlinSourceSet, + final override val compilationData: AbstractKotlinFragmentMetadataCompilationData +) : AbstractCompilationDetails(defaultSourceSet) { + + @Suppress("UNCHECKED_CAST") + override val compilation: KotlinCompilation + get() = target.compilations.getByName(defaultSourceSet.name) as KotlinCompilation + + override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder = + GradleKpmDependencyFilesHolder.ofMetadataCompilationDependencies(compilationData) + + override val kotlinDependenciesHolder: HasKotlinDependencies + get() = compilationData.fragment + + override fun associateWith(other: CompilationDetails<*>) { + throw UnsupportedOperationException("not supported in the mapped model") + } + + override val associateCompilations: Set> + get() = emptySet() + + override fun whenSourceSetAdded(sourceSet: KotlinSourceSet) { + if (sourceSet != defaultSourceSet) + throw UnsupportedOperationException("metadata compilations have predefined sources") + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/NativeCompilationDetails.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/NativeCompilationDetails.kt new file mode 100644 index 00000000000..6a4bd649509 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/NativeCompilationDetails.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.plugin.mpp + +import org.jetbrains.kotlin.gradle.dsl.CompilerCommonOptions +import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions +import org.jetbrains.kotlin.gradle.plugin.HasCompilerOptions +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.KotlinTarget +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.GradleKpmDependencyFilesHolder +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.newDependencyFilesHolder +import org.jetbrains.kotlin.gradle.utils.filesProvider +import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName + +open class NativeCompilationDetails( + target: KotlinTarget, + compilationPurpose: String, + defaultSourceSet: KotlinSourceSet, + @Suppress("DEPRECATION") + createCompilerOptions: DefaultCompilationDetails.() -> HasCompilerOptions, + @Suppress("DEPRECATION") + createKotlinOptions: DefaultCompilationDetails.() -> KotlinCommonOptions +) : DefaultCompilationDetails( + target, + compilationPurpose, + defaultSourceSet, + createCompilerOptions, + createKotlinOptions +) { + override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder = project.newDependencyFilesHolder( + lowerCamelCaseName( + target.disambiguationClassifier, + compilationPurpose.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME }.orEmpty(), + "compileKlibraries" + ) + ) + + override val compileAllTaskName: String + get() = lowerCamelCaseName(target.disambiguationClassifier, compilationPurpose, "klibrary") + + override fun addAssociateCompilationDependencies(other: KotlinCompilation<*>) { + compileDependencyFilesHolder.dependencyFiles += + other.output.classesDirs + project.filesProvider { other.compileDependencyFiles } + + target.project.configurations.named(compilation.implementationConfigurationName).configure { configuration -> + configuration.extendsFrom(target.project.configurations.findByName(other.implementationConfigurationName)) + } + } + + override fun addSourcesToCompileTask(sourceSet: KotlinSourceSet, addAsCommonSources: Lazy) { + addSourcesToKotlinNativeCompileTask(project, compileKotlinTaskName, { sourceSet.kotlin }, addAsCommonSources) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SharedNativeCompilationDetails.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SharedNativeCompilationDetails.kt new file mode 100644 index 00000000000..486cf668f7b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SharedNativeCompilationDetails.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.plugin.mpp + +import org.gradle.api.file.FileCollection +import org.jetbrains.kotlin.gradle.dsl.CompilerCommonOptions +import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions +import org.jetbrains.kotlin.gradle.plugin.HasCompilerOptions +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.KotlinTarget +import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations +import org.jetbrains.kotlin.gradle.plugin.sources.internal +import org.jetbrains.kotlin.gradle.targets.metadata.getMetadataCompilationForSourceSet + +internal open class SharedNativeCompilationDetails( + target: KotlinTarget, + compilationPurpose: String, + defaultSourceSet: KotlinSourceSet, + @Suppress("DEPRECATION") + createCompilerOptions: DefaultCompilationDetails.() -> HasCompilerOptions, + @Suppress("DEPRECATION") + createKotlinOptions: DefaultCompilationDetails.() -> KotlinCommonOptions +) : DefaultCompilationDetails( + target, + compilationPurpose, + defaultSourceSet, + createCompilerOptions, + createKotlinOptions +) { + + override val friendArtifacts: FileCollection + get() = super.friendArtifacts.plus(run { + val project = target.project + val friendSourceSets = getVisibleSourceSetsFromAssociateCompilations(defaultSourceSet).toMutableSet().apply { + // TODO: implement proper dependsOn/refines compiler args for Kotlin/Native and pass the dependsOn klibs separately; + // But for now, those dependencies don't have any special semantics, so passing all them as friends works, too + addAll(defaultSourceSet.internal.dependsOnClosure) + } + project.files(friendSourceSets.mapNotNull { project.getMetadataCompilationForSourceSet(it)?.output?.classesDirs }) + }) + + override fun addSourcesToCompileTask(sourceSet: KotlinSourceSet, addAsCommonSources: Lazy) { + addSourcesToKotlinNativeCompileTask(project, compileKotlinTaskName, { sourceSet.kotlin }, addAsCommonSources) + } +} \ No newline at end of file