add function index

This commit is contained in:
e5l
2016-07-08 19:25:19 +03:00
parent 86e50516a3
commit 2f661e9ec7
7 changed files with 49 additions and 28 deletions
-16
View File
@@ -16,20 +16,4 @@
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_5" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="masterDetails">
<states>
<state key="ProjectJDKs.UI">
<settings>
<last-edited>1.8</last-edited>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
</states>
</component>
</project>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>
@@ -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()
}
}
}
}
@@ -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<FunctionArgument>?
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)
@@ -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<String>, disposer: Disposable) {
class TranslationState(val sources: List<String>, disposer: Disposable) {
val environment: KotlinCoreEnvironment
val bindingContext: BindingContext
var functions = HashMap<String, FunctionDescriptor>()
init {
val configuration = CompilerConfiguration()
@@ -73,7 +76,7 @@ class TranslationState(sources: List<String>, 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
}
@@ -1,7 +1,9 @@
package org.kotlinnative.translator.llvm
fun LLVMDescriptorGenerate(name: String, argTypes: List<Pair<String, String>>?, returnType: String) =
"define $returnType @$name(${argTypes?.mapIndexed { i: Int, s: Pair<String, String> -> "${s.second} %${s.first}" }?.joinToString() ?: "" })"
import org.kotlinnative.translator.utils.FunctionArgument
fun LLVMDescriptorGenerate(name: String, argTypes: List<FunctionArgument>?, 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"
@@ -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<KtType>)