diff --git a/.idea/dictionaries/sebastiansellmair.xml b/.idea/dictionaries/sebastiansellmair.xml index 805e5bf1e9e..1942f5d4e53 100644 --- a/.idea/dictionaries/sebastiansellmair.xml +++ b/.idea/dictionaries/sebastiansellmair.xml @@ -1,6 +1,7 @@ + actuals cinterops instantiator interops diff --git a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt index 9a075ccee78..60e5320dee0 100644 --- a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt +++ b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CodegenUtil.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall import org.jetbrains.kotlin.resolve.descriptorUtil.module -import org.jetbrains.kotlin.resolve.multiplatform.ExpectedActualResolver +import org.jetbrains.kotlin.resolve.multiplatform.findCompatibleExpectsForActual import org.jetbrains.kotlin.resolve.multiplatform.onlyFromThisModule import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.util.getExceptionMessage @@ -182,9 +182,7 @@ object CodegenUtil { @JvmStatic fun findExpectedFunctionForActual(descriptor: FunctionDescriptor): FunctionDescriptor? { - val compatibleExpectedFunctions = with(ExpectedActualResolver) { - descriptor.findCompatibleExpectedForActual(onlyFromThisModule(descriptor.module)) - } + val compatibleExpectedFunctions = descriptor.findCompatibleExpectsForActual(onlyFromThisModule(descriptor.module)) return compatibleExpectedFunctions.firstOrNull() as FunctionDescriptor? } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FrameMapWithExpectActualSupport.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/FrameMapWithExpectActualSupport.kt index 2a6b7b27730..aa8580cc3d4 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FrameMapWithExpectActualSupport.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FrameMapWithExpectActualSupport.kt @@ -6,7 +6,7 @@ package org.jetbrains.kotlin.codegen import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.resolve.multiplatform.ExpectedActualResolver +import org.jetbrains.kotlin.resolve.multiplatform.findCompatibleActualsForExpected import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver /** @@ -29,9 +29,7 @@ class FrameMapWithExpectActualSupport(private val module: ModuleDescriptor) : Fr // in ExpressionCodegen.generateThisOrOuterFromContext by comparing classes by type constructor equality. if (parameter !is ReceiverParameterDescriptor || parameter.value !is ExtensionReceiver) return null - val actual = with(ExpectedActualResolver) { - container.findCompatibleActualForExpected(module).firstOrNull() - } + val actual = container.findCompatibleActualsForExpected(module).firstOrNull() return (actual as? CallableDescriptor)?.extensionReceiverParameter } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java index 438b69787bb..f125db46981 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java @@ -44,7 +44,7 @@ import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo; import org.jetbrains.kotlin.resolve.calls.util.CallMaker; import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt; import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil; -import org.jetbrains.kotlin.resolve.multiplatform.ExpectedActualResolver; +import org.jetbrains.kotlin.resolve.multiplatform.ExpectedActualResolverKt; import org.jetbrains.kotlin.resolve.scopes.*; import org.jetbrains.kotlin.resolve.source.KotlinSourceElementKt; import org.jetbrains.kotlin.types.*; @@ -532,7 +532,7 @@ public class BodyResolver { } parentEnumOrSealed.add(currentDescriptor.getTypeConstructor()); if (currentDescriptor.isExpect()) { - List actualDescriptors = ExpectedActualResolver.INSTANCE.findCompatibleActualForExpected( + List actualDescriptors = ExpectedActualResolverKt.findCompatibleActualsForExpected( currentDescriptor, DescriptorUtilsKt.getModule( currentDescriptor) ); for (MemberDescriptor actualDescriptor: actualDescriptors) { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ExpectDeclarationRemover.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ExpectDeclarationRemover.kt index b5d9651ba8c..ca9a0d5315a 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ExpectDeclarationRemover.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ExpectDeclarationRemover.kt @@ -23,9 +23,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.resolve.descriptorUtil.module -import org.jetbrains.kotlin.resolve.multiplatform.ExpectedActualResolver -import org.jetbrains.kotlin.resolve.multiplatform.OptionalAnnotationUtil -import org.jetbrains.kotlin.resolve.multiplatform.onlyFromThisModule +import org.jetbrains.kotlin.resolve.multiplatform.* import org.jetbrains.kotlin.utils.addToStdlib.safeAs // `doRemove` means should expect-declaration be removed from IR @@ -136,16 +134,13 @@ class ExpectDeclarationRemover(val symbolTable: ReferenceSymbolTable, private va private fun MemberDescriptor.findActualForExpect(): MemberDescriptor? { if (!isExpect) error(this) - return with(ExpectedActualResolver) { - findCompatibleActualForExpected(this@findActualForExpect.module).singleOrNull() - } + return findCompatibleActualsForExpected(module).singleOrNull() + } private fun MemberDescriptor.findExpectForActual(): MemberDescriptor? { if (!isActual) error(this) - return with(ExpectedActualResolver) { - findCompatibleExpectedForActual(onlyFromThisModule(this@findExpectForActual.module)).singleOrNull() - } + return findCompatibleExpectsForActual().singleOrNull() } private fun IrExpression.remapExpectValueSymbols(): IrExpression { diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/ExpectActualTable.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/ExpectActualTable.kt index ace9bbdd34c..630972d4c8d 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/ExpectActualTable.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/ExpectActualTable.kt @@ -116,4 +116,4 @@ class ExpectActualTable(val expectDescriptorToSymbol: MutableMap Boolean): Boolean { val function = containingDeclaration if (function is FunctionDescriptor && function.isActual) { - with(ExpectedActualResolver) { - val expected = function.findCompatibleExpectedForActual(ALL_MODULES).firstOrNull() - return expected is FunctionDescriptor && checker(expected.valueParameters[index]) - } + val expected = function.findCompatibleExpectsForActual().firstOrNull() + return expected is FunctionDescriptor && checker(expected.valueParameters[index]) } return false } 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 45b35320e82..e0c95df69b9 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectedActualResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectedActualResolver.kt @@ -24,24 +24,11 @@ import org.jetbrains.kotlin.utils.SmartList import org.jetbrains.kotlin.utils.keysToMap object ExpectedActualResolver { - // FIXME(dsavvinov): review clients, as they won't work properly in HMPP projects - fun MemberDescriptor.findCompatibleActualForExpected(platformModule: ModuleDescriptor): List = - findActualForExpected(this, platformModule, onlyFromThisModule(platformModule))?.get(Compatible).orEmpty() - - fun MemberDescriptor.findAnyActualForExpected(platformModule: ModuleDescriptor): List { - val actualsGroupedByCompatibility = findActualForExpected(this, platformModule, onlyFromThisModule(platformModule)) - return actualsGroupedByCompatibility?.get(Compatible) - ?: actualsGroupedByCompatibility?.values?.flatten() - ?: emptyList() - } - - fun MemberDescriptor.findCompatibleExpectedForActual(moduleFilter: ModuleFilter): List = - findExpectedForActual(this, moduleFilter)?.get(Compatible).orEmpty() fun findActualForExpected( expected: MemberDescriptor, platformModule: ModuleDescriptor, - moduleVisibilityFilter: ModuleFilter, + moduleVisibilityFilter: ModuleFilter = allModulesProvidingActualsFor(expected.module), ): Map, List>? { return when (expected) { is CallableMemberDescriptor -> { @@ -69,7 +56,7 @@ object ExpectedActualResolver { fun findExpectedForActual( actual: MemberDescriptor, - moduleFilter: (ModuleDescriptor) -> Boolean + moduleFilter: (ModuleDescriptor) -> Boolean = allModulesProvidingExpectsFor(actual.module) ): Map, List>? { return when (actual) { is CallableMemberDescriptor -> { @@ -533,19 +520,39 @@ object ExpectedActualResolver { } } -fun DeclarationDescriptor.findExpects(): List { - return ExpectedActualResolver.findExpectedForActual( - this as MemberDescriptor, ALL_MODULES - )?.get(Compatible).orEmpty() +// FIXME(dsavvinov): review clients, as they won't work properly in HMPP projects +@JvmOverloads +fun MemberDescriptor.findCompatibleActualsForExpected( + platformModule: ModuleDescriptor, moduleFilter: ModuleFilter = allModulesProvidingActualsFor(module) +): List = + ExpectedActualResolver.findActualForExpected(this, platformModule, moduleFilter)?.get(Compatible).orEmpty() + +@JvmOverloads +fun MemberDescriptor.findAnyActualsForExpected( + platformModule: ModuleDescriptor, moduleFilter: ModuleFilter = allModulesProvidingActualsFor(module) +): List { + val actualsGroupedByCompatibility = ExpectedActualResolver.findActualForExpected(this, platformModule, moduleFilter) + return actualsGroupedByCompatibility?.get(Compatible) + ?: actualsGroupedByCompatibility?.values?.flatten() + ?: emptyList() } -fun DeclarationDescriptor.findActuals(inModule: ModuleDescriptor = this.module): List { - return ExpectedActualResolver.findActualForExpected( - (this as MemberDescriptor), inModule, ALL_MODULES - )?.get(Compatible).orEmpty() +fun MemberDescriptor.findCompatibleExpectsForActual( + moduleFilter: ModuleFilter = allModulesProvidingExpectsFor(module) +): List = + ExpectedActualResolver.findExpectedForActual(this, moduleFilter)?.get(Compatible).orEmpty() + +fun DeclarationDescriptor.findExpects(): List { + if(this !is MemberDescriptor) return emptyList() + return this.findCompatibleExpectsForActual() +} + +fun DeclarationDescriptor.findActuals(inModule: ModuleDescriptor): List { + if(this !is MemberDescriptor) return emptyList() + return this.findCompatibleActualsForExpected(inModule) } // TODO: Klibs still need to better handle source in deserialized descriptors. -val DeclarationDescriptorWithSource.couldHaveASource: Boolean get() = - this.source.containingFile != SourceFile.NO_SOURCE_FILE || - this is DeserializedDescriptor +val DeclarationDescriptorWithSource.couldHaveASource: Boolean + get() = this.source.containingFile != SourceFile.NO_SOURCE_FILE || + this is DeserializedDescriptor diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/OptionalAnnotationUtil.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/OptionalAnnotationUtil.kt index 41061858f54..5dd6f47846a 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/OptionalAnnotationUtil.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/OptionalAnnotationUtil.kt @@ -19,9 +19,7 @@ object OptionalAnnotationUtil { assert(descriptor.isExpect) { "Not an expected class: $descriptor" } if (isOptionalAnnotationClass(descriptor)) { - with(ExpectedActualResolver) { - return descriptor.findCompatibleActualForExpected(descriptor.module).isEmpty() - } + return descriptor.findCompatibleActualsForExpected(descriptor.module).isEmpty() } return false 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 a7eb6e667fd..85df9fbf776 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/moduleFilterUtils.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/moduleFilterUtils.kt @@ -15,4 +15,12 @@ fun onlyFromThisModule(module: ModuleDescriptor): ModuleFilter = { it == module val ALL_MODULES: ModuleFilter = { true } +fun allModulesProvidingExpectsFor(platformModule: ModuleDescriptor): ModuleFilter = { + it == platformModule || it in platformModule.allExpectedByModules +} + +fun allModulesProvidingActualsFor(commonModule: ModuleDescriptor): ModuleFilter = { + it == commonModule || commonModule in it.allExpectedByModules +} + fun Iterable.applyFilter(filter: ModuleFilter): List = filter { filter(it.module) }