Introduce SymbolTable lifecycle
To be enforced later
This commit is contained in:
committed by
SvyatoslavScherbina
parent
fefcb8082f
commit
1ec5a188f7
+11
-1
@@ -221,10 +221,14 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) {
|
|||||||
|
|
||||||
val specialDeclarationsFactory = SpecialDeclarationsFactory(this)
|
val specialDeclarationsFactory = SpecialDeclarationsFactory(this)
|
||||||
|
|
||||||
class LazyMember<T>(val initializer: Context.() -> T) {
|
open class LazyMember<T>(val initializer: Context.() -> T) {
|
||||||
operator fun getValue(thisRef: Context, property: KProperty<*>): T = thisRef.getValue(this)
|
operator fun getValue(thisRef: Context, property: KProperty<*>): T = thisRef.getValue(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class LazyVarMember<T>(initializer: Context.() -> T) : LazyMember<T>(initializer) {
|
||||||
|
operator fun setValue(thisRef: Context, property: KProperty<*>, newValue: T) = thisRef.setValue(this, newValue)
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun <T> lazyMember(initializer: Context.() -> T) = LazyMember<T>(initializer)
|
fun <T> lazyMember(initializer: Context.() -> T) = LazyMember<T>(initializer)
|
||||||
|
|
||||||
@@ -235,6 +239,8 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) {
|
|||||||
}
|
}
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun <T> nullValue() = LazyVarMember<T?>({ null })
|
||||||
}
|
}
|
||||||
|
|
||||||
private val lazyValues = mutableMapOf<LazyMember<*>, Any?>()
|
private val lazyValues = mutableMapOf<LazyMember<*>, Any?>()
|
||||||
@@ -242,6 +248,10 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) {
|
|||||||
fun <T> getValue(member: LazyMember<T>): T =
|
fun <T> getValue(member: LazyMember<T>): T =
|
||||||
@Suppress("UNCHECKED_CAST") (lazyValues.getOrPut(member, { member.initializer(this) }) as T)
|
@Suppress("UNCHECKED_CAST") (lazyValues.getOrPut(member, { member.initializer(this) }) as T)
|
||||||
|
|
||||||
|
fun <T> setValue(member: LazyVarMember<T>, newValue: T) {
|
||||||
|
lazyValues[member] = newValue
|
||||||
|
}
|
||||||
|
|
||||||
val reflectionTypes: KonanReflectionTypes by lazy(PUBLICATION) {
|
val reflectionTypes: KonanReflectionTypes by lazy(PUBLICATION) {
|
||||||
KonanReflectionTypes(moduleDescriptor, KonanFqNames.internalPackageName)
|
KonanReflectionTypes(moduleDescriptor, KonanFqNames.internalPackageName)
|
||||||
}
|
}
|
||||||
|
|||||||
+33
-4
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.config.languageVersionSettings
|
|||||||
import org.jetbrains.kotlin.backend.common.serialization.DescriptorTable
|
import org.jetbrains.kotlin.backend.common.serialization.DescriptorTable
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||||
|
import org.jetbrains.kotlin.ir.util.SymbolTable
|
||||||
import org.jetbrains.kotlin.ir.util.patchDeclarationParents
|
import org.jetbrains.kotlin.ir.util.patchDeclarationParents
|
||||||
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
|
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
|
||||||
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
|
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
|
||||||
@@ -50,6 +51,19 @@ internal val frontendPhase = konanUnitPhase(
|
|||||||
description = "Frontend builds AST"
|
description = "Frontend builds AST"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Valid from [createSymbolTablePhase] until [destroySymbolTablePhase].
|
||||||
|
*/
|
||||||
|
private var Context.symbolTable: SymbolTable? by Context.nullValue()
|
||||||
|
|
||||||
|
internal val createSymbolTablePhase = konanUnitPhase(
|
||||||
|
op = {
|
||||||
|
this.symbolTable = SymbolTable()
|
||||||
|
},
|
||||||
|
name = "CreateSymbolTable",
|
||||||
|
description = "Create SymbolTable"
|
||||||
|
)
|
||||||
|
|
||||||
internal val objCExportPhase = konanUnitPhase(
|
internal val objCExportPhase = konanUnitPhase(
|
||||||
op = {
|
op = {
|
||||||
objCExport = ObjCExport(this)
|
objCExport = ObjCExport(this)
|
||||||
@@ -61,9 +75,12 @@ internal val objCExportPhase = konanUnitPhase(
|
|||||||
internal val psiToIrPhase = konanUnitPhase(
|
internal val psiToIrPhase = konanUnitPhase(
|
||||||
op = {
|
op = {
|
||||||
// Translate AST to high level IR.
|
// Translate AST to high level IR.
|
||||||
|
|
||||||
|
val symbolTable = symbolTable!!
|
||||||
|
|
||||||
val translator = Psi2IrTranslator(config.configuration.languageVersionSettings,
|
val translator = Psi2IrTranslator(config.configuration.languageVersionSettings,
|
||||||
Psi2IrConfiguration(false))
|
Psi2IrConfiguration(false))
|
||||||
val generatorContext = translator.createGeneratorContext(moduleDescriptor, bindingContext)
|
val generatorContext = translator.createGeneratorContext(moduleDescriptor, bindingContext, symbolTable)
|
||||||
@Suppress("DEPRECATION")
|
@Suppress("DEPRECATION")
|
||||||
psi2IrGeneratorContext = generatorContext
|
psi2IrGeneratorContext = generatorContext
|
||||||
|
|
||||||
@@ -73,7 +90,7 @@ internal val psiToIrPhase = konanUnitPhase(
|
|||||||
moduleDescriptor,
|
moduleDescriptor,
|
||||||
this as LoggingContext,
|
this as LoggingContext,
|
||||||
generatorContext.irBuiltIns,
|
generatorContext.irBuiltIns,
|
||||||
generatorContext.symbolTable,
|
symbolTable,
|
||||||
forwardDeclarationsModuleDescriptor,
|
forwardDeclarationsModuleDescriptor,
|
||||||
getExportedDependencies()
|
getExportedDependencies()
|
||||||
)
|
)
|
||||||
@@ -91,7 +108,7 @@ internal val psiToIrPhase = konanUnitPhase(
|
|||||||
dependenciesCount = dependencies.size
|
dependenciesCount = dependencies.size
|
||||||
}
|
}
|
||||||
|
|
||||||
val symbols = KonanSymbols(this, generatorContext.symbolTable, generatorContext.symbolTable.lazyWrapper)
|
val symbols = KonanSymbols(this, symbolTable, symbolTable.lazyWrapper)
|
||||||
val module = translator.generateModuleFragment(generatorContext, environment.getSourceFiles(), deserializer)
|
val module = translator.generateModuleFragment(generatorContext, environment.getSourceFiles(), deserializer)
|
||||||
|
|
||||||
irModule = module
|
irModule = module
|
||||||
@@ -101,7 +118,17 @@ internal val psiToIrPhase = konanUnitPhase(
|
|||||||
// validateIrModule(this, module)
|
// validateIrModule(this, module)
|
||||||
},
|
},
|
||||||
name = "Psi2Ir",
|
name = "Psi2Ir",
|
||||||
description = "Psi to IR conversion"
|
description = "Psi to IR conversion",
|
||||||
|
prerequisite = setOf(createSymbolTablePhase)
|
||||||
|
)
|
||||||
|
|
||||||
|
internal val destroySymbolTablePhase = konanUnitPhase(
|
||||||
|
op = {
|
||||||
|
this.symbolTable = null // TODO: invalidate symbolTable itself.
|
||||||
|
},
|
||||||
|
name = "DestroySymbolTable",
|
||||||
|
description = "Destroy SymbolTable",
|
||||||
|
prerequisite = setOf(createSymbolTablePhase)
|
||||||
)
|
)
|
||||||
|
|
||||||
internal val irGeneratorPluginsPhase = konanUnitPhase(
|
internal val irGeneratorPluginsPhase = konanUnitPhase(
|
||||||
@@ -274,8 +301,10 @@ val toplevelPhase: CompilerPhase<*, Unit, Unit> = namedUnitPhase(
|
|||||||
name = "Compiler",
|
name = "Compiler",
|
||||||
description = "The whole compilation process",
|
description = "The whole compilation process",
|
||||||
lower = frontendPhase then
|
lower = frontendPhase then
|
||||||
|
createSymbolTablePhase then
|
||||||
objCExportPhase then
|
objCExportPhase then
|
||||||
psiToIrPhase then
|
psiToIrPhase then
|
||||||
|
destroySymbolTablePhase then
|
||||||
irGeneratorPluginsPhase then
|
irGeneratorPluginsPhase then
|
||||||
copyDefaultValuesToActualPhase then
|
copyDefaultValuesToActualPhase then
|
||||||
patchDeclarationParents0Phase then
|
patchDeclarationParents0Phase then
|
||||||
|
|||||||
Reference in New Issue
Block a user