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 efa8478dc9a..f053e81be1e 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 @@ -354,9 +354,7 @@ internal fun generateDestructuringBlock( statements += FirVariableImpl( session, entry, entry.nameAsSafeName, entry.typeReference.toFirOrImplicitTypeRef(), isVar, - FirComponentCallImpl(session, entry, index + 1).apply { - arguments += generateAccessExpression(session, entry, container.name) - }, + FirComponentCallImpl(session, entry, index + 1, generateAccessExpression(session, entry, container.name)), FirVariableSymbol(entry.nameAsSafeName) // TODO? ).apply { entry.extractAnnotationsTo(this) diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/annotated.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/annotated.txt index 912af844741..4885c9ba791 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/annotated.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/annotated.txt @@ -28,6 +28,6 @@ FILE: annotated.kt } public? final? fun bar(two: Two): kotlin/Unit { lval : = two# - @Ann() lval x: = component1(#) - @Ann() lval y: = component2(#) + @Ann() lval x: = #.component1() + @Ann() lval y: = #.component2() } diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/destructuring.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/destructuring.txt index 16434895593..46a524f4152 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/destructuring.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/destructuring.txt @@ -14,9 +14,9 @@ FILE: destructuring.kt } public? final? fun foo(some: Some): kotlin/Unit { lval : = some# - lvar x: = component1(#) - lvar y: = component2(#) - lvar z: String = component3(#) + lvar x: = #.component1() + lvar y: = #.component2() + lvar z: String = #.component3() lval : = x# x# = inc#(#) # diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/for.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/for.txt index 9bb5b27628e..52c8215795b 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/for.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/for.txt @@ -39,8 +39,8 @@ FILE: for.kt lval : = #.iterator#() while(#.hasNext#()) { lval : = #.next#() - lval x: = component1(#) - lval y: = component2(#) + lval x: = #.component1() + lval y: = #.component2() println#(plus#(String(x = ), x#, String( y = ), y#)) } diff --git a/compiler/fir/psi2fir/testData/rawBuilder/expressions/lambda.txt b/compiler/fir/psi2fir/testData/rawBuilder/expressions/lambda.txt index 15669f49995..b0dfbc5409a 100644 --- a/compiler/fir/psi2fir/testData/rawBuilder/expressions/lambda.txt +++ b/compiler/fir/psi2fir/testData/rawBuilder/expressions/lambda.txt @@ -24,8 +24,8 @@ FILE: lambda.kt use#(use@fun .(: ): { ^ { - lval x: = component1(#) - lval y: = component2(#) + lval x: = #.component1() + lval y: = #.component2() plus#(x#, y#) } 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 14551c70aa4..9d6284cc5d8 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -868,8 +868,8 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { override fun visitComponentCall(componentCall: FirComponentCall) { componentCall.annotations.renderAnnotations() - print("component${componentCall.componentIndex}") - visitCall(componentCall) + componentCall.explicitReceiver.accept(this) + print(".component${componentCall.componentIndex}()") } override fun visitGetClassCall(getClassCall: FirGetClassCall) { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirComponentCall.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirComponentCall.kt index 26c338f3e2e..e4066459289 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirComponentCall.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirComponentCall.kt @@ -7,10 +7,12 @@ package org.jetbrains.kotlin.fir.expressions import org.jetbrains.kotlin.fir.visitors.FirVisitor -interface FirComponentCall : FirCall { +interface FirComponentCall : FirFunctionCall { // Starting from 1, not from 0 val componentIndex: Int + override val explicitReceiver: FirExpression + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitComponentCall(this, data) } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt index 1fc6d4fda5d..300b007a964 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirComponentCallImpl.kt @@ -6,11 +6,38 @@ package org.jetbrains.kotlin.fir.expressions.impl import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.FirNamedReference import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.expressions.FirComponentCall +import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess +import org.jetbrains.kotlin.fir.references.FirSimpleNamedReference +import org.jetbrains.kotlin.fir.transformSingle +import org.jetbrains.kotlin.fir.types.FirTypeProjection +import org.jetbrains.kotlin.fir.visitors.FirTransformer +import org.jetbrains.kotlin.name.Name class FirComponentCallImpl( session: FirSession, psi: PsiElement?, - override val componentIndex: Int -) : FirAbstractCall(session, psi), FirComponentCall \ No newline at end of file + override val componentIndex: Int, + override var explicitReceiver: FirExpression +) : FirAbstractCall(session, psi), FirComponentCall { + override var calleeReference: FirNamedReference = + FirSimpleNamedReference(session, psi, Name.identifier("component$componentIndex")) + + override val typeArguments: List + get() = emptyList() + + override fun transformCalleeReference(transformer: FirTransformer, data: D): FirQualifiedAccess { + calleeReference = calleeReference.transformSingle(transformer, data) + return this + } + + override fun transformChildren(transformer: FirTransformer, data: D): FirElement { + calleeReference = calleeReference.transformSingle(transformer, data) + explicitReceiver = explicitReceiver.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 2c4f5692aa0..a587bb2efc2 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 @@ -212,10 +212,6 @@ abstract class FirTransformer : FirVisitor { - return transformCall(componentCall, data) - } - open fun transformDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): CompositeTransformResult { return transformCall(delegatedConstructorCall, data) } @@ -224,6 +220,10 @@ abstract class FirTransformer : FirVisitor { + return transformFunctionCall(componentCall, data) + } + open fun transformGetClassCall(getClassCall: FirGetClassCall, data: D): CompositeTransformResult { return transformCall(getClassCall, 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 9d4002222b5..f66964db0fd 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 @@ -212,10 +212,6 @@ abstract class FirVisitor { return visitCall(arraySetCall, data) } - open fun visitComponentCall(componentCall: FirComponentCall, data: D): R { - return visitCall(componentCall, data) - } - open fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): R { return visitCall(delegatedConstructorCall, data) } @@ -224,6 +220,10 @@ abstract class FirVisitor { return visitCall(functionCall, data) } + open fun visitComponentCall(componentCall: FirComponentCall, data: D): R { + return visitFunctionCall(componentCall, data) + } + open fun visitGetClassCall(getClassCall: FirGetClassCall, data: D): R { return visitCall(getClassCall, 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 069f85bfdd3..7a5c0403a2e 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 @@ -212,10 +212,6 @@ abstract class FirVisitorVoid : FirVisitor() { visitCall(arraySetCall, null) } - open fun visitComponentCall(componentCall: FirComponentCall) { - visitCall(componentCall, null) - } - open fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall) { visitCall(delegatedConstructorCall, null) } @@ -224,6 +220,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitCall(functionCall, null) } + open fun visitComponentCall(componentCall: FirComponentCall) { + visitFunctionCall(componentCall, null) + } + open fun visitGetClassCall(getClassCall: FirGetClassCall) { visitCall(getClassCall, null) }