|
|
@@ -240,7 +240,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va
|
|
|
|
return result
|
|
|
|
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 type = receiver.type as LLVMReferenceType
|
|
|
|
val clazz = resolveClassOrObjectLocation(type)
|
|
|
|
val clazz = resolveClassOrObjectLocation(type)
|
|
|
|
val field = clazz.fieldsIndex[selectorName]
|
|
|
|
val field = clazz.fieldsIndex[selectorName]
|
|
|
@@ -324,24 +324,15 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va
|
|
|
|
indexVariable
|
|
|
|
indexVariable
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private fun evaluateReferenceExpression(expr: KtReferenceExpression, scopeDepth: Int, classScope: ClassCodegen? = null): LLVMSingleValue? = when {
|
|
|
|
private fun evaluateReferenceExpression(expr: KtReferenceExpression, scopeDepth: Int, classScope: ClassCodegen? = null): LLVMSingleValue? = when {
|
|
|
|
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 -> {
|
|
|
|
resolveContainingClass(expr) != null -> evaluateMemberMethodOrField(variableManager["this"]!!, expr.firstChild.text, topLevel)
|
|
|
|
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]
|
|
|
|
else -> variableManager[expr.firstChild.text]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun resolveEnumClassField(expr: KtReferenceExpression): LLVMSingleValue {
|
|
|
|
private fun resolveEnumClassField(expr: KtReferenceExpression): LLVMSingleValue {
|
|
|
|
return state.classes[expr.getType(state.bindingContext).toString()]!!.enumFields[expr.text]!!
|
|
|
|
return state.classes[expr.getType(state.bindingContext).toString()]!!.enumFields[expr.text]!!
|
|
|
@@ -417,7 +408,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va
|
|
|
|
return null
|
|
|
|
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
|
|
|
|
val name = expr.getResolvedCallWithAssert(state.bindingContext).dispatchReceiver?.type?.toString() ?: return null
|
|
|
|
return state.classes[name] ?: state.objects[name]
|
|
|
|
return state.classes[name] ?: state.objects[name]
|
|
|
|
}
|
|
|
|
}
|
|
|
|