Add signature cache to FirBasedSignatureComposer
This commit is contained in:
+23
-11
@@ -18,11 +18,12 @@ import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
|||||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
import org.jetbrains.kotlin.fir.visitors.FirVisitor
|
||||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||||
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
|
||||||
// @NoMutableState -- we'll restore this annotation once we get rid of withFileSignature().
|
// @NoMutableState -- we'll restore this annotation once we get rid of withFileSignature().
|
||||||
class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignatureComposer {
|
class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignatureComposer {
|
||||||
var fileSignature: IdSignature.FileSignature? = null
|
private var fileSignature: IdSignature.FileSignature? = null
|
||||||
|
|
||||||
override fun withFileSignature(sig: IdSignature.FileSignature, body: () -> Unit) {
|
override fun withFileSignature(sig: IdSignature.FileSignature, body: () -> Unit) {
|
||||||
fileSignature = sig
|
fileSignature = sig
|
||||||
@@ -30,6 +31,10 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
|
|||||||
fileSignature = null
|
fileSignature = null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private data class FirDeclarationWithParentId(val declaration: FirDeclaration, val classId: ClassId?)
|
||||||
|
|
||||||
|
private val signatureCache = mutableMapOf<FirDeclarationWithParentId, IdSignature.CommonSignature>()
|
||||||
|
|
||||||
inner class SignatureBuilder : FirVisitor<Unit, Any?>() {
|
inner class SignatureBuilder : FirVisitor<Unit, Any?>() {
|
||||||
var hashId: Long? = null
|
var hashId: Long? = null
|
||||||
var mask = 0L
|
var mask = 0L
|
||||||
@@ -87,13 +92,27 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
|
|||||||
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 (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
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun calculatePublicSignature(declarationWithParentId: FirDeclarationWithParentId): IdSignature.CommonSignature {
|
||||||
|
val (declaration, containingClassId) = declarationWithParentId
|
||||||
val builder = SignatureBuilder()
|
val builder = SignatureBuilder()
|
||||||
try {
|
try {
|
||||||
declaration.accept(builder, null)
|
declaration.accept(builder, null)
|
||||||
} catch (t: Throwable) {
|
} catch (t: Throwable) {
|
||||||
throw IllegalStateException("Error while composing signature for ${declaration.render()}", t)
|
throw IllegalStateException("Error while composing signature for ${declaration.render()}", t)
|
||||||
}
|
}
|
||||||
val publicSignature = when (declaration) {
|
return when (declaration) {
|
||||||
is FirRegularClass -> {
|
is FirRegularClass -> {
|
||||||
// TODO: private classes are probably not acceptable here too
|
// TODO: private classes are probably not acceptable here too
|
||||||
val classId = declaration.classId
|
val classId = declaration.classId
|
||||||
@@ -108,8 +127,6 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
is FirCallableDeclaration -> {
|
is FirCallableDeclaration -> {
|
||||||
val containingClassId = containingClass?.classId
|
|
||||||
|
|
||||||
val classId = containingClassId ?: declaration.containingClass()?.classId
|
val classId = containingClassId ?: declaration.containingClass()?.classId
|
||||||
val packageName = classId?.packageFqName ?: declaration.symbol.callableId.packageName
|
val packageName = classId?.packageFqName ?: declaration.symbol.callableId.packageName
|
||||||
val callableName = declaration.irName
|
val callableName = declaration.irName
|
||||||
@@ -122,11 +139,6 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
|
|||||||
}
|
}
|
||||||
else -> error("Unsupported FIR declaration in signature composer: ${declaration.render()}")
|
else -> error("Unsupported FIR declaration in signature composer: ${declaration.render()}")
|
||||||
}
|
}
|
||||||
return if (isTopLevelPrivate(declaration) || forceTopLevelPrivate) {
|
|
||||||
val fileSig = fileSignature ?: declaration.fakeFileSignature(publicSignature)
|
|
||||||
IdSignature.CompositeSignature(fileSig, publicSignature)
|
|
||||||
} else
|
|
||||||
publicSignature
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun composeTypeParameterSignature(
|
override fun composeTypeParameterSignature(
|
||||||
@@ -136,8 +148,8 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
|
|||||||
): IdSignature? {
|
): IdSignature? {
|
||||||
if (containerSignature == null) return null
|
if (containerSignature == null) return null
|
||||||
return IdSignature.CompositeSignature(
|
return IdSignature.CompositeSignature(
|
||||||
containerSignature,
|
containerSignature,
|
||||||
IdSignature.LocalSignature(MangleConstant.TYPE_PARAMETER_MARKER_NAME, index.toLong(), null)
|
IdSignature.LocalSignature(MangleConstant.TYPE_PARAMETER_MARKER_NAME, index.toLong(), null)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user