From aab5664c5b5788d34dd74c7bc500ac564c06a0f1 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 3 Nov 2023 15:28:49 +0200 Subject: [PATCH] [FIR2IR] Manage script symbols in declaration storage instead of declaration generator This is needed to be able to implement creation of unbound symbols for references of corresponding declarations (KT-62856) --- .../fir/backend/Fir2IrDeclarationStorage.kt | 10 +++++++++- .../Fir2IrCallableDeclarationsGenerator.kt | 17 +++++++---------- .../org/jetbrains/kotlin/ir/util/SymbolTable.kt | 4 ++++ 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index b5ea28e6b63..1b2033047fc 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -1129,11 +1129,19 @@ class Fir2IrDeclarationStorage( fun getOrCreateIrScript(script: FirScript): IrScript { getCachedIrScript(script)?.let { return it } - return callablesGenerator.createIrScript(script).also { + val symbol = createScriptSymbol(signatureComposer.composeSignature(script)) + return callablesGenerator.createIrScript(script, symbol).also { scriptCache[script] = it } } + private fun createScriptSymbol(signature: IdSignature?): IrScriptSymbol { + return when { + signature != null -> symbolTable.referenceScript(signature) + else -> IrScriptSymbolImpl() + } + } + // ------------------------------------ scoping ------------------------------------ fun enterScope(symbol: IrSymbol) { diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrCallableDeclarationsGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrCallableDeclarationsGenerator.kt index f8d06f4ea81..9f0c2019775 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrCallableDeclarationsGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrCallableDeclarationsGenerator.kt @@ -928,16 +928,13 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi // ------------------------------------ scripts ------------------------------------ - fun createIrScript(script: FirScript): IrScript = script.convertWithOffsets { startOffset, endOffset -> - val signature = signatureComposer.composeSignature(script)!! - symbolTable.declareScript(signature, { IrScriptPublicSymbolImpl(signature) }) { symbol -> - IrScriptImpl(symbol, script.name, irFactory, startOffset, endOffset).also { irScript -> - irScript.origin = SCRIPT_K2_ORIGIN - irScript.metadata = FirMetadataSource.Script(script) - irScript.implicitReceiversParameters = emptyList() - irScript.providedProperties = emptyList() - irScript.providedPropertiesParameters = emptyList() - } + fun createIrScript(script: FirScript, symbol: IrScriptSymbol): IrScript = script.convertWithOffsets { startOffset, endOffset -> + IrScriptImpl(symbol, script.name, irFactory, startOffset, endOffset).also { irScript -> + irScript.origin = SCRIPT_K2_ORIGIN + irScript.metadata = FirMetadataSource.Script(script) + irScript.implicitReceiversParameters = emptyList() + irScript.providedProperties = emptyList() + irScript.providedPropertiesParameters = emptyList() } } 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 1d19eb13bac..16fd8836716 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 @@ -59,6 +59,10 @@ open class SymbolTable( ) } + fun referenceScript(signature: IdSignature): IrScriptSymbol { + return scriptSlice.referenced(signature) { IrScriptPublicSymbolImpl(signature) } + } + // ------------------------------------ class ------------------------------------ fun declareClass(