diff --git a/translator/.idea/misc.xml b/translator/.idea/misc.xml
index 20cd4f70c34..7ca109729dc 100644
--- a/translator/.idea/misc.xml
+++ b/translator/.idea/misc.xml
@@ -16,20 +16,4 @@
-
-
-
-
- 1.8
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/translator/.idea/vcs.xml b/translator/.idea/vcs.xml
new file mode 100644
index 00000000000..6c0b8635858
--- /dev/null
+++ b/translator/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/FileTranslator.kt b/translator/src/main/kotlin/org/kotlinnative/translator/FileTranslator.kt
index d3a0fc5b0c6..ceff49542d8 100644
--- a/translator/src/main/kotlin/org/kotlinnative/translator/FileTranslator.kt
+++ b/translator/src/main/kotlin/org/kotlinnative/translator/FileTranslator.kt
@@ -3,6 +3,8 @@ package org.kotlinnative.translator
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.kotlinnative.translator.llvm.LLVMBuilder
+import org.kotlinnative.translator.utils.FunctionDescriptor
+import org.kotlinnative.translator.utils.KtType
class FileTranslator(val state: TranslationState, val file: KtFile) {
@@ -17,7 +19,15 @@ class FileTranslator(val state: TranslationState, val file: KtFile) {
private fun generateFileBody() {
for (declaration in file.declarations) {
when (declaration) {
- is KtNamedFunction -> FunctionCodegen(state, declaration, codeBuilder).generate()
+ is KtNamedFunction -> {
+ val function = FunctionCodegen(state, declaration, codeBuilder)
+ state.functions.put(function.name, FunctionDescriptor(
+ KtType(function.returnType),
+ function.args?.map { KtType(it.type) }?.toList() ?: listOf()
+ ))
+
+ function.generate()
+ }
}
}
}
diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt
index 6c4dfc0b9e8..a7bfd810136 100644
--- a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt
+++ b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt
@@ -11,13 +11,27 @@ import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments
import org.jetbrains.kotlin.resolve.BindingContext
import org.kotlinnative.translator.llvm.LLVMBuilder
-import org.kotlinnative.translator.llvm.LLVMVariable
import org.kotlinnative.translator.llvm.LLVMDescriptorGenerate
import org.kotlinnative.translator.llvm.LLVMMapStandardType
+import org.kotlinnative.translator.llvm.LLVMVariable
+import org.kotlinnative.translator.utils.FunctionArgument
class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction, val codeBuilder: LLVMBuilder) {
+ var name = function.fqName.toString()
+ var returnType: String
+ var args: List?
+
+ init {
+ val descriptor = state.bindingContext.get(BindingContext.FUNCTION, function)
+ args = descriptor?.valueParameters?.map {
+ FunctionArgument(LLVMMapStandardType(it.type.toString()), it.name.toString())
+ }
+
+ returnType = LLVMMapStandardType(descriptor?.returnType.toString())
+ }
+
fun generate() {
generateDeclaration(function)
codeBuilder.addStartExpression()
@@ -26,15 +40,10 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction
}
private fun generateDeclaration(function: KtNamedFunction) {
- val descriptor = state.bindingContext.get(BindingContext.FUNCTION, function)
- var args = descriptor?.valueParameters?.map {
- Pair(it.name.toString(), LLVMMapStandardType(it.type.toString()))
- }
- val returnType = LLVMMapStandardType(descriptor?.returnType.toString())
-
codeBuilder.addLLVMCode(LLVMDescriptorGenerate(function.fqName.toString(), args, returnType))
}
+
private fun expressionWalker(expr: Any?) {
when (expr) {
is KtBlockExpression -> evaluateBlockExpression(expr)
diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt b/translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt
index 961abc58dfd..80eef985cd2 100644
--- a/translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt
+++ b/translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt
@@ -18,12 +18,15 @@ import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM
import org.jetbrains.kotlin.utils.PathUtil
import org.kotlinnative.translator.exceptions.TranslationException
+import org.kotlinnative.translator.utils.FunctionDescriptor
+import java.util.*
-class TranslationState(sources: List, disposer: Disposable) {
+class TranslationState(val sources: List, disposer: Disposable) {
val environment: KotlinCoreEnvironment
val bindingContext: BindingContext
+ var functions = HashMap()
init {
val configuration = CompilerConfiguration()
@@ -73,7 +76,7 @@ class TranslationState(sources: List, disposer: Disposable) {
collector.report(CompilerMessageSeverity.ERROR, runtimes.joinToString { it.path }, CompilerMessageLocation.NO_LOCATION)
println(runtimes.joinToString { it.toString() })
}
- });
+ })
return if (analyzer.hasErrors()) null else analyzer.analysisResult
}
diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt
index dc846f44a2d..ab93e42d785 100644
--- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt
+++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt
@@ -1,7 +1,9 @@
package org.kotlinnative.translator.llvm
-fun LLVMDescriptorGenerate(name: String, argTypes: List>?, returnType: String) =
- "define $returnType @$name(${argTypes?.mapIndexed { i: Int, s: Pair -> "${s.second} %${s.first}" }?.joinToString() ?: "" })"
+import org.kotlinnative.translator.utils.FunctionArgument
+
+fun LLVMDescriptorGenerate(name: String, argTypes: List?, returnType: String) =
+ "define $returnType @$name(${argTypes?.mapIndexed { i: Int, s: FunctionArgument -> "${s.type} %tmp.${s.name}" }?.joinToString() ?: "" })"
fun LLVMMapStandardType(type: String) = when(type) {
"Int" -> "i32"
diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/utils/types.kt b/translator/src/main/kotlin/org/kotlinnative/translator/utils/types.kt
new file mode 100644
index 00000000000..5e372049dbd
--- /dev/null
+++ b/translator/src/main/kotlin/org/kotlinnative/translator/utils/types.kt
@@ -0,0 +1,7 @@
+package org.kotlinnative.translator.utils
+
+data class FunctionArgument(val type: String, val name: String)
+
+data class KtType(val name: String)
+
+data class FunctionDescriptor(val returnType: KtType, val argTypes: List)