From 00ed41a81ebd9e2b270f02d30dde20c76c306d8d Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Thu, 2 Dec 2021 15:23:48 +0100 Subject: [PATCH] [Gradle][KPM] Implement FragmentGranularMetadataResolverFactory The logic is intended to be reused in ide import related logic --- .../FragmentGranularMetadataResolverFactory.kt | 18 ++++++++++++++++++ .../mpp/pm20/fragmentsMetadataCompilation.kt | 13 ++++--------- 2 files changed, 22 insertions(+), 9 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/FragmentGranularMetadataResolverFactory.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/FragmentGranularMetadataResolverFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/FragmentGranularMetadataResolverFactory.kt new file mode 100644 index 00000000000..0e7cda76f6e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/FragmentGranularMetadataResolverFactory.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2010-2021 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.pm20 + +internal class FragmentGranularMetadataResolverFactory { + private val resolvers = mutableMapOf() + + fun getOrCreate(fragment: KotlinGradleFragment): FragmentGranularMetadataResolver = resolvers.getOrPut(fragment) { + FragmentGranularMetadataResolver(fragment, lazy { + fragment.refinesClosure.minus(fragment).map { refinesFragment -> + getOrCreate(refinesFragment) + } + }) + } +} 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 1d39804369c..5ef7f7f8106 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 @@ -113,15 +113,10 @@ private fun configureMetadataCompilationsAndCreateRegistry( metadataCompilationRegistry: MetadataCompilationRegistry ) { val project = module.project - val metadataResolutionByFragment = mutableMapOf() + val metadataResolverFactory = FragmentGranularMetadataResolverFactory() module.fragments.all { fragment -> - val transformation = FragmentGranularMetadataResolver(fragment, lazy { - fragment.refinesClosure.minus(fragment).map { - metadataResolutionByFragment.getValue(it) - } - }) - metadataResolutionByFragment[fragment] = transformation - createExtractMetadataTask(project, fragment, transformation) + val metadataResolver = metadataResolverFactory.getOrCreate(fragment) + createExtractMetadataTask(project, fragment, metadataResolver) } val compileAllTask = project.registerTask(lowerCamelCaseName(module.moduleClassifier, "metadataClasses")) module.fragments.all { fragment -> @@ -285,4 +280,4 @@ private fun disableMetadataCompilationIfNotYetSupported( } private fun transformFragmentMetadataTaskName(fragment: KotlinModuleFragment) = - lowerCamelCaseName("resolve", fragment.disambiguateName("Metadata")) \ No newline at end of file + lowerCamelCaseName("resolve", fragment.disambiguateName("Metadata"))