From 39e38c70493eb988996196daeff71e6bff40e98b Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 8 Jul 2020 13:50:53 +0200 Subject: [PATCH] IR: introduce buildVariable, use where possible --- .../common/lower/FinallyBlocksLowering.kt | 19 +++---- .../backend/common/lower/LateinitLowering.kt | 16 ++---- .../kotlin/ir/builders/IrBuilders.kt | 50 +++++-------------- .../declarations/declarationBuilders.kt | 24 +++++++++ .../ir/backend/js/JsSharedVariablesManager.kt | 23 ++++----- .../kotlin/ir/backend/js/ir/IrBuilder.kt | 33 +++++------- 6 files changed, 71 insertions(+), 94 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FinallyBlocksLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FinallyBlocksLowering.kt index 9150e6484a8..22c53cde2cd 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FinallyBlocksLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/FinallyBlocksLowering.kt @@ -10,16 +10,16 @@ import org.jetbrains.kotlin.backend.common.ir.returnType import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.builders.* -import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl +import org.jetbrains.kotlin.ir.builders.declarations.buildVariable +import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin +import org.jetbrains.kotlin.ir.declarations.IrFile +import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor -import org.jetbrains.kotlin.ir.descriptors.WrappedVariableDescriptor import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol import org.jetbrains.kotlin.ir.symbols.impl.IrReturnableBlockSymbolImpl -import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl import org.jetbrains.kotlin.ir.types.IrSimpleType import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid @@ -210,13 +210,10 @@ class FinallyBlocksLowering(val context: CommonBackendContext, private val throw val transformer = this irBuilder.run { val transformedFinallyExpression = finallyExpression.transform(transformer, null) - val parameter = WrappedVariableDescriptor() - val catchParameter = IrVariableImpl( - startOffset, endOffset, IrDeclarationOrigin.CATCH_PARAMETER, IrVariableSymbolImpl(parameter), - Name.identifier("t"), throwableType, isVar = false, isConst = false, isLateinit = false - ).also { parameter.bind(it) } - - catchParameter.parent = scope.getLocalDeclarationParent() + val catchParameter = buildVariable( + scope.getLocalDeclarationParent(), startOffset, endOffset, IrDeclarationOrigin.CATCH_PARAMETER, Name.identifier("t"), + throwableType + ) val syntheticTry = IrTryImpl( startOffset = startOffset, 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 7d2868e97ef..786ccbe8a10 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 @@ -21,12 +21,10 @@ import org.jetbrains.kotlin.backend.common.ir.Symbols import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.declarations.buildField +import org.jetbrains.kotlin.ir.builders.declarations.buildVariable import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl -import org.jetbrains.kotlin.ir.descriptors.WrappedVariableDescriptor import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* -import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl import org.jetbrains.kotlin.ir.types.isMarkedNullable import org.jetbrains.kotlin.ir.types.isPrimitiveType import org.jetbrains.kotlin.ir.types.makeNullable @@ -118,21 +116,15 @@ class LateinitUsageLowering(val backendContext: CommonBackendContext) : BodyLowe if (!declaration.isLateinit) return declaration - val descriptor = WrappedVariableDescriptor() - val type = declaration.type.makeNullable() - val newVar = IrVariableImpl( + val newVar = buildVariable( + declaration.parent, declaration.startOffset, declaration.endOffset, declaration.origin, - IrVariableSymbolImpl(descriptor), declaration.name, - type, + declaration.type.makeNullable(), isVar = true, - isConst = false, - isLateinit = true ).also { - descriptor.bind(it) - it.parent = declaration.parent it.initializer = IrConstImpl.constNull(declaration.startOffset, declaration.endOffset, backendContext.irBuiltIns.nothingNType) } 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 af17daa33dc..264a45285ee 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 @@ -18,16 +18,17 @@ package org.jetbrains.kotlin.ir.builders import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET +import org.jetbrains.kotlin.ir.builders.declarations.buildVariable import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrVariable -import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl -import org.jetbrains.kotlin.ir.descriptors.WrappedVariableDescriptor import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrLoop import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin -import org.jetbrains.kotlin.ir.expressions.impl.* +import org.jetbrains.kotlin.ir.expressions.impl.IrBreakImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrContinueImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrGetObjectValueImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrWhileLoopImpl import org.jetbrains.kotlin.ir.symbols.IrClassSymbol -import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl import org.jetbrains.kotlin.name.Name @@ -65,25 +66,13 @@ fun Scope.createTmpVariable( 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 +): IrVariable = + buildVariable( + getLocalDeclarationParent(), startOffset, endOffset, origin, Name.identifier(nameHint ?: "tmp"), + irType, isMutable ).apply { this.initializer = initializer - parent = getLocalDeclarationParent() - descriptor.bind(this) } -} fun Scope.createTmpVariable( irExpression: IrExpression, @@ -91,23 +80,10 @@ fun Scope.createTmpVariable( isMutable: Boolean = false, origin: IrDeclarationOrigin = IrDeclarationOrigin.IR_TEMPORARY_VARIABLE, irType: IrType? = null -): IrVariable { - val varType = irType ?: irExpression.type - val descriptor = WrappedVariableDescriptor() - val symbol = IrVariableSymbolImpl(descriptor) - return IrVariableImpl( - irExpression.startOffset, - irExpression.endOffset, - origin, - symbol, - Name.identifier(nameHint ?: "tmp"), - varType, - isMutable, - isConst = false, - isLateinit = false +): IrVariable = + buildVariable( + getLocalDeclarationParent(), irExpression.startOffset, irExpression.endOffset, origin, Name.identifier(nameHint ?: "tmp"), + irType ?: irExpression.type, isMutable ).apply { initializer = irExpression - parent = getLocalDeclarationParent() - descriptor.bind(this) } -} \ No newline at end of file diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt index a293aad1dc5..531bde65f89 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt @@ -337,3 +337,27 @@ fun IrTypeParametersContainer.addTypeParameter(name: String, upperBound: IrType, this.variance = variance this.superTypes.add(upperBound) } + +fun buildVariable( + parent: IrDeclarationParent?, + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + name: Name, + type: IrType, + isVar: Boolean = false, + isConst: Boolean = false, + isLateinit: Boolean = false, +): IrVariable { + val wrappedDescriptor = WrappedVariableDescriptor() + return IrVariableImpl( + startOffset, endOffset, origin, + IrVariableSymbolImpl(wrappedDescriptor), + name, type, isVar, isConst, isLateinit + ).also { + wrappedDescriptor.bind(it) + if (parent != null) { + it.parent = parent + } + } +} diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSharedVariablesManager.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSharedVariablesManager.kt index c0bdffacd60..9a87fbebc40 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSharedVariablesManager.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsSharedVariablesManager.kt @@ -6,16 +6,17 @@ package org.jetbrains.kotlin.ir.backend.js import org.jetbrains.kotlin.backend.common.ir.SharedVariablesManager -import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl -import org.jetbrains.kotlin.ir.descriptors.* +import org.jetbrains.kotlin.ir.builders.declarations.buildVariable +import org.jetbrains.kotlin.ir.declarations.IrVariable +import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrGetValue import org.jetbrains.kotlin.ir.expressions.IrSetVariable -import org.jetbrains.kotlin.ir.expressions.impl.* +import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol -import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl class JsSharedVariablesManager(context: JsIrBackendContext) : SharedVariablesManager { @@ -44,20 +45,14 @@ class JsSharedVariablesManager(context: JsIrBackendContext) : SharedVariablesMan putValueArgument(0, initializer) } - val descriptor = WrappedVariableDescriptor() - return IrVariableImpl( + return buildVariable( + originalDeclaration.parent, originalDeclaration.startOffset, originalDeclaration.endOffset, originalDeclaration.origin, - IrVariableSymbolImpl(descriptor), originalDeclaration.name, - dynamicType, - isVar = false, - isConst = false, - isLateinit = false + dynamicType ).also { - descriptor.bind(it) - it.parent = originalDeclaration.parent it.initializer = irCall } } 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 fb04c442b8a..ac830c9a7ae 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 @@ -11,19 +11,17 @@ 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.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.declarations.impl.IrFunctionImpl -import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl import org.jetbrains.kotlin.ir.descriptors.WrappedClassDescriptor import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor -import org.jetbrains.kotlin.ir.descriptors.WrappedVariableDescriptor 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.symbols.impl.IrSimpleFunctionSymbolImpl -import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.name.Name @@ -183,23 +181,18 @@ object JsIrBuilder { isConst: Boolean = false, isLateinit: Boolean = false, initializer: IrExpression? = null - ): IrVariable { - val descriptor = WrappedVariableDescriptor() - return IrVariableImpl( - UNDEFINED_OFFSET, - UNDEFINED_OFFSET, - SYNTHESIZED_DECLARATION, - IrVariableSymbolImpl(descriptor), - Name.identifier(name), - type, - isVar, - isConst, - isLateinit - ).also { - descriptor.bind(it) - it.initializer = initializer - if (parent != null) it.parent = parent - } + ): IrVariable = buildVariable( + parent, + UNDEFINED_OFFSET, + UNDEFINED_OFFSET, + SYNTHESIZED_DECLARATION, + Name.identifier(name), + type, + isVar, + isConst, + isLateinit, + ).also { + it.initializer = initializer } fun buildBreak(type: IrType, loop: IrLoop) = IrBreakImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, loop)