IR: create IrBlockBody via IrFactory

This commit is contained in:
Alexander Udalov
2020-07-14 19:57:17 +02:00
parent 9ad4a754ce
commit 0d605a6b7f
39 changed files with 137 additions and 82 deletions
@@ -582,7 +582,7 @@ class Fir2IrVisitor(
internal fun convertToIrBlockBody(block: FirBlock): IrBlockBody { internal fun convertToIrBlockBody(block: FirBlock): IrBlockBody {
return block.convertWithOffsets { startOffset, endOffset -> return block.convertWithOffsets { startOffset, endOffset ->
val irStatements = block.mapToIrStatements() val irStatements = block.mapToIrStatements()
IrBlockBodyImpl( irFactory.createBlockBody(
startOffset, endOffset, startOffset, endOffset,
if (irStatements.isNotEmpty()) { if (irStatements.isNotEmpty()) {
irStatements.filterNotNull().takeIf { it.isNotEmpty() } irStatements.filterNotNull().takeIf { it.isNotEmpty() }
@@ -127,7 +127,7 @@ internal class ClassMemberGenerator(
annotationGenerator.generate(irFunction, firFunction) annotationGenerator.generate(irFunction, firFunction)
} }
if (firFunction is FirConstructor && irFunction is IrConstructor && !parentAsClass.isAnnotationClass && !firFunction.isExpect) { if (firFunction is FirConstructor && irFunction is IrConstructor && !parentAsClass.isAnnotationClass && !firFunction.isExpect) {
val body = IrBlockBodyImpl(startOffset, endOffset) val body = factory.createBlockBody(startOffset, endOffset)
val delegatedConstructor = firFunction.delegatedConstructor val delegatedConstructor = firFunction.delegatedConstructor
if (delegatedConstructor != null) { if (delegatedConstructor != null) {
val irDelegatingConstructorCall = delegatedConstructor.toIrDelegatingConstructorCall() val irDelegatingConstructorCall = delegatedConstructor.toIrDelegatingConstructorCall()
@@ -250,7 +250,7 @@ internal class ClassMemberGenerator(
val fieldSymbol = backingField?.symbol val fieldSymbol = backingField?.symbol
val declaration = this val declaration = this
if (fieldSymbol != null) { if (fieldSymbol != null) {
body = IrBlockBodyImpl( body = factory.createBlockBody(
startOffset, endOffset, startOffset, endOffset,
listOf( listOf(
if (isSetter) { if (isSetter) {
@@ -27,7 +27,10 @@ import org.jetbrains.kotlin.ir.descriptors.WrappedPropertyDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedTypeParameterDescriptor import org.jetbrains.kotlin.ir.descriptors.WrappedTypeParameterDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedValueParameterDescriptor import org.jetbrains.kotlin.ir.descriptors.WrappedValueParameterDescriptor
import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
@@ -212,7 +215,7 @@ internal class DelegatedMemberGenerator(
} }
} }
val body = IrBlockBodyImpl(startOffset, endOffset) val body = irFactory.createBlockBody(startOffset, endOffset)
val irCall = IrCallImpl( val irCall = IrCallImpl(
startOffset, startOffset,
endOffset, endOffset,
@@ -22,7 +22,6 @@ import org.jetbrains.kotlin.ir.builders.declarations.buildTypeParameter
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.descriptors.* import org.jetbrains.kotlin.ir.descriptors.*
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl
@@ -66,7 +65,7 @@ fun IrClass.addSimpleDelegatingConstructor(
parameter.copyTo(constructor, index = index) parameter.copyTo(constructor, index = index)
} }
constructor.body = IrBlockBodyImpl( constructor.body = factory.createBlockBody(
startOffset, endOffset, startOffset, endOffset,
listOf( listOf(
IrDelegatingConstructorCallImpl( IrDelegatingConstructorCallImpl(
@@ -70,7 +70,7 @@ open class DefaultArgumentStubGenerator(
log { "$irFunction -> $newIrFunction" } log { "$irFunction -> $newIrFunction" }
val builder = context.createIrBuilder(newIrFunction.symbol) val builder = context.createIrBuilder(newIrFunction.symbol)
newIrFunction.body = IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET) { newIrFunction.body = context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET) {
statements += builder.irBlockBody(newIrFunction) { statements += builder.irBlockBody(newIrFunction) {
val params = mutableListOf<IrValueDeclaration>() val params = mutableListOf<IrValueDeclaration>()
val variables = mutableMapOf<IrValueDeclaration, IrValueDeclaration>() val variables = mutableMapOf<IrValueDeclaration, IrValueDeclaration>()
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
@@ -73,7 +72,7 @@ class InlineClassLowering(val context: CommonBackendContext) {
val irClass = irConstructor.parentAsClass val irClass = irConstructor.parentAsClass
// Copied and adapted from Kotlin/Native InlineClassTransformer // Copied and adapted from Kotlin/Native InlineClassTransformer
staticMethod.body = IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET) { staticMethod.body = context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET) {
statements += context.createIrBuilder(staticMethod.symbol).irBlockBody(staticMethod) { statements += context.createIrBuilder(staticMethod.symbol).irBlockBody(staticMethod) {
// Secondary ctors of inline class must delegate to some other constructors. // Secondary ctors of inline class must delegate to some other constructors.
@@ -139,7 +138,7 @@ class InlineClassLowering(val context: CommonBackendContext) {
val functionBody = function.body val functionBody = function.body
// Move function body to static method, transforming value parameters and nested declarations // Move function body to static method, transforming value parameters and nested declarations
staticMethod.body = IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET) { staticMethod.body = context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET) {
statements.addAll((functionBody as IrBlockBody).statements) statements.addAll((functionBody as IrBlockBody).statements)
transformChildrenVoid(object : IrElementTransformerVoid() { transformChildrenVoid(object : IrElementTransformerVoid() {
@@ -177,7 +176,7 @@ class InlineClassLowering(val context: CommonBackendContext) {
private fun delegateToStaticMethod(function: IrSimpleFunction, staticMethod: IrSimpleFunction): IrBlockBody { private fun delegateToStaticMethod(function: IrSimpleFunction, staticMethod: IrSimpleFunction): IrBlockBody {
// Delegate original function to static implementation // Delegate original function to static implementation
return IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET) { return context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET) {
statements += context.createIrBuilder(function.symbol).irBlockBody { statements += context.createIrBuilder(function.symbol).irBlockBody {
+irReturn( +irReturn(
irCall(staticMethod).apply { irCall(staticMethod).apply {
@@ -69,7 +69,7 @@ class InnerClassesLowering(val context: BackendContext, private val innerClasses
val blockBody = irConstructor.body as? IrBlockBody ?: throw AssertionError("Unexpected constructor body: ${irConstructor.body}") val blockBody = irConstructor.body as? IrBlockBody ?: throw AssertionError("Unexpected constructor body: ${irConstructor.body}")
loweredConstructor.body = IrBlockBodyImpl(blockBody.startOffset, blockBody.endOffset) { loweredConstructor.body = context.irFactory.createBlockBody(blockBody.startOffset, blockBody.endOffset) {
context.createIrBuilder(irConstructor.symbol, irConstructor.startOffset, irConstructor.endOffset).apply { context.createIrBuilder(irConstructor.symbol, irConstructor.startOffset, irConstructor.endOffset).apply {
statements.add(0, irSetField(irGet(irClass.thisReceiver!!), parentThisField, irGet(outerThisParameter))) statements.add(0, irSetField(irGet(irClass.thisReceiver!!), parentThisField, irGet(outerThisParameter)))
} }
@@ -24,7 +24,10 @@ import org.jetbrains.kotlin.ir.builders.declarations.buildField
import org.jetbrains.kotlin.ir.builders.declarations.buildVariable import org.jetbrains.kotlin.ir.builders.declarations.buildVariable
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrSetVariableImpl
import org.jetbrains.kotlin.ir.types.isMarkedNullable import org.jetbrains.kotlin.ir.types.isMarkedNullable
import org.jetbrains.kotlin.ir.types.isPrimitiveType import org.jetbrains.kotlin.ir.types.isPrimitiveType
import org.jetbrains.kotlin.ir.types.makeNullable import org.jetbrains.kotlin.ir.types.makeNullable
@@ -84,7 +87,7 @@ class NullableFieldsDeclarationLowering(val backendContext: CommonBackendContext
assert(!type.isPrimitiveType()) { "'lateinit' modifier is not allowed on primitive types" } assert(!type.isPrimitiveType()) { "'lateinit' modifier is not allowed on primitive types" }
val startOffset = getter.startOffset val startOffset = getter.startOffset
val endOffset = getter.endOffset val endOffset = getter.endOffset
getter.body = IrBlockBodyImpl(startOffset, endOffset) { getter.body = backendContext.irFactory.createBlockBody(startOffset, endOffset) {
val irBuilder = backendContext.createIrBuilder(getter.symbol, startOffset, endOffset) val irBuilder = backendContext.createIrBuilder(getter.symbol, startOffset, endOffset)
irBuilder.run { irBuilder.run {
val resultVar = scope.createTmpVariable( val resultVar = scope.createTmpVariable(
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.impl.EmptyPackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.impl.EmptyPackageFragmentDescriptor
import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.* import org.jetbrains.kotlin.ir.*
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrDeclarationBuilder import org.jetbrains.kotlin.ir.backend.js.ir.JsIrDeclarationBuilder
import org.jetbrains.kotlin.ir.backend.js.lower.JsInnerClassesSupport import org.jetbrains.kotlin.ir.backend.js.lower.JsInnerClassesSupport
import org.jetbrains.kotlin.ir.backend.js.utils.OperatorNames import org.jetbrains.kotlin.ir.backend.js.utils.OperatorNames
@@ -129,7 +128,7 @@ class JsIrBackendContext(
return testContainerFuns.getOrPut(module) { return testContainerFuns.getOrPut(module) {
val file = syntheticFile("tests", module) val file = syntheticFile("tests", module)
jsIrDeclarationBuilder.buildFunction("test fun", irBuiltIns.unitType, file).apply { jsIrDeclarationBuilder.buildFunction("test fun", irBuiltIns.unitType, file).apply {
body = JsIrBuilder.buildBlockBody(emptyList()) body = irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET, emptyList())
file.declarations += this file.declarations += this
} }
} }
@@ -75,8 +75,6 @@ object JsIrBuilder {
) = ) =
IrSetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, symbol, receiver, value, type, SYNTHESIZED_STATEMENT, superQualifierSymbol) IrSetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, symbol, receiver, value, type, SYNTHESIZED_STATEMENT, superQualifierSymbol)
fun buildBlockBody(statements: List<IrStatement>) = IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, statements)
fun buildBlock(type: IrType) = IrBlockImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, SYNTHESIZED_STATEMENT) fun buildBlock(type: IrType) = IrBlockImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, SYNTHESIZED_STATEMENT)
fun buildBlock(type: IrType, statements: List<IrStatement>) = fun buildBlock(type: IrType, statements: List<IrStatement>) =
IrBlockImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, SYNTHESIZED_STATEMENT, statements) IrBlockImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, SYNTHESIZED_STATEMENT, statements)
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.backend.common.DeclarationTransformer
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl
import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.ir.util.parentAsClass
@@ -27,7 +26,7 @@ class AnnotationConstructorLowering(context: CommonBackendContext) : Declaration
// put empty body to make sure proper initializer is generated // put empty body to make sure proper initializer is generated
// TODO what about its previous body? // TODO what about its previous body?
declaration.body = IrBlockBodyImpl(declaration.startOffset, declaration.endOffset) { declaration.body = declaration.factory.createBlockBody(declaration.startOffset, declaration.endOffset) {
statements += IrInstanceInitializerCallImpl(startOffset, endOffset, irClass.symbol, unitType) statements += IrInstanceInitializerCallImpl(startOffset, endOffset, irClass.symbol, unitType)
} }
@@ -82,7 +82,7 @@ abstract class AbstractBlockDecomposerLowering(
} }
private fun IrExpressionBody.toBlockBody(containingFunction: IrFunction): IrBlockBody { private fun IrExpressionBody.toBlockBody(containingFunction: IrFunction): IrBlockBody {
return IrBlockBodyImpl(startOffset, endOffset) { return context.irFactory.createBlockBody(startOffset, endOffset) {
expression.patchDeclarationParents(containingFunction) expression.patchDeclarationParents(containingFunction)
val returnStatement = JsIrBuilder.buildReturn(containingFunction.symbol, expression, nothingType) val returnStatement = JsIrBuilder.buildReturn(containingFunction.symbol, expression, nothingType)
statements += returnStatement statements += returnStatement
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.ir.backend.js.utils.getJsName
import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.classifierOrNull import org.jetbrains.kotlin.ir.types.classifierOrNull
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
@@ -140,7 +139,7 @@ class BridgesConstruction(val context: JsCommonBackendContext) : DeclarationTran
overriddenSymbols += bridge.symbol overriddenSymbols += bridge.symbol
} }
irFunction.body = IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET) { irFunction.body = context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET) {
statements += context.createIrBuilder(irFunction.symbol).irBlockBody(irFunction) { statements += context.createIrBuilder(irFunction.symbol).irBlockBody(irFunction) {
if (specialMethodInfo != null) { if (specialMethodInfo != null) {
irFunction.valueParameters.take(specialMethodInfo.argumentsToCheck).forEach { irFunction.valueParameters.take(specialMethodInfo.argumentsToCheck).forEach {
@@ -293,7 +293,7 @@ class CallableReferenceLowering(private val context: CommonBackendContext) : Bod
} }
} }
body = IrBlockBodyImpl(reference.startOffset, reference.endOffset, listOf(reference.run { body = factory.createBlockBody(reference.startOffset, reference.endOffset, listOf(reference.run {
IrReturnImpl( IrReturnImpl(
startOffset, startOffset,
endOffset, nothingType, endOffset, nothingType,
@@ -324,7 +324,7 @@ class CallableReferenceLowering(private val context: CommonBackendContext) : Bod
type = clazz.defaultType type = clazz.defaultType
} }
getter.body = IrBlockBodyImpl( getter.body = context.irFactory.createBlockBody(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, listOf( UNDEFINED_OFFSET, UNDEFINED_OFFSET, listOf(
IrReturnImpl( IrReturnImpl(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, nothingType, getter.symbol, IrConstImpl.string( UNDEFINED_OFFSET, UNDEFINED_OFFSET, nothingType, getter.symbol, IrConstImpl.string(
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrSetField import org.jetbrains.kotlin.ir.expressions.IrSetField
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl
@@ -45,7 +44,7 @@ class CreateScriptFunctionsPhase(val context: CommonBackendContext) : FileLoweri
initializeStatements.forEach { it.first.initializer = null } initializeStatements.forEach { it.first.initializer = null }
val initializeScriptFunction = createFunction(irScript, "\$initializeScript\$", context.irBuiltIns.unitType).also { val initializeScriptFunction = createFunction(irScript, "\$initializeScript\$", context.irBuiltIns.unitType).also {
it.body = IrBlockBodyImpl( it.body = it.factory.createBlockBody(
startOffset, startOffset,
endOffset, endOffset,
initializeStatements.map { (field, expression) -> createIrSetField(field, expression) } initializeStatements.map { (field, expression) -> createIrSetField(field, expression) }
@@ -53,7 +52,7 @@ class CreateScriptFunctionsPhase(val context: CommonBackendContext) : FileLoweri
} }
val evaluateScriptFunction = createFunction(irScript, "\$evaluateScript\$", getReturnType(irScript)).also { val evaluateScriptFunction = createFunction(irScript, "\$evaluateScript\$", getReturnType(irScript)).also {
it.body = IrBlockBodyImpl( it.body = it.factory.createBlockBody(
startOffset, startOffset,
endOffset, endOffset,
irScript.statements.prepareForEvaluateScriptFunction(it) irScript.statements.prepareForEvaluateScriptFunction(it)
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.BodyLoweringPass
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
import org.jetbrains.kotlin.ir.backend.js.lower.PrimaryConstructorLowering.SYNTHETIC_PRIMARY_CONSTRUCTOR import org.jetbrains.kotlin.ir.backend.js.lower.PrimaryConstructorLowering.SYNTHETIC_PRIMARY_CONSTRUCTOR
@@ -115,7 +116,7 @@ class ES6AddInternalParametersToConstructorPhase(val context: JsIrBackendContext
).apply { ).apply {
addValueParameter("\$this\$", context.dynamicType) addValueParameter("\$this\$", context.dynamicType)
body = JsIrBuilder.buildBlockBody(constructor.body?.statements ?: emptyList()) body = context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET, constructor.body?.statements.orEmpty())
transformChildren(object : IrElementTransformerVoid() { transformChildren(object : IrElementTransformerVoid() {
override fun visitGetValue(expression: IrGetValue): IrExpression { override fun visitGetValue(expression: IrGetValue): IrExpression {
@@ -26,7 +26,6 @@ import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
import org.jetbrains.kotlin.ir.builders.declarations.buildField import org.jetbrains.kotlin.ir.builders.declarations.buildField
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
@@ -129,7 +128,7 @@ class EnumClassConstructorLowering(val context: JsCommonBackendContext) : Declar
enumConstructor.newConstructor = this enumConstructor.newConstructor = this
enumConstructor.body?.let { oldBody -> enumConstructor.body?.let { oldBody ->
body = IrBlockBodyImpl(oldBody.startOffset, oldBody.endOffset) { body = context.irFactory.createBlockBody(oldBody.startOffset, oldBody.endOffset) {
statements += (oldBody as IrBlockBody).statements statements += (oldBody as IrBlockBody).statements
context.fixReferencesToConstructorParameters(enumClass, this) context.fixReferencesToConstructorParameters(enumClass, this)
@@ -400,7 +399,7 @@ class EnumClassCreateInitializerLowering(val context: JsIrBackendContext) : Decl
private fun createInitEntryInstancesFun(irClass: IrClass, entryInstancesInitializedField: IrField): IrSimpleFunction = private fun createInitEntryInstancesFun(irClass: IrClass, entryInstancesInitializedField: IrField): IrSimpleFunction =
context.jsIrDeclarationBuilder.buildFunction(irClass, "${irClass.name.identifier}_initEntries", context.irBuiltIns.unitType).also { context.jsIrDeclarationBuilder.buildFunction(irClass, "${irClass.name.identifier}_initEntries", context.irBuiltIns.unitType).also {
it.body = IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET) { it.body = context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET) {
statements += context.createIrBuilder(it.symbol).irBlockBody(it) { statements += context.createIrBuilder(it.symbol).irBlockBody(it) {
+irIfThen(irGetField(null, entryInstancesInitializedField), irReturnUnit()) +irIfThen(irGetField(null, entryInstancesInitializedField), irReturnUnit())
+irSetField(null, entryInstancesInitializedField, irBoolean(true)) +irSetField(null, entryInstancesInitializedField, irBoolean(true))
@@ -456,7 +455,7 @@ class EnumEntryCreateGetInstancesFunsLowering(val context: JsIrBackendContext):
enumEntry.getType(irClass) enumEntry.getType(irClass)
) )
}.also { }.also {
it.body = IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET) { it.body = context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET) {
statements += context.createIrBuilder(it.symbol).irBlockBody(it) { statements += context.createIrBuilder(it.symbol).irBlockBody(it) {
+irCall(initEntryInstancesFun) +irCall(initEntryInstancesFun)
+irReturn(irGetField(null, enumEntry.correspondingField!!)) +irReturn(irGetField(null, enumEntry.correspondingField!!))
@@ -475,7 +474,7 @@ class EnumSyntheticFunctionsLowering(val context: JsIrBackendContext): Declarati
val kind = body.kind val kind = body.kind
declaration.parents.filterIsInstance<IrClass>().firstOrNull { it.goodEnum }?.let { irClass -> declaration.parents.filterIsInstance<IrClass>().firstOrNull { it.goodEnum }?.let { irClass ->
declaration.body = IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET) { declaration.body = context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET) {
statements += when (kind) { statements += when (kind) {
IrSyntheticBodyKind.ENUM_VALUES -> createEnumValuesBody(declaration, irClass) IrSyntheticBodyKind.ENUM_VALUES -> createEnumValuesBody(declaration, irClass)
IrSyntheticBodyKind.ENUM_VALUEOF -> createEnumValueOfBody(declaration, irClass) IrSyntheticBodyKind.ENUM_VALUEOF -> createEnumValueOfBody(declaration, irClass)
@@ -87,7 +87,7 @@ class InteropCallableReferenceLowering(val context: JsIrBackendContext) : BodyLo
invokeExpression.putValueArgument(i, getValue(vp)) invokeExpression.putValueArgument(i, getValue(vp))
} }
return IrBlockBodyImpl( return context.irFactory.createBlockBody(
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
listOf( listOf(
@@ -188,9 +188,7 @@ class InteropCallableReferenceLowering(val context: JsIrBackendContext) : BodyLo
statements.add(JsIrBuilder.buildReturn(factoryFunction.symbol, functionExpression, context.irBuiltIns.nothingType)) statements.add(JsIrBuilder.buildReturn(factoryFunction.symbol, functionExpression, context.irBuiltIns.nothingType))
} }
return expression.run { return context.irFactory.createBlockBody(expression.startOffset, expression.endOffset, statements)
IrBlockBodyImpl(startOffset, endOffset, statements)
}
} }
private fun buildFactoryFunction(expression: IrConstructorCall): IrSimpleFunction { private fun buildFactoryFunction(expression: IrConstructorCall): IrSimpleFunction {
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrVariable import org.jetbrains.kotlin.ir.declarations.IrVariable
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.ir.types.makeNullable import org.jetbrains.kotlin.ir.types.makeNullable
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
@@ -56,7 +55,7 @@ class ObjectDeclarationLowering(
val primaryConstructor = declaration.primaryConstructor ?: declaration.syntheticPrimaryConstructor!! val primaryConstructor = declaration.primaryConstructor ?: declaration.syntheticPrimaryConstructor!!
getInstanceFun.body = IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET) { getInstanceFun.body = context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET) {
statements += context.createIrBuilder(getInstanceFun.symbol).irBlockBody(getInstanceFun) { statements += context.createIrBuilder(getInstanceFun.symbol).irBlockBody(getInstanceFun) {
+irIfThen( +irIfThen(
irEqualsNull(irGetField(null, instanceField)), irEqualsNull(irGetField(null, instanceField)),
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.ir.builders.declarations.addConstructor
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrBody import org.jetbrains.kotlin.ir.expressions.IrBody
import org.jetbrains.kotlin.ir.expressions.IrInstanceInitializerCall import org.jetbrains.kotlin.ir.expressions.IrInstanceInitializerCall
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl
import org.jetbrains.kotlin.ir.util.constructors import org.jetbrains.kotlin.ir.util.constructors
@@ -53,7 +52,7 @@ class PrimaryConstructorLowering(context: JsCommonBackendContext) : DeclarationT
} }
declaration.body = irClass.run { declaration.body = irClass.run {
IrBlockBodyImpl(startOffset, endOffset, listOf(IrInstanceInitializerCallImpl(startOffset, endOffset, symbol, unitType))) factory.createBlockBody(startOffset, endOffset, listOf(IrInstanceInitializerCallImpl(startOffset, endOffset, symbol, unitType)))
} }
return declaration return declaration
@@ -14,7 +14,10 @@ import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.builders.declarations.buildValueParameter import org.jetbrains.kotlin.ir.builders.declarations.buildValueParameter
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionReferenceImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrPropertyReferenceImpl
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -105,7 +108,7 @@ class PrivateMembersLowering(val context: JsIrBackendContext) : DeclarationTrans
function.body?.let { function.body?.let {
staticFunction.body = when (it) { staticFunction.body = when (it) {
is IrBlockBody -> IrBlockBodyImpl(it.startOffset, it.endOffset) { is IrBlockBody -> context.irFactory.createBlockBody(it.startOffset, it.endOffset) {
statements += (it.copyWithParameters() as IrBlockBody).statements statements += (it.copyWithParameters() as IrBlockBody).statements
} }
is IrExpressionBody -> context.irFactory.createExpressionBody(it.startOffset, it.endOffset) { is IrExpressionBody -> context.irFactory.createExpressionBody(it.startOffset, it.endOffset) {
@@ -19,7 +19,10 @@ import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrRawFunctionReferenceImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
@@ -81,7 +84,7 @@ class SecondaryConstructorLowering(val context: JsIrBackendContext) : Declaratio
} }
private fun generateFactoryBody(constructor: IrConstructor, irClass: IrClass, stub: IrSimpleFunction, delegate: IrSimpleFunction) { private fun generateFactoryBody(constructor: IrConstructor, irClass: IrClass, stub: IrSimpleFunction, delegate: IrSimpleFunction) {
stub.body = IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET) { stub.body = context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET) {
val type = irClass.defaultType val type = irClass.defaultType
val createFunctionIntrinsic = context.intrinsics.jsObjectCreate val createFunctionIntrinsic = context.intrinsics.jsObjectCreate
val irCreateCall = JsIrBuilder.buildCall(createFunctionIntrinsic.symbol, type, listOf(type)) val irCreateCall = JsIrBuilder.buildCall(createFunctionIntrinsic.symbol, type, listOf(type))
@@ -128,7 +131,7 @@ class SecondaryConstructorLowering(val context: JsIrBackendContext) : Declaratio
val oldValueParameters = constructor.valueParameters + oldThisReceiver val oldValueParameters = constructor.valueParameters + oldThisReceiver
// TODO: replace parameters as well // TODO: replace parameters as well
delegate.body = IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET) { delegate.body = context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET) {
statements += (constructorBody.deepCopyWithSymbols(delegate) as IrStatementContainer).statements statements += (constructorBody.deepCopyWithSymbols(delegate) as IrStatementContainer).statements
statements += JsIrBuilder.buildReturn(delegate.symbol, JsIrBuilder.buildGetValue(thisParam.symbol), context.irBuiltIns.nothingType) statements += JsIrBuilder.buildReturn(delegate.symbol, JsIrBuilder.buildGetValue(thisParam.symbol), context.irBuiltIns.nothingType)
transformChildrenVoid(ThisUsageReplaceTransformer(delegate.symbol, oldValueParameters.zip(delegate.valueParameters).toMap())) transformChildrenVoid(ThisUsageReplaceTransformer(delegate.symbol, oldValueParameters.zip(delegate.valueParameters).toMap()))
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower
import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.FileLoweringPass
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
@@ -54,7 +55,7 @@ class TestGenerator(val context: JsIrBackendContext, val testContainerFactory: (
parentFunction: IrSimpleFunction, parentFunction: IrSimpleFunction,
ignored: Boolean = false ignored: Boolean = false
): FunctionWithBody { ): FunctionWithBody {
val body = JsIrBuilder.buildBlockBody(emptyList()) val body = context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET, emptyList())
val function = context.jsIrDeclarationBuilder.buildFunction("$name test fun", context.irBuiltIns.anyNType, parentFunction) val function = context.jsIrDeclarationBuilder.buildFunction("$name test fun", context.irBuiltIns.anyNType, parentFunction)
function.body = body function.body = body
@@ -15,7 +15,10 @@ import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.explicitParameters import org.jetbrains.kotlin.ir.util.explicitParameters
import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.ir.util.patchDeclarationParents
@@ -135,8 +138,9 @@ class JsSuspendFunctionsLowering(ctx: JsIrBackendContext) : AbstractSuspendFunct
}) })
} }
val functionBody = val functionBody = context.irFactory.createBlockBody(
IrBlockBodyImpl(stateMachineFunction.startOffset, stateMachineFunction.endOffset, listOf(suspendResult, rootLoop)) stateMachineFunction.startOffset, stateMachineFunction.endOffset, listOf(suspendResult, rootLoop)
)
stateMachineFunction.body = functionBody stateMachineFunction.body = functionBody
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrValueParameter import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.expressions.IrBlockBody import org.jetbrains.kotlin.ir.expressions.IrBlockBody
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
class RemoveInlineFunctionsWithReifiedTypeParametersLowering: DeclarationTransformer { class RemoveInlineFunctionsWithReifiedTypeParametersLowering: DeclarationTransformer {
@@ -30,7 +29,7 @@ class CopyInlineFunctionBodyLowering(val context: JsIrBackendContext) : Declarat
override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? { override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
if (declaration is IrFunction && declaration.isInline) { if (declaration is IrFunction && declaration.isInline) {
declaration.body?.let { originalBody -> declaration.body?.let { originalBody ->
declaration.body = IrBlockBodyImpl(originalBody.startOffset, originalBody.endOffset) { declaration.body = context.irFactory.createBlockBody(originalBody.startOffset, originalBody.endOffset) {
statements += (originalBody.deepCopyWithSymbols(declaration) as IrBlockBody).statements statements += (originalBody.deepCopyWithSymbols(declaration) as IrBlockBody).statements
} }
} }
@@ -131,7 +131,7 @@ fun breakCrossModuleFieldAccess(
name = Name.identifier("get-$fieldName") name = Name.identifier("get-$fieldName")
returnType = type returnType = type
} }
getter.body = IrBlockBodyImpl( getter.body = factory.createBlockBody(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, listOf( UNDEFINED_OFFSET, UNDEFINED_OFFSET, listOf(
IrReturnImpl( IrReturnImpl(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, getter.symbol, UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, getter.symbol,
@@ -158,7 +158,7 @@ fun breakCrossModuleFieldAccess(
val param = setter.addValueParameter("value", type) val param = setter.addValueParameter("value", type)
setter.body = IrBlockBodyImpl( setter.body = factory.createBlockBody(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, listOf( UNDEFINED_OFFSET, UNDEFINED_OFFSET, listOf(
IrSetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, symbol, type).apply { IrSetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, symbol, type).apply {
value = IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, param.symbol) value = IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, param.symbol)
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.psi2ir.generators
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.psi.KtAnonymousInitializer import org.jetbrains.kotlin.psi.KtAnonymousInitializer
import org.jetbrains.kotlin.psi.KtBlockExpression import org.jetbrains.kotlin.psi.KtBlockExpression
import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.endOffset
@@ -41,7 +40,7 @@ class AnonymousInitializerGenerator(
val bodyGenerator = createBodyGenerator(irAnonymousInitializer.symbol) val bodyGenerator = createBodyGenerator(irAnonymousInitializer.symbol)
val statementGenerator = bodyGenerator.createStatementGenerator() val statementGenerator = bodyGenerator.createStatementGenerator()
val ktBody = ktAnonymousInitializer.body!! val ktBody = ktAnonymousInitializer.body!!
val irBlockBody = IrBlockBodyImpl(ktBody.startOffsetSkippingComments, ktBody.endOffset) val irBlockBody = context.irFactory.createBlockBody(ktBody.startOffsetSkippingComments, ktBody.endOffset)
if (ktBody is KtBlockExpression) { if (ktBody is KtBlockExpression) {
statementGenerator.generateStatements(ktBody.statements, irBlockBody) statementGenerator.generateStatements(ktBody.statements, irBlockBody)
} else { } else {
@@ -54,7 +54,7 @@ class BodyGenerator(
fun generateFunctionBody(ktBody: KtExpression): IrBody { fun generateFunctionBody(ktBody: KtExpression): IrBody {
val statementGenerator = createStatementGenerator() val statementGenerator = createStatementGenerator()
val irBlockBody = IrBlockBodyImpl(ktBody.startOffsetSkippingComments, ktBody.endOffset) val irBlockBody = context.irFactory.createBlockBody(ktBody.startOffsetSkippingComments, ktBody.endOffset)
if (ktBody is KtBlockExpression) { if (ktBody is KtBlockExpression) {
statementGenerator.generateStatements(ktBody.statements, irBlockBody) statementGenerator.generateStatements(ktBody.statements, irBlockBody)
} else { } else {
@@ -77,7 +77,7 @@ class BodyGenerator(
val statementGenerator = createStatementGenerator() val statementGenerator = createStatementGenerator()
val ktBody = ktFun.bodyExpression!! val ktBody = ktFun.bodyExpression!!
val irBlockBody = IrBlockBodyImpl(ktBody.startOffsetSkippingComments, ktBody.endOffset) val irBlockBody = context.irFactory.createBlockBody(ktBody.startOffsetSkippingComments, ktBody.endOffset)
for (ktParameter in ktFun.valueParameters) { for (ktParameter in ktFun.valueParameters) {
val ktDestructuringDeclaration = ktParameter.destructuringDeclaration ?: continue val ktDestructuringDeclaration = ktParameter.destructuringDeclaration ?: continue
@@ -131,7 +131,7 @@ class BodyGenerator(
} }
fun generateSecondaryConstructorBody(ktConstructor: KtSecondaryConstructor): IrBody { fun generateSecondaryConstructorBody(ktConstructor: KtSecondaryConstructor): IrBody {
val irBlockBody = IrBlockBodyImpl(ktConstructor.startOffsetSkippingComments, ktConstructor.endOffset) val irBlockBody = context.irFactory.createBlockBody(ktConstructor.startOffsetSkippingComments, ktConstructor.endOffset)
generateDelegatingConstructorCall(irBlockBody, ktConstructor) generateDelegatingConstructorCall(irBlockBody, ktConstructor)
@@ -177,7 +177,7 @@ class BodyGenerator(
loopTable[expression] loopTable[expression]
fun generatePrimaryConstructorBody(ktClassOrObject: KtPureClassOrObject): IrBody { fun generatePrimaryConstructorBody(ktClassOrObject: KtPureClassOrObject): IrBody {
val irBlockBody = IrBlockBodyImpl(ktClassOrObject.pureStartOffset, ktClassOrObject.pureEndOffset) val irBlockBody = context.irFactory.createBlockBody(ktClassOrObject.pureStartOffset, ktClassOrObject.pureEndOffset)
generateSuperConstructorCall(irBlockBody, ktClassOrObject) generateSuperConstructorCall(irBlockBody, ktClassOrObject)
@@ -194,7 +194,7 @@ class BodyGenerator(
} }
fun generateSecondaryConstructorBodyWithNestedInitializers(ktConstructor: KtSecondaryConstructor): IrBody { fun generateSecondaryConstructorBodyWithNestedInitializers(ktConstructor: KtSecondaryConstructor): IrBody {
val irBlockBody = IrBlockBodyImpl(ktConstructor.startOffsetSkippingComments, ktConstructor.endOffset) val irBlockBody = context.irFactory.createBlockBody(ktConstructor.startOffsetSkippingComments, ktConstructor.endOffset)
generateDelegatingConstructorCall(irBlockBody, ktConstructor) generateDelegatingConstructorCall(irBlockBody, ktConstructor)
@@ -22,7 +22,10 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.descriptors.IrImplementingDelegateDescriptorImpl import org.jetbrains.kotlin.ir.descriptors.IrImplementingDelegateDescriptorImpl
import org.jetbrains.kotlin.ir.expressions.IrBlockBody import org.jetbrains.kotlin.ir.expressions.IrBlockBody
import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl
import org.jetbrains.kotlin.ir.expressions.mapValueParameters import org.jetbrains.kotlin.ir.expressions.mapValueParameters
import org.jetbrains.kotlin.ir.expressions.putTypeArguments import org.jetbrains.kotlin.ir.expressions.putTypeArguments
import org.jetbrains.kotlin.ir.expressions.typeParametersCount import org.jetbrains.kotlin.ir.expressions.typeParametersCount
@@ -324,7 +327,7 @@ class ClassGenerator(
val startOffset = irDelegate.startOffset val startOffset = irDelegate.startOffset
val endOffset = irDelegate.endOffset val endOffset = irDelegate.endOffset
val irBlockBody = IrBlockBodyImpl(startOffset, endOffset) val irBlockBody = context.irFactory.createBlockBody(startOffset, endOffset)
val substitutedDelegateTo = substituteDelegateToDescriptor(delegatedDescriptor, delegateToDescriptor) val substitutedDelegateTo = substituteDelegateToDescriptor(delegatedDescriptor, delegateToDescriptor)
val returnType = substitutedDelegateTo.returnType!! val returnType = substitutedDelegateTo.returnType!!
@@ -13,7 +13,10 @@ import org.jetbrains.kotlin.ir.expressions.IrBlockBody
import org.jetbrains.kotlin.ir.expressions.IrBody import org.jetbrains.kotlin.ir.expressions.IrBody
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl
import org.jetbrains.kotlin.ir.types.impl.IrUninitializedType import org.jetbrains.kotlin.ir.types.impl.IrUninitializedType
import org.jetbrains.kotlin.ir.util.declareSimpleFunctionWithOverrides import org.jetbrains.kotlin.ir.util.declareSimpleFunctionWithOverrides
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
@@ -148,7 +151,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
val startOffset = irAccessor.startOffset val startOffset = irAccessor.startOffset
val endOffset = irAccessor.endOffset val endOffset = irAccessor.endOffset
val irBody = IrBlockBodyImpl(startOffset, endOffset) val irBody = context.irFactory.createBlockBody(startOffset, endOffset)
val receiver = generateReceiverExpressionForDefaultPropertyAccessor(property, irAccessor) val receiver = generateReceiverExpressionForDefaultPropertyAccessor(property, irAccessor)
@@ -175,7 +178,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
val startOffset = irAccessor.startOffset val startOffset = irAccessor.startOffset
val endOffset = irAccessor.endOffset val endOffset = irAccessor.endOffset
val irBody = IrBlockBodyImpl(startOffset, endOffset) val irBody = context.irFactory.createBlockBody(startOffset, endOffset)
val receiver = generateReceiverExpressionForDefaultPropertyAccessor(property, irAccessor) val receiver = generateReceiverExpressionForDefaultPropertyAccessor(property, irAccessor)
@@ -141,7 +141,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
createAdapterFun(startOffset, endOffset, adapteeDescriptor, ktExpectedParameterTypes, ktExpectedReturnType, callBuilder, callableReferenceType) createAdapterFun(startOffset, endOffset, adapteeDescriptor, ktExpectedParameterTypes, ktExpectedReturnType, callBuilder, callableReferenceType)
val irCall = createAdapteeCall(startOffset, endOffset, adapteeSymbol, callBuilder, irAdapterFun) val irCall = createAdapteeCall(startOffset, endOffset, adapteeSymbol, callBuilder, irAdapterFun)
irAdapterFun.body = IrBlockBodyImpl(startOffset, endOffset).apply { irAdapterFun.body = context.irFactory.createBlockBody(startOffset, endOffset).apply {
if (KotlinBuiltIns.isUnit(ktExpectedReturnType)) if (KotlinBuiltIns.isUnit(ktExpectedReturnType))
statements.add(irCall) statements.add(irCall)
else else
@@ -18,12 +18,10 @@ package org.jetbrains.kotlin.ir.builders
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.expressions.IrBlockBody import org.jetbrains.kotlin.ir.expressions.IrBlockBody
import org.jetbrains.kotlin.ir.expressions.IrContainerExpression import org.jetbrains.kotlin.ir.expressions.IrContainerExpression
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockImpl import org.jetbrains.kotlin.ir.expressions.impl.IrBlockImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
@@ -63,7 +61,7 @@ open class IrBlockBodyBuilder(
startOffset: Int, startOffset: Int,
endOffset: Int endOffset: Int
) : IrStatementsBuilder<IrBlockBody>(context, scope, startOffset, endOffset) { ) : IrStatementsBuilder<IrBlockBody>(context, scope, startOffset, endOffset) {
private val irBlockBody = IrBlockBodyImpl(startOffset, endOffset) private val irBlockBody = context.irFactory.createBlockBody(startOffset, endOffset)
inline fun blockBody(body: IrBlockBodyBuilder.() -> Unit): IrBlockBody { inline fun blockBody(body: IrBlockBodyBuilder.() -> Unit): IrBlockBody {
body() body()
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.ir.declarations package org.jetbrains.kotlin.ir.declarations
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.*
@@ -212,4 +214,21 @@ interface IrFactory {
fun createExpressionBody( fun createExpressionBody(
expression: IrExpression, expression: IrExpression,
): IrExpressionBody ): IrExpressionBody
fun createBlockBody(
startOffset: Int,
endOffset: Int,
): IrBlockBody
fun createBlockBody(
startOffset: Int,
endOffset: Int,
statements: List<IrStatement>,
): IrBlockBody
fun createBlockBody(
startOffset: Int,
endOffset: Int,
initializer: IrBlockBody.() -> Unit,
): IrBlockBody
} }
@@ -6,9 +6,12 @@
package org.jetbrains.kotlin.ir.declarations.impl package org.jetbrains.kotlin.ir.declarations.impl
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
@@ -244,4 +247,24 @@ object IrFactoryImpl : IrFactory {
expression: IrExpression, expression: IrExpression,
): IrExpressionBody = ): IrExpressionBody =
IrExpressionBodyImpl(expression) IrExpressionBodyImpl(expression)
override fun createBlockBody(
startOffset: Int,
endOffset: Int,
): IrBlockBody =
IrBlockBodyImpl(startOffset, endOffset, null)
override fun createBlockBody(
startOffset: Int,
endOffset: Int,
statements: List<IrStatement>,
): IrBlockBody =
IrBlockBodyImpl(startOffset, endOffset, statements)
override fun createBlockBody(
startOffset: Int,
endOffset: Int,
initializer: IrBlockBody.() -> Unit,
): IrBlockBody =
IrBlockBodyImpl(startOffset, endOffset, initializer)
} }
@@ -34,7 +34,9 @@ interface IrExpressionBody : IrBody {
accept(transformer, data) as IrExpressionBody accept(transformer, data) as IrExpressionBody
} }
interface IrBlockBody : IrBody, IrStatementContainer interface IrBlockBody : IrBody, IrStatementContainer {
val factory: IrFactory
}
interface IrSyntheticBody : IrBody { interface IrSyntheticBody : IrBody {
val kind: IrSyntheticBodyKind val kind: IrSyntheticBodyKind
@@ -17,11 +17,12 @@
package org.jetbrains.kotlin.ir.expressions.impl package org.jetbrains.kotlin.ir.expressions.impl
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.declarations.IrFactory
import org.jetbrains.kotlin.ir.declarations.impl.IrBodyBase import org.jetbrains.kotlin.ir.declarations.impl.IrBodyBase
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
import org.jetbrains.kotlin.ir.expressions.IrBlockBody import org.jetbrains.kotlin.ir.expressions.IrBlockBody
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import java.util.*
class IrBlockBodyImpl( class IrBlockBodyImpl(
startOffset: Int, startOffset: Int,
@@ -40,6 +41,9 @@ class IrBlockBodyImpl(
override val statements: MutableList<IrStatement> override val statements: MutableList<IrStatement>
get() = checkEnabled { statementsField } get() = checkEnabled { statementsField }
override val factory: IrFactory
get() = IrFactoryImpl
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R { override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
return visitor.visitBlockBody(this, data) return visitor.visitBlockBody(this, data)
} }
@@ -372,7 +372,7 @@ open class DeepCopyIrTreeWithSymbols(
body.factory.createExpressionBody(body.expression.transform()) body.factory.createExpressionBody(body.expression.transform())
override fun visitBlockBody(body: IrBlockBody): IrBlockBody = override fun visitBlockBody(body: IrBlockBody): IrBlockBody =
IrBlockBodyImpl( body.factory.createBlockBody(
body.startOffset, body.endOffset, body.startOffset, body.endOffset,
body.statements.map { it.transform() } body.statements.map { it.transform() }
) )
@@ -113,7 +113,7 @@ abstract class IrFileDeserializer(
private val deserializeFakeOverrides: Boolean, private val deserializeFakeOverrides: Boolean,
private val fakeOverrideQueue: MutableList<IrClass> private val fakeOverrideQueue: MutableList<IrClass>
) { ) {
private val irFactory: IrFactory get() = symbolTable.irFactory protected val irFactory: IrFactory get() = symbolTable.irFactory
abstract fun deserializeIrSymbolToDeclare(code: Long): Pair<IrSymbol, IdSignature> abstract fun deserializeIrSymbolToDeclare(code: Long): Pair<IrSymbol, IdSignature>
abstract fun deserializeIrSymbol(code: Long): IrSymbol abstract fun deserializeIrSymbol(code: Long): IrSymbol
@@ -269,7 +269,7 @@ abstract class IrFileDeserializer(
statements.add(deserializeStatement(it) as IrStatement) statements.add(deserializeStatement(it) as IrStatement)
} }
return IrBlockBodyImpl(start, end, statements) return irFactory.createBlockBody(start, end, statements)
} }
private fun deserializeBranch(proto: ProtoBranch, start: Int, end: Int): IrBranch { private fun deserializeBranch(proto: ProtoBranch, start: Int, end: Int): IrBranch {
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.backend.common.serialization
import org.jetbrains.kotlin.backend.common.LoggingContext import org.jetbrains.kotlin.backend.common.LoggingContext
import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideBuilder import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideBuilder
import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideControl
import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
@@ -23,7 +22,6 @@ import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl
import org.jetbrains.kotlin.ir.descriptors.* import org.jetbrains.kotlin.ir.descriptors.*
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrLoop import org.jetbrains.kotlin.ir.expressions.IrLoop
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrErrorExpressionImpl import org.jetbrains.kotlin.ir.expressions.impl.IrErrorExpressionImpl
import org.jetbrains.kotlin.ir.linkage.IrDeserializer import org.jetbrains.kotlin.ir.linkage.IrDeserializer
import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.*
@@ -417,7 +415,9 @@ abstract class KotlinIrLinker(
deserializeStatement(bodyData) deserializeStatement(bodyData)
} else { } else {
val errorType = IrErrorTypeImpl(null, emptyList(), Variance.INVARIANT) val errorType = IrErrorTypeImpl(null, emptyList(), Variance.INVARIANT)
IrBlockBodyImpl(-1, -1, listOf(IrErrorExpressionImpl(-1, -1, errorType, "Statement body is not deserialized yet"))) irFactory.createBlockBody(
-1, -1, listOf(IrErrorExpressionImpl(-1, -1, errorType, "Statement body is not deserialized yet"))
)
} }
} }