IrTypes: update minor utilities

This commit is contained in:
Dmitry Petrov
2018-05-15 15:35:57 +03:00
parent e8fe788df6
commit c22f6dee4a
4 changed files with 39 additions and 23 deletions
@@ -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")