[FIR2IR] Use IrSymbols directly instead of referencing via SymbolTable
This commit is contained in:
@@ -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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+19
-26
@@ -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)
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user