diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt index 9aacd5ea082..66df06a955c 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt @@ -536,35 +536,46 @@ class ExpressionsConverter( val source = callSuffix.toFirSourceElement() - val (calleeReference, explicitReceiver) = when { - name != null -> buildSimpleNamedReference { - this.source = source - this.name = name.nameAsSafeName() - } to null - - additionalArgument != null -> { + val (calleeReference, explicitReceiver, isImplicitInvoke) = when { + name != null -> CalleeAndReceiver( buildSimpleNamedReference { this.source = source - this.name = OperatorNameConventions.INVOKE - } to additionalArgument!! + this.name = name.nameAsSafeName() + } + ) + + additionalArgument != null -> { + CalleeAndReceiver( + buildSimpleNamedReference { + this.source = source + this.name = OperatorNameConventions.INVOKE + }, + additionalArgument!!, + isImplicitInvoke = true + ) } superNode != null -> { - buildErrorNamedReference { - val node = superNode!! - this.source = node.toFirSourceElement() - diagnostic = ConeSimpleDiagnostic("Super cannot be a callee", DiagnosticKind.SuperNotAllowed) - } to null + CalleeAndReceiver( + buildErrorNamedReference { + val node = superNode!! + this.source = node.toFirSourceElement() + diagnostic = ConeSimpleDiagnostic("Super cannot be a callee", DiagnosticKind.SuperNotAllowed) + } + ) } - else -> buildErrorNamedReference { - this.source = source - diagnostic = ConeSimpleDiagnostic("Call has no callee", DiagnosticKind.Syntax) - } to null + else -> CalleeAndReceiver( + buildErrorNamedReference { + this.source = source + diagnostic = ConeSimpleDiagnostic("Call has no callee", DiagnosticKind.Syntax) + } + ) } val builder: FirQualifiedAccessBuilder = if (hasArguments) { - FirFunctionCallBuilder().apply { + val builder = if (isImplicitInvoke) FirImplicitInvokeCallBuilder() else FirFunctionCallBuilder() + builder.apply { this.source = source this.calleeReference = calleeReference diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 0ae2713e48e..b9f7c91539f 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -1775,38 +1775,49 @@ class RawFirBuilder( private fun splitToCalleeAndReceiver( calleeExpression: KtExpression?, defaultSource: FirPsiSourceElement<*>, - ): Pair { + ): CalleeAndReceiver { return when (calleeExpression) { - is KtSimpleNameExpression -> buildSimpleNamedReference { - source = calleeExpression.toFirSourceElement() - name = calleeExpression.getReferencedNameAsName() - } to null + is KtSimpleNameExpression -> + CalleeAndReceiver( + buildSimpleNamedReference { + source = calleeExpression.toFirSourceElement() + name = calleeExpression.getReferencedNameAsName() + } + ) is KtParenthesizedExpression -> splitToCalleeAndReceiver(calleeExpression.expression, defaultSource) null -> { - buildErrorNamedReference { diagnostic = ConeSimpleDiagnostic("Call has no callee", DiagnosticKind.Syntax) } to null + CalleeAndReceiver( + buildErrorNamedReference { diagnostic = ConeSimpleDiagnostic("Call has no callee", DiagnosticKind.Syntax) } + ) } is KtSuperExpression -> { - buildErrorNamedReference { - source = calleeExpression.toFirSourceElement() - diagnostic = ConeSimpleDiagnostic("Super cannot be a callee", DiagnosticKind.SuperNotAllowed) - } to null + CalleeAndReceiver( + buildErrorNamedReference { + source = calleeExpression.toFirSourceElement() + diagnostic = ConeSimpleDiagnostic("Super cannot be a callee", DiagnosticKind.SuperNotAllowed) + } + ) } else -> { - buildSimpleNamedReference { - source = defaultSource.fakeElement(FirFakeSourceElementKind.ImplicitInvokeCall) - name = OperatorNameConventions.INVOKE - } to calleeExpression.toFirExpression("Incorrect invoke receiver") + CalleeAndReceiver( + buildSimpleNamedReference { + source = defaultSource.fakeElement(FirFakeSourceElementKind.ImplicitInvokeCall) + name = OperatorNameConventions.INVOKE + }, + receiverExpression = calleeExpression.toFirExpression("Incorrect invoke receiver"), + isImplicitInvoke = true + ) } } } override fun visitCallExpression(expression: KtCallExpression, data: Unit): FirElement { val source = expression.toFirSourceElement() - val (calleeReference, explicitReceiver) = splitToCalleeAndReceiver(expression.calleeExpression, source) + val (calleeReference, explicitReceiver, isImplicitInvoke) = splitToCalleeAndReceiver(expression.calleeExpression, source) val result: FirQualifiedAccessBuilder = if (expression.valueArgumentList == null && expression.lambdaArguments.isEmpty()) { FirQualifiedAccessExpressionBuilder().apply { @@ -1814,7 +1825,8 @@ class RawFirBuilder( this.calleeReference = calleeReference } } else { - FirFunctionCallBuilder().apply { + val builder = if (isImplicitInvoke) FirImplicitInvokeCallBuilder() else FirFunctionCallBuilder() + builder.apply { this.source = source this.calleeReference = calleeReference context.calleeNamesForLambda += calleeReference.name diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt index 0969fb8dd22..1ee99c877d1 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt @@ -494,3 +494,9 @@ fun FirQualifiedAccess.wrapWithSafeCall(receiver: FirExpression): FirSafeCallExp this.source = this@wrapWithSafeCall.source?.fakeElement(FirFakeSourceElementKind.DesugaredSafeCallExpression) } } + +data class CalleeAndReceiver( + val reference: FirNamedReference, + val receiverExpression: FirExpression? = null, + val isImplicitInvoke: Boolean = false +) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirImplicitInvokeCall.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirImplicitInvokeCall.kt new file mode 100644 index 00000000000..34e39b039d7 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirImplicitInvokeCall.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.FirSourceElement +import org.jetbrains.kotlin.fir.references.FirNamedReference +import org.jetbrains.kotlin.fir.references.FirReference +import org.jetbrains.kotlin.fir.types.FirTypeProjection +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +abstract class FirImplicitInvokeCall : FirFunctionCall() { + abstract override val source: FirSourceElement? + abstract override val typeRef: FirTypeRef + abstract override val annotations: List + abstract override val typeArguments: List + abstract override val explicitReceiver: FirExpression? + abstract override val dispatchReceiver: FirExpression + abstract override val extensionReceiver: FirExpression + abstract override val argumentList: FirArgumentList + abstract override val calleeReference: FirNamedReference + + override fun accept(visitor: FirVisitor, data: D): R = visitor.visitImplicitInvokeCall(this, data) + + abstract override fun replaceTypeRef(newTypeRef: FirTypeRef) + + abstract override fun replaceTypeArguments(newTypeArguments: List) + + abstract override fun replaceExplicitReceiver(newExplicitReceiver: FirExpression?) + + abstract override fun replaceArgumentList(newArgumentList: FirArgumentList) + + abstract override fun replaceCalleeReference(newCalleeReference: FirNamedReference) + + abstract override fun replaceCalleeReference(newCalleeReference: FirReference) + + abstract override fun transformAnnotations(transformer: FirTransformer, data: D): FirImplicitInvokeCall + + abstract override fun transformTypeArguments(transformer: FirTransformer, data: D): FirImplicitInvokeCall + + abstract override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirImplicitInvokeCall + + abstract override fun transformDispatchReceiver(transformer: FirTransformer, data: D): FirImplicitInvokeCall + + abstract override fun transformExtensionReceiver(transformer: FirTransformer, data: D): FirImplicitInvokeCall + + abstract override fun transformCalleeReference(transformer: FirTransformer, data: D): FirImplicitInvokeCall +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirAbstractFunctionCallBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirAbstractFunctionCallBuilder.kt new file mode 100644 index 00000000000..614d2c27cfa --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirAbstractFunctionCallBuilder.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.builder + +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.builder.FirBuilderDsl +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.expressions.FirArgumentList +import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.expressions.FirFunctionCall +import org.jetbrains.kotlin.fir.expressions.builder.FirCallBuilder +import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessBuilder +import org.jetbrains.kotlin.fir.references.FirNamedReference +import org.jetbrains.kotlin.fir.types.FirTypeProjection +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +@FirBuilderDsl +interface FirAbstractFunctionCallBuilder : FirQualifiedAccessBuilder, FirCallBuilder { + abstract override var source: FirSourceElement? + abstract override val annotations: MutableList + abstract override val typeArguments: MutableList + abstract override var explicitReceiver: FirExpression? + abstract override var dispatchReceiver: FirExpression + abstract override var extensionReceiver: FirExpression + abstract override var argumentList: FirArgumentList + abstract var typeRef: FirTypeRef + abstract var calleeReference: FirNamedReference + override fun build(): FirFunctionCall +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirFunctionCallBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirFunctionCallBuilder.kt index b8fdf0a9a55..96ecfd46c4f 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirFunctionCallBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirFunctionCallBuilder.kt @@ -15,9 +15,8 @@ import org.jetbrains.kotlin.fir.expressions.FirArgumentList import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirFunctionCall -import org.jetbrains.kotlin.fir.expressions.builder.FirCallBuilder +import org.jetbrains.kotlin.fir.expressions.builder.FirAbstractFunctionCallBuilder import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder -import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessBuilder import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression import org.jetbrains.kotlin.fir.references.FirNamedReference @@ -33,7 +32,7 @@ import org.jetbrains.kotlin.fir.visitors.* */ @FirBuilderDsl -open class FirFunctionCallBuilder : FirQualifiedAccessBuilder, FirCallBuilder, FirAnnotationContainerBuilder, FirExpressionBuilder { +open class FirFunctionCallBuilder : FirAbstractFunctionCallBuilder, FirAnnotationContainerBuilder, FirExpressionBuilder { override var source: FirSourceElement? = null override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null) override val annotations: MutableList = mutableListOf() @@ -42,7 +41,7 @@ open class FirFunctionCallBuilder : FirQualifiedAccessBuilder, FirCallBuilder, F override var dispatchReceiver: FirExpression = FirNoReceiverExpression override var extensionReceiver: FirExpression = FirNoReceiverExpression override var argumentList: FirArgumentList = FirEmptyArgumentList - open lateinit var calleeReference: FirNamedReference + override lateinit var calleeReference: FirNamedReference @OptIn(FirImplementationDetail::class) override fun build(): FirFunctionCall { diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirImplicitInvokeCallBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirImplicitInvokeCallBuilder.kt new file mode 100644 index 00000000000..387ffd74179 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirImplicitInvokeCallBuilder.kt @@ -0,0 +1,72 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.builder + +import kotlin.contracts.* +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder +import org.jetbrains.kotlin.fir.builder.FirBuilderDsl +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.expressions.FirArgumentList +import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList +import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall +import org.jetbrains.kotlin.fir.expressions.builder.FirAbstractFunctionCallBuilder +import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder +import org.jetbrains.kotlin.fir.expressions.impl.FirImplicitInvokeCallImpl +import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression +import org.jetbrains.kotlin.fir.references.FirNamedReference +import org.jetbrains.kotlin.fir.references.FirReference +import org.jetbrains.kotlin.fir.types.FirTypeProjection +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +@FirBuilderDsl +open class FirImplicitInvokeCallBuilder : FirAbstractFunctionCallBuilder, FirAnnotationContainerBuilder, FirExpressionBuilder { + override var source: FirSourceElement? = null + override val annotations: MutableList = mutableListOf() + override val typeArguments: MutableList = mutableListOf() + override var explicitReceiver: FirExpression? = null + override var dispatchReceiver: FirExpression = FirNoReceiverExpression + override var extensionReceiver: FirExpression = FirNoReceiverExpression + override var argumentList: FirArgumentList = FirEmptyArgumentList + override lateinit var calleeReference: FirNamedReference + + override fun build(): FirImplicitInvokeCall { + return FirImplicitInvokeCallImpl( + source, + annotations, + typeArguments, + explicitReceiver, + dispatchReceiver, + extensionReceiver, + argumentList, + calleeReference, + ) + } + + + @Deprecated("Modification of 'typeRef' has no impact for FirImplicitInvokeCallBuilder", level = DeprecationLevel.HIDDEN) + override var typeRef: FirTypeRef + get() = throw IllegalStateException() + set(value) { + throw IllegalStateException() + } +} + +@OptIn(ExperimentalContracts::class) +inline fun buildImplicitInvokeCall(init: FirImplicitInvokeCallBuilder.() -> Unit): FirImplicitInvokeCall { + contract { + callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE) + } + return FirImplicitInvokeCallBuilder().apply(init).build() +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirImplicitInvokeCallImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirImplicitInvokeCallImpl.kt new file mode 100644 index 00000000000..8162e0c3be4 --- /dev/null +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirImplicitInvokeCallImpl.kt @@ -0,0 +1,123 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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 org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.expressions.FirArgumentList +import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall +import org.jetbrains.kotlin.fir.references.FirNamedReference +import org.jetbrains.kotlin.fir.references.FirReference +import org.jetbrains.kotlin.fir.types.FirTypeProjection +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl +import org.jetbrains.kotlin.fir.visitors.* + +/* + * This file was generated automatically + * DO NOT MODIFY IT MANUALLY + */ + +internal class FirImplicitInvokeCallImpl( + override val source: FirSourceElement?, + override val annotations: MutableList, + override val typeArguments: MutableList, + override var explicitReceiver: FirExpression?, + override var dispatchReceiver: FirExpression, + override var extensionReceiver: FirExpression, + override var argumentList: FirArgumentList, + override var calleeReference: FirNamedReference, +) : FirImplicitInvokeCall() { + override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null) + + override fun acceptChildren(visitor: FirVisitor, data: D) { + typeRef.accept(visitor, data) + annotations.forEach { it.accept(visitor, data) } + typeArguments.forEach { it.accept(visitor, data) } + explicitReceiver?.accept(visitor, data) + if (dispatchReceiver !== explicitReceiver) { + dispatchReceiver.accept(visitor, data) + } + if (extensionReceiver !== explicitReceiver && extensionReceiver !== dispatchReceiver) { + extensionReceiver.accept(visitor, data) + } + argumentList.accept(visitor, data) + calleeReference.accept(visitor, data) + } + + override fun transformChildren(transformer: FirTransformer, data: D): FirImplicitInvokeCallImpl { + typeRef = typeRef.transformSingle(transformer, data) + transformAnnotations(transformer, data) + transformTypeArguments(transformer, data) + explicitReceiver = explicitReceiver?.transformSingle(transformer, data) + if (dispatchReceiver !== explicitReceiver) { + dispatchReceiver = dispatchReceiver.transformSingle(transformer, data) + } + if (extensionReceiver !== explicitReceiver && extensionReceiver !== dispatchReceiver) { + extensionReceiver = extensionReceiver.transformSingle(transformer, data) + } + argumentList = argumentList.transformSingle(transformer, data) + transformCalleeReference(transformer, data) + return this + } + + override fun transformAnnotations(transformer: FirTransformer, data: D): FirImplicitInvokeCallImpl { + annotations.transformInplace(transformer, data) + return this + } + + override fun transformTypeArguments(transformer: FirTransformer, data: D): FirImplicitInvokeCallImpl { + typeArguments.transformInplace(transformer, data) + return this + } + + override fun transformExplicitReceiver(transformer: FirTransformer, data: D): FirImplicitInvokeCallImpl { + explicitReceiver = explicitReceiver?.transformSingle(transformer, data) + return this + } + + override fun transformDispatchReceiver(transformer: FirTransformer, data: D): FirImplicitInvokeCallImpl { + dispatchReceiver = dispatchReceiver.transformSingle(transformer, data) + return this + } + + override fun transformExtensionReceiver(transformer: FirTransformer, data: D): FirImplicitInvokeCallImpl { + extensionReceiver = extensionReceiver.transformSingle(transformer, data) + return this + } + + override fun transformCalleeReference(transformer: FirTransformer, data: D): FirImplicitInvokeCallImpl { + calleeReference = calleeReference.transformSingle(transformer, data) + return this + } + + override fun replaceTypeRef(newTypeRef: FirTypeRef) { + typeRef = newTypeRef + } + + override fun replaceTypeArguments(newTypeArguments: List) { + typeArguments.clear() + typeArguments.addAll(newTypeArguments) + } + + override fun replaceExplicitReceiver(newExplicitReceiver: FirExpression?) { + explicitReceiver = newExplicitReceiver + } + + override fun replaceArgumentList(newArgumentList: FirArgumentList) { + argumentList = newArgumentList + } + + override fun replaceCalleeReference(newCalleeReference: FirNamedReference) { + calleeReference = newCalleeReference + } + + override fun replaceCalleeReference(newCalleeReference: FirReference) { + require(newCalleeReference is FirNamedReference) + replaceCalleeReference(newCalleeReference) + } +} diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt index 74898edf277..926a38ae9e3 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirTransformer.kt @@ -85,6 +85,7 @@ import org.jetbrains.kotlin.fir.declarations.FirErrorFunction import org.jetbrains.kotlin.fir.declarations.FirErrorProperty import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirFunctionCall +import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall import org.jetbrains.kotlin.fir.expressions.FirComponentCall import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess @@ -457,6 +458,10 @@ abstract class FirTransformer : FirVisitor { + return transformElement(implicitInvokeCall, data) + } + open fun transformDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): CompositeTransformResult { return transformElement(delegatedConstructorCall, data) } @@ -957,6 +962,10 @@ abstract class FirTransformer : FirVisitor { + return transformImplicitInvokeCall(implicitInvokeCall, data) + } + final override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): CompositeTransformResult { return transformDelegatedConstructorCall(delegatedConstructorCall, data) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt index 1f6b6f9c4de..9d413a5969d 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitor.kt @@ -85,6 +85,7 @@ import org.jetbrains.kotlin.fir.declarations.FirErrorFunction import org.jetbrains.kotlin.fir.declarations.FirErrorProperty import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirFunctionCall +import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall import org.jetbrains.kotlin.fir.expressions.FirComponentCall import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess @@ -297,6 +298,8 @@ abstract class FirVisitor { open fun visitFunctionCall(functionCall: FirFunctionCall, data: D): R = visitElement(functionCall, data) + open fun visitImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall, data: D): R = visitElement(implicitInvokeCall, data) + open fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): R = visitElement(delegatedConstructorCall, data) open fun visitComponentCall(componentCall: FirComponentCall, data: D): R = visitElement(componentCall, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt index 8d489418a2d..89064e4316c 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/visitors/FirVisitorVoid.kt @@ -85,6 +85,7 @@ import org.jetbrains.kotlin.fir.declarations.FirErrorFunction import org.jetbrains.kotlin.fir.declarations.FirErrorProperty import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirFunctionCall +import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall import org.jetbrains.kotlin.fir.expressions.FirComponentCall import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess @@ -455,6 +456,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitElement(functionCall) } + open fun visitImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall) { + visitElement(implicitInvokeCall) + } + open fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall) { visitElement(delegatedConstructorCall) } @@ -955,6 +960,10 @@ abstract class FirVisitorVoid : FirVisitor() { visitFunctionCall(functionCall) } + final override fun visitImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall, data: Nothing?) { + visitImplicitInvokeCall(implicitInvokeCall) + } + final override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: Nothing?) { visitDelegatedConstructorCall(delegatedConstructorCall) } 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 97899cf8388..38cf9ff1d09 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -1104,6 +1104,10 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM visitCall(functionCall) } + override fun visitImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall) { + visitFunctionCall(implicitInvokeCall) + } + override fun visitComparisonExpression(comparisonExpression: FirComparisonExpression) { print("CMP(${comparisonExpression.operation.operator}, ") comparisonExpression.compareToCall.accept(this) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultTransformer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultTransformer.kt index ba78744865e..9234f8827dd 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultTransformer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultTransformer.kt @@ -98,5 +98,9 @@ abstract class FirDefaultTransformer : FirTransformer() { ): CompositeTransformResult { return transformResolvedQualifier(errorResolvedQualifier, data) } + + override fun transformImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall, data: D): CompositeTransformResult { + return transformFunctionCall(implicitInvokeCall, data) + } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt index c5ac76f754c..4f3caad71a4 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitor.kt @@ -91,5 +91,9 @@ abstract class FirDefaultVisitor : FirVisitor() { override fun visitErrorResolvedQualifier(errorResolvedQualifier: FirErrorResolvedQualifier, data: D): R { return visitResolvedQualifier(errorResolvedQualifier, data) } + + override fun visitImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall, data: D): R { + return visitFunctionCall(implicitInvokeCall, data) + } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt index 4093a4ba746..1da0f42a361 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/visitors/FirDefaultVisitorVoid.kt @@ -91,4 +91,8 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() { override fun visitErrorResolvedQualifier(errorResolvedQualifier: FirErrorResolvedQualifier) { return visitResolvedQualifier(errorResolvedQualifier) } + + override fun visitImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall) { + return visitFunctionCall(implicitInvokeCall) + } } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt index fa6c3fc3690..f0603093b9a 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt @@ -65,6 +65,12 @@ object BuilderConfigurator : AbstractBuilderConfigurator(FirTree fields from constructor without listOf("isPrimary", "attributes") } + val abstractFunctionCallBuilder by builder { + parents += qualifiedAccessBuilder + parents += callBuilder + fields from functionCall + } + for (constructorType in listOf("FirPrimaryConstructor", "FirConstructorImpl")) { builder(constructor, constructorType) { parents += abstractConstructorBuilder @@ -148,9 +154,8 @@ object BuilderConfigurator : AbstractBuilderConfigurator(FirTree useTypes(emptyArgumentListType) } - builder(functionCall) { - parents += qualifiedAccessBuilder - parents += callBuilder + val configurationForFunctionCallBuilder: LeafBuilderConfigurationContext.() -> Unit = { + parents += abstractFunctionCallBuilder defaultNoReceivers() openBuilder() default("argumentList") { @@ -159,6 +164,9 @@ object BuilderConfigurator : AbstractBuilderConfigurator(FirTree useTypes(emptyArgumentListType) } + builder(functionCall, init = configurationForFunctionCallBuilder) + builder(implicitInvokeCall, init = configurationForFunctionCallBuilder) + builder(qualifiedAccessExpression) { parents += qualifiedAccessBuilder defaultNoReceivers() diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt index 780f0863799..ceba6d555ea 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/FirTreeBuilder.kt @@ -102,6 +102,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() { val errorProperty = element("ErrorProperty", Declaration, variable, diagnosticHolder, typeParametersOwner) val qualifiedAccessExpression = element("QualifiedAccessExpression", Expression, expression, qualifiedAccess) val functionCall = element("FunctionCall", Expression, qualifiedAccessExpression, call) + val implicitInvokeCall = element("ImplicitInvokeCall", Expression, functionCall) val delegatedConstructorCall = element("DelegatedConstructorCall", Expression, resolvable, call) val componentCall = element("ComponentCall", Expression, functionCall) val callableReferenceAccess = element("CallableReferenceAccess", Expression, qualifiedAccessExpression)