From 2f661e9ec77e687745060bfd79761e6a55b78a59 Mon Sep 17 00:00:00 2001 From: e5l Date: Fri, 8 Jul 2016 19:25:19 +0300 Subject: [PATCH] add function index --- translator/.idea/misc.xml | 16 ------------- translator/.idea/vcs.xml | 6 +++++ .../kotlinnative/translator/FileTranslator.kt | 12 +++++++++- .../translator/FunctionCodegen.kt | 23 +++++++++++++------ .../translator/TranslationState.kt | 7 ++++-- .../translator/llvm/generators.kt | 6 +++-- .../kotlinnative/translator/utils/types.kt | 7 ++++++ 7 files changed, 49 insertions(+), 28 deletions(-) create mode 100644 translator/.idea/vcs.xml create mode 100644 translator/src/main/kotlin/org/kotlinnative/translator/utils/types.kt 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)