From 44289714016100bdb54a4dbedf8f0a530373f642 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Wed, 21 Dec 2022 14:28:11 +0100 Subject: [PATCH] [LazyIR] Exclude INVISIBLE_FAKE callable members from class declarations Fixes KT-55509 --- .../kotlin/ir/declarations/lazy/IrLazyClass.kt | 7 ++++--- .../DescriptorByIdSignatureFinderImpl.kt | 13 +++++++++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt index 0f57692217d..c274b2496db 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyClass.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.ir.declarations.lazy import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.DescriptorVisibilities.isPrivate import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrConstructorCall @@ -73,10 +74,10 @@ class IrLazyClass( } private fun shouldBuildStub(descriptor: DeclarationDescriptor): Boolean = - descriptor !is DeclarationDescriptorWithVisibility || - !DescriptorVisibilities.isPrivate(descriptor.visibility) || + descriptor !is DeclarationDescriptorWithVisibility + || (!isPrivate(descriptor.visibility) && descriptor.visibility != DescriptorVisibilities.INVISIBLE_FAKE) // This exception is needed for K/N caches usage. - isObject && descriptor is ClassConstructorDescriptor + || isObject && descriptor is ClassConstructorDescriptor override var typeParameters: List by lazyVar(stubGenerator.lock) { descriptor.declaredTypeParameters.mapTo(arrayListOf()) { diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DescriptorByIdSignatureFinderImpl.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DescriptorByIdSignatureFinderImpl.kt index 06a5109b9fa..dbc7a075f2f 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DescriptorByIdSignatureFinderImpl.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DescriptorByIdSignatureFinderImpl.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.backend.common.serialization import org.jetbrains.kotlin.backend.common.serialization.mangle.MangleConstant import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.DescriptorVisibilities.INVISIBLE_FAKE import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.util.DescriptorByIdSignatureFinder @@ -43,14 +44,22 @@ class DescriptorByIdSignatureFinderImpl( MODULE_ONLY } - override fun findDescriptorBySignature(signature: IdSignature): DeclarationDescriptor? = - when (signature) { + override fun findDescriptorBySignature(signature: IdSignature): DeclarationDescriptor? { + val descriptor = when (signature) { is IdSignature.AccessorSignature -> resolveAccessorSignature(signature) is IdSignature.CommonSignature -> resolveCommonSignature(signature) is IdSignature.CompositeSignature -> resolveCompositeSignature(signature) else -> error("Unexpected signature kind: $signature") } + return when (descriptor) { + null -> null + is PropertyAccessorDescriptor -> descriptor.takeIf { it.visibility != INVISIBLE_FAKE && it.correspondingProperty.visibility != INVISIBLE_FAKE } + is DeclarationDescriptorWithVisibility -> descriptor.takeIf { it.visibility != INVISIBLE_FAKE } + else -> descriptor + } + } + private fun resolveCompositeSignature(signature: IdSignature.CompositeSignature): DeclarationDescriptor? { val container = findDescriptorBySignature(signature.nearestPublicSig()) ?: return null