IrTypes: basic built-in types

This commit is contained in:
Dmitry Petrov
2018-04-27 14:09:11 +03:00
parent c97697d7a9
commit 0e34ee5270
3 changed files with 103 additions and 14 deletions
@@ -80,7 +80,12 @@ class StatementGenerator(
genStmt().assertCast()
override fun visitExpression(expression: KtExpression, data: Nothing?): IrStatement =
createDummyExpression(expression, expression::class.java.simpleName)
IrErrorExpressionImpl(
expression.startOffset,
expression.endOffset,
context.irBuiltIns.nothingType,
expression::class.java.simpleName
)
override fun visitProperty(property: KtProperty, data: Nothing?): IrStatement {
val variableDescriptor = getOrFail(BindingContext.VARIABLE, property)
@@ -110,7 +115,7 @@ class StatementGenerator(
override fun visitDestructuringDeclaration(multiDeclaration: KtDestructuringDeclaration, data: Nothing?): IrStatement {
val irBlock = IrCompositeImpl(
multiDeclaration.startOffset, multiDeclaration.endOffset,
context.builtIns.unitType, IrStatementOrigin.DESTRUCTURING_DECLARATION
context.irBuiltIns.unitType, IrStatementOrigin.DESTRUCTURING_DECLARATION
)
val ktInitializer = multiDeclaration.initializer!!
val containerValue = scope.createTemporaryVariableInBlock(ktInitializer.genExpr(), irBlock, "container")
@@ -166,11 +171,11 @@ class StatementGenerator(
override fun visitReturnExpression(expression: KtReturnExpression, data: Nothing?): IrStatement {
val returnTarget = getReturnExpressionTarget(expression)
val irReturnedExpression = expression.returnedExpression?.genExpr() ?: IrGetObjectValueImpl(
expression.startOffset, expression.endOffset, context.builtIns.unitType,
expression.startOffset, expression.endOffset, context.irBuiltIns.unitType,
context.symbolTable.referenceClass(context.builtIns.unit)
)
return IrReturnImpl(
expression.startOffset, expression.endOffset, context.builtIns.nothingType,
expression.startOffset, expression.endOffset, context.irBuiltIns.nothingType,
context.symbolTable.referenceFunction(returnTarget), irReturnedExpression
)
}
@@ -202,7 +207,7 @@ class StatementGenerator(
return IrThrowImpl(
expression.startOffset,
expression.endOffset,
context.builtIns.nothingType,
context.irBuiltIns.nothingType,
expression.thrownExpression!!.genExpr()
)
}
@@ -223,7 +228,7 @@ class StatementGenerator(
override fun visitStringTemplateExpression(expression: KtStringTemplateExpression, data: Nothing?): IrStatement {
val entries = expression.entries
val resultType = getInferredTypeWithImplicitCastsOrFail(expression)
val resultType = getInferredTypeWithImplicitCastsOrFail(expression).toIrType()
return when (entries.size) {
1 -> {
val irArg = entries[0].genExpr()
@@ -240,10 +245,10 @@ class StatementGenerator(
}
override fun visitLiteralStringTemplateEntry(entry: KtLiteralStringTemplateEntry, data: Nothing?): IrStatement =
IrConstImpl.string(entry.startOffset, entry.endOffset, context.builtIns.stringType, entry.text)
IrConstImpl.string(entry.startOffset, entry.endOffset, context.irBuiltIns.stringType, entry.text)
override fun visitEscapeStringTemplateEntry(entry: KtEscapeStringTemplateEntry, data: Nothing?): IrStatement =
IrConstImpl.string(entry.startOffset, entry.endOffset, context.builtIns.stringType, entry.unescapedValue)
IrConstImpl.string(entry.startOffset, entry.endOffset, context.irBuiltIns.stringType, entry.unescapedValue)
override fun visitStringTemplateEntryWithExpression(entry: KtStringTemplateEntryWithExpression, data: Nothing?): IrStatement =
entry.expression!!.genExpr()
@@ -309,15 +314,22 @@ class StatementGenerator(
override fun visitThisExpression(expression: KtThisExpression, data: Nothing?): IrExpression {
val referenceTarget = getOrFail(BindingContext.REFERENCE_TARGET, expression.instanceReference) { "No reference target for this" }
return when (referenceTarget) {
is ClassDescriptor ->
is ClassDescriptor -> {
val thisAsReceiverParameter = referenceTarget.thisAsReceiverParameter
val thisType = thisAsReceiverParameter.type.toIrType()
IrGetValueImpl(
expression.startOffset, expression.endOffset,
context.symbolTable.referenceValueParameter(referenceTarget.thisAsReceiverParameter)
thisType,
context.symbolTable.referenceValueParameter(thisAsReceiverParameter)
)
}
is CallableDescriptor -> {
val extensionReceiver = referenceTarget.extensionReceiverParameter ?: TODO("No extension receiver: $referenceTarget")
val extensionReceiverType = extensionReceiver.type.toIrType()
IrGetValueImpl(
expression.startOffset, expression.endOffset,
extensionReceiverType,
context.symbolTable.referenceValueParameter(extensionReceiver)
)
}