[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. * 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( fun composeSignature(
declaration: FirDeclaration, declaration: FirDeclaration,
containingClass: ConeClassLikeLookupTag? = null, containingClass: ConeClassLikeLookupTag? = null,
forceTopLevelPrivate: Boolean = false forceTopLevelPrivate: Boolean = false,
allowLocalClasses: Boolean = false,
): IdSignature? ): IdSignature?
fun composeAccessorSignature( fun composeAccessorSignature(
@@ -84,23 +84,27 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
override fun composeSignature( override fun composeSignature(
declaration: FirDeclaration, declaration: FirDeclaration,
containingClass: ConeClassLikeLookupTag?, containingClass: ConeClassLikeLookupTag?,
forceTopLevelPrivate: Boolean forceTopLevelPrivate: Boolean,
allowLocalClasses: Boolean,
): IdSignature? { ): IdSignature? {
if (declaration is FirAnonymousObject || declaration is FirAnonymousFunction) return null if (declaration is FirAnonymousObject || declaration is FirAnonymousFunction) return null
if (declaration is FirRegularClass && declaration.classId.isLocal) return null if (declaration is FirRegularClass && declaration.classId.isLocal) return null
if (declaration is FirCallableDeclaration) { if (declaration is FirCallableDeclaration) {
if (declaration.visibility == Visibilities.Local) return null 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 declarationWithParentId = FirDeclarationWithParentId(declaration, containingClass?.classId)
val publicSignature = signatureCache.getOrPut(declarationWithParentId) { val publicSignature = signatureCache.getOrPut(declarationWithParentId) {
calculatePublicSignature(declarationWithParentId) calculatePublicSignature(declarationWithParentId)
} }
val resultSignature: IdSignature = if (isTopLevelPrivate(declaration) || forceTopLevelPrivate) { val resultSignature: IdSignature = if (isTopLevelPrivate(declaration) || forceTopLevelPrivate) {
val fileSig = fileSignature ?: declaration.fakeFileSignature(publicSignature) val fileSig = fileSignature ?: declaration.fakeFileSignature(publicSignature)
IdSignature.CompositeSignature(fileSig, publicSignature) IdSignature.CompositeSignature(fileSig, publicSignature)
} else } else
publicSignature publicSignature
return resultSignature return resultSignature
} }