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:
+20
-28
@@ -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
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user