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.IrElement
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.builders.declarations.buildVariable
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl
|
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.WrappedSimpleFunctionDescriptor
|
||||||
import org.jetbrains.kotlin.ir.descriptors.WrappedVariableDescriptor
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrReturnableBlockSymbolImpl
|
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.IrSimpleType
|
||||||
import org.jetbrains.kotlin.ir.types.IrType
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
@@ -210,13 +210,10 @@ class FinallyBlocksLowering(val context: CommonBackendContext, private val throw
|
|||||||
val transformer = this
|
val transformer = this
|
||||||
irBuilder.run {
|
irBuilder.run {
|
||||||
val transformedFinallyExpression = finallyExpression.transform(transformer, null)
|
val transformedFinallyExpression = finallyExpression.transform(transformer, null)
|
||||||
val parameter = WrappedVariableDescriptor()
|
val catchParameter = buildVariable(
|
||||||
val catchParameter = IrVariableImpl(
|
scope.getLocalDeclarationParent(), startOffset, endOffset, IrDeclarationOrigin.CATCH_PARAMETER, Name.identifier("t"),
|
||||||
startOffset, endOffset, IrDeclarationOrigin.CATCH_PARAMETER, IrVariableSymbolImpl(parameter),
|
throwableType
|
||||||
Name.identifier("t"), throwableType, isVar = false, isConst = false, isLateinit = false
|
)
|
||||||
).also { parameter.bind(it) }
|
|
||||||
|
|
||||||
catchParameter.parent = scope.getLocalDeclarationParent()
|
|
||||||
|
|
||||||
val syntheticTry = IrTryImpl(
|
val syntheticTry = IrTryImpl(
|
||||||
startOffset = startOffset,
|
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.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.buildField
|
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.*
|
||||||
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.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
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.isMarkedNullable
|
||||||
import org.jetbrains.kotlin.ir.types.isPrimitiveType
|
import org.jetbrains.kotlin.ir.types.isPrimitiveType
|
||||||
import org.jetbrains.kotlin.ir.types.makeNullable
|
import org.jetbrains.kotlin.ir.types.makeNullable
|
||||||
@@ -118,21 +116,15 @@ class LateinitUsageLowering(val backendContext: CommonBackendContext) : BodyLowe
|
|||||||
|
|
||||||
if (!declaration.isLateinit) return declaration
|
if (!declaration.isLateinit) return declaration
|
||||||
|
|
||||||
val descriptor = WrappedVariableDescriptor()
|
val newVar = buildVariable(
|
||||||
val type = declaration.type.makeNullable()
|
declaration.parent,
|
||||||
val newVar = IrVariableImpl(
|
|
||||||
declaration.startOffset,
|
declaration.startOffset,
|
||||||
declaration.endOffset,
|
declaration.endOffset,
|
||||||
declaration.origin,
|
declaration.origin,
|
||||||
IrVariableSymbolImpl(descriptor),
|
|
||||||
declaration.name,
|
declaration.name,
|
||||||
type,
|
declaration.type.makeNullable(),
|
||||||
isVar = true,
|
isVar = true,
|
||||||
isConst = false,
|
|
||||||
isLateinit = true
|
|
||||||
).also {
|
).also {
|
||||||
descriptor.bind(it)
|
|
||||||
it.parent = declaration.parent
|
|
||||||
it.initializer =
|
it.initializer =
|
||||||
IrConstImpl.constNull(declaration.startOffset, declaration.endOffset, backendContext.irBuiltIns.nothingNType)
|
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.IrElement
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
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.IrDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
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.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrLoop
|
import org.jetbrains.kotlin.ir.expressions.IrLoop
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
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.IrClassSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl
|
|
||||||
import org.jetbrains.kotlin.ir.types.IrType
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
|
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
@@ -65,25 +66,13 @@ fun Scope.createTmpVariable(
|
|||||||
origin: IrDeclarationOrigin = IrDeclarationOrigin.IR_TEMPORARY_VARIABLE,
|
origin: IrDeclarationOrigin = IrDeclarationOrigin.IR_TEMPORARY_VARIABLE,
|
||||||
startOffset: Int = UNDEFINED_OFFSET,
|
startOffset: Int = UNDEFINED_OFFSET,
|
||||||
endOffset: Int = UNDEFINED_OFFSET
|
endOffset: Int = UNDEFINED_OFFSET
|
||||||
): IrVariable {
|
): IrVariable =
|
||||||
val descriptor = WrappedVariableDescriptor()
|
buildVariable(
|
||||||
val symbol = IrVariableSymbolImpl(descriptor)
|
getLocalDeclarationParent(), startOffset, endOffset, origin, Name.identifier(nameHint ?: "tmp"),
|
||||||
return IrVariableImpl(
|
irType, isMutable
|
||||||
startOffset,
|
|
||||||
endOffset,
|
|
||||||
origin,
|
|
||||||
symbol,
|
|
||||||
Name.identifier(nameHint ?: "tmp"),
|
|
||||||
irType,
|
|
||||||
isMutable,
|
|
||||||
isConst = false,
|
|
||||||
isLateinit = false
|
|
||||||
).apply {
|
).apply {
|
||||||
this.initializer = initializer
|
this.initializer = initializer
|
||||||
parent = getLocalDeclarationParent()
|
|
||||||
descriptor.bind(this)
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
fun Scope.createTmpVariable(
|
fun Scope.createTmpVariable(
|
||||||
irExpression: IrExpression,
|
irExpression: IrExpression,
|
||||||
@@ -91,23 +80,10 @@ fun Scope.createTmpVariable(
|
|||||||
isMutable: Boolean = false,
|
isMutable: Boolean = false,
|
||||||
origin: IrDeclarationOrigin = IrDeclarationOrigin.IR_TEMPORARY_VARIABLE,
|
origin: IrDeclarationOrigin = IrDeclarationOrigin.IR_TEMPORARY_VARIABLE,
|
||||||
irType: IrType? = null
|
irType: IrType? = null
|
||||||
): IrVariable {
|
): IrVariable =
|
||||||
val varType = irType ?: irExpression.type
|
buildVariable(
|
||||||
val descriptor = WrappedVariableDescriptor()
|
getLocalDeclarationParent(), irExpression.startOffset, irExpression.endOffset, origin, Name.identifier(nameHint ?: "tmp"),
|
||||||
val symbol = IrVariableSymbolImpl(descriptor)
|
irType ?: irExpression.type, isMutable
|
||||||
return IrVariableImpl(
|
|
||||||
irExpression.startOffset,
|
|
||||||
irExpression.endOffset,
|
|
||||||
origin,
|
|
||||||
symbol,
|
|
||||||
Name.identifier(nameHint ?: "tmp"),
|
|
||||||
varType,
|
|
||||||
isMutable,
|
|
||||||
isConst = false,
|
|
||||||
isLateinit = false
|
|
||||||
).apply {
|
).apply {
|
||||||
initializer = irExpression
|
initializer = irExpression
|
||||||
parent = getLocalDeclarationParent()
|
|
||||||
descriptor.bind(this)
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
+24
@@ -337,3 +337,27 @@ fun IrTypeParametersContainer.addTypeParameter(name: String, upperBound: IrType,
|
|||||||
this.variance = variance
|
this.variance = variance
|
||||||
this.superTypes.add(upperBound)
|
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
|
package org.jetbrains.kotlin.ir.backend.js
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.ir.SharedVariablesManager
|
import org.jetbrains.kotlin.backend.common.ir.SharedVariablesManager
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.builders.declarations.buildVariable
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl
|
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
||||||
import org.jetbrains.kotlin.ir.descriptors.*
|
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrGetValue
|
import org.jetbrains.kotlin.ir.expressions.IrGetValue
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrSetVariable
|
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.IrSimpleFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl
|
|
||||||
|
|
||||||
class JsSharedVariablesManager(context: JsIrBackendContext) : SharedVariablesManager {
|
class JsSharedVariablesManager(context: JsIrBackendContext) : SharedVariablesManager {
|
||||||
|
|
||||||
@@ -44,20 +45,14 @@ class JsSharedVariablesManager(context: JsIrBackendContext) : SharedVariablesMan
|
|||||||
putValueArgument(0, initializer)
|
putValueArgument(0, initializer)
|
||||||
}
|
}
|
||||||
|
|
||||||
val descriptor = WrappedVariableDescriptor()
|
return buildVariable(
|
||||||
return IrVariableImpl(
|
originalDeclaration.parent,
|
||||||
originalDeclaration.startOffset,
|
originalDeclaration.startOffset,
|
||||||
originalDeclaration.endOffset,
|
originalDeclaration.endOffset,
|
||||||
originalDeclaration.origin,
|
originalDeclaration.origin,
|
||||||
IrVariableSymbolImpl(descriptor),
|
|
||||||
originalDeclaration.name,
|
originalDeclaration.name,
|
||||||
dynamicType,
|
dynamicType
|
||||||
isVar = false,
|
|
||||||
isConst = false,
|
|
||||||
isLateinit = false
|
|
||||||
).also {
|
).also {
|
||||||
descriptor.bind(it)
|
|
||||||
it.parent = originalDeclaration.parent
|
|
||||||
it.initializer = irCall
|
it.initializer = irCall
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,19 +11,17 @@ import org.jetbrains.kotlin.descriptors.Visibility
|
|||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.buildValueParameter
|
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.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrAnonymousInitializerImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrAnonymousInitializerImpl
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
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.WrappedClassDescriptor
|
||||||
import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor
|
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.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.*
|
import org.jetbrains.kotlin.ir.symbols.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
|
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.ir.types.IrType
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
@@ -183,23 +181,18 @@ object JsIrBuilder {
|
|||||||
isConst: Boolean = false,
|
isConst: Boolean = false,
|
||||||
isLateinit: Boolean = false,
|
isLateinit: Boolean = false,
|
||||||
initializer: IrExpression? = null
|
initializer: IrExpression? = null
|
||||||
): IrVariable {
|
): IrVariable = buildVariable(
|
||||||
val descriptor = WrappedVariableDescriptor()
|
parent,
|
||||||
return IrVariableImpl(
|
UNDEFINED_OFFSET,
|
||||||
UNDEFINED_OFFSET,
|
UNDEFINED_OFFSET,
|
||||||
UNDEFINED_OFFSET,
|
SYNTHESIZED_DECLARATION,
|
||||||
SYNTHESIZED_DECLARATION,
|
Name.identifier(name),
|
||||||
IrVariableSymbolImpl(descriptor),
|
type,
|
||||||
Name.identifier(name),
|
isVar,
|
||||||
type,
|
isConst,
|
||||||
isVar,
|
isLateinit,
|
||||||
isConst,
|
).also {
|
||||||
isLateinit
|
it.initializer = initializer
|
||||||
).also {
|
|
||||||
descriptor.bind(it)
|
|
||||||
it.initializer = initializer
|
|
||||||
if (parent != null) it.parent = parent
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun buildBreak(type: IrType, loop: IrLoop) = IrBreakImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, loop)
|
fun buildBreak(type: IrType, loop: IrLoop) = IrBreakImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, type, loop)
|
||||||
|
|||||||
Reference in New Issue
Block a user