backend: handle initializers in interop lowering
Also add lowering utils.
This commit is contained in:
committed by
SvyatoslavScherbina
parent
9a7d036b33
commit
9afd9360b3
+39
-2
@@ -4,13 +4,14 @@ import org.jetbrains.kotlin.backend.common.BackendContext
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||
import org.jetbrains.kotlin.ir.builders.*
|
||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||
import org.jetbrains.kotlin.ir.declarations.IrConstructor
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.expressions.IrDelegatingConstructorCall
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -54,6 +55,42 @@ inline fun IrGeneratorWithScope.irBlock(expression: IrExpression, origin: IrStat
|
||||
inline fun IrGeneratorWithScope.irBlockBody(irElement: IrElement, body: IrBlockBodyBuilder.() -> Unit) =
|
||||
this.irBlockBody(irElement.startOffset, irElement.endOffset, body)
|
||||
|
||||
open class IrBuildingTransformer(private val context: BackendContext) : IrElementTransformerVoid() {
|
||||
private var currentBuilder: IrBuilderWithScope? = null
|
||||
|
||||
protected val builder: IrBuilderWithScope
|
||||
get() = currentBuilder!!
|
||||
|
||||
private inline fun <T> withBuilder(declarationDescriptor: DeclarationDescriptor, block: () -> T): T {
|
||||
val oldBuilder = currentBuilder
|
||||
currentBuilder = context.createIrBuilder(declarationDescriptor)
|
||||
return try {
|
||||
block()
|
||||
} finally {
|
||||
currentBuilder = oldBuilder
|
||||
}
|
||||
}
|
||||
|
||||
override fun visitFunction(declaration: IrFunction): IrStatement {
|
||||
withBuilder(declaration.descriptor) {
|
||||
return super.visitFunction(declaration)
|
||||
}
|
||||
}
|
||||
|
||||
override fun visitField(declaration: IrField): IrStatement {
|
||||
withBuilder(declaration.descriptor) {
|
||||
// Transforms initializer:
|
||||
return super.visitField(declaration)
|
||||
}
|
||||
}
|
||||
|
||||
override fun visitAnonymousInitializer(declaration: IrAnonymousInitializer): IrStatement {
|
||||
withBuilder(declaration.descriptor) {
|
||||
return super.visitAnonymousInitializer(declaration)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun computeOverrides(current: ClassDescriptor, functionsFromCurrent: List<CallableMemberDescriptor>): List<DeclarationDescriptor> {
|
||||
|
||||
val result = mutableListOf<DeclarationDescriptor>()
|
||||
|
||||
+1
-1
@@ -62,7 +62,7 @@ internal class KonanLower(val context: Context) {
|
||||
Autoboxing(context).lower(irFile)
|
||||
}
|
||||
phaser.phase(KonanPhase.LOWER_INTEROP) {
|
||||
InteropLowering(context).runOnFilePostfix(irFile)
|
||||
InteropLowering(context).lower(irFile)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+9
-13
@@ -1,8 +1,8 @@
|
||||
package org.jetbrains.kotlin.backend.konan.lower
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.FunctionLoweringPass
|
||||
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
||||
import org.jetbrains.kotlin.backend.common.lower.IrBuildingTransformer
|
||||
import org.jetbrains.kotlin.backend.common.lower.at
|
||||
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
|
||||
import org.jetbrains.kotlin.backend.konan.Context
|
||||
import org.jetbrains.kotlin.backend.konan.ValueType
|
||||
import org.jetbrains.kotlin.backend.konan.isRepresentedAs
|
||||
@@ -12,12 +12,9 @@ import org.jetbrains.kotlin.ir.builders.IrBuilder
|
||||
import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope
|
||||
import org.jetbrains.kotlin.ir.builders.irCall
|
||||
import org.jetbrains.kotlin.ir.builders.irGet
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.IrTypeOperatorCall
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrGetObjectValueImpl
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.OverridingUtil
|
||||
@@ -29,16 +26,15 @@ import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
||||
/**
|
||||
* Lowers some interop intrinsic calls.
|
||||
*/
|
||||
internal class InteropLowering(val context: Context) : FunctionLoweringPass {
|
||||
override fun lower(irFunction: IrFunction) {
|
||||
val transformer = InteropTransformer(context, irFunction.descriptor)
|
||||
irFunction.transformChildrenVoid(transformer)
|
||||
internal class InteropLowering(val context: Context) : FileLoweringPass {
|
||||
override fun lower(irFile: IrFile) {
|
||||
val transformer = InteropTransformer(context)
|
||||
irFile.transformChildrenVoid(transformer)
|
||||
}
|
||||
}
|
||||
|
||||
private class InteropTransformer(val context: Context, val function: FunctionDescriptor) : IrElementTransformerVoid() {
|
||||
private class InteropTransformer(val context: Context) : IrBuildingTransformer(context) {
|
||||
|
||||
val builder = context.createIrBuilder(function)
|
||||
val interop = context.interopBuiltIns
|
||||
|
||||
private fun MemberScope.getSingleContributedFunction(name: String,
|
||||
|
||||
Reference in New Issue
Block a user