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">
|
<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" />
|
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||||
</component>
|
</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>
|
</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.KtFile
|
||||||
import org.jetbrains.kotlin.psi.KtNamedFunction
|
import org.jetbrains.kotlin.psi.KtNamedFunction
|
||||||
import org.kotlinnative.translator.llvm.LLVMBuilder
|
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) {
|
class FileTranslator(val state: TranslationState, val file: KtFile) {
|
||||||
|
|
||||||
@@ -17,7 +19,15 @@ class FileTranslator(val state: TranslationState, val file: KtFile) {
|
|||||||
private fun generateFileBody() {
|
private fun generateFileBody() {
|
||||||
for (declaration in file.declarations) {
|
for (declaration in file.declarations) {
|
||||||
when (declaration) {
|
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.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.kotlinnative.translator.llvm.LLVMBuilder
|
import org.kotlinnative.translator.llvm.LLVMBuilder
|
||||||
import org.kotlinnative.translator.llvm.LLVMVariable
|
|
||||||
import org.kotlinnative.translator.llvm.LLVMDescriptorGenerate
|
import org.kotlinnative.translator.llvm.LLVMDescriptorGenerate
|
||||||
import org.kotlinnative.translator.llvm.LLVMMapStandardType
|
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) {
|
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() {
|
fun generate() {
|
||||||
generateDeclaration(function)
|
generateDeclaration(function)
|
||||||
codeBuilder.addStartExpression()
|
codeBuilder.addStartExpression()
|
||||||
@@ -26,15 +40,10 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun generateDeclaration(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))
|
codeBuilder.addLLVMCode(LLVMDescriptorGenerate(function.fqName.toString(), args, returnType))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun expressionWalker(expr: Any?) {
|
private fun expressionWalker(expr: Any?) {
|
||||||
when (expr) {
|
when (expr) {
|
||||||
is KtBlockExpression -> evaluateBlockExpression(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.resolve.jvm.TopDownAnalyzerFacadeForJVM
|
||||||
import org.jetbrains.kotlin.utils.PathUtil
|
import org.jetbrains.kotlin.utils.PathUtil
|
||||||
import org.kotlinnative.translator.exceptions.TranslationException
|
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 environment: KotlinCoreEnvironment
|
||||||
val bindingContext: BindingContext
|
val bindingContext: BindingContext
|
||||||
|
var functions = HashMap<String, FunctionDescriptor>()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
val configuration = CompilerConfiguration()
|
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)
|
collector.report(CompilerMessageSeverity.ERROR, runtimes.joinToString { it.path }, CompilerMessageLocation.NO_LOCATION)
|
||||||
println(runtimes.joinToString { it.toString() })
|
println(runtimes.joinToString { it.toString() })
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
return if (analyzer.hasErrors()) null else analyzer.analysisResult
|
return if (analyzer.hasErrors()) null else analyzer.analysisResult
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
package org.kotlinnative.translator.llvm
|
package org.kotlinnative.translator.llvm
|
||||||
|
|
||||||
fun LLVMDescriptorGenerate(name: String, argTypes: List<Pair<String, String>>?, returnType: String) =
|
import org.kotlinnative.translator.utils.FunctionArgument
|
||||||
"define $returnType @$name(${argTypes?.mapIndexed { i: Int, s: Pair<String, String> -> "${s.second} %${s.first}" }?.joinToString() ?: "" })"
|
|
||||||
|
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) {
|
fun LLVMMapStandardType(type: String) = when(type) {
|
||||||
"Int" -> "i32"
|
"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