[FIR2IR] Use IrSymbols directly instead of referencing via SymbolTable

This commit is contained in:
Mikhail Glukhikh
2020-05-19 18:00:04 +03:00
parent 90e6d5bea7
commit 6b3c390fa7
3 changed files with 28 additions and 37 deletions
@@ -350,12 +350,11 @@ class Fir2IrClassifierStorage(
fun getIrClassSymbol(firClassSymbol: FirClassSymbol<*>): IrClassSymbol { fun getIrClassSymbol(firClassSymbol: FirClassSymbol<*>): IrClassSymbol {
val firClass = firClassSymbol.fir val firClass = firClassSymbol.fir
getCachedIrClass(firClass)?.let { return symbolTable.referenceClass(it.descriptor) } getCachedIrClass(firClass)?.let { return it.symbol }
// TODO: remove all this code and change to unbound symbol creation
if (firClass is FirAnonymousObject || firClass is FirRegularClass && firClass.visibility == Visibilities.LOCAL) { if (firClass is FirAnonymousObject || firClass is FirRegularClass && firClass.visibility == Visibilities.LOCAL) {
val irClass = createIrClass(firClass) return createIrClass(firClass).symbol
return symbolTable.referenceClass(irClass.descriptor)
} }
// TODO: remove all this code and change to unbound symbol creation
val classId = firClassSymbol.classId val classId = firClassSymbol.classId
val parentId = classId.outerClassId val parentId = classId.outerClassId
val irParent = declarationStorage.findIrParent(classId.packageFqName, parentId, firClassSymbol) val irParent = declarationStorage.findIrParent(classId.packageFqName, parentId, firClassSymbol)
@@ -365,15 +364,14 @@ class Fir2IrClassifierStorage(
declarationStorage.addDeclarationsToExternalClass(firClass as FirRegularClass, irClass) declarationStorage.addDeclarationsToExternalClass(firClass as FirRegularClass, irClass)
} }
return symbolTable.referenceClass(irClass.descriptor) return irClass.symbol
} }
fun getIrTypeParameterSymbol( fun getIrTypeParameterSymbol(
firTypeParameterSymbol: FirTypeParameterSymbol, firTypeParameterSymbol: FirTypeParameterSymbol,
typeContext: ConversionTypeContext typeContext: ConversionTypeContext
): IrTypeParameterSymbol { ): IrTypeParameterSymbol {
val irTypeParameter = getCachedIrTypeParameter(firTypeParameterSymbol.fir, typeContext = typeContext) return getCachedIrTypeParameter(firTypeParameterSymbol.fir, typeContext = typeContext)?.symbol
?: throw AssertionError("Cannot find cached type parameter by FIR symbol: ${firTypeParameterSymbol.name}") ?: throw AssertionError("Cannot find cached type parameter by FIR symbol: ${firTypeParameterSymbol.name}")
return symbolTable.referenceTypeParameter(irTypeParameter.descriptor)
} }
} }
@@ -857,26 +857,25 @@ class Fir2IrDeclarationStorage(
fun getIrConstructorSymbol(firConstructorSymbol: FirConstructorSymbol): IrConstructorSymbol { fun getIrConstructorSymbol(firConstructorSymbol: FirConstructorSymbol): IrConstructorSymbol {
val firConstructor = firConstructorSymbol.fir val firConstructor = firConstructorSymbol.fir
getCachedIrConstructor(firConstructor)?.let { return symbolTable.referenceConstructor(it.descriptor) } getCachedIrConstructor(firConstructor)?.let { return it.symbol }
val irParent = findIrParent(firConstructor) as IrClass val irParent = findIrParent(firConstructor) as IrClass
val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED
val irDeclaration = createIrConstructor(firConstructor, irParent, origin = parentOrigin).apply { val irDeclaration = createIrConstructor(firConstructor, irParent, origin = parentOrigin).apply {
setAndModifyParent(irParent) setAndModifyParent(irParent)
} }
return symbolTable.referenceConstructor(irDeclaration.descriptor) return irDeclaration.symbol
} }
fun getIrFunctionSymbol(firFunctionSymbol: FirFunctionSymbol<*>): IrFunctionSymbol { fun getIrFunctionSymbol(firFunctionSymbol: FirFunctionSymbol<*>): IrFunctionSymbol {
return when (val firDeclaration = firFunctionSymbol.fir) { return when (val firDeclaration = firFunctionSymbol.fir) {
is FirSimpleFunction, is FirAnonymousFunction -> { is FirSimpleFunction, is FirAnonymousFunction -> {
getCachedIrFunction(firDeclaration)?.let { return symbolTable.referenceSimpleFunction(it.descriptor) } getCachedIrFunction(firDeclaration)?.let { return it.symbol }
val irParent = findIrParent(firDeclaration) val irParent = findIrParent(firDeclaration)
val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED
val irDeclaration = createIrFunction(firDeclaration, irParent, origin = parentOrigin).apply { createIrFunction(firDeclaration, irParent, origin = parentOrigin).apply {
setAndModifyParent(irParent) setAndModifyParent(irParent)
} }.symbol
symbolTable.referenceSimpleFunction(irDeclaration.descriptor)
} }
is FirConstructor -> { is FirConstructor -> {
getIrConstructorSymbol(firDeclaration.symbol) getIrConstructorSymbol(firDeclaration.symbol)
@@ -888,20 +887,18 @@ class Fir2IrDeclarationStorage(
fun getIrPropertyOrFieldSymbol(firVariableSymbol: FirVariableSymbol<*>): IrSymbol { fun getIrPropertyOrFieldSymbol(firVariableSymbol: FirVariableSymbol<*>): IrSymbol {
return when (val fir = firVariableSymbol.fir) { return when (val fir = firVariableSymbol.fir) {
is FirProperty -> { is FirProperty -> {
propertyCache[fir]?.let { return symbolTable.referenceProperty(it.descriptor) } propertyCache[fir]?.let { return it.symbol }
val irParent = findIrParent(fir) val irParent = findIrParent(fir)
val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED
val irProperty = createIrProperty(fir, irParent, origin = parentOrigin).apply { createIrProperty(fir, irParent, origin = parentOrigin).apply {
setAndModifyParent(irParent) setAndModifyParent(irParent)
} }.symbol
symbolTable.referenceProperty(irProperty.descriptor)
} }
is FirField -> { is FirField -> {
fieldCache[fir]?.let { return symbolTable.referenceField(it.descriptor) } fieldCache[fir]?.let { return it.symbol }
val irField = createIrField(fir).apply { createIrField(fir).apply {
setAndModifyParent(findIrParent(fir)) setAndModifyParent(findIrParent(fir))
} }.symbol
symbolTable.referenceField(irField.descriptor)
} }
else -> throw IllegalArgumentException("Unexpected fir in property symbol: ${fir.render()}") else -> throw IllegalArgumentException("Unexpected fir in property symbol: ${fir.render()}")
} }
@@ -910,13 +907,12 @@ class Fir2IrDeclarationStorage(
fun getIrBackingFieldSymbol(firVariableSymbol: FirVariableSymbol<*>): IrSymbol { fun getIrBackingFieldSymbol(firVariableSymbol: FirVariableSymbol<*>): IrSymbol {
return when (val fir = firVariableSymbol.fir) { return when (val fir = firVariableSymbol.fir) {
is FirProperty -> { is FirProperty -> {
propertyCache[fir]?.let { return symbolTable.referenceField(it.backingField!!.descriptor) } propertyCache[fir]?.let { return it.backingField!!.symbol }
val irParent = findIrParent(fir) val irParent = findIrParent(fir)
val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED
val irProperty = createIrProperty(fir, irParent, origin = parentOrigin).apply { createIrProperty(fir, irParent, origin = parentOrigin).apply {
setAndModifyParent(irParent) setAndModifyParent(irParent)
} }.backingField!!.symbol
symbolTable.referenceField(irProperty.backingField!!.descriptor)
} }
else -> { else -> {
getIrVariableSymbol(fir) getIrVariableSymbol(fir)
@@ -925,31 +921,28 @@ class Fir2IrDeclarationStorage(
} }
private fun getIrVariableSymbol(firVariable: FirVariable<*>): IrVariableSymbol { private fun getIrVariableSymbol(firVariable: FirVariable<*>): IrVariableSymbol {
val irDeclaration = localStorage.getVariable(firVariable) return localStorage.getVariable(firVariable)?.symbol
?: throw IllegalArgumentException("Cannot find variable ${firVariable.render()} in local storage") ?: throw IllegalArgumentException("Cannot find variable ${firVariable.render()} in local storage")
return symbolTable.referenceVariable(irDeclaration.descriptor)
} }
fun getIrValueSymbol(firVariableSymbol: FirVariableSymbol<*>): IrSymbol { fun getIrValueSymbol(firVariableSymbol: FirVariableSymbol<*>): IrSymbol {
return when (val firDeclaration = firVariableSymbol.fir) { return when (val firDeclaration = firVariableSymbol.fir) {
is FirEnumEntry -> { is FirEnumEntry -> {
classifierStorage.getCachedIrEnumEntry(firDeclaration)?.let { return symbolTable.referenceEnumEntry(it.descriptor) } classifierStorage.getCachedIrEnumEntry(firDeclaration)?.let { return it.symbol }
val containingFile = firProvider.getFirCallableContainerFile(firVariableSymbol) val containingFile = firProvider.getFirCallableContainerFile(firVariableSymbol)
val parentClassSymbol = firVariableSymbol.callableId.classId?.let { firSymbolProvider.getClassLikeSymbolByFqName(it) } val parentClassSymbol = firVariableSymbol.callableId.classId?.let { firSymbolProvider.getClassLikeSymbolByFqName(it) }
val irParentClass = (parentClassSymbol?.fir as? FirClass<*>)?.let { classifierStorage.getCachedIrClass(it) } val irParentClass = (parentClassSymbol?.fir as? FirClass<*>)?.let { classifierStorage.getCachedIrClass(it) }
val irEnumEntry = classifierStorage.createIrEnumEntry( classifierStorage.createIrEnumEntry(
firDeclaration, firDeclaration,
irParent = irParentClass, irParent = irParentClass,
origin = if (containingFile != null) IrDeclarationOrigin.DEFINED else origin = if (containingFile != null) IrDeclarationOrigin.DEFINED else
(parentClassSymbol?.fir as? FirClass<*>)?.irOrigin(firProvider) ?: IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB (parentClassSymbol?.fir as? FirClass<*>)?.irOrigin(firProvider) ?: IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB
) ).symbol
symbolTable.referenceEnumEntry(irEnumEntry.descriptor)
} }
is FirValueParameter -> { is FirValueParameter -> {
val irDeclaration = localStorage.getParameter(firDeclaration) localStorage.getParameter(firDeclaration)?.symbol
// catch parameter is FirValueParameter in FIR but IrVariable in IR // catch parameter is FirValueParameter in FIR but IrVariable in IR
?: return getIrVariableSymbol(firDeclaration) ?: return getIrVariableSymbol(firDeclaration)
symbolTable.referenceValueParameter(irDeclaration.descriptor)
} }
else -> { else -> {
getIrVariableSymbol(firDeclaration) getIrVariableSymbol(firDeclaration)
@@ -233,12 +233,12 @@ class Fir2IrVisitor(
val irTarget = conversionScope.returnTarget(returnExpression) val irTarget = conversionScope.returnTarget(returnExpression)
return returnExpression.convertWithOffsets { startOffset, endOffset -> return returnExpression.convertWithOffsets { startOffset, endOffset ->
val result = returnExpression.result val result = returnExpression.result
val descriptor = irTarget.descriptor
IrReturnImpl( IrReturnImpl(
startOffset, endOffset, irBuiltIns.nothingType, startOffset, endOffset, irBuiltIns.nothingType,
when (descriptor) { when (irTarget) {
is ClassConstructorDescriptor -> symbolTable.referenceConstructor(descriptor) is IrConstructor -> irTarget.symbol
else -> symbolTable.referenceSimpleFunction(descriptor) is IrSimpleFunction -> irTarget.symbol
else -> throw AssertionError("Should not be here: $irTarget")
}, },
convertToIrExpression(result) convertToIrExpression(result)
) )