diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt index e96b0e5d327..9be24a0499a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt @@ -13,6 +13,7 @@ import org.gradle.api.internal.plugins.DslObject import org.gradle.jvm.toolchain.JavaToolchainSpec import org.gradle.util.ConfigureUtil import org.jetbrains.kotlin.gradle.plugin.* +import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsSingleTargetPreset import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget @@ -120,7 +121,7 @@ open class KotlinProjectExtension @Inject constructor(project: Project) : Kotlin } internal val kpmModelContainer by lazy { - if (PropertiesProvider(project).experimentalKpmModelMapping) { + if (project.kotlinPropertiesProvider.experimentalKpmModelMapping) { DefaultKpmGradleProjectModelContainer.create(project) } else error("Model mapping is not enabled.") } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt index 1017d49005b..bf92e820e3f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt @@ -101,11 +101,11 @@ internal fun configureStdlibDefaultDependency(project: Project) = with(project) val scopesToHandleConfigurations = listOf(KotlinDependencyScope.API_SCOPE, KotlinDependencyScope.IMPLEMENTATION_SCOPE) - val ext = topLevelExtension + val extension = topLevelExtension when { project.hasKpmModel -> addStdlibToKpmProject(project) - ext is KotlinProjectExtension -> { - ext.sourceSets.all { kotlinSourceSet -> + extension is KotlinProjectExtension -> { + extension.sourceSets.all { kotlinSourceSet -> scopesToHandleConfigurations.forEach { scope -> val scopeConfiguration = project.sourceSetDependencyConfigurationByScope(kotlinSourceSet, scope) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradlePlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradlePlugin.kt index 3c9cbab412f..affc3d78ecf 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradlePlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradlePlugin.kt @@ -82,8 +82,7 @@ abstract class KotlinPm20GradlePlugin @Inject constructor( fun rootPublicationComponentName(module: KotlinGradleModule) = module.disambiguateName("root") -open class KotlinPm20ProjectExtension(project: Project) : - KotlinTopLevelExtension(project) { +open class KotlinPm20ProjectExtension(project: Project) : KotlinTopLevelExtension(project) { internal val kpmModelContainer = DefaultKpmGradleProjectModelContainer.create(project) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt index 971bd81b2a2..5e2aeed5618 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt @@ -37,7 +37,7 @@ interface KotlinVariantCompilationDataInternal : Kotlin project.filesProvider { val friendVariants = resolveFriendVariants() val friendModuleClassifiers = friendVariants.map { it.containingModule.moduleClassifier }.toSet() - val artifactView = owner.compileDependenciesConfiguration + owner.compileDependenciesConfiguration .incoming.artifactView { view -> view.componentFilter { id -> // FIXME rewrite using the proper module resolution after those changes are merged @@ -45,11 +45,10 @@ interface KotlinVariantCompilationDataInternal : Kotlin asProject?.build?.isCurrentBuild == true && asProject.projectPath == owner.project.path } - }.artifacts - artifactView.filter { - // FIXME rewrite using the proper module resolution after those changes are merged - moduleClassifiersFromCapabilities(it.variant.capabilities).any { it in friendModuleClassifiers } - }.map { it.file } + }.artifacts.filter { + // FIXME rewrite using the proper module resolution after those changes are merged + moduleClassifiersFromCapabilities(it.variant.capabilities).any { it in friendModuleClassifiers } + }.map { it.file } } ) } @@ -72,17 +71,16 @@ interface KotlinVariantCompilationDataInternal : Kotlin ?: error("Failed to resolve dependencies of ${owner.containingModule}")) .allDependencyModules .filterIsInstance() - .filter { + .filter { dependencyModule -> // the module comes from the same Gradle project // todo: extend to other friends once supported - it.project == owner.containingModule.project && - // also, important to check that the owner variant really requests this module: - variantResolver.getChosenVariant(owner, it) is VariantResolution.VariantMatch + dependencyModule.project == owner.containingModule.project } - val friendVariants = friendModules.map { - (variantResolver.getChosenVariant(owner, it) as VariantResolution.VariantMatch).chosenVariant - } - return friendVariants.filterIsInstance() + return friendModules + .map { friendModule -> variantResolver.getChosenVariant(owner, friendModule) } + // also, important to check that the owner variant really requests this module: + .filterIsInstance() + .mapNotNull { variantMatch -> variantMatch.chosenVariant as? KotlinGradleVariant } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt index 103190957c7..f147cdc03ef 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt @@ -90,8 +90,8 @@ open class KotlinGradleFragmentInternal @Inject constructor( // out of the consumer's metadata compilations compile classpath; however, Native variants must expose implementation as API // anyway, so for now all fragments follow that behavior override val declaredModuleDependencies: Iterable - get() = listOf(apiConfiguration, implementationConfiguration).flatMapTo(mutableSetOf()) { - it.allDependencies.map { it.toModuleDependency(project) } + get() = listOf(apiConfiguration, implementationConfiguration).flatMapTo(mutableSetOf()) { exportConfiguration -> + exportConfiguration.allDependencies.map { dependency -> dependency.toModuleDependency(project) } } override val kotlinSourceRoots: SourceDirectorySet = diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinJvmVariant.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinJvmVariant.kt index 713d7f3353a..8e6cdcb4147 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinJvmVariant.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinJvmVariant.kt @@ -51,7 +51,7 @@ internal fun KotlinGradleVariant.ownModuleName(): String { return filterModuleName("$baseName$suffix") } -class KotlinMappedJvmCompilationFactory( +internal class KotlinMappedJvmCompilationFactory( target: KotlinJvmTarget ) : KotlinJvmCompilationFactory(target) { override fun create(name: String): KotlinJvmCompilation { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KpmAwareTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KpmAwareTargetConfigurator.kt index 22b4427c30b..5d1abb8ea95 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KpmAwareTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KpmAwareTargetConfigurator.kt @@ -28,7 +28,7 @@ internal open class KpmAwareTargetConfigurator( private fun setupMavenPublicationDsl(target: T) { if (target is AbstractKotlinTarget) { target.compilations.all { compilation -> - val compilationDetails = (compilation as? AbstractKotlinCompilation)?.compilationDetails as? VariantMappedCompilationDetails + val compilationDetails = (compilation as? AbstractKotlinCompilation)?.compilationDetails if (compilationDetails is VariantMappedCompilationDetails<*> && compilationDetails.variant.containingModule.isMain) { val variant = compilationDetails.variant if (variant is SingleMavenPublishedModuleHolder) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/LegacyMappedVariant.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/LegacyMappedVariant.kt index 40883ab4b86..3dca4a14fce 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/LegacyMappedVariant.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/LegacyMappedVariant.kt @@ -40,15 +40,19 @@ internal open class LegacyMappedVariant( override val platformType: KotlinPlatformType get() = compilation.platformType + override val compileDependenciesConfiguration: Configuration get() = project.configurations.getByName(compilation.compileDependencyConfigurationName) + override var compileDependencyFiles: FileCollection get() = compilation.compileDependencyFiles set(value) { compilation.compileDependencyFiles = value } + override val compilationOutputs: KotlinCompilationOutput get() = compilation.output + override val sourceArchiveTaskName: String get() = defaultSourceArtifactTaskName // TODO: no such task yet @@ -180,12 +184,11 @@ internal fun mapTargetCompilationsToKpmVariants(target: AbstractKotlinTarget, pu module.fragments.add(variant) } - val whenPublicationShouldRegister: (() -> Unit) -> Unit = when (publicationRegistration) { - PublicationRegistrationMode.IMMEDIATE -> ::run - PublicationRegistrationMode.AFTER_EVALUATE -> { - { target.project.whenEvaluated { it() } } + fun whenPublicationShouldRegister(action: () -> Unit) = + when (publicationRegistration) { + PublicationRegistrationMode.IMMEDIATE -> action() + PublicationRegistrationMode.AFTER_EVALUATE -> target.project.whenEvaluated { action() } } - } whenPublicationShouldRegister { val mainModule = target.project.kpmModules.getByName(KotlinGradleModule.MAIN_MODULE_NAME) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/fragmentFactories.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/fragmentFactories.kt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/fragmentsMetadataCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/fragmentsMetadataCompilation.kt index e4de33a5650..6ff6de5fe06 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/fragmentsMetadataCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/fragmentsMetadataCompilation.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.gradle.tasks.registerTask import org.jetbrains.kotlin.gradle.tasks.withType import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation import org.jetbrains.kotlin.gradle.utils.dashSeparatedName +import org.jetbrains.kotlin.gradle.utils.filesProvider import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION import org.jetbrains.kotlin.project.model.KotlinModuleFragment @@ -152,14 +153,12 @@ private fun configureMetadataJarTask( } module.fragments.all { fragment -> allMetadataJar.configure { jar -> - val metadataOutput = project.files(Callable { + val metadataOutput = project.filesProvider { val compilationData = registry.getForFragmentOrNull(fragment) - compilationData?.run { - if (!fragment.isNativeHostSpecific()) - project.filesWithUnpackedArchives(compilationData.output.allOutputs, setOf(KLIB_FILE_EXTENSION)) - else emptyList() - } ?: emptyList() - }) + .takeIf { !fragment.isNativeHostSpecific() } + ?: return@filesProvider emptyList() + project.filesWithUnpackedArchives(compilationData.output.allOutputs, setOf(KLIB_FILE_EXTENSION)) + } jar.from(metadataOutput) { spec -> spec.into(fragment.fragmentName) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KpmMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KpmMetadataTargetConfigurator.kt index 02a315a503f..0ef8843fa30 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KpmMetadataTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KpmMetadataTargetConfigurator.kt @@ -27,16 +27,13 @@ internal class KpmMetadataTargetConfigurator(private val metadataTargetConfigura override fun configureCompilationDefaults(target: KotlinMetadataTarget) { super.configureCompilationDefaults(target) - // we still want to configure the legacy "main" compilation - run { - val mainCompilation = target.compilations.create(KotlinCompilation.MAIN_COMPILATION_NAME) - defineConfigurationsForCompilation(mainCompilation) - createLifecycleTask(mainCompilation) - metadataTargetConfigurator - .buildCompilationProcessor(mainCompilation) - .run() - mainCompilation.compileKotlinTaskProvider.configure { it.enabled = false } - } + val mainCompilation = target.compilations.create(KotlinCompilation.MAIN_COMPILATION_NAME) + defineConfigurationsForCompilation(mainCompilation) + createLifecycleTask(mainCompilation) + metadataTargetConfigurator + .buildCompilationProcessor(mainCompilation) + .run() + mainCompilation.compileKotlinTaskProvider.configure { it.enabled = false } } private fun configureTargetWithKpm(target: KotlinMetadataTarget) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/stringUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/stringUtils.kt index d8ccb6d7b7e..52e505ca5ef 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/stringUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/stringUtils.kt @@ -24,7 +24,7 @@ internal fun dashSeparatedName(vararg nameParts: String?): String { } internal fun dashSeparatedLowercaseName(nameParts: Iterable) = - dashSeparatedName(*nameParts.toList().toTypedArray()) + dashSeparatedLowercaseName(*nameParts.toList().toTypedArray()) internal fun dashSeparatedLowercaseName(vararg nameParts: String?): String { val nonEmptyParts = nameParts.mapNotNull { it?.takeIf(String::isNotEmpty)?.toLowerCase(Locale.ENGLISH) }