translator: add detection class variables without required 'this' word

This commit is contained in:
Alexey Stepanov
2016-08-09 10:57:38 +03:00
parent 83c1352d91
commit 70b77c0351
3 changed files with 27 additions and 1 deletions
@@ -5,6 +5,8 @@ import com.intellij.psi.PsiWhiteSpace
import com.intellij.psi.impl.source.tree.LeafPsiElement
import com.intellij.psi.tree.IElementType
import org.jetbrains.kotlin.KtNodeTypes
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments
@@ -13,6 +15,7 @@ import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.calls.callUtil.getType
import org.jetbrains.kotlin.resolve.calls.callUtil.getValueArgumentsInParentheses
import org.jetbrains.kotlin.resolve.constants.TypedCompileTimeConstant
import org.kotlinnative.translator.exceptions.UnimplementedException
import org.kotlinnative.translator.llvm.*
import org.kotlinnative.translator.llvm.types.*
import java.util.*
@@ -285,7 +288,17 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
expr is KtArrayAccessExpression -> evaluateArrayAccessExpression(expr, scopeDepth + 1)
isEnumClassField(expr) -> resolveEnumClassField(expr)
(expr is KtNameReferenceExpression) && (classScope != null) -> evaluateNameReferenceExpression(expr, classScope)
else -> variableManager.get(expr.firstChild.text)
else -> {
val referenceContext = state.bindingContext.get(BindingContext.REFERENCE_TARGET, expr)
when (referenceContext) {
is PropertyDescriptorImpl -> {
val receiverThis = variableManager.get("this")!!
evaluateMemberMethodOrField(receiverThis, expr.firstChild.text, topLevel, call = null)!!
}
else -> variableManager.get(expr.firstChild.text)
}
}
}
private fun resolveEnumClassField(expr: KtReferenceExpression): LLVMSingleValue {
@@ -0,0 +1 @@
this_test_1_Int(48) == 53
@@ -0,0 +1,12 @@
class this_test_1_class {
var data: Int = 5
fun f(x: Int) {
data = x + 5
}
}
fun this_test_1(arg: Int): Int {
val instance = this_test_1_class()
instance.f(arg)
return instance.data
}