diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectedActualResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectedActualResolver.kt index e0c95df69b9..43bac3f6c38 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectedActualResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectedActualResolver.kt @@ -28,7 +28,7 @@ object ExpectedActualResolver { fun findActualForExpected( expected: MemberDescriptor, platformModule: ModuleDescriptor, - moduleVisibilityFilter: ModuleFilter = allModulesProvidingActualsFor(expected.module), + moduleVisibilityFilter: ModuleFilter = allModulesProvidingActualsFor(expected.module, platformModule), ): Map, List>? { return when (expected) { is CallableMemberDescriptor -> { @@ -523,13 +523,13 @@ object ExpectedActualResolver { // FIXME(dsavvinov): review clients, as they won't work properly in HMPP projects @JvmOverloads fun MemberDescriptor.findCompatibleActualsForExpected( - platformModule: ModuleDescriptor, moduleFilter: ModuleFilter = allModulesProvidingActualsFor(module) + platformModule: ModuleDescriptor, moduleFilter: ModuleFilter = allModulesProvidingActualsFor(module, platformModule) ): List = ExpectedActualResolver.findActualForExpected(this, platformModule, moduleFilter)?.get(Compatible).orEmpty() @JvmOverloads fun MemberDescriptor.findAnyActualsForExpected( - platformModule: ModuleDescriptor, moduleFilter: ModuleFilter = allModulesProvidingActualsFor(module) + platformModule: ModuleDescriptor, moduleFilter: ModuleFilter = allModulesProvidingActualsFor(module, platformModule) ): List { val actualsGroupedByCompatibility = ExpectedActualResolver.findActualForExpected(this, platformModule, moduleFilter) return actualsGroupedByCompatibility?.get(Compatible) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/moduleFilterUtils.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/moduleFilterUtils.kt index 85df9fbf776..752a914d9b0 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/moduleFilterUtils.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/moduleFilterUtils.kt @@ -19,8 +19,28 @@ fun allModulesProvidingExpectsFor(platformModule: ModuleDescriptor): ModuleFilte 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 Iterable.applyFilter(filter: ModuleFilter): List = filter { filter(it.module) }