[FIR2IR] add option to allow IdSignature for members of local classes

^KT-54311
This commit is contained in:
Dmitrii Gridin
2022-11-04 12:16:33 +01:00
committed by Space Team
parent c6a3ca86eb
commit 1dfca7aca9
2 changed files with 9 additions and 4 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -17,7 +17,8 @@ interface Fir2IrSignatureComposer {
fun composeSignature(
declaration: FirDeclaration,
containingClass: ConeClassLikeLookupTag? = null,
forceTopLevelPrivate: Boolean = false
forceTopLevelPrivate: Boolean = false,
allowLocalClasses: Boolean = false,
): IdSignature?
fun composeAccessorSignature(
@@ -84,23 +84,27 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
override fun composeSignature(
declaration: FirDeclaration,
containingClass: ConeClassLikeLookupTag?,
forceTopLevelPrivate: Boolean
forceTopLevelPrivate: Boolean,
allowLocalClasses: Boolean,
): IdSignature? {
if (declaration is FirAnonymousObject || declaration is FirAnonymousFunction) return null
if (declaration is FirRegularClass && declaration.classId.isLocal) return null
if (declaration is FirCallableDeclaration) {
if (declaration.visibility == Visibilities.Local) return null
if (declaration.dispatchReceiverClassOrNull()?.classId?.isLocal == true || containingClass?.classId?.isLocal == true) return null
if (!allowLocalClasses && (declaration.dispatchReceiverClassOrNull()?.classId?.isLocal == true || containingClass?.classId?.isLocal == true)) return null
}
val declarationWithParentId = FirDeclarationWithParentId(declaration, containingClass?.classId)
val publicSignature = signatureCache.getOrPut(declarationWithParentId) {
calculatePublicSignature(declarationWithParentId)
}
val resultSignature: IdSignature = if (isTopLevelPrivate(declaration) || forceTopLevelPrivate) {
val fileSig = fileSignature ?: declaration.fakeFileSignature(publicSignature)
IdSignature.CompositeSignature(fileSig, publicSignature)
} else
publicSignature
return resultSignature
}