IR: introduce buildVariable, use where possible

This commit is contained in:
Alexander Udalov
2020-07-08 13:50:53 +02:00
parent c3560e5854
commit 39e38c7049
6 changed files with 71 additions and 94 deletions
@@ -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,
@@ -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)
}
@@ -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)
}
}
@@ -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
}
}
}
@@ -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
}
}
@@ -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)