translator: add parsing basic types constants
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user