[IR] Introduce & use declaration-based SymbolTable.withReferenceScope

This commit is contained in:
Mikhail Glukhikh
2020-06-05 09:41:23 +03:00
parent 7a0f986823
commit 1c2fbb61fe
2 changed files with 12 additions and 3 deletions
@@ -63,8 +63,10 @@ interface ReferenceSymbolTable {
fun referenceTypeAliasFromLinker(descriptor: TypeAliasDescriptor, sig: IdSignature): IrTypeAliasSymbol fun referenceTypeAliasFromLinker(descriptor: TypeAliasDescriptor, sig: IdSignature): IrTypeAliasSymbol
fun enterScope(owner: DeclarationDescriptor) fun enterScope(owner: DeclarationDescriptor)
fun enterScope(owner: IrDeclaration)
fun leaveScope(owner: DeclarationDescriptor) fun leaveScope(owner: DeclarationDescriptor)
fun leaveScope(owner: IrDeclaration)
} }
open class SymbolTable( open class SymbolTable(
@@ -955,7 +957,7 @@ open class SymbolTable(
scopedSymbolTables.forEach { it.enterScope(owner) } scopedSymbolTables.forEach { it.enterScope(owner) }
} }
fun enterScope(owner: IrDeclaration) { override fun enterScope(owner: IrDeclaration) {
enterScope(owner.descriptor) enterScope(owner.descriptor)
} }
@@ -963,7 +965,7 @@ open class SymbolTable(
scopedSymbolTables.forEach { it.leaveScope(owner) } scopedSymbolTables.forEach { it.leaveScope(owner) }
} }
fun leaveScope(owner: IrDeclaration) { override fun leaveScope(owner: IrDeclaration) {
leaveScope(owner.descriptor) leaveScope(owner.descriptor)
} }
@@ -1026,6 +1028,13 @@ inline fun <T, D : DeclarationDescriptor> ReferenceSymbolTable.withReferenceScop
return result return result
} }
inline fun <T, D : IrDeclaration> ReferenceSymbolTable.withReferenceScope(owner: D, block: ReferenceSymbolTable.(D) -> T): T {
enterScope(owner)
val result = block(owner)
leaveScope(owner)
return result
}
val SymbolTable.allUnbound: Set<IrSymbol> val SymbolTable.allUnbound: Set<IrSymbol>
get() { get() {
val r = mutableSetOf<IrSymbol>() val r = mutableSetOf<IrSymbol>()
@@ -136,7 +136,7 @@ interface IrBuilderExtension {
fun <T : IrDeclaration> T.buildWithScope(builder: (T) -> Unit): T = fun <T : IrDeclaration> T.buildWithScope(builder: (T) -> Unit): T =
also { irDeclaration -> also { irDeclaration ->
compilerContext.symbolTable.withReferenceScope(irDeclaration.descriptor) { compilerContext.symbolTable.withReferenceScope(irDeclaration) {
builder(irDeclaration) builder(irDeclaration)
} }
} }