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.PsiElement
|
||||||
import com.intellij.psi.PsiWhiteSpace
|
import com.intellij.psi.PsiWhiteSpace
|
||||||
import com.intellij.psi.impl.source.tree.LeafPsiElement
|
import com.intellij.psi.impl.source.tree.LeafPsiElement
|
||||||
|
import org.jetbrains.kotlin.KtNodeTypes
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments
|
import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getValueArgumentsInParentheses
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getValueArgumentsInParentheses
|
||||||
import org.kotlinnative.translator.llvm.*
|
import org.kotlinnative.translator.llvm.*
|
||||||
import org.kotlinnative.translator.llvm.types.LLVMIntType
|
import org.kotlinnative.translator.llvm.types.*
|
||||||
import org.kotlinnative.translator.llvm.types.LLVMType
|
|
||||||
import org.kotlinnative.translator.llvm.types.LLVMVoidType
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
@@ -186,7 +185,15 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction
|
|||||||
|
|
||||||
private fun evaluateConstantExpression(expr: KtConstantExpression): LLVMConstant {
|
private fun evaluateConstantExpression(expr: KtConstantExpression): LLVMConstant {
|
||||||
val node = expr.node
|
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? {
|
private fun evaluatePsiElement(element: PsiElement, scopeDepth: Int): LLVMSingleValue? {
|
||||||
|
|||||||
@@ -2,9 +2,14 @@ package org.kotlinnative.translator.llvm
|
|||||||
|
|
||||||
import org.kotlinnative.translator.llvm.types.LLVMType
|
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 getType(): String = type.toString() + if (pointer) "*" else " "
|
||||||
|
|
||||||
override fun toString(): String = value
|
override fun toString(): String = value
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,12 @@ class LLVMBooleanType() : LLVMType() {
|
|||||||
override fun operatorNeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression =
|
override fun operatorNeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression =
|
||||||
LLVMExpression(LLVMBooleanType(), "icmp ne i1 $firstOp, $secondOp")
|
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 align = 4
|
||||||
override val size: Byte = 1
|
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 operatorGeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = throw UnimplementedException()
|
||||||
open fun operatorEq(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 operatorNeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = throw UnimplementedException()
|
||||||
|
open fun parseArg(inputArg: String) = inputArg
|
||||||
|
|
||||||
fun makeClone() = clone()
|
fun makeClone() = clone()
|
||||||
|
|
||||||
@@ -26,6 +27,8 @@ fun parseLLVMType(type: String): LLVMType = when (type) {
|
|||||||
"i32" -> LLVMIntType()
|
"i32" -> LLVMIntType()
|
||||||
"i16" -> LLVMShortType()
|
"i16" -> LLVMShortType()
|
||||||
"i8" -> LLVMCharType()
|
"i8" -> LLVMCharType()
|
||||||
|
"i1" -> LLVMBooleanType()
|
||||||
|
"double" -> LLVMDoubleType()
|
||||||
"Unit" -> LLVMVoidType()
|
"Unit" -> LLVMVoidType()
|
||||||
else -> LLVMReferenceType(type)
|
else -> LLVMReferenceType(type)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user