IrTypes: update minor utilities
This commit is contained in:
@@ -197,10 +197,6 @@ fun IrBuilderWithScope.irAs(argument: IrExpression, type: IrType) =
|
|||||||
fun IrBuilderWithScope.irImplicitCast(argument: IrExpression, type: IrType) =
|
fun IrBuilderWithScope.irImplicitCast(argument: IrExpression, type: IrType) =
|
||||||
IrTypeOperatorCallImpl(startOffset, endOffset, type, IrTypeOperator.IMPLICIT_CAST, type, type.classifierOrFail, argument)
|
IrTypeOperatorCallImpl(startOffset, endOffset, type, IrTypeOperator.IMPLICIT_CAST, type, type.classifierOrFail, argument)
|
||||||
|
|
||||||
fun IrBuilderWithScope.irImplicitCast(argument: IrExpression, type: IrType, typeClassifier: IrClassifierSymbol) =
|
|
||||||
IrTypeOperatorCallImpl(startOffset, endOffset, type, IrTypeOperator.IMPLICIT_CAST, type, type.classifierOrFail, argument)
|
|
||||||
|
|
||||||
|
|
||||||
fun IrBuilderWithScope.irInt(value: Int) =
|
fun IrBuilderWithScope.irInt(value: Int) =
|
||||||
IrConstImpl.int(startOffset, endOffset, context.irBuiltIns.intType, value)
|
IrConstImpl.int(startOffset, endOffset, context.irBuiltIns.intType, value)
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.ir.declarations.IrFunction
|
|||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
||||||
import org.jetbrains.kotlin.ir.declarations.putDefault
|
import org.jetbrains.kotlin.ir.declarations.putDefault
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
|
|
||||||
// This class can be used by kotlin-native.
|
// This class can be used by kotlin-native.
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
@@ -33,6 +34,7 @@ class IrMemberFunctionBuilder(
|
|||||||
context: IrGeneratorContext,
|
context: IrGeneratorContext,
|
||||||
val irClass: IrClass,
|
val irClass: IrClass,
|
||||||
val function: FunctionDescriptor,
|
val function: FunctionDescriptor,
|
||||||
|
val returnType: IrType,
|
||||||
val origin: IrDeclarationOrigin,
|
val origin: IrDeclarationOrigin,
|
||||||
startOffset: Int = UNDEFINED_OFFSET,
|
startOffset: Int = UNDEFINED_OFFSET,
|
||||||
endOffset: Int = UNDEFINED_OFFSET
|
endOffset: Int = UNDEFINED_OFFSET
|
||||||
@@ -40,7 +42,7 @@ class IrMemberFunctionBuilder(
|
|||||||
lateinit var irFunction: IrFunction
|
lateinit var irFunction: IrFunction
|
||||||
|
|
||||||
inline fun addToClass(body: IrMemberFunctionBuilder.(IrFunction) -> Unit): IrFunction {
|
inline fun addToClass(body: IrMemberFunctionBuilder.(IrFunction) -> Unit): IrFunction {
|
||||||
irFunction = IrFunctionImpl(startOffset, endOffset, origin, function)
|
irFunction = IrFunctionImpl(startOffset, endOffset, origin, function, returnType)
|
||||||
body(irFunction)
|
body(irFunction)
|
||||||
irFunction.body = doBuild()
|
irFunction.body = doBuild()
|
||||||
irClass.declarations.add(irFunction)
|
irClass.declarations.add(irFunction)
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.ir.builders
|
package org.jetbrains.kotlin.ir.builders
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrElseBranch
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrWhen
|
import org.jetbrains.kotlin.ir.expressions.IrWhen
|
||||||
@@ -30,7 +31,7 @@ fun primitiveOp1(
|
|||||||
origin: IrStatementOrigin,
|
origin: IrStatementOrigin,
|
||||||
argument: IrExpression
|
argument: IrExpression
|
||||||
): IrExpression =
|
): IrExpression =
|
||||||
IrUnaryPrimitiveImpl(startOffset, endOffset, origin, primitiveOpSymbol, argument)
|
IrUnaryPrimitiveImpl(startOffset, endOffset, primitiveOpSymbol.owner.returnType, origin, primitiveOpSymbol, argument)
|
||||||
|
|
||||||
fun primitiveOp2(
|
fun primitiveOp2(
|
||||||
startOffset: Int, endOffset: Int,
|
startOffset: Int, endOffset: Int,
|
||||||
@@ -38,10 +39,10 @@ fun primitiveOp2(
|
|||||||
origin: IrStatementOrigin,
|
origin: IrStatementOrigin,
|
||||||
argument1: IrExpression, argument2: IrExpression
|
argument1: IrExpression, argument2: IrExpression
|
||||||
): IrExpression =
|
): IrExpression =
|
||||||
IrBinaryPrimitiveImpl(startOffset, endOffset, origin, primitiveOpSymbol, argument1, argument2)
|
IrBinaryPrimitiveImpl(startOffset, endOffset, primitiveOpSymbol.owner.returnType, origin, primitiveOpSymbol, argument1, argument2)
|
||||||
|
|
||||||
fun IrGeneratorContext.constNull(startOffset: Int, endOffset: Int): IrExpression =
|
fun IrGeneratorContext.constNull(startOffset: Int, endOffset: Int): IrExpression =
|
||||||
IrConstImpl.constNull(startOffset, endOffset, builtIns.nullableNothingType)
|
IrConstImpl.constNull(startOffset, endOffset, irBuiltIns.nothingNType)
|
||||||
|
|
||||||
fun IrGeneratorContext.equalsNull(startOffset: Int, endOffset: Int, argument: IrExpression): IrExpression =
|
fun IrGeneratorContext.equalsNull(startOffset: Int, endOffset: Int, argument: IrExpression): IrExpression =
|
||||||
primitiveOp2(
|
primitiveOp2(
|
||||||
@@ -53,7 +54,19 @@ fun IrGeneratorContext.eqeqeq(startOffset: Int, endOffset: Int, argument1: IrExp
|
|||||||
primitiveOp2(startOffset, endOffset, irBuiltIns.eqeqeqSymbol, IrStatementOrigin.EQEQEQ, argument1, argument2)
|
primitiveOp2(startOffset, endOffset, irBuiltIns.eqeqeqSymbol, IrStatementOrigin.EQEQEQ, argument1, argument2)
|
||||||
|
|
||||||
fun IrGeneratorContext.throwNpe(startOffset: Int, endOffset: Int, origin: IrStatementOrigin): IrExpression =
|
fun IrGeneratorContext.throwNpe(startOffset: Int, endOffset: Int, origin: IrStatementOrigin): IrExpression =
|
||||||
IrNullaryPrimitiveImpl(startOffset, endOffset, origin, irBuiltIns.throwNpeSymbol)
|
IrNullaryPrimitiveImpl(startOffset, endOffset, irBuiltIns.nothingType, origin, irBuiltIns.throwNpeSymbol)
|
||||||
|
|
||||||
|
fun IrGeneratorContext.constTrue(startOffset: Int, endOffset: Int) =
|
||||||
|
IrConstImpl.constTrue(startOffset, endOffset, irBuiltIns.booleanType)
|
||||||
|
|
||||||
|
fun IrGeneratorContext.constFalse(startOffset: Int, endOffset: Int) =
|
||||||
|
IrConstImpl.constFalse(startOffset, endOffset, irBuiltIns.booleanType)
|
||||||
|
|
||||||
|
fun IrGeneratorContext.elseBranch(elseExpr: IrExpression): IrElseBranch {
|
||||||
|
val startOffset = elseExpr.startOffset
|
||||||
|
val endOffset = elseExpr.endOffset
|
||||||
|
return IrElseBranchImpl(startOffset, endOffset, constTrue(startOffset, endOffset), elseExpr)
|
||||||
|
}
|
||||||
|
|
||||||
// a || b == if (a) true else b
|
// a || b == if (a) true else b
|
||||||
fun IrGeneratorContext.oror(
|
fun IrGeneratorContext.oror(
|
||||||
@@ -63,11 +76,10 @@ fun IrGeneratorContext.oror(
|
|||||||
b: IrExpression,
|
b: IrExpression,
|
||||||
origin: IrStatementOrigin = IrStatementOrigin.OROR
|
origin: IrStatementOrigin = IrStatementOrigin.OROR
|
||||||
): IrWhen =
|
): IrWhen =
|
||||||
IrIfThenElseImpl(
|
IrIfThenElseImpl(startOffset, endOffset, irBuiltIns.booleanType, origin).apply {
|
||||||
startOffset, endOffset, builtIns.booleanType,
|
branches.add(IrBranchImpl(a, constTrue(a.startOffset, a.endOffset)))
|
||||||
a, IrConstImpl.constTrue(b.startOffset, b.endOffset, builtIns.booleanType), b,
|
branches.add(elseBranch(b))
|
||||||
origin
|
}
|
||||||
)
|
|
||||||
|
|
||||||
fun IrGeneratorContext.oror(a: IrExpression, b: IrExpression, origin: IrStatementOrigin = IrStatementOrigin.OROR): IrWhen =
|
fun IrGeneratorContext.oror(a: IrExpression, b: IrExpression, origin: IrStatementOrigin = IrStatementOrigin.OROR): IrWhen =
|
||||||
oror(b.startOffset, b.endOffset, a, b, origin)
|
oror(b.startOffset, b.endOffset, a, b, origin)
|
||||||
@@ -83,11 +95,10 @@ fun IrGeneratorContext.andand(
|
|||||||
b: IrExpression,
|
b: IrExpression,
|
||||||
origin: IrStatementOrigin = IrStatementOrigin.ANDAND
|
origin: IrStatementOrigin = IrStatementOrigin.ANDAND
|
||||||
): IrWhen =
|
): IrWhen =
|
||||||
IrIfThenElseImpl(
|
IrIfThenElseImpl(startOffset, endOffset, irBuiltIns.booleanType, origin).apply {
|
||||||
startOffset, endOffset, builtIns.booleanType,
|
branches.add(IrBranchImpl(a, b))
|
||||||
a, b, IrConstImpl.constFalse(b.startOffset, b.endOffset, builtIns.booleanType),
|
branches.add(elseBranch(constFalse(b.startOffset, b.endOffset)))
|
||||||
origin
|
}
|
||||||
)
|
|
||||||
|
|
||||||
fun IrGeneratorContext.andand(a: IrExpression, b: IrExpression, origin: IrStatementOrigin = IrStatementOrigin.ANDAND): IrWhen =
|
fun IrGeneratorContext.andand(a: IrExpression, b: IrExpression, origin: IrStatementOrigin = IrStatementOrigin.ANDAND): IrWhen =
|
||||||
andand(b.startOffset, b.endOffset, a, b, origin)
|
andand(b.startOffset, b.endOffset, a, b, origin)
|
||||||
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
|||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.createFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.impl.createFunctionSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.types.impl.originalKotlinType
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
|
||||||
@@ -42,7 +43,7 @@ class Scope(val scopeOwnerSymbol: IrSymbol) {
|
|||||||
private var lastTemporaryIndex: Int = 0
|
private var lastTemporaryIndex: Int = 0
|
||||||
private fun nextTemporaryIndex(): Int = lastTemporaryIndex++
|
private fun nextTemporaryIndex(): Int = lastTemporaryIndex++
|
||||||
|
|
||||||
fun createDescriptorForTemporaryVariable(
|
private fun createDescriptorForTemporaryVariable(
|
||||||
type: KotlinType,
|
type: KotlinType,
|
||||||
nameHint: String? = null,
|
nameHint: String? = null,
|
||||||
isMutable: Boolean = false
|
isMutable: Boolean = false
|
||||||
@@ -59,12 +60,18 @@ class Scope(val scopeOwnerSymbol: IrSymbol) {
|
|||||||
nameHint: String? = null,
|
nameHint: String? = null,
|
||||||
isMutable: Boolean = false,
|
isMutable: Boolean = false,
|
||||||
origin: IrDeclarationOrigin = IrDeclarationOrigin.IR_TEMPORARY_VARIABLE
|
origin: IrDeclarationOrigin = IrDeclarationOrigin.IR_TEMPORARY_VARIABLE
|
||||||
): IrVariable =
|
): IrVariable {
|
||||||
IrVariableImpl(
|
val originalKotlinType = irExpression.type.originalKotlinType ?: throw AssertionError("No originalKotlinType for $irExpression")
|
||||||
|
return IrVariableImpl(
|
||||||
irExpression.startOffset, irExpression.endOffset, origin,
|
irExpression.startOffset, irExpression.endOffset, origin,
|
||||||
createDescriptorForTemporaryVariable(irExpression.type, nameHint, isMutable),
|
createDescriptorForTemporaryVariable(
|
||||||
|
originalKotlinType,
|
||||||
|
nameHint, isMutable
|
||||||
|
),
|
||||||
|
irExpression.type,
|
||||||
irExpression
|
irExpression
|
||||||
)
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("DeprecatedCallableAddReplaceWith")
|
@Suppress("DeprecatedCallableAddReplaceWith")
|
||||||
|
|||||||
Reference in New Issue
Block a user