From 5ba772fff93c7041b6ff04c0ffce031b08f2c3ad Mon Sep 17 00:00:00 2001 From: e5l Date: Fri, 8 Jul 2016 17:08:14 +0300 Subject: [PATCH] Translator: cleanup, add simple structure, function declarations generation --- .gitignore | 6 +- translator/.idea/.name | 1 + translator/.idea/gradle.xml | 2 +- translator/.idea/misc.xml | 4 +- .../META-INF/ast-kotlin_main.kotlin_module | Bin 80 -> 0 bytes ...inScriptParser$Companion$classPath$2.class | Bin 2128 -> 0 bytes ...tParser$Companion$messageCollector$1.class | Bin 3022 -> 0 bytes .../hello/KotlinScriptParser$Companion.class | Bin 3404 -> 0 bytes .../main/hello/KotlinScriptParser.class | Bin 10395 -> 0 bytes .../build/classes/main/hello/MainKt.class | Bin 8484 -> 0 bytes .../classes/main/hello/llvmVariable.class | Bin 2064 -> 0 bytes .../main/llvmBuilder$llvmBuilder.class | Bin 539 -> 0 bytes .../build/classes/main/llvmBuilder.class | Bin 531 -> 0 bytes .../native/translator/debug/DebugKt.class | Bin 3658 -> 0 bytes translator/src/main/kotlin/llvmBuilder.kt | 14 -- translator/src/main/kotlin/llvmVariable.kt | 3 - translator/src/main/kotlin/main.kt | 159 ++---------------- .../kotlinnative/translator/FileTranslator.kt | 32 ++++ .../translator/FunctionCodegen.kt | 122 ++++++++++++++ .../translator}/KotlinScriptParser.kt | 4 - .../translator/TranslationState.kt | 80 +++++++++ .../kotlinnative/translator/debug}/debug.kt | 5 +- .../exceptions/TranslationException.kt | 3 + .../translator/llvm/LLVMBuilder.kt | 13 ++ .../translator/llvm/LLVMVariable.kt | 3 + .../translator/llvm/generators.kt | 9 + 26 files changed, 285 insertions(+), 175 deletions(-) create mode 100644 translator/.idea/.name delete mode 100644 translator/build/classes/main/META-INF/ast-kotlin_main.kotlin_module delete mode 100644 translator/build/classes/main/hello/KotlinScriptParser$Companion$classPath$2.class delete mode 100644 translator/build/classes/main/hello/KotlinScriptParser$Companion$messageCollector$1.class delete mode 100644 translator/build/classes/main/hello/KotlinScriptParser$Companion.class delete mode 100644 translator/build/classes/main/hello/KotlinScriptParser.class delete mode 100644 translator/build/classes/main/hello/MainKt.class delete mode 100644 translator/build/classes/main/hello/llvmVariable.class delete mode 100644 translator/build/classes/main/llvmBuilder$llvmBuilder.class delete mode 100644 translator/build/classes/main/llvmBuilder.class delete mode 100644 translator/build/classes/main/org/kotlin/native/translator/debug/DebugKt.class delete mode 100644 translator/src/main/kotlin/llvmBuilder.kt delete mode 100644 translator/src/main/kotlin/llvmVariable.kt create mode 100644 translator/src/main/kotlin/org/kotlinnative/translator/FileTranslator.kt create mode 100644 translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt rename translator/src/main/kotlin/{ => org/kotlinnative/translator}/KotlinScriptParser.kt (98%) create mode 100644 translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt rename translator/src/main/kotlin/{ => org/kotlinnative/translator/debug}/debug.kt (94%) create mode 100644 translator/src/main/kotlin/org/kotlinnative/translator/exceptions/TranslationException.kt create mode 100644 translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt create mode 100644 translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt create mode 100644 translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt diff --git a/.gitignore b/.gitignore index 5b4bbf65181..95c0c2f3a03 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,14 @@ .DS_Store .idea/shelf -/dependencies -/dist +dependencies +dist out tmp workspace.xml *.versionsBackup .gradle -/build/ +build # Ignore Gradle GUI config gradle-app.setting diff --git a/translator/.idea/.name b/translator/.idea/.name new file mode 100644 index 00000000000..85562220163 --- /dev/null +++ b/translator/.idea/.name @@ -0,0 +1 @@ +ast-kotlin \ No newline at end of file diff --git a/translator/.idea/gradle.xml b/translator/.idea/gradle.xml index ab6e46d7aef..05e52194ddf 100644 --- a/translator/.idea/gradle.xml +++ b/translator/.idea/gradle.xml @@ -3,7 +3,6 @@ diff --git a/translator/.idea/misc.xml b/translator/.idea/misc.xml index ee2a58cb493..20cd4f70c34 100644 --- a/translator/.idea/misc.xml +++ b/translator/.idea/misc.xml @@ -13,8 +13,8 @@ - - + + diff --git a/translator/build/classes/main/META-INF/ast-kotlin_main.kotlin_module b/translator/build/classes/main/META-INF/ast-kotlin_main.kotlin_module deleted file mode 100644 index 057d2d3830c7fc83fd848487692568e18531fced..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80 zcmZQzU|?ooU|@t|1}=Us){NAgoO~fR-^9#3?-DLuE~WgUbiM5SlAO#uy}ZPd%(7Iy blA^@C;+({i{35-S)TGjMA$AuKY=m@+e&Gsblr97?WM8_2m!5l5QwY$^{Q%Ep6*!EREx4& z*^#sDycab~^Qgg9m&4uETybC4rCRe0Q_VS!d|5PHFFZ7Cb=ffW*?Im11}`>}Kuq9P z8~+?b3B(2BhE=x@bb+g5;|;^6w070C%D%37w9(%@KJCwJ5}i;KM9?iTQna02bzk=? zjx-pGv@F|`jj&3#SE`vNH6??v!Uz($Brp{Er`e`SYXJ=T)_%oHpjV(A&?&1 zKI>-a`571ca7DpoTxE1EOj{NbxF#?hI?-}k&7JtaDV<%NZVU)?L+-+x>n zI)k{;h3j}npf@nxhH3)01UjiV?^lh$l_tc2OmIjAL%6NrT?`Z6)98l&`oX%YUvrPS zOCZHuQRjy4+BHYhea5owgeGo}wSm^K5MtJ>s3b;lN5Oj-6Nt*49f7yo?}YU*{w#?! zCc4p&NoF+V=$dZS*$PHo;9A2*kcAe=%)FwTdR4c)K&r3JlangzNg1gZsYA2o=3Lj< zwFE>#piA=sI%FjDrcL=tS5SA%+cSvaRPq0HDR0K-49oE58SdEl78Q*Z#x@ z<0B<95DA{+qu%4A!Op%|Ut}sWB_1h%ejkr?2GUtp{G7CG>t)rhxpePRBl2dV1O_e& zHGvgBfRFvQTutH=eAva^8o^sRGraB{c#Ju3@38fIiiV|^YSoJFY|4tslfI&@Npnj& zhEIowU1erQdNqdvcbYYOy64V}DS;asHOn)qdcmq2u0d_B?qc4Qa!{@QP-Bxeh=+Qm zw!8GTr&}&Z0^M7(G}CqsYnPbs*(}Xu!Lsy5ZR=EWJv6a(#sH=WKnHWesmyL9B1}rG zH^<@C#gh$EH@OO~9qCs{{=khuneTXTILhh4IfrN<`dy$57>@pqo;NJXiDUGy{)C&a zF!BcDB~0G^1$QHOGU4lqV3Y4@njfH!dr*1e@1~HUK7W_R`-pM9PO1BWyY>@^h5_h6CYSK8tu9=-$E;uD+LVafP3D?)`xJXvYsIo{ql8+>bt!I_6LK{p9<9 z-M=C7^fgL9W4$314^>C;1=$gNj;CDzF0ba+m2(RyJXO-=p$1<`FDny6nUHG#R6Kriue5a*?TLVk}fKlk<4T!o0-Wd)6*l_ z$?Qxfn^n?F3Z6027>ayv^HB(31Ec|bNqT|w1EynP8_@!C!T%!iO=_{gv^*?e3Cr6M UEI z4e!_G15Yk}sV_d*hf-uM?c&9?{7vd|pUISlRxaXNnSJ&-XPzG!&TLNQ&?>bO0t~SS*&{(> zsLiW((y~m;W~fQDo@Lm%V#H~~E)|QW zScm#BWUOb{u%cxwZ<&|WNu5h*VDLM6jqci?evnxYg{hCOw74*d;btQJ*vJUzHJw`? zLK$A>mgZdPORt!jaV*Wq^*yo9w3&4Q>T4Zm*uF}QY8a;DZrjSR=?s^2om>goo*f~? z7`Azloh}y?&2YG7sJfCegju$hwIys}Xw2q$c82mvEpU=Z*`6{ATcXOBO7{GVcdZnp zt#~?&r?8Dd@-iocW->;mDIhy9|SbI9-tAl>APfVPm4T%03Tk89T5ujOUPG zKnQK*-|Beumo$BfTM|0L=oE<+REtG!Ofhs;JM1Z3dxv+vPlkeBLPa;_YHxEQgxwYM z(wf2D^i9dwi+#eH{R~?ZsfX)2D0KBQ_&SDoN3Wkis6*Vu=ZY%8`C2SqD zVxf!y;c+Kk{2vf6XRm}~`%uTyivBNgAa>hCAf;AX2qBjuQ+GF1FR% z64GQ_)-)W^Sr|4|L+a&F>scAY7ztwtr^wBFJ&Ym#7$r;wj3QG@!5w30d34E3pyFAt zX0z1E;sj}WGzeKB9y7osmx=T0NOUbUUhiofRzRGgHKC)fO;=$a8h8Zf7*fkg#~`nYOo;-wuEgtUm}He4!9 za?4v;mvPkW%#d32=JC;z;b;Y(GRm5*(V=@!%h8n=iy@pbOIDU2qbHQKCXK94(Km7w ziM&azSWX!Rw+3|8wmG$tCQs>jMP-#Hbi+r{q&lH^)zDarFwu``wwHG36+qn`$Y*XL zvV`bwH1**VqH<*m8?cdPpVAj}SK5ef!e){p6-=X1qP^Sg(WXT_(-D1^XlHc0pbKd2 z^*8x{M=07p2jvbr>5{G{{{niVdx((0fd%wMpRe#o1m92m0+PLfW$6Gdba;!wd7Nxt zz)LsLFptxVm}m+vK%K+kc}%TY&&^>+`#feAVcsWi&7pqfbm?a@zQ%QUkR0I{Lm8LI z)l<-LnYaLA_#Rh?^9wgUI0P3X34z{iG}ErnYitbTbK2b?0@z4QHHG*O zNGl?w3XQ_3K-(=`6TVdkGq5I@3G(U-SL!2tNu!@$4d5&KM2-lbfF^uR^c>CKA~fEf zKurp>?(aI@S)N@_;X2->RlGL=X5)Q)FoAkous3YM)Y@pXvB{+|8=8$~mv6Cg)y9Ya E05pL!(*OVf diff --git a/translator/build/classes/main/hello/KotlinScriptParser$Companion.class b/translator/build/classes/main/hello/KotlinScriptParser$Companion.class deleted file mode 100644 index d3489af3d52b47b23e409d0d223747c00f66373e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3404 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 z 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 B%gF!$ diff --git a/translator/build/classes/main/llvmBuilder$llvmBuilder.class b/translator/build/classes/main/llvmBuilder$llvmBuilder.class deleted file mode 100644 index 8eaeb8d1204f1413d9ac4f67e32e885856667564..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 539 zcmYjNO>fgc5Ph>woZ`A^QfQl&77lO#BrwUf73znC6e(>bsB*~xZQ>PdVy`9dI_LZr zPFy)5aX?Xy{ZSQTQY1^eGxOeR-oBZ;``>>6^zfXppCt42qR>gK@|Tsm0V1@faxSAp zny=B#c&a9@0gvFHYNOo;g7@n6Fhm`GfEpTvn){|L;b2hFscN1O+Jjl<5^bU@7u^+?u(XK{qWh6hHhyv;aL6%SlX!%H(Nn%>1-T#+xi3j^OpN_3t#X d{U0^^Xrjd|+9Qy~4jzwCvj{AnSojvZe*x};Z@&Nl diff --git a/translator/build/classes/main/llvmBuilder.class b/translator/build/classes/main/llvmBuilder.class deleted file mode 100644 index bb65853b6cae238f8f36d5542ab38065bb5c2382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 531 zcmYjN&ubb%6#m|@jU6ybR4Oy1R_+g7Kr}=ks>?+nwnSsO=!g$=Ld!+Bxccpjs#sn7EJZ{e%IkNe zb???wekM{ILVZKS;YM7-KB2Nfyq`K&-b*7zs14GIjE6GQavZB4x#8XeZPb@pGFI6m z6MRo+*+hNP`E%GeMrFNNTB~^Z=C_$~I#EMyHJ5)hCUw&3)L673_@CAbQ~qr%yveY| zp0_~p?H_F2a3JuUZMY`!1OcNLeDeZMgNK*w1sZt8K47-aC~x+f@dZa^&I(8H`q=(= eD%kmtDt%N?Wfr?5kVOqoM<`eX7SAkvi@gWk#%y)~ diff --git a/translator/build/classes/main/org/kotlin/native/translator/debug/DebugKt.class b/translator/build/classes/main/org/kotlin/native/translator/debug/DebugKt.class deleted file mode 100644 index ce174ba60c20c3d20b274b83748a367af079fd13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3658 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 diff --git a/translator/src/main/kotlin/llvmBuilder.kt b/translator/src/main/kotlin/llvmBuilder.kt deleted file mode 100644 index a06fbeb9348..00000000000 --- a/translator/src/main/kotlin/llvmBuilder.kt +++ /dev/null @@ -1,14 +0,0 @@ -package hello - -class llvmBuilder{ - private val llvmCode : StringBuilder = StringBuilder() - class llvmBuilder constructor() {} - - fun addLlvmCode(code : String){ - llvmCode.appendln(code) - } - - override fun toString(): String { - return llvmCode.toString() - } -} \ No newline at end of file diff --git a/translator/src/main/kotlin/llvmVariable.kt b/translator/src/main/kotlin/llvmVariable.kt deleted file mode 100644 index 7c0f255d22c..00000000000 --- a/translator/src/main/kotlin/llvmVariable.kt +++ /dev/null @@ -1,3 +0,0 @@ -package hello - -data class llvmVariable(val label : String) \ No newline at end of file diff --git a/translator/src/main/kotlin/main.kt b/translator/src/main/kotlin/main.kt index 7c6ef167d3c..150924f27eb 100644 --- a/translator/src/main/kotlin/main.kt +++ b/translator/src/main/kotlin/main.kt @@ -1,152 +1,23 @@ -package hello - import com.intellij.openapi.util.Disposer -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiWhiteSpace -import com.intellij.psi.impl.source.tree.LeafPsiElement -import com.intellij.psi.impl.source.tree.TreeElement -import com.intellij.psi.search.GlobalSearchScope -import com.intellij.psi.tree.IElementType -import org.jetbrains.kotlin.KtNodeType -import org.jetbrains.kotlin.KtNodeTypes -import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys -import org.jetbrains.kotlin.cli.common.messages.* -import org.jetbrains.kotlin.cli.jvm.compiler.* -import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots -import org.jetbrains.kotlin.cli.jvm.config.getModuleName -import org.jetbrains.kotlin.descriptors.PackageFragmentProvider -import org.jetbrains.kotlin.frontend.java.di.createContainerForTopDownAnalyzerForJvm -import org.jetbrains.kotlin.incremental.components.LookupTracker -import org.jetbrains.kotlin.load.java.JvmAbi -import org.jetbrains.kotlin.psi.KtBlockExpression -import org.jetbrains.kotlin.resolve. AnalyzingUtils -import org.jetbrains.kotlin.resolve.TopDownAnalysisContext -import org.jetbrains.kotlin.resolve.TopDownAnalysisMode -import org.jetbrains.kotlin.resolve.jvm.JvmAnalyzerFacade -import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM -import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory -import org.jetbrains.kotlin.utils.PathUtil -import org.jetbrains.kotlin.cli.jvm.compiler.* -import org.jetbrains.kotlin.config.* -import org.jetbrains.kotlin.lexer.KtKeywordToken -import org.jetbrains.kotlin.lexer.KtSingleValueToken -import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.psi.KtBinaryExpression -import org.jetbrains.kotlin.psi.KtConstantExpression -import org.jetbrains.kotlin.psi.KtReturnExpression -import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext -import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments -import org.kotlin.native.translator.debug.debugPrintNode -import org.jetbrains.kotlin.lexer.KtToken -import java.lang.StringBuilder -import java.io.File -import java.util.* -import java.util.logging.Logger - - -var llvmCode = llvmBuilder() - -fun expressionWalker(expr : Any?) { - when(expr){ - is KtBlockExpression -> evaluateBlockExpression(expr) - is PsiElement -> evaluatePsiExpression(expr) - null -> Unit - else -> UnsupportedOperationException() - } -} - - -fun evaluateBlockExpression(expr : KtBlockExpression){ - var element = expr - expressionWalker(element.firstChild) - - expressionWalker(element.getNextSiblingIgnoringWhitespaceAndComments()) -} - -var variableCount = 0 -fun evaluatePsiExpression(expr : PsiElement){ - var element = expr - evaluateExpression(element.firstChild) - - evaluatePsiExpression(element.getNextSiblingIgnoringWhitespaceAndComments() ?: return) -} - -fun evaluateExpression(expr: Any?) : llvmVariable?{ - return when(expr){ - is KtBinaryExpression -> evaluateBinaryExpression(expr) - is PsiWhiteSpace -> null - is PsiElement -> evaluatePsiElement(expr) - is KtConstantExpression -> evaluateConstantExpression(expr) - null -> null - else -> throw UnsupportedOperationException() - } -} - -fun evaluateBinaryExpression(expr : KtBinaryExpression) : llvmVariable{ - val left = evaluateExpression(expr.firstChild) - val right = evaluateExpression(expr.lastChild) - val operator = expr.operationToken - - - - val llvmOperator = when (operator) { - KtTokens.PLUS -> "add nsw i32" - KtTokens.MINUS -> "sub nsw i32" - KtTokens.MUL -> "mul nsw i32" - else -> throw UnsupportedOperationException("Unkbown binary operator") - } - - variableCount++ - llvmCode.addLlvmCode("%var$variableCount = $llvmOperator ${left?.label}, ${right?.label}") - return llvmVariable("%var$variableCount") -} - -fun evaluateConstantExpression(expr : KtConstantExpression) : llvmVariable { - val node = expr.node - return llvmVariable(node.firstChildNode.text) -} - -fun evaluatePsiElement(element : PsiElement) : llvmVariable? { - return when(element){ - is LeafPsiElement -> evaluateLeafPsiElement(element) - is KtConstantExpression -> evaluateConstantExpression(element) - KtTokens.INTEGER_LITERAL -> null - else -> null - } -} - -fun evaluateLeafPsiElement(element : LeafPsiElement) : llvmVariable? { - return when(element.elementType){ - KtTokens.RETURN_KEYWORD -> evaluateReturnInstruction(element) - else -> llvmVariable("") - } - -} - -fun evaluateReturnInstruction(element : LeafPsiElement) : llvmVariable?{ - var next = element.getNextSiblingIgnoringWhitespaceAndComments(); - val retVar = evaluateExpression(next) - - llvmCode.addLlvmCode("ret i32 ${retVar?.label}") - return null -} +import org.kotlinnative.translator.FileTranslator +import org.kotlinnative.translator.TranslationState fun main(args: Array) { - val scriptFile = "/home/user/Kotlin/manual/sum.kt" - val parser = KotlinScriptParser() + if (args.isEmpty()) { + println("Enter filename") + return + } - val analyzeContext = parser.parse(scriptFile) + val disposer = Disposer.newDisposable() + val state = TranslationState(args.asList(), disposer) - val function = analyzeContext.functions.keys.first() - var body = function.bodyExpression as KtBlockExpression + val files = state.environment.getSourceFiles() + if (files.isEmpty()) { + print("Empty") + return + } - llvmCode.addLlvmCode("define i32 @${function.fqName}() #0{") + println(FileTranslator(state, files[0]).generateCode()) +} - expressionWalker(body); - - llvmCode.addLlvmCode("}") - println(llvmCode) - - -} \ 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 new file mode 100644 index 00000000000..4ad543cd1cd --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/FileTranslator.kt @@ -0,0 +1,32 @@ +package org.kotlinnative.translator + +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtNamedFunction +import org.jetbrains.kotlin.resolve.BindingContext +import org.kotlin.native.translator.llvm.LLVMBuilder +import org.kotlinnative.translator.llvm.LLVMDescriptorGenearte +import org.kotlinnative.translator.llvm.LLVMMapStandardType + +class FileTranslator(val state: TranslationState, val file: KtFile) { + + private var codeBuilder = LLVMBuilder() + private var compiled = false; + + fun generateCode(): String { + if (!compiled) { + generateFileBody() + } + + compiled = true + return codeBuilder.toString() + } + + private fun generateFileBody() { + for (declaration in file.declarations) { + when (declaration) { + is KtNamedFunction -> FunctionCodegen(state, declaration, codeBuilder).generate() + } + } + } + +} diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt new file mode 100644 index 00000000000..356ef86a0f7 --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt @@ -0,0 +1,122 @@ +package org.kotlinnative.translator + +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiWhiteSpace +import com.intellij.psi.impl.source.tree.LeafPsiElement +import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.psi.KtBinaryExpression +import org.jetbrains.kotlin.psi.KtBlockExpression +import org.jetbrains.kotlin.psi.KtConstantExpression +import org.jetbrains.kotlin.psi.KtNamedFunction +import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments +import org.jetbrains.kotlin.resolve.BindingContext +import org.kotlin.native.translator.llvm.LLVMBuilder +import org.kotlin.native.translator.llvm.LLVMVariable +import org.kotlinnative.translator.llvm.LLVMDescriptorGenearte +import org.kotlinnative.translator.llvm.LLVMMapStandardType + + +class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction, val codeBuilder: LLVMBuilder) { + + private var variableCount = 0 + + fun generate() { + generateDeclaration(function) + codeBuilder.addLlvmCode("{") + expressionWalker(function.bodyExpression) + codeBuilder.addLlvmCode("}") + } + + 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(LLVMDescriptorGenearte(function.fqName.toString(), args, returnType)) + } + + private fun expressionWalker(expr: Any?) { + when (expr) { + is KtBlockExpression -> evaluateBlockExpression(expr) + is PsiElement -> evaluatePsiExpression(expr) + null -> Unit + else -> UnsupportedOperationException() + } + } + + private fun evaluateBlockExpression(expr: KtBlockExpression) { + var element = expr + expressionWalker(element.firstChild) + + expressionWalker(element.getNextSiblingIgnoringWhitespaceAndComments()) + } + + private fun evaluatePsiExpression(expr: PsiElement) { + var element = expr + evaluateExpression(element.firstChild) + + evaluatePsiExpression(element.getNextSiblingIgnoringWhitespaceAndComments() ?: return) + } + + private fun evaluateExpression(expr: Any?): LLVMVariable? { + return when (expr) { + is KtBinaryExpression -> evaluateBinaryExpression(expr) + is PsiWhiteSpace -> null + is PsiElement -> evaluatePsiElement(expr) + is KtConstantExpression -> evaluateConstantExpression(expr) + null -> null + else -> throw UnsupportedOperationException() + } + } + + private fun evaluateBinaryExpression(expr: KtBinaryExpression): LLVMVariable { + val left = evaluateExpression(expr.firstChild) + val right = evaluateExpression(expr.lastChild) + val operator = expr.operationToken + + + val llvmOperator = when (operator) { + KtTokens.PLUS -> "add nsw i32" + KtTokens.MINUS -> "sub nsw i32" + KtTokens.MUL -> "mul nsw i32" + else -> throw UnsupportedOperationException("Unkbown binary operator") + } + + variableCount++ + codeBuilder.addLlvmCode("%var$variableCount = $llvmOperator ${left?.label}, ${right?.label}") + return LLVMVariable("%var$variableCount") + } + + private fun evaluateConstantExpression(expr: KtConstantExpression): LLVMVariable { + val node = expr.node + return LLVMVariable(node.firstChildNode.text) + } + + private fun evaluatePsiElement(element: PsiElement): LLVMVariable? { + return when (element) { + is LeafPsiElement -> evaluateLeafPsiElement(element) + is KtConstantExpression -> evaluateConstantExpression(element) + KtTokens.INTEGER_LITERAL -> null + else -> null + } + } + + private fun evaluateLeafPsiElement(element: LeafPsiElement): LLVMVariable? { + return when (element.elementType) { + KtTokens.RETURN_KEYWORD -> evaluateReturnInstruction(element) + else -> LLVMVariable("") + } + + } + + private fun evaluateReturnInstruction(element: LeafPsiElement): LLVMVariable? { + var next = element.getNextSiblingIgnoringWhitespaceAndComments(); + val retVar = evaluateExpression(next) + + codeBuilder.addLlvmCode("ret i32 ${retVar?.label}") + return null + } +} \ No newline at end of file diff --git a/translator/src/main/kotlin/KotlinScriptParser.kt b/translator/src/main/kotlin/org/kotlinnative/translator/KotlinScriptParser.kt similarity index 98% rename from translator/src/main/kotlin/KotlinScriptParser.kt rename to translator/src/main/kotlin/org/kotlinnative/translator/KotlinScriptParser.kt index 4183fdb40fe..c8ff7fd4c5c 100644 --- a/translator/src/main/kotlin/KotlinScriptParser.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/KotlinScriptParser.kt @@ -29,11 +29,7 @@ import org.jetbrains.kotlin.utils.PathUtil import java.io.File import java.util.* import java.util.logging.Logger -import org.kotlin.native.translator.debug.* -/** - * Created by user on 7/8/16. - */ class KotlinScriptParser { companion object { private val LOG = Logger.getLogger(KotlinScriptParser.javaClass.name) diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt b/translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt new file mode 100644 index 00000000000..bf18de7e8e1 --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt @@ -0,0 +1,80 @@ +package org.kotlinnative.translator +import com.intellij.openapi.Disposable +import org.jetbrains.kotlin.analyzer.AnalysisResult +import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys +import org.jetbrains.kotlin.cli.common.messages.* +import org.jetbrains.kotlin.cli.jvm.compiler.CliLightClassGenerationSupport +import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles +import org.jetbrains.kotlin.cli.jvm.compiler.JvmPackagePartProvider +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.cli.jvm.config.getModuleName +import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots +import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.config.JVMConfigurationKeys +import org.jetbrains.kotlin.config.addKotlinSourceRoots +import org.jetbrains.kotlin.load.java.JvmAbi +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 + + +class TranslationState(sources: List, disposer: Disposable) { + + val environment: KotlinCoreEnvironment + val bindingContext: BindingContext + + init { + val configuration = CompilerConfiguration() + val messageCollector = GroupingMessageCollector(object : MessageCollector { + private var hasError = false + + override fun hasErrors(): Boolean { + return hasError; + } + + override fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageLocation) { + println("[report] $message") + hasError = severity.isError || hasError + } + }) + + configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector) + configuration.put(JVMConfigurationKeys.MODULE_NAME, JvmAbi.DEFAULT_MODULE_NAME) + + configuration.addKotlinSourceRoots(sources) + + environment = KotlinCoreEnvironment.createForProduction(disposer, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES) + bindingContext = analyze(environment)?.bindingContext ?: throw TranslationException() + } + + fun analyze(environment: KotlinCoreEnvironment): AnalysisResult? { + val collector = environment.configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) + + val analyzer = AnalyzerWithCompilerReport(collector) + analyzer.analyzeAndReport(environment.getSourceFiles(), object : AnalyzerWithCompilerReport.Analyzer { + override fun analyze(): AnalysisResult { + val sharedTrace = CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace() + val moduleContext = TopDownAnalyzerFacadeForJVM.createContextWithSealedModule(environment.project, environment.getModuleName()) + + return TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegrationWithCustomContext( + moduleContext, + environment.getSourceFiles(), + sharedTrace, + environment.configuration.get(JVMConfigurationKeys.MODULES), + environment.configuration.get(JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS), + JvmPackagePartProvider(environment)) + } + + override fun reportEnvironmentErrors() { + var files = environment.configuration.jvmClasspathRoots + var runtimes = files.map { it.canonicalFile }.filter { it.name == PathUtil.KOTLIN_JAVA_RUNTIME_JAR && it.exists() } + collector.report(CompilerMessageSeverity.ERROR, runtimes.joinToString { it.path }, CompilerMessageLocation.NO_LOCATION) + println(runtimes.joinToString { it.toString() }) + } + }); + + return if (analyzer.hasErrors()) null else analyzer.analysisResult + } + +} \ No newline at end of file diff --git a/translator/src/main/kotlin/debug.kt b/translator/src/main/kotlin/org/kotlinnative/translator/debug/debug.kt similarity index 94% rename from translator/src/main/kotlin/debug.kt rename to translator/src/main/kotlin/org/kotlinnative/translator/debug/debug.kt index 5b4e584cf6d..55f35bddc21 100644 --- a/translator/src/main/kotlin/debug.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/debug/debug.kt @@ -1,7 +1,4 @@ -/** - * Created by user on 7/8/16. - */ -package org.kotlin.native.translator.debug +package org.kotlinnative.translator.debug import com.intellij.psi.PsiElement import com.intellij.psi.PsiWhiteSpace diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/exceptions/TranslationException.kt b/translator/src/main/kotlin/org/kotlinnative/translator/exceptions/TranslationException.kt new file mode 100644 index 00000000000..576f5d38e8a --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/exceptions/TranslationException.kt @@ -0,0 +1,3 @@ +package org.kotlinnative.translator.exceptions + +class TranslationException : Exception() \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt new file mode 100644 index 00000000000..6ee8edd05fe --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -0,0 +1,13 @@ +package org.kotlin.native.translator.llvm + +class LLVMBuilder { + private val llvmCode: StringBuilder = StringBuilder() + + fun addLlvmCode(code: String) { + llvmCode.appendln(code) + } + + override fun toString(): String { + return llvmCode.toString() + } +} \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt new file mode 100644 index 00000000000..9ee935d9088 --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt @@ -0,0 +1,3 @@ +package org.kotlin.native.translator.llvm + +data class LLVMVariable(val label: String) \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt new file mode 100644 index 00000000000..28b0d7a3626 --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt @@ -0,0 +1,9 @@ +package org.kotlinnative.translator.llvm + +fun LLVMDescriptorGenearte(name: String, argTypes: List>?, returnType: String) = + "define $returnType @$name(${argTypes?.mapIndexed { i: Int, s: Pair -> "${s.second} %${s.first}" }?.joinToString() ?: "" })" + +fun LLVMMapStandardType(type: String) = when(type) { + "Int" -> "i32" + else -> "%$type*" +} \ No newline at end of file