From 36cef0a401c7f2855448ca63618ac74a2a49ef6a Mon Sep 17 00:00:00 2001 From: Alexey Stepanov Date: Tue, 9 Aug 2016 12:39:05 +0300 Subject: [PATCH] translator: fix access to class variables which are classes and fix class declaration order --- .../kotlinnative/translator/BlockCodegen.kt | 11 +++++++++++ .../translator/llvm/LLVMBuilder.kt | 2 +- .../tests/input/class_variable_access_1.txt | 1 + .../tests/kotlin/class_variable_access_1.kt | 18 ++++++++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 translator/src/test/kotlin/tests/input/class_variable_access_1.txt create mode 100644 translator/src/test/kotlin/tests/kotlin/class_variable_access_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 8736c81aadf..e4563b592d8 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt @@ -176,6 +176,17 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM var receiver = when (receiverExpr) { is KtCallExpression, is KtBinaryExpression -> evaluateExpression(receiverExpr, scopeDepth) as LLVMVariable + is KtNameReferenceExpression ->{ + val referenceContext = state.bindingContext.get(BindingContext.REFERENCE_TARGET, receiverExpr) + variableManager.get(receiverName) + when (referenceContext) { + is PropertyDescriptorImpl -> { + val receiverThis = variableManager.get("this")!! + evaluateMemberMethodOrField(receiverThis, receiverName, topLevel, call = null)!! as LLVMVariable + } + else -> variableManager.get(receiverName) + } + } else -> variableManager.get(receiverName) } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt index 451bd866dcc..8cd47b968aa 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -219,7 +219,7 @@ class LLVMBuilder(val arm: Boolean) { fun createClass(name: String, fields: List) { val code = "%class.$name = type { ${fields.map { it.getType() }.joinToString()} }" - localCode.appendln(code) + globalCode.appendln(code) } fun bitcast(src: LLVMVariable, llvmType: LLVMVariable): LLVMVariable { diff --git a/translator/src/test/kotlin/tests/input/class_variable_access_1.txt b/translator/src/test/kotlin/tests/input/class_variable_access_1.txt new file mode 100644 index 00000000000..70a561973bc --- /dev/null +++ b/translator/src/test/kotlin/tests/input/class_variable_access_1.txt @@ -0,0 +1 @@ +class_variable_access_1_test_Int(22) == 30 diff --git a/translator/src/test/kotlin/tests/kotlin/class_variable_access_1.kt b/translator/src/test/kotlin/tests/kotlin/class_variable_access_1.kt new file mode 100644 index 00000000000..5b26f1dd992 --- /dev/null +++ b/translator/src/test/kotlin/tests/kotlin/class_variable_access_1.kt @@ -0,0 +1,18 @@ +class class_variable_access_1_donor(var size: Int) { + val data: Int = 5 +} + +class class_variable_access_1_owner(val arg: class_variable_access_1_donor) { + val tKIopsD = 56 + fun getSize(): Int { + return arg.size + 8 + } +} + + +fun class_variable_access_1_test(x: Int): Int { + val instance_donor = class_variable_access_1_donor(x) + val instance_owner = class_variable_access_1_owner(instance_donor) + + return instance_owner.getSize() +} \ No newline at end of file