translator: add parsing basic types constants

This commit is contained in:
Alexey Stepanov
2016-07-13 18:18:13 +03:00
parent 70270d35de
commit 91876c70e6
4 changed files with 27 additions and 6 deletions
@@ -3,15 +3,14 @@ package org.kotlinnative.translator
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiWhiteSpace
import com.intellij.psi.impl.source.tree.LeafPsiElement
import org.jetbrains.kotlin.KtNodeTypes
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.calls.callUtil.getValueArgumentsInParentheses
import org.kotlinnative.translator.llvm.*
import org.kotlinnative.translator.llvm.types.LLVMIntType
import org.kotlinnative.translator.llvm.types.LLVMType
import org.kotlinnative.translator.llvm.types.LLVMVoidType
import org.kotlinnative.translator.llvm.types.*
import java.util.*
@@ -186,7 +185,15 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction
private fun evaluateConstantExpression(expr: KtConstantExpression): LLVMConstant {
val node = expr.node
return LLVMConstant(node.firstChildNode.text, LLVMIntType(), pointer = false)
val type = when (node.elementType) {
KtNodeTypes.BOOLEAN_CONSTANT -> LLVMBooleanType()
KtNodeTypes.INTEGER_CONSTANT -> LLVMIntType()
KtNodeTypes.FLOAT_CONSTANT -> LLVMDoubleType()
KtNodeTypes.CHARACTER_CONSTANT -> LLVMCharType()
else -> throw IllegalArgumentException("Unknown type")
}
return LLVMConstant(node.firstChildNode.text, type, pointer = false)
}
private fun evaluatePsiElement(element: PsiElement, scopeDepth: Int): LLVMSingleValue? {
@@ -2,9 +2,14 @@ package org.kotlinnative.translator.llvm
import org.kotlinnative.translator.llvm.types.LLVMType
open class LLVMConstant(val value: String, override val type: LLVMType? = null, override var pointer: Boolean = false) : LLVMSingleValue(type, pointer) {
open class LLVMConstant(value: String, override val type: LLVMType? = null, override var pointer: Boolean = false) : LLVMSingleValue(type, pointer) {
val value: String
init {
this.value = type?.parseArg(value) ?: value
}
override fun getType(): String = type.toString() + if (pointer) "*" else " "
override fun toString(): String = value
}
}
@@ -36,6 +36,12 @@ class LLVMBooleanType() : LLVMType() {
override fun operatorNeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression =
LLVMExpression(LLVMBooleanType(), "icmp ne i1 $firstOp, $secondOp")
override fun parseArg(inputArg: String) = when(inputArg.toLowerCase()){
"true" -> "1"
"false" -> "0"
else -> throw IllegalArgumentException("Failed to parse boolean type")
}
override val align = 4
override val size: Byte = 1
@@ -15,6 +15,7 @@ abstract class LLVMType() : Cloneable {
open fun operatorGeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = throw UnimplementedException()
open fun operatorEq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = throw UnimplementedException()
open fun operatorNeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = throw UnimplementedException()
open fun parseArg(inputArg: String) = inputArg
fun makeClone() = clone()
@@ -26,6 +27,8 @@ fun parseLLVMType(type: String): LLVMType = when (type) {
"i32" -> LLVMIntType()
"i16" -> LLVMShortType()
"i8" -> LLVMCharType()
"i1" -> LLVMBooleanType()
"double" -> LLVMDoubleType()
"Unit" -> LLVMVoidType()
else -> LLVMReferenceType(type)
}