From 4cc5fb74549ee7123b73433cc17d39c53f6a8d02 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 5 Sep 2016 09:49:40 +0300 Subject: [PATCH] Always generate temporary variables for receivers in a property compound assignment (emulate 'resolve' behavior). --- .../intermediate/SimplePropertyLValue.kt | 33 +++---- .../expressions/augmentedAssignment1.txt | 45 +++++----- .../expressions/augmentedAssignment2.txt | 35 ++++---- .../expressions/complexAugmentedAssignment.kt | 20 +++++ .../complexAugmentedAssignment.txt | 88 +++++++++++++++++++ .../expressions/forWithImplicitReceivers.txt | 19 ++-- .../irText/expressions/incrementDecrement.txt | 52 ++++++----- .../safeCallWithIncrementDecrement.txt | 19 ++-- .../kotlin/ir/IrTextTestCaseGenerated.java | 6 ++ 9 files changed, 227 insertions(+), 90 deletions(-) create mode 100644 compiler/testData/ir/irText/expressions/complexAugmentedAssignment.kt create mode 100644 compiler/testData/ir/irText/expressions/complexAugmentedAssignment.txt diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/SimplePropertyLValue.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/SimplePropertyLValue.kt index c8299f62a57..f89b814b888 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/SimplePropertyLValue.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/intermediate/SimplePropertyLValue.kt @@ -18,14 +18,10 @@ package org.jetbrains.kotlin.psi2ir.intermediate import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor -import org.jetbrains.kotlin.descriptors.PropertyGetterDescriptor -import org.jetbrains.kotlin.descriptors.PropertySetterDescriptor -import org.jetbrains.kotlin.ir.declarations.IrVariable import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext import org.jetbrains.kotlin.psi2ir.generators.Scope import org.jetbrains.kotlin.types.KotlinType -import org.jetbrains.kotlin.utils.SmartList class SimplePropertyLValue( val context: GeneratorContext, @@ -62,22 +58,29 @@ class SimplePropertyLValue( override fun assign(withLValue: (LValue) -> IrExpression) = callReceiver.call { dispatchReceiverValue, extensionReceiverValue -> - val variablesForReceivers = SmartList() + val dispatchReceiverTmp = dispatchReceiverValue?.let { + scope.createTemporaryVariable(dispatchReceiverValue.load(), "this") + } + val dispatchReceiverValue2 = dispatchReceiverTmp?.let { VariableLValue(it) } + + val extensionReceiverTmp = extensionReceiverValue?.let { + scope.createTemporaryVariable(extensionReceiverValue.load(), "receiver") + } + val extensionReceiverValue2 = extensionReceiverTmp?.let { VariableLValue(it) } val irResultExpression = withLValue( SimplePropertyLValue(context, scope, startOffset, endOffset, irOperator, descriptor, - SimpleCallReceiver(dispatchReceiverValue, extensionReceiverValue), + SimpleCallReceiver(dispatchReceiverValue2, extensionReceiverValue2), superQualifier) ) - if (variablesForReceivers.isEmpty()) { - irResultExpression - } - else { - val irBlock = IrBlockImpl(startOffset, endOffset, irResultExpression.type, irOperator) - irBlock.addAll(variablesForReceivers) - irBlock.addStatement(irResultExpression) - irBlock - } + val irBlock = IrBlockImpl(startOffset, endOffset, irResultExpression.type, irOperator) + irBlock.addIfNotNull(dispatchReceiverTmp) + irBlock.addIfNotNull(extensionReceiverTmp) + irBlock.addStatement(irResultExpression) + irBlock } + + override fun assign(value: IrExpression): IrExpression = + store(value) } \ No newline at end of file diff --git a/compiler/testData/ir/irText/expressions/augmentedAssignment1.txt b/compiler/testData/ir/irText/expressions/augmentedAssignment1.txt index da86435ce29..e9116015021 100644 --- a/compiler/testData/ir/irText/expressions/augmentedAssignment1.txt +++ b/compiler/testData/ir/irText/expressions/augmentedAssignment1.txt @@ -28,23 +28,28 @@ FILE /augmentedAssignment1.kt other: CONST Int type=kotlin.Int value='5' FUN public fun testProperty(): kotlin.Unit BLOCK_BODY - CALL . type=kotlin.Unit operator=PLUSEQ - : CALL .plus type=kotlin.Int operator=PLUSEQ - $this: CALL . type=kotlin.Int operator=PLUSEQ - other: CONST Int type=kotlin.Int value='1' - CALL . type=kotlin.Unit operator=MINUSEQ - : CALL .minus type=kotlin.Int operator=MINUSEQ - $this: CALL . type=kotlin.Int operator=MINUSEQ - other: CONST Int type=kotlin.Int value='2' - CALL . type=kotlin.Unit operator=MULTEQ - : CALL .times type=kotlin.Int operator=MULTEQ - $this: CALL . type=kotlin.Int operator=MULTEQ - other: CONST Int type=kotlin.Int value='3' - CALL . type=kotlin.Unit operator=DIVEQ - : CALL .div type=kotlin.Int operator=DIVEQ - $this: CALL . type=kotlin.Int operator=DIVEQ - other: CONST Int type=kotlin.Int value='4' - CALL . type=kotlin.Unit operator=PERCEQ - : CALL .mod type=kotlin.Int operator=PERCEQ - $this: CALL . type=kotlin.Int operator=PERCEQ - other: CONST Int type=kotlin.Int value='5' + BLOCK type=kotlin.Unit operator=PLUSEQ + CALL . type=kotlin.Unit operator=PLUSEQ + : CALL .plus type=kotlin.Int operator=PLUSEQ + $this: CALL . type=kotlin.Int operator=PLUSEQ + other: CONST Int type=kotlin.Int value='1' + BLOCK type=kotlin.Unit operator=MINUSEQ + CALL . type=kotlin.Unit operator=MINUSEQ + : CALL .minus type=kotlin.Int operator=MINUSEQ + $this: CALL . type=kotlin.Int operator=MINUSEQ + other: CONST Int type=kotlin.Int value='2' + BLOCK type=kotlin.Unit operator=MULTEQ + CALL . type=kotlin.Unit operator=MULTEQ + : CALL .times type=kotlin.Int operator=MULTEQ + $this: CALL . type=kotlin.Int operator=MULTEQ + other: CONST Int type=kotlin.Int value='3' + BLOCK type=kotlin.Unit operator=DIVEQ + CALL . type=kotlin.Unit operator=DIVEQ + : CALL .div type=kotlin.Int operator=DIVEQ + $this: CALL . type=kotlin.Int operator=DIVEQ + other: CONST Int type=kotlin.Int value='4' + BLOCK type=kotlin.Unit operator=PERCEQ + CALL . type=kotlin.Unit operator=PERCEQ + : CALL .mod type=kotlin.Int operator=PERCEQ + $this: CALL . type=kotlin.Int operator=PERCEQ + other: CONST Int type=kotlin.Int value='5' diff --git a/compiler/testData/ir/irText/expressions/augmentedAssignment2.txt b/compiler/testData/ir/irText/expressions/augmentedAssignment2.txt index 9ab346c30e5..1ce4bc06ead 100644 --- a/compiler/testData/ir/irText/expressions/augmentedAssignment2.txt +++ b/compiler/testData/ir/irText/expressions/augmentedAssignment2.txt @@ -38,18 +38,23 @@ FILE /augmentedAssignment2.kt s: CONST String type=kotlin.String value='*=' FUN public fun testProperty(): kotlin.Unit BLOCK_BODY - CALL .plusAssign type=kotlin.Unit operator=PLUSEQ - $receiver: CALL . type=A operator=PLUSEQ - s: CONST String type=kotlin.String value='+=' - CALL .minusAssign type=kotlin.Unit operator=MINUSEQ - $receiver: CALL . type=A operator=MINUSEQ - s: CONST String type=kotlin.String value='-=' - CALL .timesAssign type=kotlin.Unit operator=MULTEQ - $receiver: CALL . type=A operator=MULTEQ - s: CONST String type=kotlin.String value='*=' - CALL .divAssign type=kotlin.Unit operator=DIVEQ - $receiver: CALL . type=A operator=DIVEQ - s: CONST String type=kotlin.String value='/=' - CALL .modAssign type=kotlin.Unit operator=PERCEQ - $receiver: CALL . type=A operator=PERCEQ - s: CONST String type=kotlin.String value='%=' + BLOCK type=kotlin.Unit operator=PLUSEQ + CALL .plusAssign type=kotlin.Unit operator=PLUSEQ + $receiver: CALL . type=A operator=PLUSEQ + s: CONST String type=kotlin.String value='+=' + BLOCK type=kotlin.Unit operator=MINUSEQ + CALL .minusAssign type=kotlin.Unit operator=MINUSEQ + $receiver: CALL . type=A operator=MINUSEQ + s: CONST String type=kotlin.String value='-=' + BLOCK type=kotlin.Unit operator=MULTEQ + CALL .timesAssign type=kotlin.Unit operator=MULTEQ + $receiver: CALL . type=A operator=MULTEQ + s: CONST String type=kotlin.String value='*=' + BLOCK type=kotlin.Unit operator=DIVEQ + CALL .divAssign type=kotlin.Unit operator=DIVEQ + $receiver: CALL . type=A operator=DIVEQ + s: CONST String type=kotlin.String value='/=' + BLOCK type=kotlin.Unit operator=PERCEQ + CALL .modAssign type=kotlin.Unit operator=PERCEQ + $receiver: CALL . type=A operator=PERCEQ + s: CONST String type=kotlin.String value='%=' diff --git a/compiler/testData/ir/irText/expressions/complexAugmentedAssignment.kt b/compiler/testData/ir/irText/expressions/complexAugmentedAssignment.kt new file mode 100644 index 00000000000..d17173b3b4a --- /dev/null +++ b/compiler/testData/ir/irText/expressions/complexAugmentedAssignment.kt @@ -0,0 +1,20 @@ +object X1 { + var x1 = 0 + object X2 { + var x2 = 0 + object X3 { + var x3 = 0 + } + } +} + +fun test1(a: IntArray) { + var i = 0 + a[i++]++ +} + +fun test2() { + X1.x1++ + X1.X2.x2++ + X1.X2.X3.x3++ +} \ No newline at end of file diff --git a/compiler/testData/ir/irText/expressions/complexAugmentedAssignment.txt b/compiler/testData/ir/irText/expressions/complexAugmentedAssignment.txt new file mode 100644 index 00000000000..81809e4fc81 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/complexAugmentedAssignment.txt @@ -0,0 +1,88 @@ +FILE /complexAugmentedAssignment.kt + CLASS OBJECT X1 + CONSTRUCTOR private constructor X1() + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL Any + INSTANCE_INITIALIZER_CALL classDescriptor=X1 + PROPERTY public final var x1: kotlin.Int + EXPRESSION_BODY + CONST Int type=kotlin.Int value='0' + CLASS OBJECT X2 + CONSTRUCTOR private constructor X2() + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL Any + INSTANCE_INITIALIZER_CALL classDescriptor=X2 + PROPERTY public final var x2: kotlin.Int + EXPRESSION_BODY + CONST Int type=kotlin.Int value='0' + CLASS OBJECT X3 + CONSTRUCTOR private constructor X3() + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL Any + INSTANCE_INITIALIZER_CALL classDescriptor=X3 + PROPERTY public final var x3: kotlin.Int + EXPRESSION_BODY + CONST Int type=kotlin.Int value='0' + FUN public fun test1(/*0*/ a: kotlin.IntArray): kotlin.Unit + BLOCK_BODY + VAR var i: kotlin.Int + CONST Int type=kotlin.Int value='0' + BLOCK type=kotlin.Int operator=POSTFIX_INCR + VAR val tmp1_array: kotlin.IntArray + GET_VAR a type=kotlin.IntArray operator=null + VAR val tmp2_index0: kotlin.Int + BLOCK type=kotlin.Int operator=POSTFIX_INCR + VAR val tmp0: kotlin.Int + GET_VAR i type=kotlin.Int operator=POSTFIX_INCR + SET_VAR i type=kotlin.Unit operator=POSTFIX_INCR + CALL .inc type=kotlin.Int operator=POSTFIX_INCR + $this: GET_VAR tmp0 type=kotlin.Int operator=null + GET_VAR tmp0 type=kotlin.Int operator=null + VAR val tmp3: kotlin.Int + CALL .get type=kotlin.Int operator=POSTFIX_INCR + $this: GET_VAR tmp1_array type=kotlin.IntArray operator=null + index: GET_VAR tmp2_index0 type=kotlin.Int operator=null + CALL .set type=kotlin.Unit operator=POSTFIX_INCR + $this: GET_VAR tmp1_array type=kotlin.IntArray operator=null + index: GET_VAR tmp2_index0 type=kotlin.Int operator=null + value: CALL .inc type=kotlin.Int operator=POSTFIX_INCR + $this: GET_VAR tmp3 type=kotlin.Int operator=null + GET_VAR tmp3 type=kotlin.Int operator=null + FUN public fun test2(): kotlin.Unit + BLOCK_BODY + BLOCK type=kotlin.Int operator=POSTFIX_INCR + VAR val tmp0_this: X1 + GET_OBJECT X1 type=X1 + BLOCK type=kotlin.Int operator=POSTFIX_INCR + VAR val tmp1: kotlin.Int + CALL . type=kotlin.Int operator=POSTFIX_INCR + $this: GET_VAR tmp0_this type=X1 operator=null + CALL . type=kotlin.Unit operator=POSTFIX_INCR + $this: GET_VAR tmp0_this type=X1 operator=null + : CALL .inc type=kotlin.Int operator=POSTFIX_INCR + $this: GET_VAR tmp1 type=kotlin.Int operator=null + GET_VAR tmp1 type=kotlin.Int operator=null + BLOCK type=kotlin.Int operator=POSTFIX_INCR + VAR val tmp2_this: X1.X2 + GET_OBJECT X2 type=X1.X2 + BLOCK type=kotlin.Int operator=POSTFIX_INCR + VAR val tmp3: kotlin.Int + CALL . type=kotlin.Int operator=POSTFIX_INCR + $this: GET_VAR tmp2_this type=X1.X2 operator=null + CALL . type=kotlin.Unit operator=POSTFIX_INCR + $this: GET_VAR tmp2_this type=X1.X2 operator=null + : CALL .inc type=kotlin.Int operator=POSTFIX_INCR + $this: GET_VAR tmp3 type=kotlin.Int operator=null + GET_VAR tmp3 type=kotlin.Int operator=null + BLOCK type=kotlin.Int operator=POSTFIX_INCR + VAR val tmp4_this: X1.X2.X3 + GET_OBJECT X3 type=X1.X2.X3 + BLOCK type=kotlin.Int operator=POSTFIX_INCR + VAR val tmp5: kotlin.Int + CALL . type=kotlin.Int operator=POSTFIX_INCR + $this: GET_VAR tmp4_this type=X1.X2.X3 operator=null + CALL . type=kotlin.Unit operator=POSTFIX_INCR + $this: GET_VAR tmp4_this type=X1.X2.X3 operator=null + : CALL .inc type=kotlin.Int operator=POSTFIX_INCR + $this: GET_VAR tmp5 type=kotlin.Int operator=null + GET_VAR tmp5 type=kotlin.Int operator=null diff --git a/compiler/testData/ir/irText/expressions/forWithImplicitReceivers.txt b/compiler/testData/ir/irText/expressions/forWithImplicitReceivers.txt index b7c76accc83..754cb36f880 100644 --- a/compiler/testData/ir/irText/expressions/forWithImplicitReceivers.txt +++ b/compiler/testData/ir/irText/expressions/forWithImplicitReceivers.txt @@ -32,14 +32,17 @@ FILE /forWithImplicitReceivers.kt BLOCK_BODY RETURN type=kotlin.Nothing from=next BLOCK type=kotlin.Int operator=POSTFIX_DECR - VAR val tmp0: kotlin.Int - CALL . type=kotlin.Int operator=POSTFIX_DECR - $this: $RECEIVER of: next type=IntCell - CALL . type=kotlin.Unit operator=POSTFIX_DECR - $this: $RECEIVER of: next type=IntCell - : CALL .dec type=kotlin.Int operator=POSTFIX_DECR - $this: GET_VAR tmp0 type=kotlin.Int operator=null - GET_VAR tmp0 type=kotlin.Int operator=null + VAR val tmp0_this: IntCell + $RECEIVER of: next type=IntCell + BLOCK type=kotlin.Int operator=POSTFIX_DECR + VAR val tmp1: kotlin.Int + CALL . type=kotlin.Int operator=POSTFIX_DECR + $this: GET_VAR tmp0_this type=IntCell operator=null + CALL . type=kotlin.Unit operator=POSTFIX_DECR + $this: GET_VAR tmp0_this type=IntCell operator=null + : CALL .dec type=kotlin.Int operator=POSTFIX_DECR + $this: GET_VAR tmp1 type=kotlin.Int operator=null + GET_VAR tmp1 type=kotlin.Int operator=null FUN public fun IReceiver.test(): kotlin.Unit BLOCK_BODY BLOCK type=kotlin.Unit operator=FOR_LOOP diff --git a/compiler/testData/ir/irText/expressions/incrementDecrement.txt b/compiler/testData/ir/irText/expressions/incrementDecrement.txt index b7f650f1679..9cccba3617a 100644 --- a/compiler/testData/ir/irText/expressions/incrementDecrement.txt +++ b/compiler/testData/ir/irText/expressions/incrementDecrement.txt @@ -53,38 +53,42 @@ FILE /incrementDecrement.kt BLOCK_BODY VAR val p1: kotlin.Int BLOCK type=kotlin.Int operator=PREFIX_INCR - VAR val tmp0: kotlin.Int - CALL .inc type=kotlin.Int operator=PREFIX_INCR - $this: CALL . type=kotlin.Int operator=PREFIX_INCR - CALL . type=kotlin.Unit operator=PREFIX_INCR - : GET_VAR tmp0 type=kotlin.Int operator=null - GET_VAR tmp0 type=kotlin.Int operator=null + BLOCK type=kotlin.Int operator=PREFIX_INCR + VAR val tmp0: kotlin.Int + CALL .inc type=kotlin.Int operator=PREFIX_INCR + $this: CALL . type=kotlin.Int operator=PREFIX_INCR + CALL . type=kotlin.Unit operator=PREFIX_INCR + : GET_VAR tmp0 type=kotlin.Int operator=null + GET_VAR tmp0 type=kotlin.Int operator=null VAR val p2: kotlin.Int BLOCK type=kotlin.Int operator=PREFIX_DECR - VAR val tmp1: kotlin.Int - CALL .dec type=kotlin.Int operator=PREFIX_DECR - $this: CALL . type=kotlin.Int operator=PREFIX_DECR - CALL . type=kotlin.Unit operator=PREFIX_DECR - : GET_VAR tmp1 type=kotlin.Int operator=null - GET_VAR tmp1 type=kotlin.Int operator=null + BLOCK type=kotlin.Int operator=PREFIX_DECR + VAR val tmp1: kotlin.Int + CALL .dec type=kotlin.Int operator=PREFIX_DECR + $this: CALL . type=kotlin.Int operator=PREFIX_DECR + CALL . type=kotlin.Unit operator=PREFIX_DECR + : GET_VAR tmp1 type=kotlin.Int operator=null + GET_VAR tmp1 type=kotlin.Int operator=null FUN public fun testPropPostfix(): kotlin.Unit BLOCK_BODY VAR val p1: kotlin.Int BLOCK type=kotlin.Int operator=POSTFIX_INCR - VAR val tmp0: kotlin.Int - CALL . type=kotlin.Int operator=POSTFIX_INCR - CALL . type=kotlin.Unit operator=POSTFIX_INCR - : CALL .inc type=kotlin.Int operator=POSTFIX_INCR - $this: GET_VAR tmp0 type=kotlin.Int operator=null - GET_VAR tmp0 type=kotlin.Int operator=null + BLOCK type=kotlin.Int operator=POSTFIX_INCR + VAR val tmp0: kotlin.Int + CALL . type=kotlin.Int operator=POSTFIX_INCR + CALL . type=kotlin.Unit operator=POSTFIX_INCR + : CALL .inc type=kotlin.Int operator=POSTFIX_INCR + $this: GET_VAR tmp0 type=kotlin.Int operator=null + GET_VAR tmp0 type=kotlin.Int operator=null VAR val p2: kotlin.Int BLOCK type=kotlin.Int operator=PREFIX_DECR - VAR val tmp1: kotlin.Int - CALL .dec type=kotlin.Int operator=PREFIX_DECR - $this: CALL . type=kotlin.Int operator=PREFIX_DECR - CALL . type=kotlin.Unit operator=PREFIX_DECR - : GET_VAR tmp1 type=kotlin.Int operator=null - GET_VAR tmp1 type=kotlin.Int operator=null + BLOCK type=kotlin.Int operator=PREFIX_DECR + VAR val tmp1: kotlin.Int + CALL .dec type=kotlin.Int operator=PREFIX_DECR + $this: CALL . type=kotlin.Int operator=PREFIX_DECR + CALL . type=kotlin.Unit operator=PREFIX_DECR + : GET_VAR tmp1 type=kotlin.Int operator=null + GET_VAR tmp1 type=kotlin.Int operator=null FUN public fun testArrayPrefix(): kotlin.Unit BLOCK_BODY VAR val a1: kotlin.Int diff --git a/compiler/testData/ir/irText/expressions/safeCallWithIncrementDecrement.txt b/compiler/testData/ir/irText/expressions/safeCallWithIncrementDecrement.txt index 78a937b7eba..9ab2450fcd6 100644 --- a/compiler/testData/ir/irText/expressions/safeCallWithIncrementDecrement.txt +++ b/compiler/testData/ir/irText/expressions/safeCallWithIncrementDecrement.txt @@ -41,14 +41,17 @@ FILE /safeCallWithIncrementDecrement.kt arg1: CONST Null type=kotlin.Nothing? value='null' then: CONST Null type=kotlin.Nothing? value='null' else: BLOCK type=kotlin.Int operator=POSTFIX_INCR - VAR val tmp1: kotlin.Int - CALL . type=kotlin.Int operator=POSTFIX_INCR - $this: GET_VAR tmp0_safe_receiver type=test.C? operator=null - CALL . type=kotlin.Unit operator=POSTFIX_INCR - $this: GET_VAR tmp0_safe_receiver type=test.C? operator=null - value: CALL .inc type=kotlin.Int? operator=POSTFIX_INCR - $receiver: GET_VAR tmp1 type=kotlin.Int operator=null - GET_VAR tmp1 type=kotlin.Int operator=null + VAR val tmp1_this: test.C? + GET_VAR tmp0_safe_receiver type=test.C? operator=null + BLOCK type=kotlin.Int operator=POSTFIX_INCR + VAR val tmp2: kotlin.Int + CALL . type=kotlin.Int operator=POSTFIX_INCR + $this: GET_VAR tmp1_this type=test.C? operator=null + CALL . type=kotlin.Unit operator=POSTFIX_INCR + $this: GET_VAR tmp1_this type=test.C? operator=null + value: CALL .inc type=kotlin.Int? operator=POSTFIX_INCR + $receiver: GET_VAR tmp2 type=kotlin.Int operator=null + GET_VAR tmp2 type=kotlin.Int operator=null FUN public fun testArrayAccess(/*0*/ nc: test.C?): kotlin.Unit BLOCK_BODY BLOCK type=kotlin.Int operator=POSTFIX_INCR diff --git a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java index 573c0cbde57..538181a5951 100644 --- a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java @@ -322,6 +322,12 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase { doTest(fileName); } + @TestMetadata("complexAugmentedAssignment.kt") + public void testComplexAugmentedAssignment() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/complexAugmentedAssignment.kt"); + doTest(fileName); + } + @TestMetadata("conventionComparisons.kt") public void testConventionComparisons() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/conventionComparisons.kt");