IR: allow SymbolTable descendants
This commit is contained in:
committed by
teamcityserver
parent
e0570d98b2
commit
ba541bd53b
@@ -60,7 +60,7 @@ interface ReferenceSymbolTable {
|
|||||||
fun leaveScope(owner: IrDeclaration)
|
fun leaveScope(owner: IrDeclaration)
|
||||||
}
|
}
|
||||||
|
|
||||||
class SymbolTable(
|
open class SymbolTable(
|
||||||
val signaturer: IdSignatureComposer,
|
val signaturer: IdSignatureComposer,
|
||||||
val irFactory: IrFactory,
|
val irFactory: IrFactory,
|
||||||
val nameProvider: NameProvider = NameProvider.DEFAULT
|
val nameProvider: NameProvider = NameProvider.DEFAULT
|
||||||
@@ -71,7 +71,7 @@ class SymbolTable(
|
|||||||
@Suppress("LeakingThis")
|
@Suppress("LeakingThis")
|
||||||
val lazyWrapper = IrLazySymbolTable(this)
|
val lazyWrapper = IrLazySymbolTable(this)
|
||||||
|
|
||||||
private abstract class SymbolTableBase<D : DeclarationDescriptor, B : IrSymbolOwner, S : IrBindableSymbol<D, B>>(val lock: IrLock) {
|
protected abstract class SymbolTableBase<D : DeclarationDescriptor, B : IrSymbolOwner, S : IrBindableSymbol<D, B>>(val lock: IrLock) {
|
||||||
val unboundSymbols = linkedSetOf<S>()
|
val unboundSymbols = linkedSetOf<S>()
|
||||||
|
|
||||||
abstract fun get(d: D): S?
|
abstract fun get(d: D): S?
|
||||||
@@ -212,7 +212,7 @@ class SymbolTable(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private open inner class FlatSymbolTable<D : DeclarationDescriptor, B : IrSymbolOwner, S : IrBindableSymbol<D, B>> :
|
protected open inner class FlatSymbolTable<D : DeclarationDescriptor, B : IrSymbolOwner, S : IrBindableSymbol<D, B>> :
|
||||||
SymbolTableBase<D, B, S>(lock) {
|
SymbolTableBase<D, B, S>(lock) {
|
||||||
val descriptorToSymbol = linkedMapOf<D, S>()
|
val descriptorToSymbol = linkedMapOf<D, S>()
|
||||||
val idSigToSymbol = linkedMapOf<IdSignature, S>()
|
val idSigToSymbol = linkedMapOf<IdSignature, S>()
|
||||||
@@ -249,11 +249,11 @@ class SymbolTable(
|
|||||||
override fun signature(descriptor: ClassDescriptor): IdSignature? = signaturer.composeEnumEntrySignature(descriptor)
|
override fun signature(descriptor: ClassDescriptor): IdSignature? = signaturer.composeEnumEntrySignature(descriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
private inner class FieldSymbolTable : FlatSymbolTable<PropertyDescriptor, IrField, IrFieldSymbol>() {
|
protected inner class FieldSymbolTable : FlatSymbolTable<PropertyDescriptor, IrField, IrFieldSymbol>() {
|
||||||
override fun signature(descriptor: PropertyDescriptor): IdSignature? = signaturer.composeFieldSignature(descriptor)
|
override fun signature(descriptor: PropertyDescriptor): IdSignature? = signaturer.composeFieldSignature(descriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
private inner class ScopedSymbolTable<D : DeclarationDescriptor, B : IrSymbolOwner, S : IrBindableSymbol<D, B>>
|
protected inner class ScopedSymbolTable<D : DeclarationDescriptor, B : IrSymbolOwner, S : IrBindableSymbol<D, B>>
|
||||||
: SymbolTableBase<D, B, S>(lock) {
|
: SymbolTableBase<D, B, S>(lock) {
|
||||||
inner class Scope(val owner: IrSymbol, val parent: Scope?) {
|
inner class Scope(val owner: IrSymbol, val parent: Scope?) {
|
||||||
private val descriptorToSymbol = linkedMapOf<D, S>()
|
private val descriptorToSymbol = linkedMapOf<D, S>()
|
||||||
@@ -308,7 +308,7 @@ class SymbolTable(
|
|||||||
fun dump(): String = dumpTo(StringBuilder()).toString()
|
fun dump(): String = dumpTo(StringBuilder()).toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
private var currentScope: Scope? = null
|
protected var currentScope: Scope? = null
|
||||||
|
|
||||||
override fun get(d: D): S? {
|
override fun get(d: D): S? {
|
||||||
val scope = currentScope ?: return null
|
val scope = currentScope ?: return null
|
||||||
@@ -372,13 +372,13 @@ class SymbolTable(
|
|||||||
private val classSymbolTable = FlatSymbolTable<ClassDescriptor, IrClass, IrClassSymbol>()
|
private val classSymbolTable = FlatSymbolTable<ClassDescriptor, IrClass, IrClassSymbol>()
|
||||||
private val constructorSymbolTable = FlatSymbolTable<ClassConstructorDescriptor, IrConstructor, IrConstructorSymbol>()
|
private val constructorSymbolTable = FlatSymbolTable<ClassConstructorDescriptor, IrConstructor, IrConstructorSymbol>()
|
||||||
private val enumEntrySymbolTable = EnumEntrySymbolTable()
|
private val enumEntrySymbolTable = EnumEntrySymbolTable()
|
||||||
private val fieldSymbolTable = FieldSymbolTable()
|
protected val fieldSymbolTable = FieldSymbolTable()
|
||||||
private val simpleFunctionSymbolTable = FlatSymbolTable<FunctionDescriptor, IrSimpleFunction, IrSimpleFunctionSymbol>()
|
private val simpleFunctionSymbolTable = FlatSymbolTable<FunctionDescriptor, IrSimpleFunction, IrSimpleFunctionSymbol>()
|
||||||
private val propertySymbolTable = FlatSymbolTable<PropertyDescriptor, IrProperty, IrPropertySymbol>()
|
private val propertySymbolTable = FlatSymbolTable<PropertyDescriptor, IrProperty, IrPropertySymbol>()
|
||||||
private val typeAliasSymbolTable = FlatSymbolTable<TypeAliasDescriptor, IrTypeAlias, IrTypeAliasSymbol>()
|
private val typeAliasSymbolTable = FlatSymbolTable<TypeAliasDescriptor, IrTypeAlias, IrTypeAliasSymbol>()
|
||||||
|
|
||||||
private val globalTypeParameterSymbolTable = FlatSymbolTable<TypeParameterDescriptor, IrTypeParameter, IrTypeParameterSymbol>()
|
protected val globalTypeParameterSymbolTable = FlatSymbolTable<TypeParameterDescriptor, IrTypeParameter, IrTypeParameterSymbol>()
|
||||||
private val scopedTypeParameterSymbolTable by threadLocal {
|
protected val scopedTypeParameterSymbolTable by threadLocal {
|
||||||
ScopedSymbolTable<TypeParameterDescriptor, IrTypeParameter, IrTypeParameterSymbol>()
|
ScopedSymbolTable<TypeParameterDescriptor, IrTypeParameter, IrTypeParameterSymbol>()
|
||||||
}
|
}
|
||||||
private val valueParameterSymbolTable by threadLocal {
|
private val valueParameterSymbolTable by threadLocal {
|
||||||
@@ -703,7 +703,7 @@ class SymbolTable(
|
|||||||
override fun referenceField(descriptor: PropertyDescriptor) =
|
override fun referenceField(descriptor: PropertyDescriptor) =
|
||||||
fieldSymbolTable.referenced(descriptor) { createFieldSymbol(descriptor) }
|
fieldSymbolTable.referenced(descriptor) { createFieldSymbol(descriptor) }
|
||||||
|
|
||||||
override fun referenceFieldFromLinker(sig: IdSignature) =
|
override fun referenceFieldFromLinker(sig: IdSignature): IrFieldSymbol =
|
||||||
fieldSymbolTable.run {
|
fieldSymbolTable.run {
|
||||||
if (sig.isPubliclyVisible) IrFieldPublicSymbolImpl(sig) else IrFieldSymbolImpl()
|
if (sig.isPubliclyVisible) IrFieldPublicSymbolImpl(sig) else IrFieldSymbolImpl()
|
||||||
}
|
}
|
||||||
@@ -928,7 +928,7 @@ class SymbolTable(
|
|||||||
typeParameterFactory
|
typeParameterFactory
|
||||||
)
|
)
|
||||||
|
|
||||||
fun declareGlobalTypeParameter(
|
open fun declareGlobalTypeParameter(
|
||||||
sig: IdSignature,
|
sig: IdSignature,
|
||||||
symbolFactory: () -> IrTypeParameterSymbol,
|
symbolFactory: () -> IrTypeParameterSymbol,
|
||||||
typeParameterFactory: (IrTypeParameterSymbol) -> IrTypeParameter
|
typeParameterFactory: (IrTypeParameterSymbol) -> IrTypeParameter
|
||||||
@@ -963,6 +963,7 @@ class SymbolTable(
|
|||||||
typeParameterFactory
|
typeParameterFactory
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@Suppress("UNUSED_PARAMETER")
|
||||||
fun declareScopedTypeParameter(
|
fun declareScopedTypeParameter(
|
||||||
sig: IdSignature,
|
sig: IdSignature,
|
||||||
symbolFactory: (IdSignature) -> IrTypeParameterSymbol,
|
symbolFactory: (IdSignature) -> IrTypeParameterSymbol,
|
||||||
|
|||||||
Reference in New Issue
Block a user