add function index
This commit is contained in:
Generated
-16
@@ -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>
|
||||
Generated
+6
@@ -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>)
|
||||
Reference in New Issue
Block a user