[FIR2IR] Convert return expressions using symbols instead of IrFunction

This commit is contained in:
Dmitriy Novozhilov
2023-10-24 12:10:32 +03:00
committed by Space Team
parent a38d60b275
commit 429010d70e
2 changed files with 12 additions and 22 deletions
@@ -12,10 +12,7 @@ import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.expressions.FirReturnExpression import org.jetbrains.kotlin.fir.expressions.FirReturnExpression
import org.jetbrains.kotlin.ir.builders.Scope import org.jetbrains.kotlin.ir.builders.Scope
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.symbols.UnsafeDuringIrConstructionAPI
import org.jetbrains.kotlin.ir.util.isSetter import org.jetbrains.kotlin.ir.util.isSetter
import org.jetbrains.kotlin.ir.util.parentClassOrNull import org.jetbrains.kotlin.ir.util.parentClassOrNull
import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.ir.util.render
@@ -193,28 +190,29 @@ class Fir2IrConversionScope(val configuration: Fir2IrConfiguration) {
} }
} }
fun returnTarget(expression: FirReturnExpression, declarationStorage: Fir2IrDeclarationStorage): IrFunction { fun returnTarget(expression: FirReturnExpression, declarationStorage: Fir2IrDeclarationStorage): IrFunctionSymbol {
val irTarget = when (val firTarget = expression.target.labeledElement) { val irTarget = when (val firTarget = expression.target.labeledElement) {
is FirConstructor -> declarationStorage.getCachedIrConstructorSymbol(firTarget)?.ownerIfBound() is FirConstructor -> declarationStorage.getCachedIrConstructorSymbol(firTarget)
is FirPropertyAccessor -> { is FirPropertyAccessor -> {
var answer: IrFunction? = null var answer: IrFunctionSymbol? = null
for ((property, firProperty) in propertyStack.asReversed()) { for ((property, firProperty) in propertyStack.asReversed()) {
if (firProperty?.getter === firTarget) { if (firProperty?.getter === firTarget) {
answer = property.getter answer = property.getter?.symbol
} else if (firProperty?.setter === firTarget) { } else if (firProperty?.setter === firTarget) {
answer = property.setter answer = property.setter?.symbol
} }
} }
answer answer
} }
else -> declarationStorage.getCachedIrFunctionSymbol(firTarget)?.ownerIfBound() else -> declarationStorage.getCachedIrFunctionSymbol(firTarget)
} }
for (potentialTarget in functionStack.asReversed()) { for (potentialTarget in functionStack.asReversed()) {
if (potentialTarget == irTarget) { val targetSymbol = potentialTarget.symbol
return potentialTarget if (targetSymbol == irTarget) {
return targetSymbol
} }
} }
return functionStack.last() return functionStack.last().symbol
} }
fun parent(): IrDeclarationParent? = parentStack.lastOrNull() fun parent(): IrDeclarationParent? = parentStack.lastOrNull()
@@ -522,15 +522,7 @@ class Fir2IrVisitor(
return returnExpression.convertWithOffsets { startOffset, endOffset -> return returnExpression.convertWithOffsets { startOffset, endOffset ->
// For implicit returns, use the expression endOffset to generate the expected line number for debugging. // For implicit returns, use the expression endOffset to generate the expected line number for debugging.
val returnStartOffset = if (returnExpression.source?.kind is KtFakeSourceElementKind.ImplicitReturn) endOffset else startOffset val returnStartOffset = if (returnExpression.source?.kind is KtFakeSourceElementKind.ImplicitReturn) endOffset else startOffset
IrReturnImpl( IrReturnImpl(returnStartOffset, endOffset, irBuiltIns.nothingType, irTarget, convertToIrExpression(result))
returnStartOffset, endOffset, irBuiltIns.nothingType,
when (irTarget) {
is IrConstructor -> irTarget.symbol
is IrSimpleFunction -> irTarget.symbol
else -> error("Unknown return target: $irTarget")
},
convertToIrExpression(result)
)
}.let { }.let {
returnExpression.accept(implicitCastInserter, it) returnExpression.accept(implicitCastInserter, it)
} }