[JS IR] Take into account file annotations for calculating symbol hashes

^KT-55367 Fixed
This commit is contained in:
Alexander Korepanov
2022-12-09 13:06:34 +01:00
committed by Space Team
parent 4136189114
commit 48daf0befe
39 changed files with 280 additions and 81 deletions
@@ -255,7 +255,7 @@ class CacheUpdater(
symbolCanBeExported = true
}
if (symbolCanBeExported) {
idSignatureToFile[signature] = IdSignatureSource(libFile, KotlinSourceFile(fileDeserializer.file), symbol)
idSignatureToFile[signature] = IdSignatureSource(libFile, fileDeserializer.file, symbol)
}
}
@@ -276,12 +276,12 @@ class CacheUpdater(
) {
val allImportedSignatures = addParentSignatures(maybeImportedSignatures, idSignatureToFile, libFile, srcFile)
for (importedSignature in allImportedSignatures) {
val (dependencyLib, dependencyFile) = idSignatureToFile[importedSignature] ?: continue
val dependency = idSignatureToFile[importedSignature] ?: continue
signatureHashCalculator[importedSignature]?.also { signatureHash ->
addDirectDependency(dependencyLib, dependencyFile, importedSignature, signatureHash)
} ?: notFoundIcError("signature $importedSignature hash", dependencyLib, dependencyFile)
addDirectDependency(dependency.lib, dependency.src, importedSignature, signatureHash)
} ?: notFoundIcError("signature $importedSignature hash", dependency.lib, dependency.src)
updatedMetadata[dependencyLib, dependencyFile]?.also { dependencyMetadata ->
updatedMetadata[dependency.lib, dependency.src]?.also { dependencyMetadata ->
dependencyMetadata.addInverseDependency(libFile, srcFile, importedSignature)
}
}
@@ -59,6 +59,10 @@ private class HashCalculatorForIC {
)
}
fun updateAnnotationContainer(annotationContainer: IrAnnotationContainer) {
updateForEach(annotationContainer.annotations, ::update)
}
inline fun <T> updateForEach(collection: Collection<T>, f: (T) -> Unit) {
update(collection.size)
collection.forEach { f(it) }
@@ -112,6 +116,10 @@ internal fun IrSimpleFunction.irSimpleFunctionHashForIC() = HashCalculatorForIC(
it.update(this)
}.finalize()
internal fun IrAnnotationContainer.irAnnotationContainerHashForIC() = HashCalculatorForIC().also {
it.updateAnnotationContainer(this)
}.finalize()
internal fun IrSymbol.irSymbolHashForIC() = HashCalculatorForIC().also {
it.update(toString())
// symbol rendering prints very little information about type parameters
@@ -128,11 +136,7 @@ internal fun IrSymbol.irSymbolHashForIC() = HashCalculatorForIC().also {
it.update(functionParam.defaultValue?.let { 1 } ?: 0)
}
}
(owner as? IrAnnotationContainer)?.let { annotationContainer ->
it.updateForEach(annotationContainer.annotations) { annotation ->
it.update(annotation)
}
}
(owner as? IrAnnotationContainer)?.let(it::updateAnnotationContainer)
}.finalize()
internal fun String.stringHashForIC() = HashCalculatorForIC().also { it.update(this) }.finalize()
@@ -25,27 +25,39 @@ internal class IdSignatureHashCalculator {
private val inlineFunctionCallGraph = hashMapOf<IrFunction, Set<IrFunction>>()
private val processingFunctions = hashSetOf<IrFunction>()
private val functionTransitiveHashes = hashMapOf<IrFunction, ICHash>()
private val fileAnnotationHashes = hashMapOf<IrFile, ICHash>()
private val allIdSignatureHashes = hashMapOf<IdSignature, ICHash>()
private val IrFile.annotationsHash: ICHash
get() = fileAnnotationHashes.getOrPut(this, ::irAnnotationContainerHashForIC)
private inner class FlatHashCalculator : IrElementVisitorVoid {
private var fileAnnotationsHash = ICHash()
override fun visitElement(element: IrElement) {
element.acceptChildrenVoid(this)
}
override fun visitFile(declaration: IrFile, data: Nothing?) {
fileAnnotationsHash = declaration.annotationsHash
declaration.acceptChildrenVoid(this)
}
override fun visitSimpleFunction(declaration: IrSimpleFunction) {
if (declaration.isInline) {
if (declaration in flatHashes) {
return
}
flatHashes[declaration] = if (declaration.isFakeOverride) {
val inlineFunctionFlatHash = if (declaration.isFakeOverride) {
declaration.resolveFakeOverride()?.irSimpleFunctionHashForIC()
?: icError("can not resolve fake override for ${declaration.render()}")
} else {
declaration.irSimpleFunctionHashForIC()
}
flatHashes[declaration] = fileAnnotationsHash.combineWith(inlineFunctionFlatHash)
}
// go deeper since local inline special declarations (like a reference adaptor) may appear
declaration.acceptChildrenVoid(this)
@@ -120,7 +132,8 @@ internal class IdSignatureHashCalculator {
fun addAllSignatureSymbols(idSignatureToFile: Map<IdSignature, IdSignatureSource>) {
for ((signature, signatureSrc) in idSignatureToFile) {
if (signature !in allIdSignatureHashes) {
allIdSignatureHashes[signature] = signatureSrc.symbol.irSymbolHashForIC()
val fileAnnotationsHash = signatureSrc.srcIrFile.annotationsHash
allIdSignatureHashes[signature] = fileAnnotationsHash.combineWith(signatureSrc.symbol.irSymbolHashForIC())
}
}
}
@@ -11,7 +11,14 @@ import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.ir.util.resolveFakeOverride
internal data class IdSignatureSource(val lib: KotlinLibraryFile, val src: KotlinSourceFile, val symbol: IrSymbol)
internal class IdSignatureSource(
val lib: KotlinLibraryFile,
val srcIrFile: IrFile,
val symbol: IrSymbol
) {
val src: KotlinSourceFile
get() = KotlinSourceFile(srcIrFile)
}
internal fun addParentSignatures(
signatures: Collection<IdSignature>,