From 2259c6f75dc6e37c5e67faa654fae35a318ec26f Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Thu, 25 Nov 2021 09:35:00 +0300 Subject: [PATCH] [JS IR IC] assert cross-file tag are not null and fix tests --- .../lower/inline/SyntheticAccessorLowering.kt | 2 +- .../irToJs/IrModuleToJsTransformerTmp.kt | 26 +++++++++++++------ .../jetbrains/kotlin/ir/util/SymbolTable.kt | 4 +-- .../JsIrRecompiledArtifactsIdentityHandler.kt | 24 ++++++++--------- .../box/inline/localDeclarationsClash.kt | 1 - 5 files changed, 33 insertions(+), 24 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/SyntheticAccessorLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/SyntheticAccessorLowering.kt index be21f69205e..96a19f1ad6b 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/SyntheticAccessorLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/SyntheticAccessorLowering.kt @@ -208,7 +208,7 @@ class SyntheticAccessorLowering(private val context: CommonBackendContext) : Bod if (candidates.isEmpty()) return val fileHash = irFile.fileEntry.name.hashCode().toUInt().toString(Character.MAX_RADIX) - val accessors = candidates.map { it.createAccessor(fileHash) } + val accessors = candidates.map { context.irFactory.stageController.restrictTo(it) { it.createAccessor(fileHash) } } val candidatesMap = candidates.zip(accessors).toMap() irFile.transformChildrenVoid(CallSiteTransformer(candidatesMap)) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformerTmp.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformerTmp.kt index cd382e02a4e..1ee2c4a4da2 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformerTmp.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformerTmp.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.backend.js.utils.serialization.JsIrAstSerializer import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.types.classifierOrFail +import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.js.backend.JsToStringGenerationVisitor import org.jetbrains.kotlin.js.backend.NoOpSourceLocationConsumer import org.jetbrains.kotlin.js.backend.SourceLocationConsumer @@ -221,24 +222,33 @@ class IrModuleToJsTransformerTmp( result.importedModules += nameGenerator.importedModules - fun computeTag(declaration: IrDeclaration): String { - return (backendContext.irFactory as IdSignatureRetriever).declarationSignature(declaration)?.toString() - ?: System.identityHashCode(declaration).toString() -// TODO ?: error("signature for ${declaration.render()} not found") + val definitionSet = file.declarations.toSet() + + fun computeTag(declaration: IrDeclaration): String? { + val tag = (backendContext.irFactory as IdSignatureRetriever).declarationSignature(declaration)?.toString() + + if (tag == null && declaration !in definitionSet) { + error("signature for ${declaration.render()} not found") + } + + return tag } nameGenerator.nameMap.entries.forEach { (declaration, name) -> - val tag = computeTag(declaration) - result.nameBindings[tag] = name + computeTag(declaration)?.let { tag -> + result.nameBindings[tag] = name + } } nameGenerator.imports.entries.forEach { (declaration, importExpression) -> - val tag = computeTag(declaration) + val tag = computeTag(declaration) ?: error("No tag for imported declaration ${declaration.render()}") result.imports[tag] = importExpression } file.declarations.forEach { - result.definitions += computeTag(it) + computeTag(it)?.let { tag -> + result.definitions += tag + } } return result diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index 7a3bda71191..66c64061933 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -488,7 +488,7 @@ open class SymbolTable( override fun referenceClassFromLinker(sig: IdSignature): IrClassSymbol = classSymbolTable.run { if (sig.isPubliclyVisible) referenced(sig, false) { IrClassPublicSymbolImpl(sig) } - else IrClassSymbolImpl() + else IrClassSymbolImpl(signature = sig) } val unboundClasses: Set get() = classSymbolTable.unboundSymbols @@ -841,7 +841,7 @@ open class SymbolTable( override fun referenceSimpleFunctionFromLinker(sig: IdSignature): IrSimpleFunctionSymbol { return simpleFunctionSymbolTable.run { if (sig.isPubliclyVisible) referenced(sig, false) { IrSimpleFunctionPublicSymbolImpl(sig) } - else IrSimpleFunctionSymbolImpl() + else IrSimpleFunctionSymbolImpl(signature = sig) } } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/handlers/JsIrRecompiledArtifactsIdentityHandler.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/handlers/JsIrRecompiledArtifactsIdentityHandler.kt index 9ed828e841f..59226dbaca1 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/handlers/JsIrRecompiledArtifactsIdentityHandler.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/handlers/JsIrRecompiledArtifactsIdentityHandler.kt @@ -34,18 +34,18 @@ class JsIrRecompiledArtifactsIdentityHandler(testServices: TestServices) : JsBin @Suppress("UNUSED_PARAMETER") private fun compareIrArtifacts(originalArtifact: Js.JsIrArtifact, incrementalArtifact: Js.JsIrArtifact) { // TODO: enable asserts when binary stability is achieved -// val oldBinaryAsts = originalArtifact.icCache!! -// val newBinaryAsts = incrementalArtifact.icCache!! -// -// for (file in newBinaryAsts.keys) { -// val oldBinaryAst = oldBinaryAsts[file] -// val newBinaryAst = newBinaryAsts[file] -// -// testServices.assertions.assertTrue(oldBinaryAst.contentEquals(newBinaryAst)) { -// "Binary AST changed after recompilation for file $file" -// } -// } -// + val oldBinaryAsts = originalArtifact.icCache!! + val newBinaryAsts = incrementalArtifact.icCache!! + + for (file in newBinaryAsts.keys) { + val oldBinaryAst = oldBinaryAsts[file] + val newBinaryAst = newBinaryAsts[file] + + testServices.assertions.assertTrue(oldBinaryAst.contentEquals(newBinaryAst)) { + "Binary AST changed after recompilation for file $file" + } + } + val originalOutput = FileUtil.loadFile(originalArtifact.outputFile) val recompiledOutput = FileUtil.loadFile(incrementalArtifact.outputFile) testServices.assertions.assertEquals(originalOutput, recompiledOutput) { "Output file changed after recompilation" } diff --git a/js/js.translator/testData/box/inline/localDeclarationsClash.kt b/js/js.translator/testData/box/inline/localDeclarationsClash.kt index 6d5d3f08a18..23749b51d21 100644 --- a/js/js.translator/testData/box/inline/localDeclarationsClash.kt +++ b/js/js.translator/testData/box/inline/localDeclarationsClash.kt @@ -1,4 +1,3 @@ -// SKIP_IR_INCREMENTAL_CHECKS // EXPECTED_REACHABLE_NODES: 1281 // FILE: 1.kt