[Gradle][KPM] Implement FragmentGranularMetadataResolverFactory

The logic is intended to be reused in ide import related logic
This commit is contained in:
sebastian.sellmair
2021-12-02 15:23:48 +01:00
committed by Space
parent ea698838dd
commit 00ed41a81e
2 changed files with 22 additions and 9 deletions
@@ -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<KotlinGradleFragment, FragmentGranularMetadataResolver>()
fun getOrCreate(fragment: KotlinGradleFragment): FragmentGranularMetadataResolver = resolvers.getOrPut(fragment) {
FragmentGranularMetadataResolver(fragment, lazy {
fragment.refinesClosure.minus(fragment).map { refinesFragment ->
getOrCreate(refinesFragment)
}
})
}
}
@@ -113,15 +113,10 @@ private fun configureMetadataCompilationsAndCreateRegistry(
metadataCompilationRegistry: MetadataCompilationRegistry
) {
val project = module.project
val metadataResolutionByFragment = mutableMapOf<KotlinGradleFragment, FragmentGranularMetadataResolver>()
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<DefaultTask>(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"))
lowerCamelCaseName("resolve", fragment.disambiguateName("Metadata"))