JS IR: move declaration creation from IrBuilder to JsIrDeclarationBuilder

This is a temporary class until IrDeclarationFactory is there.
This commit is contained in:
Alexander Udalov
2020-07-10 18:54:06 +02:00
parent d3a34a8898
commit 65d3ae6253
14 changed files with 156 additions and 131 deletions
@@ -6,10 +6,13 @@
package org.jetbrains.kotlin.ir.backend.js
import org.jetbrains.kotlin.backend.common.CommonBackendContext
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrDeclarationBuilder
interface JsCommonBackendContext : CommonBackendContext {
override val mapping: JsMapping
val jsIrDeclarationBuilder: JsIrDeclarationBuilder
val es6mode: Boolean
get() = false
}
}
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.ir.backend.js
import org.jetbrains.kotlin.backend.common.atMostOne
import org.jetbrains.kotlin.backend.common.ir.Ir
import org.jetbrains.kotlin.backend.common.ir.Symbols
import org.jetbrains.kotlin.ir.backend.js.lower.JsInnerClassesSupport
import org.jetbrains.kotlin.builtins.PrimitiveType
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.descriptors.*
@@ -16,6 +15,8 @@ import org.jetbrains.kotlin.descriptors.impl.EmptyPackageFragmentDescriptor
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
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.lower.JsInnerClassesSupport
import org.jetbrains.kotlin.ir.backend.js.utils.OperatorNames
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl
@@ -53,6 +54,8 @@ class JsIrBackendContext(
override var inVerbosePhase: Boolean = false
override val jsIrDeclarationBuilder: JsIrDeclarationBuilder = JsIrDeclarationBuilder()
val devMode = configuration[JSConfigurationKeys.DEVELOPER_MODE] ?: false
val externalPackageFragment = mutableMapOf<IrFileSymbol, IrFile>()
@@ -123,7 +126,7 @@ class JsIrBackendContext(
fun createTestContainerFun(module: IrModuleFragment): IrSimpleFunction {
return testContainerFuns.getOrPut(module) {
val file = syntheticFile("tests", module)
JsIrBuilder.buildFunction("test fun", irBuiltIns.unitType, file).apply {
jsIrDeclarationBuilder.buildFunction("test fun", irBuiltIns.unitType, file).apply {
body = JsIrBuilder.buildBlockBody(emptyList())
file.declarations += this
}
@@ -5,21 +5,16 @@
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.IrStatement
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.builders.declarations.buildValueParameter
import org.jetbrains.kotlin.ir.builders.declarations.buildVariable
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrAnonymousInitializerImpl
import org.jetbrains.kotlin.ir.descriptors.WrappedClassDescriptor
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginImpl
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.impl.*
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
@@ -51,80 +46,6 @@ object JsIrBuilder {
fun buildThrow(type: IrType, value: IrExpression) = IrThrowImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, value)
fun buildValueParameter(parent: IrDeclarationParent, 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 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,
isFakeOverride: Boolean = false,
origin: IrDeclarationOrigin = SYNTHESIZED_DECLARATION
) = buildFunction(
Name.identifier(name),
returnType,
parent,
visibility,
modality,
isInline = isInline,
isExternal = isExternal,
isTailrec = isTailrec,
isSuspend = isSuspend,
isExpect = isExpect,
isFakeOverride = isFakeOverride,
origin = 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 = SYNTHESIZED_DECLARATION
): IrSimpleFunction = 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
}
fun buildAnonymousInitializer() =
IrAnonymousInitializerImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, SYNTHESIZED_DECLARATION, IrAnonymousInitializerSymbolImpl(
WrappedClassDescriptor()
))
fun buildGetObjectValue(type: IrType, classSymbol: IrClassSymbol) =
IrGetObjectValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, classSymbol)
@@ -232,4 +153,4 @@ object JsIrBuilder {
fun buildString(type: IrType, s: String) = IrConstImpl.string(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, s)
fun buildTry(type: IrType) = IrTryImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type)
fun buildCatch(ex: IrVariable, block: IrBlockImpl) = IrCatchImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, ex, block)
}
}
@@ -0,0 +1,84 @@
/*
* 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.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
// This is a temporary class for migration to IrDeclarationFactory. Usages should be refactored to use the factory directly once possible,
// since it doesn't add sufficient value on its own.
class JsIrDeclarationBuilder {
fun buildValueParameter(parent: IrDeclarationParent, 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 = 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
}
}
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.common.ir.isElseBranch
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.backend.js.JsCommonBackendContext
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
import org.jetbrains.kotlin.ir.backend.js.utils.isPure
@@ -18,7 +19,9 @@ import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.util.dump
import org.jetbrains.kotlin.ir.util.patchDeclarationParents
import org.jetbrains.kotlin.ir.util.transformFlat
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
@@ -30,7 +33,7 @@ class JsBlockDecomposerLowering(val context: JsIrBackendContext) : AbstractBlock
}
abstract class AbstractBlockDecomposerLowering(
context: CommonBackendContext
private val context: JsCommonBackendContext
) : BodyLoweringPass {
private val nothingType = context.irBuiltIns.nothingType
@@ -48,8 +51,7 @@ abstract class AbstractBlockDecomposerLowering(
}
is IrField -> {
container.initializer?.apply {
val initFunction = JsIrBuilder.buildFunction(
val initFunction = context.jsIrDeclarationBuilder.buildFunction(
container.name.asString() + "\$init\$",
container.type,
container.parent,
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.ir.backend.js.lower
import org.jetbrains.kotlin.backend.common.CommonBackendContext
import org.jetbrains.kotlin.backend.common.DeclarationTransformer
import org.jetbrains.kotlin.backend.common.bridges.FunctionHandle
import org.jetbrains.kotlin.backend.common.bridges.generateBridges
@@ -14,8 +13,8 @@ import org.jetbrains.kotlin.backend.common.lower.*
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.backend.js.JsCommonBackendContext
import org.jetbrains.kotlin.ir.backend.js.JsLoweredDeclarationOrigin
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
import org.jetbrains.kotlin.ir.backend.js.utils.functionSignature
import org.jetbrains.kotlin.ir.backend.js.utils.getJsName
import org.jetbrains.kotlin.ir.builders.*
@@ -46,7 +45,7 @@ import org.jetbrains.kotlin.ir.util.*
// }
//
@OptIn(ObsoleteDescriptorBasedAPI::class)
class BridgesConstruction(val context: CommonBackendContext) : DeclarationTransformer {
class BridgesConstruction(val context: JsCommonBackendContext) : DeclarationTransformer {
private val specialBridgeMethods = SpecialBridgeMethods(context)
@@ -119,7 +118,7 @@ class BridgesConstruction(val context: CommonBackendContext) : DeclarationTransf
IrDeclarationOrigin.BRIDGE
// TODO: Support offsets for debug info
val irFunction = JsIrBuilder.buildFunction(
val irFunction = context.jsIrDeclarationBuilder.buildFunction(
bridge.name,
bridge.returnType,
function.parent,
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
import org.jetbrains.kotlin.ir.backend.js.lower.PrimaryConstructorLowering.*
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.declarations.*
import org.jetbrains.kotlin.ir.expressions.*
@@ -103,7 +103,7 @@ class ES6AddInternalParametersToConstructorPhase(val context: JsIrBackendContext
private fun buildInitFunction(constructor: IrConstructor, irClass: IrClass): IrSimpleFunction {
val functionName = "${irClass.name}_init"
return JsIrBuilder.buildFunction(
return context.jsIrDeclarationBuilder.buildFunction(
functionName,
context.irBuiltIns.unitType,
irClass,
@@ -11,8 +11,9 @@ 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.ir.JsIrBuilder
import org.jetbrains.kotlin.ir.backend.js.lower.ES6AddInternalParametersToConstructorPhase.*
import org.jetbrains.kotlin.ir.backend.js.lower.PrimaryConstructorLowering.*
import org.jetbrains.kotlin.ir.backend.js.lower.ES6AddInternalParametersToConstructorPhase.ES6_INIT_BOX_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.builders.declarations.addValueParameter
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.*
@@ -538,7 +539,7 @@ private fun getSuperCall(constructor: IrConstructor): IrDelegatingConstructorCal
}
private fun changeIrConstructorToIrFunction(context: JsIrBackendContext, container: IrConstructor) {
val newConstructor = JsIrBuilder.buildFunction(
val newConstructor = context.jsIrDeclarationBuilder.buildFunction(
"${container.parentAsClass.name}_constructor",
container.returnType,
container.parent
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.backend.js.JsCommonBackendContext
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.JsIrDeclarationBuilder
import org.jetbrains.kotlin.ir.backend.js.utils.toJsArrayLiteral
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
@@ -121,8 +122,8 @@ class EnumClassConstructorLowering(val context: JsCommonBackendContext) : Declar
returnType = enumConstructor.returnType
}.apply {
parent = enumClass
valueParameters += JsIrBuilder.buildValueParameter(this, "name", 0, context.irBuiltIns.stringType)
valueParameters += JsIrBuilder.buildValueParameter(this, "ordinal", 1, context.irBuiltIns.intType)
valueParameters += context.jsIrDeclarationBuilder.buildValueParameter(this, "name", 0, context.irBuiltIns.stringType)
valueParameters += context.jsIrDeclarationBuilder.buildValueParameter(this, "ordinal", 1, context.irBuiltIns.intType)
copyParameterDeclarationsFrom(enumConstructor)
val newConstructor = this
@@ -399,7 +400,7 @@ class EnumClassCreateInitializerLowering(val context: JsIrBackendContext) : Decl
}
private fun createInitEntryInstancesFun(irClass: IrClass, entryInstancesInitializedField: IrField): IrSimpleFunction =
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) {
statements += context.createIrBuilder(it.symbol).irBlockBody(it) {
+irIfThen(irGetField(null, entryInstancesInitializedField), irReturnUnit())
@@ -415,11 +416,11 @@ class EnumClassCreateInitializerLowering(val context: JsIrBackendContext) : Decl
}
}
private fun buildFunction(
private fun JsIrDeclarationBuilder.buildFunction(
irClass: IrClass,
name: String,
returnType: IrType
) = JsIrBuilder.buildFunction(name, returnType, irClass)
): IrSimpleFunction = buildFunction(name, returnType, irClass)
class EnumEntryCreateGetInstancesFunsLowering(val context: JsIrBackendContext): DeclarationTransformer {
@@ -446,18 +447,23 @@ class EnumEntryCreateGetInstancesFunsLowering(val context: JsIrBackendContext):
return null
}
private fun createGetEntryInstanceFun(irClass: IrClass, enumEntry: IrEnumEntry, initEntryInstancesFun: IrSimpleFunction): IrSimpleFunction {
return context.mapping.enumEntryToGetInstanceFun.getOrPut(enumEntry) { buildFunction(irClass, createEntryAccessorName(irClass.name.identifier, enumEntry), enumEntry.getType(irClass)) }
.also {
it.body = IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET) {
statements += context.createIrBuilder(it.symbol).irBlockBody(it) {
+irCall(initEntryInstancesFun)
+irReturn(irGetField(null, enumEntry.correspondingField!!))
}.statements
}
private fun createGetEntryInstanceFun(
irClass: IrClass, enumEntry: IrEnumEntry, initEntryInstancesFun: IrSimpleFunction
): IrSimpleFunction =
context.mapping.enumEntryToGetInstanceFun.getOrPut(enumEntry) {
context.jsIrDeclarationBuilder.buildFunction(
irClass,
createEntryAccessorName(irClass.name.identifier, enumEntry),
enumEntry.getType(irClass)
)
}.also {
it.body = IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET) {
statements += context.createIrBuilder(it.symbol).irBlockBody(it) {
+irCall(initEntryInstancesFun)
+irReturn(irGetField(null, enumEntry.correspondingField!!))
}.statements
}
}
}
}
class EnumSyntheticFunctionsLowering(val context: JsIrBackendContext): DeclarationTransformer {
@@ -12,10 +12,11 @@ import org.jetbrains.kotlin.backend.common.ir.copyTypeParametersFrom
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.backend.js.JsMapping
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder.SYNTHESIZED_DECLARATION
import org.jetbrains.kotlin.ir.backend.js.utils.Namer
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
import org.jetbrains.kotlin.ir.builders.declarations.buildField
import org.jetbrains.kotlin.ir.builders.declarations.buildValueParameter
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.declarations.IrField
@@ -82,9 +83,12 @@ class JsInnerClassesSupport(mapping: JsMapping) : InnerClassesSupport {
newConstructor.copyTypeParametersFrom(oldConstructor)
val outerThisValueParameter = JsIrBuilder.buildValueParameter(newConstructor, Namer.OUTER_NAME, 0, outerThisType)
val newValueParameters = mutableListOf(outerThisValueParameter)
val newValueParameters = mutableListOf(buildValueParameter(newConstructor) {
origin = SYNTHESIZED_DECLARATION
name = Name.identifier(Namer.OUTER_NAME)
index = 0
type = outerThisType
})
for (p in oldConstructor.valueParameters) {
newValueParameters += p.copyTo(newConstructor, index = p.index + 1)
@@ -106,11 +106,11 @@ class ObjectUsageLowering(
}
}
fun JsCommonBackendContext.getOrCreateGetInstanceFunction(obj: IrClass) =
private fun JsCommonBackendContext.getOrCreateGetInstanceFunction(obj: IrClass) =
mapping.objectToGetInstanceFunction.getOrPut(obj) {
JsIrBuilder.buildFunction(
jsIrDeclarationBuilder.buildFunction(
obj.name.asString() + "_getInstance",
returnType = obj.defaultType,
parent = obj.parent
)
}
}
@@ -159,12 +159,12 @@ class SecondaryConstructorLowering(val context: JsIrBackendContext) : Declaratio
private fun IrTypeParameter.toIrType() = IrSimpleTypeImpl(symbol, true, emptyList(), emptyList())
private fun buildInitDeclaration(constructor: IrConstructor, irClass: IrClass): IrSimpleFunction {
private fun JsIrBackendContext.buildInitDeclaration(constructor: IrConstructor, irClass: IrClass): IrSimpleFunction {
val type = irClass.defaultType
val constructorName = "${irClass.name}_init"
val functionName = "${constructorName}_\$Init\$"
return JsIrBuilder.buildFunction(
return jsIrDeclarationBuilder.buildFunction(
functionName,
type,
constructor.parent,
@@ -176,16 +176,16 @@ private fun buildInitDeclaration(constructor: IrConstructor, irClass: IrClass):
it.copyTypeParametersFrom(constructor.parentAsClass)
it.valueParameters = constructor.valueParameters.map { p -> p.copyTo(it) }
it.valueParameters += JsIrBuilder.buildValueParameter(it, "\$this", constructor.valueParameters.size, type)
it.valueParameters += jsIrDeclarationBuilder.buildValueParameter(it, "\$this", constructor.valueParameters.size, type)
}
}
private fun buildFactoryDeclaration(constructor: IrConstructor, irClass: IrClass): IrSimpleFunction {
private fun JsIrBackendContext.buildFactoryDeclaration(constructor: IrConstructor, irClass: IrClass): IrSimpleFunction {
val type = irClass.defaultType
val constructorName = "${irClass.name}_init"
val functionName = "${constructorName}_\$Create\$"
return JsIrBuilder.buildFunction(
return jsIrDeclarationBuilder.buildFunction(
functionName,
type,
constructor.parent,
@@ -56,7 +56,7 @@ class TestGenerator(val context: JsIrBackendContext, val testContainerFactory: (
): FunctionWithBody {
val body = JsIrBuilder.buildBlockBody(emptyList())
val function = JsIrBuilder.buildFunction("$name test fun", context.irBuiltIns.anyNType, parentFunction)
val function = context.jsIrDeclarationBuilder.buildFunction("$name test fun", context.irBuiltIns.anyNType, parentFunction)
function.body = body
val parentBody = parentFunction.body as IrBlockBody
@@ -7,15 +7,16 @@ package org.jetbrains.kotlin.backend.wasm
import org.jetbrains.kotlin.backend.common.ir.Ir
import org.jetbrains.kotlin.backend.common.ir.Symbols
import org.jetbrains.kotlin.ir.backend.js.lower.JsInnerClassesSupport
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.backend.js.JsCommonBackendContext
import org.jetbrains.kotlin.ir.backend.js.JsMapping
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.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
@@ -41,6 +42,7 @@ class WasmBackendContext(
override val transformedFunction = mutableMapOf<IrFunctionSymbol, IrSimpleFunctionSymbol>()
override val lateinitNullableFields = mutableMapOf<IrField, IrField>()
override val extractedLocalClasses: MutableSet<IrClass> = hashSetOf()
override val jsIrDeclarationBuilder: JsIrDeclarationBuilder = JsIrDeclarationBuilder()
// Place to store declarations excluded from code generation
val excludedDeclarations: IrPackageFragment by lazy {