[FIR] Fix augmented array set call on smartcasted receiver

#KT-60917 Fixed
This commit is contained in:
Kirill Rakhman
2023-08-16 16:45:10 +02:00
committed by Space Team
parent 72957b9978
commit 640d1e3fc8
6 changed files with 20 additions and 8 deletions
@@ -1527,15 +1527,17 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
lhsGetCall: FirFunctionCall,
transformedRhs: FirExpression
): AugmentedArraySetAsGetSetCallDesugaringInfo {
val initializer = lhsGetCall.explicitReceiver ?: buildErrorExpression {
source = augmentedArraySetCall.source
?.fakeElement(KtFakeSourceElementKind.DesugaredCompoundAssignment)
diagnostic = ConeSyntaxDiagnostic("No receiver for array access")
}
val arrayVariable = generateTemporaryVariable(
session.moduleData,
source = lhsGetCall.explicitReceiver?.source?.fakeElement(KtFakeSourceElementKind.DesugaredCompoundAssignment),
name = SpecialNames.ARRAY,
initializer = lhsGetCall.explicitReceiver ?: buildErrorExpression {
source = augmentedArraySetCall.source
?.fakeElement(KtFakeSourceElementKind.DesugaredCompoundAssignment)
diagnostic = ConeSyntaxDiagnostic("No receiver for array access")
}
initializer = initializer,
typeRef = initializer.typeRef.copyWithNewSourceKind(KtFakeSourceElementKind.DesugaredCompoundAssignment),
)
val indexVariables = lhsGetCall.arguments.flatMap {
@@ -1,6 +1,9 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -DEBUG_INFO_SMARTCAST
fun getArray(): Array<Int> = throw Exception()
fun getList(): MutableList<Int> = throw Exception()
fun getNullableList(): MutableList<Int>? = throw Exception()
fun fn() {
getArray()[1] = 2
getList()[1] = 2
@@ -8,4 +11,9 @@ fun fn() {
getList()[1]++
getArray()[1] += 2
getList()[1] += 2
val nullable = getNullableList()
if (nullable != null) {
nullable[1] += 1
}
}
@@ -3,3 +3,5 @@ package
public fun fn(): kotlin.Unit
public fun getArray(): kotlin.Array<kotlin.Int>
public fun getList(): kotlin.collections.MutableList<kotlin.Int>
public fun getNullableList(): kotlin.collections.MutableList<kotlin.Int>?
@@ -4,7 +4,7 @@
fun test1() {
var x: MutableList<Int>? = mutableListOf(1)
x!!
x[if (true) { x = null; 0 } else 0] <!UNRESOLVED_REFERENCE!>+=<!> <!UNSAFE_CALL!>x[0]<!>
x[if (true) { x = null; 0 } else 0] += <!UNSAFE_CALL!>x[0]<!>
<!UNSAFE_CALL!>x[0]<!>.inv()
}
@@ -15,7 +15,7 @@
// TESTCASE NUMBER: 1
fun case_1(x: Class?) {
x!!
<!DEBUG_INFO_EXPRESSION_TYPE("Class? & Class")!>x<!>[if (true) {<!VAL_REASSIGNMENT!>x<!>=null;0} else 0] <!UNRESOLVED_REFERENCE!>+=<!> <!DEBUG_INFO_EXPRESSION_TYPE("Class? & Class")!>x<!>[0]
<!DEBUG_INFO_EXPRESSION_TYPE("Class? & Class"), DEBUG_INFO_EXPRESSION_TYPE("Class"), DEBUG_INFO_EXPRESSION_TYPE("Class")!>x<!>[if (true) {<!VAL_REASSIGNMENT!>x<!>=null;0} else 0] += <!DEBUG_INFO_EXPRESSION_TYPE("Class? & Class")!>x<!>[0]
<!DEBUG_INFO_EXPRESSION_TYPE("Class? & Class")!>x<!>
<!DEBUG_INFO_EXPRESSION_TYPE("Class? & Class")!>x<!>[0].inv()
}
@@ -18,7 +18,7 @@
fun case_1() {
var x: MutableList<Int>? = mutableListOf(1)
x!!
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.MutableList<kotlin.Int>? & kotlin.collections.MutableList<kotlin.Int>")!>x<!>[if (true) {x=null;0} else 0] <!UNRESOLVED_REFERENCE!>+=<!> <!UNSAFE_CALL!><!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.MutableList<kotlin.Int>?")!>x<!>[0]<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.MutableList<kotlin.Int>? & kotlin.collections.MutableList<kotlin.Int>"), DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.MutableList<kotlin.Int>"), DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.MutableList<kotlin.Int>")!>x<!>[if (true) {x=null;0} else 0] += <!UNSAFE_CALL!><!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.MutableList<kotlin.Int>?")!>x<!>[0]<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.MutableList<kotlin.Int>?")!>x<!>
<!UNSAFE_CALL!><!DEBUG_INFO_EXPRESSION_TYPE("kotlin.collections.MutableList<kotlin.Int>?")!>x<!>[0]<!>.inv()
}