From 1e02fa3db9a2edea174af188024ac99340158efa Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Fri, 21 Feb 2020 17:09:35 +0300 Subject: [PATCH] [JS IR BE] Create temporary variables with wrapped descriptors. --- .../backend/common/lower/LateinitLowering.kt | 2 +- .../common/lower/ReturnableBlockLowering.kt | 2 +- .../kotlin/ir/builders/IrBuilders.kt | 29 +++++++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt index 3e035ceb511..2ba29d109c2 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt @@ -81,7 +81,7 @@ class NullableFieldsDeclarationLowering(val backendContext: CommonBackendContext getter.body = IrBlockBodyImpl(startOffset, endOffset) { val irBuilder = backendContext.createIrBuilder(getter.symbol, startOffset, endOffset) irBuilder.run { - val resultVar = scope.createTemporaryVariable( + val resultVar = scope.createTmpVariable( irGetField(getter.dispatchReceiverParameter?.let { irGet(it) }, backingField) ) resultVar.parent = getter diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ReturnableBlockLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ReturnableBlockLowering.kt index b91966477bd..bd9786dbb15 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ReturnableBlockLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ReturnableBlockLowering.kt @@ -86,7 +86,7 @@ class ReturnableBlockTransformer(val context: CommonBackendContext, val containe val scopeSymbol = currentScope?.scope?.scopeOwnerSymbol ?: containerSymbol val builder = context.createIrBuilder(scopeSymbol!!) val variable by lazy { - builder.scope.createTemporaryVariableDeclaration(expression.type, "tmp\$ret\$${labelCnt++}", true) + builder.scope.createTmpVariable(expression.type, "tmp\$ret\$${labelCnt++}", true) } val loop by lazy { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/IrBuilders.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/IrBuilders.kt index a2199611bec..af17daa33dc 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/IrBuilders.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/IrBuilders.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.ir.builders import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrVariable import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl @@ -56,6 +57,34 @@ fun IrStatementsBuilder.createTmpVariable( return variable } +fun Scope.createTmpVariable( + irType: IrType, + nameHint: String? = null, + isMutable: Boolean = false, + initializer: IrExpression? = null, + origin: IrDeclarationOrigin = IrDeclarationOrigin.IR_TEMPORARY_VARIABLE, + startOffset: Int = UNDEFINED_OFFSET, + endOffset: Int = UNDEFINED_OFFSET +): IrVariable { + val descriptor = WrappedVariableDescriptor() + val symbol = IrVariableSymbolImpl(descriptor) + return IrVariableImpl( + startOffset, + endOffset, + origin, + symbol, + Name.identifier(nameHint ?: "tmp"), + irType, + isMutable, + isConst = false, + isLateinit = false + ).apply { + this.initializer = initializer + parent = getLocalDeclarationParent() + descriptor.bind(this) + } +} + fun Scope.createTmpVariable( irExpression: IrExpression, nameHint: String? = null,