Byte and Short literals.

This commit is contained in:
Dmitry Petrov
2016-09-02 17:48:37 +03:00
committed by Dmitry Petrov
parent 66f6ce7f26
commit fed09f059b
2 changed files with 35 additions and 9 deletions
@@ -193,6 +193,10 @@ class StatementGenerator(
IrConstImpl.float(expression.startOffset, expression.endOffset, constantType, constantValue.value) IrConstImpl.float(expression.startOffset, expression.endOffset, constantType, constantValue.value)
is CharValue -> is CharValue ->
IrConstImpl.char(expression.startOffset, expression.endOffset, constantType, constantValue.value) IrConstImpl.char(expression.startOffset, expression.endOffset, constantType, constantValue.value)
is ByteValue ->
IrConstImpl.byte(expression.startOffset, expression.endOffset, constantType, constantValue.value)
is ShortValue ->
IrConstImpl.short(expression.startOffset, expression.endOffset, constantType, constantValue.value)
else -> else ->
TODO("handle other literal types: ${constantValue.type}") TODO("handle other literal types: ${constantValue.type}")
} }
@@ -224,23 +228,37 @@ class StatementGenerator(
entry.expression!!.genExpr() entry.expression!!.genExpr()
override fun visitSimpleNameExpression(expression: KtSimpleNameExpression, data: Nothing?): IrExpression { override fun visitSimpleNameExpression(expression: KtSimpleNameExpression, data: Nothing?): IrExpression {
val resolvedCall = getResolvedCall(expression) ?: val resolvedCall = getResolvedCall(expression)
return ErrorExpressionGenerator(this).generateErrorExpression(expression)
if (resolvedCall is VariableAsFunctionResolvedCall) { if (resolvedCall != null) {
val variableCall = pregenerateCall(resolvedCall.variableCall) if (resolvedCall is VariableAsFunctionResolvedCall) {
return CallGenerator(this).generateCall(expression, variableCall, IrOperator.VARIABLE_AS_FUNCTION) val variableCall = pregenerateCall(resolvedCall.variableCall)
return CallGenerator(this).generateCall(expression, variableCall, IrOperator.VARIABLE_AS_FUNCTION)
}
val descriptor = resolvedCall.resultingDescriptor
return generateExpressionForReferencedDescriptor(descriptor, expression, resolvedCall)
} }
val descriptor = resolvedCall.resultingDescriptor val referenceTarget = get(BindingContext.REFERENCE_TARGET, expression)
if (referenceTarget != null) {
return generateExpressionForReferencedDescriptor(referenceTarget, expression, null)
}
return generateExpressionForReferencedDescriptor(descriptor, expression, resolvedCall) return ErrorExpressionGenerator(this).generateErrorExpression(expression)
} }
private fun generateExpressionForReferencedDescriptor(descriptor: DeclarationDescriptor, expression: KtExpression, resolvedCall: ResolvedCall<*>): IrExpression = private fun generateExpressionForReferencedDescriptor(
descriptor: DeclarationDescriptor,
expression: KtExpression,
resolvedCall: ResolvedCall<*>?
): IrExpression =
when (descriptor) { when (descriptor) {
is FakeCallableDescriptorForObject -> is FakeCallableDescriptorForObject ->
generateExpressionForReferencedDescriptor(descriptor.getReferencedDescriptor(), expression, resolvedCall) generateExpressionForReferencedDescriptor(descriptor.getReferencedDescriptor(), expression, resolvedCall)
is TypeAliasDescriptor ->
generateExpressionForReferencedDescriptor(descriptor.classDescriptor!!, expression, null)
is ClassDescriptor -> { is ClassDescriptor -> {
val classValueType = descriptor.classValueType!! val classValueType = descriptor.classValueType!!
when { when {
@@ -255,7 +273,7 @@ class StatementGenerator(
} }
} }
is PropertyDescriptor -> { is PropertyDescriptor -> {
CallGenerator(this).generateCall(expression.startOffset, expression.endOffset, pregenerateCall(resolvedCall)) CallGenerator(this).generateCall(expression.startOffset, expression.endOffset, pregenerateCall(resolvedCall!!))
} }
is VariableDescriptor -> is VariableDescriptor ->
CallGenerator(this).generateGetVariable(expression.startOffset, expression.endOffset, descriptor) CallGenerator(this).generateGetVariable(expression.startOffset, expression.endOffset, descriptor)
@@ -34,6 +34,8 @@ sealed class IrConstKind<T>(val asString: kotlin.String) {
object Null : IrConstKind<Nothing?>("Null") object Null : IrConstKind<Nothing?>("Null")
object Boolean : IrConstKind<kotlin.Boolean>("Boolean") object Boolean : IrConstKind<kotlin.Boolean>("Boolean")
object Char : IrConstKind<kotlin.Char>("Char") object Char : IrConstKind<kotlin.Char>("Char")
object Byte : IrConstKind<kotlin.Byte>("Byte")
object Short : IrConstKind<kotlin.Short>("Short")
object Int : IrConstKind<kotlin.Int>("Int") object Int : IrConstKind<kotlin.Int>("Int")
object Long : IrConstKind<kotlin.Long>("Long") object Long : IrConstKind<kotlin.Long>("Long")
object String : IrConstKind<kotlin.String>("String") object String : IrConstKind<kotlin.String>("String")
@@ -86,6 +88,12 @@ class IrConstImpl<T> (
fun char(startOffset: Int, endOffset: Int, type: KotlinType, value: Char): IrExpression = fun char(startOffset: Int, endOffset: Int, type: KotlinType, value: Char): IrExpression =
IrConstImpl(startOffset, endOffset, type, IrConstKind.Char, value) IrConstImpl(startOffset, endOffset, type, IrConstKind.Char, value)
fun byte(startOffset: Int, endOffset: Int, type: KotlinType, value: Byte): IrExpression =
IrConstImpl(startOffset, endOffset, type, IrConstKind.Byte, value)
fun short(startOffset: Int, endOffset: Int, type: KotlinType, value: Short): IrExpression =
IrConstImpl(startOffset, endOffset, type, IrConstKind.Short, value)
} }
} }