[MPP] allModulesProvidingActualsFor: Support non-hmpp ide case

^KT-50156
This commit is contained in:
sebastian.sellmair
2021-12-22 18:22:20 +01:00
committed by Space
parent 429e1dad9f
commit ba201a249e
2 changed files with 25 additions and 5 deletions
@@ -28,7 +28,7 @@ object ExpectedActualResolver {
fun findActualForExpected( fun findActualForExpected(
expected: MemberDescriptor, expected: MemberDescriptor,
platformModule: ModuleDescriptor, platformModule: ModuleDescriptor,
moduleVisibilityFilter: ModuleFilter = allModulesProvidingActualsFor(expected.module), moduleVisibilityFilter: ModuleFilter = allModulesProvidingActualsFor(expected.module, platformModule),
): Map<ExpectActualCompatibility<MemberDescriptor>, List<MemberDescriptor>>? { ): Map<ExpectActualCompatibility<MemberDescriptor>, List<MemberDescriptor>>? {
return when (expected) { return when (expected) {
is CallableMemberDescriptor -> { is CallableMemberDescriptor -> {
@@ -523,13 +523,13 @@ object ExpectedActualResolver {
// FIXME(dsavvinov): review clients, as they won't work properly in HMPP projects // FIXME(dsavvinov): review clients, as they won't work properly in HMPP projects
@JvmOverloads @JvmOverloads
fun MemberDescriptor.findCompatibleActualsForExpected( fun MemberDescriptor.findCompatibleActualsForExpected(
platformModule: ModuleDescriptor, moduleFilter: ModuleFilter = allModulesProvidingActualsFor(module) platformModule: ModuleDescriptor, moduleFilter: ModuleFilter = allModulesProvidingActualsFor(module, platformModule)
): List<MemberDescriptor> = ): List<MemberDescriptor> =
ExpectedActualResolver.findActualForExpected(this, platformModule, moduleFilter)?.get(Compatible).orEmpty() ExpectedActualResolver.findActualForExpected(this, platformModule, moduleFilter)?.get(Compatible).orEmpty()
@JvmOverloads @JvmOverloads
fun MemberDescriptor.findAnyActualsForExpected( fun MemberDescriptor.findAnyActualsForExpected(
platformModule: ModuleDescriptor, moduleFilter: ModuleFilter = allModulesProvidingActualsFor(module) platformModule: ModuleDescriptor, moduleFilter: ModuleFilter = allModulesProvidingActualsFor(module, platformModule)
): List<MemberDescriptor> { ): List<MemberDescriptor> {
val actualsGroupedByCompatibility = ExpectedActualResolver.findActualForExpected(this, platformModule, moduleFilter) val actualsGroupedByCompatibility = ExpectedActualResolver.findActualForExpected(this, platformModule, moduleFilter)
return actualsGroupedByCompatibility?.get(Compatible) return actualsGroupedByCompatibility?.get(Compatible)
@@ -19,8 +19,28 @@ fun allModulesProvidingExpectsFor(platformModule: ModuleDescriptor): ModuleFilte
it == platformModule || it in platformModule.allExpectedByModules it == platformModule || it in platformModule.allExpectedByModules
} }
fun allModulesProvidingActualsFor(commonModule: ModuleDescriptor): ModuleFilter = { /**
it == commonModule || commonModule in it.allExpectedByModules * @param commonModule: The module for which the allowed modules can provide actuals for.
* Meaning that all allowed modules will have declared a dependsOn edge to said [commonModule]
*
* @param platformModule: This parameter is only required to support pre-hmpp IDE
* consumers. In this mode, leaf/platform modules will get wrapped using PlatformModuleInfo which
* will be one [ModuleDescriptor] which wrap all dependsOn sources as well.
* This module will not declare 'proper' [ModuleDescriptor.allExpectedByModules] to the common module
* and therefore has to be passed into this filter as well to manually check if an actual was provided by this module.
* This parameter can be dropped and removed once 'non-hmpp' mode shall not be supported anymore.
*/
fun allModulesProvidingActualsFor(
commonModule: ModuleDescriptor,
platformModule: ModuleDescriptor
): ModuleFilter = { module ->
when {
module == commonModule -> true
commonModule in module.allExpectedByModules -> true
/* Support non-hmpp IDE case */
module == platformModule -> true
else -> false
}
} }
fun <T : DeclarationDescriptor> Iterable<T>.applyFilter(filter: ModuleFilter): List<T> = filter { filter(it.module) } fun <T : DeclarationDescriptor> Iterable<T>.applyFilter(filter: ModuleFilter): List<T> = filter { filter(it.module) }