From 65d3ae625309cf8f92f799adc8aeea98568fc2bb Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 10 Jul 2020 18:54:06 +0200 Subject: [PATCH] JS IR: move declaration creation from IrBuilder to JsIrDeclarationBuilder This is a temporary class until IrDeclarationFactory is there. --- .../ir/backend/js/JsCommonBackendContext.kt | 5 +- .../ir/backend/js/JsIrBackendContext.kt | 7 +- .../kotlin/ir/backend/js/ir/IrBuilder.kt | 89 ++----------------- .../backend/js/ir/JsIrDeclarationBuilder.kt | 84 +++++++++++++++++ .../js/lower/BlockDecomposerLowering.kt | 10 ++- .../backend/js/lower/BridgesConstruction.kt | 7 +- ...AddInternalParametersToConstructorPhase.kt | 4 +- .../js/lower/ES6ConstructorLowering.kt | 7 +- .../ir/backend/js/lower/EnumClassLowering.kt | 38 ++++---- .../backend/js/lower/JsInnerClassesSupport.kt | 12 ++- .../ir/backend/js/lower/ObjectLowering.kt | 6 +- .../backend/js/lower/SecondaryCtorLowering.kt | 10 +-- .../ir/backend/js/lower/TestGenerator.kt | 2 +- .../kotlin/backend/wasm/WasmBackendContext.kt | 6 +- 14 files changed, 156 insertions(+), 131 deletions(-) create mode 100644 compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/JsIrDeclarationBuilder.kt diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsCommonBackendContext.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsCommonBackendContext.kt index 6cd5a693d68..970b6b8a6f8 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsCommonBackendContext.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsCommonBackendContext.kt @@ -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 -} \ No newline at end of file +} diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt index 622823e821c..7d4cfa27805 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt @@ -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() @@ -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 } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/IrBuilder.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/IrBuilder.kt index 06e509f486f..f319d5fd9b6 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/IrBuilder.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/IrBuilder.kt @@ -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) -} \ No newline at end of file +} diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/JsIrDeclarationBuilder.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/JsIrDeclarationBuilder.kt new file mode 100644 index 00000000000..b30ceef027f --- /dev/null +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/JsIrDeclarationBuilder.kt @@ -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 + } +} diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt index b9068a987b2..67368ef5727 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt @@ -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, diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BridgesConstruction.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BridgesConstruction.kt index eff3db86ad9..c1769befec1 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BridgesConstruction.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BridgesConstruction.kt @@ -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, diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6AddInternalParametersToConstructorPhase.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6AddInternalParametersToConstructorPhase.kt index 8748bec0614..c36fb9fad20 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6AddInternalParametersToConstructorPhase.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6AddInternalParametersToConstructorPhase.kt @@ -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, diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt index d3eccfb77aa..5bd64f10c1a 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt @@ -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 diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt index 861bb24df3c..275241aeb49 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt @@ -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 { diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/JsInnerClassesSupport.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/JsInnerClassesSupport.kt index c5d9ba5d129..2b4b1511a56 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/JsInnerClassesSupport.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/JsInnerClassesSupport.kt @@ -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) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ObjectLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ObjectLowering.kt index b9bf21f9cc5..ef2eaf52be3 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ObjectLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ObjectLowering.kt @@ -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 ) - } \ No newline at end of file + } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/SecondaryCtorLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/SecondaryCtorLowering.kt index e539bb77ab6..f2d585cc081 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/SecondaryCtorLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/SecondaryCtorLowering.kt @@ -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, diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TestGenerator.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TestGenerator.kt index bf4f0a64a57..41c79a8ce31 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TestGenerator.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/TestGenerator.kt @@ -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 diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt index abcb3d4b920..fd355a8866a 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt @@ -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() override val lateinitNullableFields = mutableMapOf() override val extractedLocalClasses: MutableSet = hashSetOf() + override val jsIrDeclarationBuilder: JsIrDeclarationBuilder = JsIrDeclarationBuilder() // Place to store declarations excluded from code generation val excludedDeclarations: IrPackageFragment by lazy {