[IR] Supported IrExpressionBody
This commit is contained in:
+1
-1
@@ -732,7 +732,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
}
|
||||
when (body) {
|
||||
is IrBlockBody -> body.statements.forEach { generateStatement(it) }
|
||||
is IrExpressionBody -> generateStatement(body.expression)
|
||||
is IrExpressionBody -> error("IrExpressionBody should've been lowered")
|
||||
is IrSyntheticBody -> throw AssertionError("Synthetic body ${body.kind} has not been lowered")
|
||||
else -> TODO(ir2string(body))
|
||||
}
|
||||
|
||||
+3
-4
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.ir.descriptors.WrappedValueParameterDescriptor
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
|
||||
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
|
||||
@@ -149,8 +148,8 @@ internal class BridgesBuilding(val context: Context) : ClassLoweringPass {
|
||||
override fun visitFunction(declaration: IrFunction): IrStatement {
|
||||
declaration.transformChildrenVoid(this)
|
||||
|
||||
val body = declaration.body as? IrBlockBody
|
||||
?: return declaration
|
||||
val body = declaration.body ?: return declaration
|
||||
|
||||
val descriptor = declaration.descriptor
|
||||
val typeSafeBarrierDescription = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(descriptor)
|
||||
if (typeSafeBarrierDescription == null || builtBridges.contains(declaration))
|
||||
@@ -159,7 +158,7 @@ internal class BridgesBuilding(val context: Context) : ClassLoweringPass {
|
||||
val irBuilder = context.createIrBuilder(declaration.symbol, declaration.startOffset, declaration.endOffset)
|
||||
declaration.body = irBuilder.irBlockBody(declaration) {
|
||||
buildTypeSafeBarrier(declaration, declaration, typeSafeBarrierDescription)
|
||||
body.statements.forEach { +it }
|
||||
(body as IrBlockBody).statements.forEach { +it }
|
||||
}
|
||||
return declaration
|
||||
}
|
||||
|
||||
+12
-5
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.declarations.IrConstructor
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||
@@ -31,11 +32,17 @@ internal class ReturnsInsertionLowering(val context: Context) : FileLoweringPass
|
||||
override fun visitFunction(declaration: IrFunction) {
|
||||
declaration.acceptChildrenVoid(this)
|
||||
|
||||
val body = declaration.body ?: return
|
||||
if (declaration is IrConstructor || declaration.returnType == context.irBuiltIns.unitType) {
|
||||
val irBuilder = context.createIrBuilder(declaration.symbol, declaration.endOffset, declaration.endOffset)
|
||||
irBuilder.run {
|
||||
(body as IrBlockBody).statements += irReturn(irGetObject(symbols.unit))
|
||||
context.createIrBuilder(declaration.symbol, declaration.endOffset, declaration.endOffset).run {
|
||||
when (val body = declaration.body) {
|
||||
is IrExpressionBody -> {
|
||||
declaration.body = IrBlockBodyImpl(body.startOffset, body.endOffset) {
|
||||
statements += irReturn(body.expression)
|
||||
}
|
||||
}
|
||||
is IrBlockBody -> {
|
||||
if (declaration is IrConstructor || declaration.returnType == context.irBuiltIns.unitType)
|
||||
body.statements += irReturn(irGetObject(symbols.unit))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user