diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt index de9a917f311..55be10587aa 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt @@ -471,9 +471,21 @@ internal fun KtExpression?.generateAssignment( } if (this is KtArrayAccessExpression) { val arrayExpression = this.arrayExpression - val arraySet = FirArraySetCallImpl(session, psi, value, operation).apply { - for (indexExpression in indexExpressions) { - indexes += indexExpression.convert() + val firArrayExpression = arrayExpression?.convert() ?: FirErrorExpressionImpl(session, arrayExpression, "No array expression") + val arraySet = if (operation != FirOperation.ASSIGN) { + FirArraySetCallImpl(session, psi, value, operation).apply { + for (indexExpression in indexExpressions) { + indexes += indexExpression.convert() + } + } + } else { + return FirFunctionCallImpl(session, psi).apply { + calleeReference = FirSimpleNamedReference(session, psi, OperatorNameConventions.SET) + explicitReceiver = firArrayExpression + for (indexExpression in indexExpressions) { + arguments += indexExpression.convert() + } + arguments += value } } if (arrayExpression is KtSimpleNameExpression) { @@ -483,10 +495,7 @@ internal fun KtExpression?.generateAssignment( } return FirBlockImpl(session, arrayExpression).apply { val name = Name.special("") - statements += generateTemporaryVariable( - session, this@generateAssignment, name, - arrayExpression?.convert() ?: FirErrorExpressionImpl(session, arrayExpression, "No array expression") - ) + statements += generateTemporaryVariable(session, this@generateAssignment, name, firArrayExpression) statements += arraySet.apply { lValue = FirSimpleNamedReference(session, arrayExpression, name) } } } diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index f3bc6ef6ae2..f4d1948d912 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -1251,7 +1251,9 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) { override fun visitArrayAccessExpression(expression: KtArrayAccessExpression, data: Unit): FirElement { val arrayExpression = expression.arrayExpression - return FirArrayGetCallImpl(session, expression, arrayExpression.toFirExpression("No array expression")).apply { + return FirFunctionCallImpl(session, expression).apply { + calleeReference = FirSimpleNamedReference(this@RawFirBuilder.session, expression, OperatorNameConventions.GET) + explicitReceiver = arrayExpression.toFirExpression("No array expression") for (indexExpression in expression.indexExpressions) { arguments += indexExpression.toFirExpression("Incorrect index expression") } diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/arrayAccess.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/arrayAccess.txt index 83d13d59f67..d256c367dba 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/arrayAccess.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/arrayAccess.txt @@ -12,5 +12,5 @@ FILE: arrayAccess.kt } public? final? fun test(a: IntArray, w: Wrapper): { - ^test a#[Int(0)].plus#(a#[p#]).plus#(a#[foo#()]).plus#(w#.v#[Int(0)]) + ^test a#.get#(Int(0)).plus#(a#.get#(p#)).plus#(a#.get#(foo#())).plus#(w#.v#.get#(Int(0))) } diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/arrayAssignment.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/arrayAssignment.txt index 6aff521a17d..492c8f8775e 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/arrayAssignment.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/arrayAssignment.txt @@ -1,12 +1,11 @@ FILE: arrayAssignment.kt public? final? fun test(): kotlin/Unit { lval x: = intArrayOf#(Int(1), Int(2), Int(3)) - x#[Int(1)] = Int(0) + x#.set#(Int(1), Int(0)) } public? final? fun foo(): { ^foo Int(1) } public? final? fun test2(): kotlin/Unit { - lval : = intArrayOf#(Int(1), Int(2), Int(3)) - #[foo#()] = Int(1) + intArrayOf#(Int(1), Int(2), Int(3)).set#(foo#(), Int(1)) } diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/unary.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/unary.txt index 33529cddca1..50061026d7e 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/unary.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/unary.txt @@ -58,15 +58,15 @@ FILE: unary.kt } public? final? fun test3(arr: Array): kotlin/Unit { lval x1: = { - lval : = arr#[Int(0)] - arr#[Int(0)] = inc#(#) + lval : = arr#.get#(Int(0)) + arr#.set#(Int(0), inc#(#)) # } lval x2: = { - lval : = arr#[Int(1)] + lval : = arr#.get#(Int(1)) lval : = inc#(#) - arr#[Int(1)] = # + arr#.set#(Int(1), #) # } @@ -80,17 +80,15 @@ FILE: unary.kt } public? final? fun test4(y: Y): kotlin/Unit { lval x1: = { - lval : = y#.arr#[Int(0)] - lval : = y#.arr# - #[Int(0)] = inc#(#) + lval : = y#.arr#.get#(Int(0)) + y#.arr#.set#(Int(0), inc#(#)) # } lval x2: = { - lval : = y#.arr#[Int(1)] + lval : = y#.arr#.get#(Int(1)) lval : = inc#(#) - lval : = y#.arr# - #[Int(1)] = # + y#.arr#.set#(Int(1), #) # } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index 9d6284cc5d8..33dbe9733ee 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -858,14 +858,6 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { visitCall(operatorCall) } - override fun visitArrayGetCall(arrayGetCall: FirArrayGetCall) { - arrayGetCall.annotations.renderAnnotations() - arrayGetCall.array.accept(this) - print("[") - arrayGetCall.arguments.renderSeparated() - print("]") - } - override fun visitComponentCall(componentCall: FirComponentCall) { componentCall.annotations.renderAnnotations() componentCall.explicitReceiver.accept(this) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirArrayGetCall.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirArrayGetCall.kt deleted file mode 100644 index caeaefd5347..00000000000 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirArrayGetCall.kt +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license - * that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.fir.expressions - -import org.jetbrains.kotlin.fir.visitors.FirVisitor - -interface FirArrayGetCall : FirCall { - val array: FirExpression - - override fun accept(visitor: FirVisitor, data: D): R = - visitor.visitArrayGetCall(this, data) - - override fun acceptChildren(visitor: FirVisitor, data: D) { - array.accept(visitor, data) - super.acceptChildren(visitor, data) - } -} \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirArrayGetCallImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirArrayGetCallImpl.kt deleted file mode 100644 index 0b5e25d1c2c..00000000000 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirArrayGetCallImpl.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license - * that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.fir.expressions.impl - -import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.fir.FirElement -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.expressions.FirArrayGetCall -import org.jetbrains.kotlin.fir.expressions.FirExpression -import org.jetbrains.kotlin.fir.transformSingle -import org.jetbrains.kotlin.fir.visitors.FirTransformer - -class FirArrayGetCallImpl( - session: FirSession, - psi: PsiElement?, - override var array: FirExpression -) : FirAbstractCall(session, psi), FirArrayGetCall { - override fun transformChildren(transformer: FirTransformer, data: D): FirElement { - array = array.transformSingle(transformer, data) - return super.transformChildren(transformer, data) - } -} \ No newline at end of file diff --git a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt index a587bb2efc2..92c7f3ccce7 100644 --- a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt +++ b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirTransformerGenerated.kt @@ -200,10 +200,6 @@ abstract class FirTransformer : FirVisitor { - return transformCall(arrayGetCall, data) - } - open fun transformArrayOfCall(arrayOfCall: FirArrayOfCall, data: D): CompositeTransformResult { return transformCall(arrayOfCall, data) } @@ -396,10 +392,6 @@ abstract class FirTransformer : FirVisitor { - return transformArrayGetCall(arrayGetCall, data) - } - final override fun visitArrayOfCall(arrayOfCall: FirArrayOfCall, data: D): CompositeTransformResult { return transformArrayOfCall(arrayOfCall, data) } diff --git a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt index f66964db0fd..1c3367aa884 100644 --- a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt +++ b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorGenerated.kt @@ -200,10 +200,6 @@ abstract class FirVisitor { return visitCall(annotationCall, data) } - open fun visitArrayGetCall(arrayGetCall: FirArrayGetCall, data: D): R { - return visitCall(arrayGetCall, data) - } - open fun visitArrayOfCall(arrayOfCall: FirArrayOfCall, data: D): R { return visitCall(arrayOfCall, data) } diff --git a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt index 7a5c0403a2e..659d5b09237 100644 --- a/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt +++ b/compiler/fir/tree/visitors/org/jetbrains/kotlin/fir/visitors/FirVisitorVoidGenerated.kt @@ -200,10 +200,6 @@ abstract class FirVisitorVoid : FirVisitor() { visitCall(annotationCall, null) } - open fun visitArrayGetCall(arrayGetCall: FirArrayGetCall) { - visitCall(arrayGetCall, null) - } - open fun visitArrayOfCall(arrayOfCall: FirArrayOfCall) { visitCall(arrayOfCall, null) } @@ -396,10 +392,6 @@ abstract class FirVisitorVoid : FirVisitor() { visitAnonymousObject(anonymousObject) } - final override fun visitArrayGetCall(arrayGetCall: FirArrayGetCall, data: Nothing?) { - visitArrayGetCall(arrayGetCall) - } - final override fun visitArrayOfCall(arrayOfCall: FirArrayOfCall, data: Nothing?) { visitArrayOfCall(arrayOfCall) }