[JS IR] Take into account file annotations for calculating symbol hashes
^KT-55367 Fixed
This commit is contained in:
committed by
Space Team
parent
4136189114
commit
48daf0befe
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
+9
-5
@@ -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()
|
||||
|
||||
+15
-2
@@ -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())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+8
-1
@@ -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>,
|
||||
|
||||
Reference in New Issue
Block a user