backend: handle initializers in interop lowering

Also add lowering utils.
This commit is contained in:
Svyatoslav Scherbina
2017-02-20 16:56:25 +07:00
committed by SvyatoslavScherbina
parent 9a7d036b33
commit 9afd9360b3
3 changed files with 49 additions and 16 deletions
@@ -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>()
@@ -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)
}
}
}
@@ -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,