IR: introduce buildVariable, use where possible
This commit is contained in:
+8
-11
@@ -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,
|
||||
|
||||
+4
-12
@@ -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)
|
||||
}
|
||||
}
|
||||
+24
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+9
-14
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user