[LazyIR] Exclude INVISIBLE_FAKE callable members from class declarations

Fixes KT-55509
This commit is contained in:
Dmitriy Dolovov
2022-12-21 14:28:11 +01:00
committed by Space Team
parent 4c925d0588
commit 4428971401
2 changed files with 15 additions and 5 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.ir.declarations.lazy package org.jetbrains.kotlin.ir.declarations.lazy
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities.isPrivate
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
@@ -73,10 +74,10 @@ class IrLazyClass(
} }
private fun shouldBuildStub(descriptor: DeclarationDescriptor): Boolean = private fun shouldBuildStub(descriptor: DeclarationDescriptor): Boolean =
descriptor !is DeclarationDescriptorWithVisibility || descriptor !is DeclarationDescriptorWithVisibility
!DescriptorVisibilities.isPrivate(descriptor.visibility) || || (!isPrivate(descriptor.visibility) && descriptor.visibility != DescriptorVisibilities.INVISIBLE_FAKE)
// This exception is needed for K/N caches usage. // This exception is needed for K/N caches usage.
isObject && descriptor is ClassConstructorDescriptor || isObject && descriptor is ClassConstructorDescriptor
override var typeParameters: List<IrTypeParameter> by lazyVar(stubGenerator.lock) { override var typeParameters: List<IrTypeParameter> by lazyVar(stubGenerator.lock) {
descriptor.declaredTypeParameters.mapTo(arrayListOf()) { descriptor.declaredTypeParameters.mapTo(arrayListOf()) {
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.backend.common.serialization
import org.jetbrains.kotlin.backend.common.serialization.mangle.MangleConstant import org.jetbrains.kotlin.backend.common.serialization.mangle.MangleConstant
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities.INVISIBLE_FAKE
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.util.DescriptorByIdSignatureFinder import org.jetbrains.kotlin.ir.util.DescriptorByIdSignatureFinder
@@ -43,14 +44,22 @@ class DescriptorByIdSignatureFinderImpl(
MODULE_ONLY MODULE_ONLY
} }
override fun findDescriptorBySignature(signature: IdSignature): DeclarationDescriptor? = override fun findDescriptorBySignature(signature: IdSignature): DeclarationDescriptor? {
when (signature) { val descriptor = when (signature) {
is IdSignature.AccessorSignature -> resolveAccessorSignature(signature) is IdSignature.AccessorSignature -> resolveAccessorSignature(signature)
is IdSignature.CommonSignature -> resolveCommonSignature(signature) is IdSignature.CommonSignature -> resolveCommonSignature(signature)
is IdSignature.CompositeSignature -> resolveCompositeSignature(signature) is IdSignature.CompositeSignature -> resolveCompositeSignature(signature)
else -> error("Unexpected signature kind: $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? { private fun resolveCompositeSignature(signature: IdSignature.CompositeSignature): DeclarationDescriptor? {
val container = findDescriptorBySignature(signature.nearestPublicSig()) ?: return null val container = findDescriptorBySignature(signature.nearestPublicSig()) ?: return null