From 34f8851ac1039c4cdab942e4f50b5344922de431 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Tue, 28 Mar 2023 01:24:08 +0200 Subject: [PATCH] [psi2ir] Ignore private members when creating fake overrides from descriptors The behavior is unified with the IR deserializer. See `isOverridableMemberOrAccessor` in IrOverridingUtil.kt Without this change, if we add a private member to the Any in wasm stdlib, the compiler starts crashing with a linker error. It's hard to write a relevant, self-contained box test for that since it requires adding a private member to Any and affects **only** "virtual" FunctionN interfaces. --- .../psi2ir/descriptors/IrDescriptorBasedFunctionFactory.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/descriptors/IrDescriptorBasedFunctionFactory.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/descriptors/IrDescriptorBasedFunctionFactory.kt index f4ae9a90734..be00fc17e6c 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/descriptors/IrDescriptorBasedFunctionFactory.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/descriptors/IrDescriptorBasedFunctionFactory.kt @@ -351,8 +351,11 @@ class IrDescriptorBasedFunctionFactory( private fun IrClass.addFakeOverrides() { - val fakeOverrideDescriptors = descriptor.unsubstitutedMemberScope.getContributedDescriptors(DescriptorKindFilter.CALLABLES) - .filterIsInstance().filter { it.kind === CallableMemberDescriptor.Kind.FAKE_OVERRIDE } + val fakeOverrideDescriptors = + descriptor.unsubstitutedMemberScope.getContributedDescriptors(DescriptorKindFilter.CALLABLES).asSequence() + .filterIsInstance() + .filter { it.kind === CallableMemberDescriptor.Kind.FAKE_OVERRIDE && it.dispatchReceiverParameter != null } + .filter { !DescriptorVisibilities.isPrivate(it.visibility) && it.visibility != DescriptorVisibilities.INVISIBLE_FAKE } fun createFakeOverrideFunction(descriptor: FunctionDescriptor, property: IrPropertySymbol?): IrSimpleFunction { val returnType = descriptor.returnType?.let { toIrType(it) } ?: error("No return type for $descriptor")