KT-36956 fix back-end part in JVM and JVM_IR

PSI2IR: deparenthesize LHS expression when generating assignment
receiver.

FE: record 'set' operator call for code generation.
This commit is contained in:
Dmitry Petrov
2020-02-28 11:49:29 +03:00
parent f764d3a021
commit 2010d8d2b9
14 changed files with 245 additions and 31 deletions
@@ -168,16 +168,17 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
origin: IrStatementOrigin,
isAssignmentStatement: Boolean = true
): AssignmentReceiver {
if (ktLeft is KtArrayAccessExpression) {
return generateArrayAccessAssignmentReceiver(ktLeft, origin)
val ktExpr = KtPsiUtil.safeDeparenthesize(ktLeft)
if (ktExpr is KtArrayAccessExpression) {
return generateArrayAccessAssignmentReceiver(ktExpr, origin)
}
val resolvedCall = getResolvedCall(ktLeft)
?: return generateExpressionAssignmentReceiver(ktLeft, origin, isAssignmentStatement)
val resolvedCall = getResolvedCall(ktExpr)
?: return generateExpressionAssignmentReceiver(ktExpr, origin, isAssignmentStatement)
val descriptor = resolvedCall.resultingDescriptor
val startOffset = ktLeft.startOffsetSkippingComments
val endOffset = ktLeft.endOffset
val startOffset = ktExpr.startOffsetSkippingComments
val endOffset = ktExpr.endOffset
return when (descriptor) {
is SyntheticFieldDescriptor -> {
val receiverValue =
@@ -186,7 +187,7 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
resolvedCall,
descriptor
)
createBackingFieldLValue(ktLeft, descriptor.propertyDescriptor, receiverValue, origin)
createBackingFieldLValue(ktExpr, descriptor.propertyDescriptor, receiverValue, origin)
}
is LocalVariableDescriptor ->
@Suppress("DEPRECATION")
@@ -200,13 +201,13 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
origin
)
else
createVariableValue(ktLeft, descriptor, origin)
createVariableValue(ktExpr, descriptor, origin)
is PropertyDescriptor ->
generateAssignmentReceiverForProperty(descriptor, origin, ktLeft, resolvedCall, isAssignmentStatement)
generateAssignmentReceiverForProperty(descriptor, origin, ktExpr, resolvedCall, isAssignmentStatement)
is ValueDescriptor ->
createVariableValue(ktLeft, descriptor, origin)
createVariableValue(ktExpr, descriptor, origin)
else ->
OnceExpressionValue(ktLeft.genExpr())
OnceExpressionValue(ktExpr.genExpr())
}
}
@@ -348,33 +349,24 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
)
}
private fun getThisClass(): ClassDescriptor {
val scopeOwner = statementGenerator.scopeOwner
return when (scopeOwner) {
is ClassConstructorDescriptor -> scopeOwner.containingDeclaration
is ClassDescriptor -> scopeOwner
else -> scopeOwner.containingDeclaration as ClassDescriptor
}
}
private fun generateArrayAccessAssignmentReceiver(
ktLeft: KtArrayAccessExpression,
ktArrayExpr: KtArrayAccessExpression,
origin: IrStatementOrigin
): ArrayAccessAssignmentReceiver {
val indexedGetResolvedCall = get(BindingContext.INDEXED_LVALUE_GET, ktLeft)
val indexedSetResolvedCall = get(BindingContext.INDEXED_LVALUE_SET, ktLeft)
val indexedGetResolvedCall = get(BindingContext.INDEXED_LVALUE_GET, ktArrayExpr)
val indexedSetResolvedCall = get(BindingContext.INDEXED_LVALUE_SET, ktArrayExpr)
return ArrayAccessAssignmentReceiver(
ktLeft.arrayExpression!!.genExpr(),
ktLeft.indexExpressions,
ktLeft.indexExpressions.map { it.genExpr() },
ktArrayExpr.arrayExpression!!.genExpr(),
ktArrayExpr.indexExpressions,
ktArrayExpr.indexExpressions.map { it.genExpr() },
indexedGetResolvedCall,
indexedSetResolvedCall,
{ indexedGetResolvedCall?.let { statementGenerator.pregenerateCallReceivers(it) } },
{ indexedSetResolvedCall?.let { statementGenerator.pregenerateCallReceivers(it) } },
CallGenerator(statementGenerator),
ktLeft.startOffsetSkippingComments,
ktLeft.endOffset,
ktArrayExpr.startOffsetSkippingComments,
ktArrayExpr.endOffset,
origin
)
}