JS IR: drop JsIrDeclarationBuilder

Move buildValueParameter back to JsIrBuilder, and use common IR builders
directly where buildFunction was called.
This commit is contained in:
Alexander Udalov
2020-07-23 23:03:01 +02:00
parent 0d605a6b7f
commit 12d2a02d22
13 changed files with 111 additions and 168 deletions
@@ -6,13 +6,10 @@
package org.jetbrains.kotlin.ir.backend.js package org.jetbrains.kotlin.ir.backend.js
import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.common.CommonBackendContext
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrDeclarationBuilder
interface JsCommonBackendContext : CommonBackendContext { interface JsCommonBackendContext : CommonBackendContext {
override val mapping: JsMapping override val mapping: JsMapping
val jsIrDeclarationBuilder: JsIrDeclarationBuilder
val es6mode: Boolean val es6mode: Boolean
get() = false get() = false
} }
@@ -14,9 +14,10 @@ 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.JsIrDeclarationBuilder import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
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
import org.jetbrains.kotlin.ir.builders.declarations.addFunction
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
@@ -55,7 +56,6 @@ class JsIrBackendContext(
override var inVerbosePhase: Boolean = false override var inVerbosePhase: Boolean = false
override val irFactory: IrFactory = IrFactoryImpl override val irFactory: IrFactory = IrFactoryImpl
override val jsIrDeclarationBuilder: JsIrDeclarationBuilder = JsIrDeclarationBuilder(irFactory)
val devMode = configuration[JSConfigurationKeys.DEVELOPER_MODE] ?: false val devMode = configuration[JSConfigurationKeys.DEVELOPER_MODE] ?: false
@@ -127,9 +127,12 @@ class JsIrBackendContext(
fun createTestContainerFun(module: IrModuleFragment): IrSimpleFunction { fun createTestContainerFun(module: IrModuleFragment): IrSimpleFunction {
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 { irFactory.addFunction(file) {
name = Name.identifier("test fun")
returnType = irBuiltIns.unitType
origin = JsIrBuilder.SYNTHESIZED_DECLARATION
}.apply {
body = irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET, emptyList()) body = irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET, emptyList())
file.declarations += this
} }
} }
} }
@@ -7,11 +7,9 @@ package org.jetbrains.kotlin.ir.backend.js.ir
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.declarations.buildValueParameter
import org.jetbrains.kotlin.ir.builders.declarations.buildVariable import org.jetbrains.kotlin.ir.builders.declarations.buildVariable
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginImpl import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
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.* import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.*
@@ -46,6 +44,14 @@ object JsIrBuilder {
fun buildThrow(type: IrType, value: IrExpression) = IrThrowImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, value) fun buildThrow(type: IrType, value: IrExpression) = IrThrowImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, value)
fun buildValueParameter(parent: IrFunction, name: String, index: Int, type: IrType): IrValueParameter =
buildValueParameter(parent) {
this.origin = SYNTHESIZED_DECLARATION
this.name = Name.identifier(name)
this.index = index
this.type = type
}
fun buildGetObjectValue(type: IrType, classSymbol: IrClassSymbol) = fun buildGetObjectValue(type: IrType, classSymbol: IrClassSymbol) =
IrGetObjectValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, classSymbol) IrGetObjectValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, classSymbol)
@@ -1,81 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.ir.backend.js.ir
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.builders.declarations.buildValueParameter
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
// This is a temporary class for migration to IrFactory. Usages should be refactored to use the factory directly once possible,
// since it doesn't add sufficient value on its own.
class JsIrDeclarationBuilder(private val irFactory: IrFactory) {
fun buildValueParameter(parent: IrFunction, name: String, index: Int, type: IrType): IrValueParameter =
buildValueParameter(parent) {
this.origin = JsIrBuilder.SYNTHESIZED_DECLARATION
this.name = Name.identifier(name)
this.index = index
this.type = type
}
fun buildFunction(
name: String,
returnType: IrType,
parent: IrDeclarationParent,
visibility: Visibility = Visibilities.PUBLIC,
modality: Modality = Modality.FINAL,
isInline: Boolean = false,
isExternal: Boolean = false,
isTailrec: Boolean = false,
isSuspend: Boolean = false,
isExpect: Boolean = false,
isOperator: Boolean = false,
isInfix: Boolean = false,
isFakeOverride: Boolean = false,
origin: IrDeclarationOrigin = JsIrBuilder.SYNTHESIZED_DECLARATION,
): IrSimpleFunction =
buildFunction(
Name.identifier(name), returnType, parent, visibility, modality,
isInline, isExternal, isTailrec, isSuspend, isExpect, isOperator, isInfix, isFakeOverride, origin
)
fun buildFunction(
name: Name,
returnType: IrType,
parent: IrDeclarationParent,
visibility: Visibility = Visibilities.PUBLIC,
modality: Modality = Modality.FINAL,
isInline: Boolean = false,
isExternal: Boolean = false,
isTailrec: Boolean = false,
isSuspend: Boolean = false,
isExpect: Boolean = false,
isOperator: Boolean = false,
isInfix: Boolean = false,
isFakeOverride: Boolean = false,
origin: IrDeclarationOrigin = JsIrBuilder.SYNTHESIZED_DECLARATION,
): IrSimpleFunction = irFactory.buildFun {
this.origin = origin
this.name = name
this.visibility = visibility
this.modality = modality
this.returnType = returnType
this.isInline = isInline
this.isExternal = isExternal
this.isTailrec = isTailrec
this.isSuspend = isSuspend
this.isOperator = isOperator
this.isInfix = isInfix
this.isExpect = isExpect
this.isFakeOverride = isFakeOverride
}.also {
it.parent = parent
}
}
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.backend.js.JsCommonBackendContext
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.utils.isPure import org.jetbrains.kotlin.ir.backend.js.utils.isPure
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
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.*
@@ -25,6 +26,7 @@ import org.jetbrains.kotlin.ir.util.transformFlat
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
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
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addIfNotNull
class JsBlockDecomposerLowering(val context: JsIrBackendContext) : AbstractBlockDecomposerLowering(context) { class JsBlockDecomposerLowering(val context: JsIrBackendContext) : AbstractBlockDecomposerLowering(context) {
@@ -51,12 +53,14 @@ abstract class AbstractBlockDecomposerLowering(
} }
is IrField -> { is IrField -> {
container.initializer?.apply { container.initializer?.apply {
val initFunction = context.jsIrDeclarationBuilder.buildFunction( val initFunction = context.irFactory.buildFun {
container.name.asString() + "\$init\$", name = Name.identifier(container.name.asString() + "\$init\$")
container.type, returnType = container.type
container.parent, visibility = Visibilities.PRIVATE
Visibilities.PRIVATE origin = JsIrBuilder.SYNTHESIZED_DECLARATION
) }.apply {
parent = container.parent
}
val newBody = toBlockBody(initFunction) val newBody = toBlockBody(initFunction)
newBody.patchDeclarationParents(initFunction) newBody.patchDeclarationParents(initFunction)
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.ir.backend.js.JsLoweredDeclarationOrigin
import org.jetbrains.kotlin.ir.backend.js.utils.functionSignature import org.jetbrains.kotlin.ir.backend.js.utils.functionSignature
import org.jetbrains.kotlin.ir.backend.js.utils.getJsName 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.builders.declarations.buildFun
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.types.IrType import org.jetbrains.kotlin.ir.types.IrType
@@ -117,20 +118,17 @@ class BridgesConstruction(val context: JsCommonBackendContext) : DeclarationTran
IrDeclarationOrigin.BRIDGE IrDeclarationOrigin.BRIDGE
// TODO: Support offsets for debug info // TODO: Support offsets for debug info
val irFunction = context.jsIrDeclarationBuilder.buildFunction( val irFunction = context.irFactory.buildFun {
bridge.name, updateFrom(bridge)
bridge.returnType, this.startOffset = UNDEFINED_OFFSET
function.parent, this.endOffset = UNDEFINED_OFFSET
bridge.visibility, this.name = bridge.name
Modality.FINAL, this.returnType = bridge.returnType
isInline = bridge.isInline, this.modality = Modality.FINAL
isExternal = bridge.isExternal, this.isFakeOverride = false
isTailrec = bridge.isTailrec, this.origin = origin
isSuspend = bridge.isSuspend, }.apply {
isExpect = bridge.isExpect, parent = function.parent
isFakeOverride = false,
origin = origin
).apply {
copyTypeParametersFrom(bridge) copyTypeParametersFrom(bridge)
copyReceiverParametersFrom(bridge) copyReceiverParametersFrom(bridge)
valueParameters += bridge.valueParameters.map { p -> p.copyTo(this) } valueParameters += bridge.valueParameters.map { p -> p.copyTo(this) }
@@ -14,6 +14,7 @@ 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
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
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.IrConstructorCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
@@ -24,6 +25,7 @@ import org.jetbrains.kotlin.ir.util.defaultType
import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.ir.util.parentAsClass
import org.jetbrains.kotlin.ir.util.statements import org.jetbrains.kotlin.ir.util.statements
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.name.Name
/** /**
* Add ES6_INIT_BOX_PARAMETER for each constructor (except constructors * Add ES6_INIT_BOX_PARAMETER for each constructor (except constructors
@@ -104,16 +106,16 @@ class ES6AddInternalParametersToConstructorPhase(val context: JsIrBackendContext
private fun buildInitFunction(constructor: IrConstructor, irClass: IrClass): IrSimpleFunction { private fun buildInitFunction(constructor: IrConstructor, irClass: IrClass): IrSimpleFunction {
val functionName = "${irClass.name}_init" val functionName = "${irClass.name}_init"
return context.jsIrDeclarationBuilder.buildFunction( return context.irFactory.buildFun {
functionName, name = Name.identifier(functionName)
context.irBuiltIns.unitType, returnType = context.irBuiltIns.unitType
irClass, visibility = Visibilities.PROTECTED
Visibilities.PROTECTED, modality = Modality.FINAL
Modality.FINAL, isInline = constructor.isInline
constructor.isInline, isExternal = constructor.isExternal
constructor.isExternal,
origin = ES6_SYNTHETIC_PRIMARY_INIT_FUNCTION origin = ES6_SYNTHETIC_PRIMARY_INIT_FUNCTION
).apply { }.apply {
parent = irClass
addValueParameter("\$this\$", context.dynamicType) addValueParameter("\$this\$", context.dynamicType)
body = context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET, constructor.body?.statements.orEmpty()) body = context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET, constructor.body?.statements.orEmpty())
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.backend.js.lower.ES6AddInternalParametersToConstr
import org.jetbrains.kotlin.ir.backend.js.lower.ES6AddInternalParametersToConstructorPhase.ES6_RESULT_TYPE_PARAMETER import org.jetbrains.kotlin.ir.backend.js.lower.ES6AddInternalParametersToConstructorPhase.ES6_RESULT_TYPE_PARAMETER
import org.jetbrains.kotlin.ir.backend.js.lower.PrimaryConstructorLowering.SYNTHETIC_PRIMARY_CONSTRUCTOR import org.jetbrains.kotlin.ir.backend.js.lower.PrimaryConstructorLowering.SYNTHETIC_PRIMARY_CONSTRUCTOR
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
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.IrGetValueImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
@@ -25,6 +26,7 @@ import org.jetbrains.kotlin.ir.types.isAny
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.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.name.Name
object ES6_THIS_VARIABLE_ORIGIN : IrDeclarationOriginImpl("ES6_THIS_VARIABLE_ORIGIN") object ES6_THIS_VARIABLE_ORIGIN : IrDeclarationOriginImpl("ES6_THIS_VARIABLE_ORIGIN")
@@ -539,11 +541,12 @@ private fun getSuperCall(constructor: IrConstructor): IrDelegatingConstructorCal
} }
private fun changeIrConstructorToIrFunction(context: JsIrBackendContext, container: IrConstructor) { private fun changeIrConstructorToIrFunction(context: JsIrBackendContext, container: IrConstructor) {
val newConstructor = context.jsIrDeclarationBuilder.buildFunction( val newConstructor = context.irFactory.buildFun {
"${container.parentAsClass.name}_constructor", name = Name.identifier("${container.parentAsClass.name}_constructor")
container.returnType, returnType = container.returnType
container.parent origin = JsIrBuilder.SYNTHESIZED_DECLARATION
).apply { }.apply {
parent = container.parent
container.valueParameters.forEach { param -> container.valueParameters.forEach { param ->
addValueParameter(param.name.asString(), param.type, param.origin) addValueParameter(param.name.asString(), param.type, param.origin)
} }
@@ -19,11 +19,11 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.backend.js.JsCommonBackendContext import org.jetbrains.kotlin.ir.backend.js.JsCommonBackendContext
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.ir.JsIrDeclarationBuilder
import org.jetbrains.kotlin.ir.backend.js.utils.toJsArrayLiteral import org.jetbrains.kotlin.ir.backend.js.utils.toJsArrayLiteral
import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor 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.builders.declarations.buildFun
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.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
@@ -120,8 +120,8 @@ class EnumClassConstructorLowering(val context: JsCommonBackendContext) : Declar
returnType = enumConstructor.returnType returnType = enumConstructor.returnType
}.apply { }.apply {
parent = enumClass parent = enumClass
valueParameters += context.jsIrDeclarationBuilder.buildValueParameter(this, "name", 0, context.irBuiltIns.stringType) valueParameters += JsIrBuilder.buildValueParameter(this, "name", 0, context.irBuiltIns.stringType)
valueParameters += context.jsIrDeclarationBuilder.buildValueParameter(this, "ordinal", 1, context.irBuiltIns.intType) valueParameters += JsIrBuilder.buildValueParameter(this, "ordinal", 1, context.irBuiltIns.intType)
copyParameterDeclarationsFrom(enumConstructor) copyParameterDeclarationsFrom(enumConstructor)
val newConstructor = this val newConstructor = this
@@ -398,7 +398,12 @@ 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.irFactory.buildFun {
name = Name.identifier("${irClass.name.identifier}_initEntries")
returnType = context.irBuiltIns.unitType
origin = JsIrBuilder.SYNTHESIZED_DECLARATION
}.also {
it.parent = irClass
it.body = context.irFactory.createBlockBody(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())
@@ -414,12 +419,6 @@ class EnumClassCreateInitializerLowering(val context: JsIrBackendContext) : Decl
} }
} }
private fun JsIrDeclarationBuilder.buildFunction(
irClass: IrClass,
name: String,
returnType: IrType
): IrSimpleFunction = buildFunction(name, returnType, irClass)
class EnumEntryCreateGetInstancesFunsLowering(val context: JsIrBackendContext): DeclarationTransformer { class EnumEntryCreateGetInstancesFunsLowering(val context: JsIrBackendContext): DeclarationTransformer {
private var IrEnumEntry.correspondingField by context.mapping.enumEntryToCorrespondingField private var IrEnumEntry.correspondingField by context.mapping.enumEntryToCorrespondingField
@@ -449,11 +448,13 @@ class EnumEntryCreateGetInstancesFunsLowering(val context: JsIrBackendContext):
irClass: IrClass, enumEntry: IrEnumEntry, initEntryInstancesFun: IrSimpleFunction irClass: IrClass, enumEntry: IrEnumEntry, initEntryInstancesFun: IrSimpleFunction
): IrSimpleFunction = ): IrSimpleFunction =
context.mapping.enumEntryToGetInstanceFun.getOrPut(enumEntry) { context.mapping.enumEntryToGetInstanceFun.getOrPut(enumEntry) {
context.jsIrDeclarationBuilder.buildFunction( context.irFactory.buildFun {
irClass, name = Name.identifier(createEntryAccessorName(irClass.name.identifier, enumEntry))
createEntryAccessorName(irClass.name.identifier, enumEntry), returnType = enumEntry.getType(irClass)
enumEntry.getType(irClass) origin = JsIrBuilder.SYNTHESIZED_DECLARATION
) }.apply {
parent = irClass
}
}.also { }.also {
it.body = context.irFactory.createBlockBody(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) {
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.ir.backend.js.JsLoweredDeclarationOrigin
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.buildField import org.jetbrains.kotlin.ir.builders.declarations.buildField
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrClass
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
@@ -111,10 +112,11 @@ class ObjectUsageLowering(
private fun JsCommonBackendContext.getOrCreateGetInstanceFunction(obj: IrClass) = private fun JsCommonBackendContext.getOrCreateGetInstanceFunction(obj: IrClass) =
mapping.objectToGetInstanceFunction.getOrPut(obj) { mapping.objectToGetInstanceFunction.getOrPut(obj) {
jsIrDeclarationBuilder.buildFunction( irFactory.buildFun {
obj.name.asString() + "_getInstance", name = Name.identifier(obj.name.asString() + "_getInstance")
returnType = obj.defaultType, returnType = obj.defaultType
parent = obj.parent,
origin = JsLoweredDeclarationOrigin.OBJECT_GET_INSTANCE_FUNCTION origin = JsLoweredDeclarationOrigin.OBJECT_GET_INSTANCE_FUNCTION
) }.apply {
parent = obj.parent
}
} }
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET 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.builders.declarations.buildFun
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.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
@@ -33,6 +34,7 @@ import org.jetbrains.kotlin.ir.util.parentAsClass
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
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
import org.jetbrains.kotlin.name.Name
class SecondaryConstructorLowering(val context: JsIrBackendContext) : DeclarationTransformer { class SecondaryConstructorLowering(val context: JsIrBackendContext) : DeclarationTransformer {
@@ -167,19 +169,20 @@ private fun JsIrBackendContext.buildInitDeclaration(constructor: IrConstructor,
val constructorName = "${irClass.name}_init" val constructorName = "${irClass.name}_init"
val functionName = "${constructorName}_\$Init\$" val functionName = "${constructorName}_\$Init\$"
return jsIrDeclarationBuilder.buildFunction( return irFactory.buildFun {
functionName, name = Name.identifier(functionName)
type, returnType = type
constructor.parent, visibility = Visibilities.INTERNAL
Visibilities.INTERNAL, modality = Modality.FINAL
Modality.FINAL, isInline = constructor.isInline
constructor.isInline, isExternal = constructor.isExternal
constructor.isExternal origin = JsIrBuilder.SYNTHESIZED_DECLARATION
).also { }.also {
it.parent = constructor.parent
it.copyTypeParametersFrom(constructor.parentAsClass) it.copyTypeParametersFrom(constructor.parentAsClass)
it.valueParameters = constructor.valueParameters.map { p -> p.copyTo(it) } it.valueParameters = constructor.valueParameters.map { p -> p.copyTo(it) }
it.valueParameters += jsIrDeclarationBuilder.buildValueParameter(it, "\$this", constructor.valueParameters.size, type) it.valueParameters += JsIrBuilder.buildValueParameter(it, "\$this", constructor.valueParameters.size, type)
} }
} }
@@ -188,15 +191,15 @@ private fun JsIrBackendContext.buildFactoryDeclaration(constructor: IrConstructo
val constructorName = "${irClass.name}_init" val constructorName = "${irClass.name}_init"
val functionName = "${constructorName}_\$Create\$" val functionName = "${constructorName}_\$Create\$"
return jsIrDeclarationBuilder.buildFunction( return irFactory.buildFun {
functionName, name = Name.identifier(functionName)
type, returnType = type
constructor.parent, visibility = constructor.visibility
constructor.visibility, modality = Modality.FINAL
Modality.FINAL, isInline = constructor.isInline
constructor.isInline, isExternal = constructor.isExternal
constructor.isExternal }.also { factory ->
).also { factory -> factory.parent = constructor.parent
factory.copyTypeParametersFrom(constructor.parentAsClass) factory.copyTypeParametersFrom(constructor.parentAsClass)
factory.valueParameters += constructor.valueParameters.map { p -> p.copyTo(factory) } factory.valueParameters += constructor.valueParameters.map { p -> p.copyTo(factory) }
factory.annotations = constructor.annotations factory.annotations = constructor.annotations
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET 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.builders.declarations.buildFun
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.IrBlockBody
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
@@ -21,6 +22,7 @@ import org.jetbrains.kotlin.ir.util.defaultType
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
import org.jetbrains.kotlin.ir.util.isEffectivelyExternal import org.jetbrains.kotlin.ir.util.isEffectivelyExternal
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
fun generateTests(context: JsIrBackendContext, moduleFragment: IrModuleFragment) { fun generateTests(context: JsIrBackendContext, moduleFragment: IrModuleFragment) {
val generator = TestGenerator(context) { context.createTestContainerFun(moduleFragment) } val generator = TestGenerator(context) { context.createTestContainerFun(moduleFragment) }
@@ -57,7 +59,12 @@ class TestGenerator(val context: JsIrBackendContext, val testContainerFactory: (
): FunctionWithBody { ): FunctionWithBody {
val body = context.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET, 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.irFactory.buildFun {
this.name = Name.identifier("$name test fun")
this.returnType = context.irBuiltIns.anyNType
this.origin = JsIrBuilder.SYNTHESIZED_DECLARATION
}
function.parent = parentFunction
function.body = body function.body = body
val parentBody = parentFunction.body as IrBlockBody val parentBody = parentFunction.body as IrBlockBody
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.backend.js.JsCommonBackendContext import org.jetbrains.kotlin.ir.backend.js.JsCommonBackendContext
import org.jetbrains.kotlin.ir.backend.js.JsMapping import org.jetbrains.kotlin.ir.backend.js.JsMapping
import org.jetbrains.kotlin.ir.backend.js.JsSharedVariablesManager import org.jetbrains.kotlin.ir.backend.js.JsSharedVariablesManager
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.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl
@@ -44,7 +43,6 @@ class WasmBackendContext(
override val lateinitNullableFields = mutableMapOf<IrField, IrField>() override val lateinitNullableFields = mutableMapOf<IrField, IrField>()
override val extractedLocalClasses: MutableSet<IrClass> = hashSetOf() override val extractedLocalClasses: MutableSet<IrClass> = hashSetOf()
override val irFactory: IrFactory = IrFactoryImpl override val irFactory: IrFactory = IrFactoryImpl
override val jsIrDeclarationBuilder: JsIrDeclarationBuilder = JsIrDeclarationBuilder(irFactory)
// Place to store declarations excluded from code generation // Place to store declarations excluded from code generation
val excludedDeclarations: IrPackageFragment by lazy { val excludedDeclarations: IrPackageFragment by lazy {