translator: add detection class variables without required 'this' word
This commit is contained in:
@@ -5,6 +5,8 @@ import com.intellij.psi.PsiWhiteSpace
|
|||||||
import com.intellij.psi.impl.source.tree.LeafPsiElement
|
import com.intellij.psi.impl.source.tree.LeafPsiElement
|
||||||
import com.intellij.psi.tree.IElementType
|
import com.intellij.psi.tree.IElementType
|
||||||
import org.jetbrains.kotlin.KtNodeTypes
|
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.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments
|
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.getType
|
||||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getValueArgumentsInParentheses
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getValueArgumentsInParentheses
|
||||||
import org.jetbrains.kotlin.resolve.constants.TypedCompileTimeConstant
|
import org.jetbrains.kotlin.resolve.constants.TypedCompileTimeConstant
|
||||||
|
import org.kotlinnative.translator.exceptions.UnimplementedException
|
||||||
import org.kotlinnative.translator.llvm.*
|
import org.kotlinnative.translator.llvm.*
|
||||||
import org.kotlinnative.translator.llvm.types.*
|
import org.kotlinnative.translator.llvm.types.*
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -285,7 +288,17 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
|
|||||||
expr is KtArrayAccessExpression -> evaluateArrayAccessExpression(expr, scopeDepth + 1)
|
expr is KtArrayAccessExpression -> evaluateArrayAccessExpression(expr, scopeDepth + 1)
|
||||||
isEnumClassField(expr) -> resolveEnumClassField(expr)
|
isEnumClassField(expr) -> resolveEnumClassField(expr)
|
||||||
(expr is KtNameReferenceExpression) && (classScope != null) -> evaluateNameReferenceExpression(expr, classScope)
|
(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 {
|
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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user