From 6fc0ed5f61d74bc412a718296cc7a83fc755f293 Mon Sep 17 00:00:00 2001 From: e5l Date: Wed, 10 Aug 2016 11:35:07 +0300 Subject: [PATCH] translator: fix resolve fields without this, fix global vars access --- .../kotlinnative/translator/BlockCodegen.kt | 17 +++--------- .../test/kotlin/tests/input/classfields_2.txt | 3 +++ .../test/kotlin/tests/input/global_vars_1.txt | 2 ++ .../test/kotlin/tests/kotlin/classfields_2.kt | 27 +++++++++++++++++++ .../test/kotlin/tests/kotlin/global_vars_1.kt | 11 ++++++++ 5 files changed, 47 insertions(+), 13 deletions(-) create mode 100644 translator/src/test/kotlin/tests/input/classfields_2.txt create mode 100644 translator/src/test/kotlin/tests/input/global_vars_1.txt create mode 100644 translator/src/test/kotlin/tests/kotlin/classfields_2.kt create mode 100644 translator/src/test/kotlin/tests/kotlin/global_vars_1.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt index 8de6e05dd8e..0575d771cb7 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt @@ -240,7 +240,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va return result } - fun evaluateMemberMethodOrField(receiver: LLVMVariable, selectorName: String, scopeDepth: Int, call: PsiElement?): LLVMSingleValue? { + fun evaluateMemberMethodOrField(receiver: LLVMVariable, selectorName: String, scopeDepth: Int, call: PsiElement? = null): LLVMSingleValue? { val type = receiver.type as LLVMReferenceType val clazz = resolveClassOrObjectLocation(type) val field = clazz.fieldsIndex[selectorName] @@ -324,23 +324,14 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va indexVariable } } - } private fun evaluateReferenceExpression(expr: KtReferenceExpression, scopeDepth: Int, classScope: ClassCodegen? = null): LLVMSingleValue? = when { expr is KtArrayAccessExpression -> evaluateArrayAccessExpression(expr, scopeDepth + 1) isEnumClassField(expr) -> resolveEnumClassField(expr) (expr is KtNameReferenceExpression) && (classScope != null) -> evaluateNameReferenceExpression(expr, classScope) - else -> { - val referenceContext = state.bindingContext.get(BindingContext.REFERENCE_TARGET, expr) - when (referenceContext) { - is PropertyDescriptorImpl -> { - val receiverThis = variableManager["this"]!! - evaluateMemberMethodOrField(receiverThis, expr.firstChild.text, topLevel, call = null)!! - } - else -> variableManager[expr.firstChild.text] - } - } + resolveContainingClass(expr) != null -> evaluateMemberMethodOrField(variableManager["this"]!!, expr.firstChild.text, topLevel) + else -> variableManager[expr.firstChild.text] } private fun resolveEnumClassField(expr: KtReferenceExpression): LLVMSingleValue { @@ -417,7 +408,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va return null } - private fun resolveContainingClass(expr: KtCallExpression): StructCodegen? { + private fun resolveContainingClass(expr: KtElement): StructCodegen? { val name = expr.getResolvedCallWithAssert(state.bindingContext).dispatchReceiver?.type?.toString() ?: return null return state.classes[name] ?: state.objects[name] } diff --git a/translator/src/test/kotlin/tests/input/classfields_2.txt b/translator/src/test/kotlin/tests/input/classfields_2.txt new file mode 100644 index 00000000000..bfd66e4ee12 --- /dev/null +++ b/translator/src/test/kotlin/tests/input/classfields_2.txt @@ -0,0 +1,3 @@ +test1() == 5 +test2() == 0 +test3() == 5 diff --git a/translator/src/test/kotlin/tests/input/global_vars_1.txt b/translator/src/test/kotlin/tests/input/global_vars_1.txt new file mode 100644 index 00000000000..49891d465b9 --- /dev/null +++ b/translator/src/test/kotlin/tests/input/global_vars_1.txt @@ -0,0 +1,2 @@ +global_test1() == 3000 +global_test2() == 4001 diff --git a/translator/src/test/kotlin/tests/kotlin/classfields_2.kt b/translator/src/test/kotlin/tests/kotlin/classfields_2.kt new file mode 100644 index 00000000000..e9304c96059 --- /dev/null +++ b/translator/src/test/kotlin/tests/kotlin/classfields_2.kt @@ -0,0 +1,27 @@ + +class Main { + var i = 0 + + fun main() { + i = 5 + } + + fun changeI(): Int { + main() + return i + } +} + +fun test1(): Int { + val main = Main() + return main.changeI() +} + +fun test2(): Int { + val main = Main() + return main.i +} + +fun test3(): Int { + return Main().changeI() +} diff --git a/translator/src/test/kotlin/tests/kotlin/global_vars_1.kt b/translator/src/test/kotlin/tests/kotlin/global_vars_1.kt new file mode 100644 index 00000000000..e3b461b4d81 --- /dev/null +++ b/translator/src/test/kotlin/tests/kotlin/global_vars_1.kt @@ -0,0 +1,11 @@ + +val MY_FIRST_CONSTANT: Int = 3000 +val MY_SECOND_CONSTANT: Int = 4000 + +fun global_test1(): Int { + return MY_FIRST_CONSTANT +} + +fun global_test2(): Int { + return MY_SECOND_CONSTANT + 1 +}