[FIR] Add special node for implicit invoke calls
This commit is contained in:
+30
-19
@@ -536,35 +536,46 @@ class ExpressionsConverter(
|
|||||||
|
|
||||||
val source = callSuffix.toFirSourceElement()
|
val source = callSuffix.toFirSourceElement()
|
||||||
|
|
||||||
val (calleeReference, explicitReceiver) = when {
|
val (calleeReference, explicitReceiver, isImplicitInvoke) = when {
|
||||||
name != null -> buildSimpleNamedReference {
|
name != null -> CalleeAndReceiver(
|
||||||
this.source = source
|
|
||||||
this.name = name.nameAsSafeName()
|
|
||||||
} to null
|
|
||||||
|
|
||||||
additionalArgument != null -> {
|
|
||||||
buildSimpleNamedReference {
|
buildSimpleNamedReference {
|
||||||
this.source = source
|
this.source = source
|
||||||
this.name = OperatorNameConventions.INVOKE
|
this.name = name.nameAsSafeName()
|
||||||
} to additionalArgument!!
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
additionalArgument != null -> {
|
||||||
|
CalleeAndReceiver(
|
||||||
|
buildSimpleNamedReference {
|
||||||
|
this.source = source
|
||||||
|
this.name = OperatorNameConventions.INVOKE
|
||||||
|
},
|
||||||
|
additionalArgument!!,
|
||||||
|
isImplicitInvoke = true
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
superNode != null -> {
|
superNode != null -> {
|
||||||
buildErrorNamedReference {
|
CalleeAndReceiver(
|
||||||
val node = superNode!!
|
buildErrorNamedReference {
|
||||||
this.source = node.toFirSourceElement()
|
val node = superNode!!
|
||||||
diagnostic = ConeSimpleDiagnostic("Super cannot be a callee", DiagnosticKind.SuperNotAllowed)
|
this.source = node.toFirSourceElement()
|
||||||
} to null
|
diagnostic = ConeSimpleDiagnostic("Super cannot be a callee", DiagnosticKind.SuperNotAllowed)
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> buildErrorNamedReference {
|
else -> CalleeAndReceiver(
|
||||||
this.source = source
|
buildErrorNamedReference {
|
||||||
diagnostic = ConeSimpleDiagnostic("Call has no callee", DiagnosticKind.Syntax)
|
this.source = source
|
||||||
} to null
|
diagnostic = ConeSimpleDiagnostic("Call has no callee", DiagnosticKind.Syntax)
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val builder: FirQualifiedAccessBuilder = if (hasArguments) {
|
val builder: FirQualifiedAccessBuilder = if (hasArguments) {
|
||||||
FirFunctionCallBuilder().apply {
|
val builder = if (isImplicitInvoke) FirImplicitInvokeCallBuilder() else FirFunctionCallBuilder()
|
||||||
|
builder.apply {
|
||||||
this.source = source
|
this.source = source
|
||||||
this.calleeReference = calleeReference
|
this.calleeReference = calleeReference
|
||||||
|
|
||||||
|
|||||||
+28
-16
@@ -1775,38 +1775,49 @@ class RawFirBuilder(
|
|||||||
private fun splitToCalleeAndReceiver(
|
private fun splitToCalleeAndReceiver(
|
||||||
calleeExpression: KtExpression?,
|
calleeExpression: KtExpression?,
|
||||||
defaultSource: FirPsiSourceElement<*>,
|
defaultSource: FirPsiSourceElement<*>,
|
||||||
): Pair<FirNamedReference, FirExpression?> {
|
): CalleeAndReceiver {
|
||||||
return when (calleeExpression) {
|
return when (calleeExpression) {
|
||||||
is KtSimpleNameExpression -> buildSimpleNamedReference {
|
is KtSimpleNameExpression ->
|
||||||
source = calleeExpression.toFirSourceElement()
|
CalleeAndReceiver(
|
||||||
name = calleeExpression.getReferencedNameAsName()
|
buildSimpleNamedReference {
|
||||||
} to null
|
source = calleeExpression.toFirSourceElement()
|
||||||
|
name = calleeExpression.getReferencedNameAsName()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
is KtParenthesizedExpression -> splitToCalleeAndReceiver(calleeExpression.expression, defaultSource)
|
is KtParenthesizedExpression -> splitToCalleeAndReceiver(calleeExpression.expression, defaultSource)
|
||||||
|
|
||||||
null -> {
|
null -> {
|
||||||
buildErrorNamedReference { diagnostic = ConeSimpleDiagnostic("Call has no callee", DiagnosticKind.Syntax) } to null
|
CalleeAndReceiver(
|
||||||
|
buildErrorNamedReference { diagnostic = ConeSimpleDiagnostic("Call has no callee", DiagnosticKind.Syntax) }
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
is KtSuperExpression -> {
|
is KtSuperExpression -> {
|
||||||
buildErrorNamedReference {
|
CalleeAndReceiver(
|
||||||
source = calleeExpression.toFirSourceElement()
|
buildErrorNamedReference {
|
||||||
diagnostic = ConeSimpleDiagnostic("Super cannot be a callee", DiagnosticKind.SuperNotAllowed)
|
source = calleeExpression.toFirSourceElement()
|
||||||
} to null
|
diagnostic = ConeSimpleDiagnostic("Super cannot be a callee", DiagnosticKind.SuperNotAllowed)
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
buildSimpleNamedReference {
|
CalleeAndReceiver(
|
||||||
source = defaultSource.fakeElement(FirFakeSourceElementKind.ImplicitInvokeCall)
|
buildSimpleNamedReference {
|
||||||
name = OperatorNameConventions.INVOKE
|
source = defaultSource.fakeElement(FirFakeSourceElementKind.ImplicitInvokeCall)
|
||||||
} to calleeExpression.toFirExpression("Incorrect invoke receiver")
|
name = OperatorNameConventions.INVOKE
|
||||||
|
},
|
||||||
|
receiverExpression = calleeExpression.toFirExpression("Incorrect invoke receiver"),
|
||||||
|
isImplicitInvoke = true
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitCallExpression(expression: KtCallExpression, data: Unit): FirElement {
|
override fun visitCallExpression(expression: KtCallExpression, data: Unit): FirElement {
|
||||||
val source = expression.toFirSourceElement()
|
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()) {
|
val result: FirQualifiedAccessBuilder = if (expression.valueArgumentList == null && expression.lambdaArguments.isEmpty()) {
|
||||||
FirQualifiedAccessExpressionBuilder().apply {
|
FirQualifiedAccessExpressionBuilder().apply {
|
||||||
@@ -1814,7 +1825,8 @@ class RawFirBuilder(
|
|||||||
this.calleeReference = calleeReference
|
this.calleeReference = calleeReference
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
FirFunctionCallBuilder().apply {
|
val builder = if (isImplicitInvoke) FirImplicitInvokeCallBuilder() else FirFunctionCallBuilder()
|
||||||
|
builder.apply {
|
||||||
this.source = source
|
this.source = source
|
||||||
this.calleeReference = calleeReference
|
this.calleeReference = calleeReference
|
||||||
context.calleeNamesForLambda += calleeReference.name
|
context.calleeNamesForLambda += calleeReference.name
|
||||||
|
|||||||
+6
@@ -494,3 +494,9 @@ fun FirQualifiedAccess.wrapWithSafeCall(receiver: FirExpression): FirSafeCallExp
|
|||||||
this.source = this@wrapWithSafeCall.source?.fakeElement(FirFakeSourceElementKind.DesugaredSafeCallExpression)
|
this.source = this@wrapWithSafeCall.source?.fakeElement(FirFakeSourceElementKind.DesugaredSafeCallExpression)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data class CalleeAndReceiver(
|
||||||
|
val reference: FirNamedReference,
|
||||||
|
val receiverExpression: FirExpression? = null,
|
||||||
|
val isImplicitInvoke: Boolean = false
|
||||||
|
)
|
||||||
|
|||||||
@@ -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<FirAnnotationCall>
|
||||||
|
abstract override val typeArguments: List<FirTypeProjection>
|
||||||
|
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 <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitImplicitInvokeCall(this, data)
|
||||||
|
|
||||||
|
abstract override fun replaceTypeRef(newTypeRef: FirTypeRef)
|
||||||
|
|
||||||
|
abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
|
||||||
|
|
||||||
|
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 <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirImplicitInvokeCall
|
||||||
|
|
||||||
|
abstract override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirImplicitInvokeCall
|
||||||
|
|
||||||
|
abstract override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirImplicitInvokeCall
|
||||||
|
|
||||||
|
abstract override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirImplicitInvokeCall
|
||||||
|
|
||||||
|
abstract override fun <D> transformExtensionReceiver(transformer: FirTransformer<D>, data: D): FirImplicitInvokeCall
|
||||||
|
|
||||||
|
abstract override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirImplicitInvokeCall
|
||||||
|
}
|
||||||
+38
@@ -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<FirAnnotationCall>
|
||||||
|
abstract override val typeArguments: MutableList<FirTypeProjection>
|
||||||
|
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
|
||||||
|
}
|
||||||
+3
-4
@@ -15,9 +15,8 @@ import org.jetbrains.kotlin.fir.expressions.FirArgumentList
|
|||||||
import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList
|
import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
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.FirExpressionBuilder
|
||||||
import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessBuilder
|
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl
|
import org.jetbrains.kotlin.fir.expressions.impl.FirFunctionCallImpl
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
||||||
import org.jetbrains.kotlin.fir.references.FirNamedReference
|
import org.jetbrains.kotlin.fir.references.FirNamedReference
|
||||||
@@ -33,7 +32,7 @@ import org.jetbrains.kotlin.fir.visitors.*
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
@FirBuilderDsl
|
@FirBuilderDsl
|
||||||
open class FirFunctionCallBuilder : FirQualifiedAccessBuilder, FirCallBuilder, FirAnnotationContainerBuilder, FirExpressionBuilder {
|
open class FirFunctionCallBuilder : FirAbstractFunctionCallBuilder, FirAnnotationContainerBuilder, FirExpressionBuilder {
|
||||||
override var source: FirSourceElement? = null
|
override var source: FirSourceElement? = null
|
||||||
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
|
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
|
||||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||||
@@ -42,7 +41,7 @@ open class FirFunctionCallBuilder : FirQualifiedAccessBuilder, FirCallBuilder, F
|
|||||||
override var dispatchReceiver: FirExpression = FirNoReceiverExpression
|
override var dispatchReceiver: FirExpression = FirNoReceiverExpression
|
||||||
override var extensionReceiver: FirExpression = FirNoReceiverExpression
|
override var extensionReceiver: FirExpression = FirNoReceiverExpression
|
||||||
override var argumentList: FirArgumentList = FirEmptyArgumentList
|
override var argumentList: FirArgumentList = FirEmptyArgumentList
|
||||||
open lateinit var calleeReference: FirNamedReference
|
override lateinit var calleeReference: FirNamedReference
|
||||||
|
|
||||||
@OptIn(FirImplementationDetail::class)
|
@OptIn(FirImplementationDetail::class)
|
||||||
override fun build(): FirFunctionCall {
|
override fun build(): FirFunctionCall {
|
||||||
|
|||||||
+72
@@ -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<FirAnnotationCall> = mutableListOf()
|
||||||
|
override val typeArguments: MutableList<FirTypeProjection> = 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()
|
||||||
|
}
|
||||||
+123
@@ -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<FirAnnotationCall>,
|
||||||
|
override val typeArguments: MutableList<FirTypeProjection>,
|
||||||
|
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 <R, D> acceptChildren(visitor: FirVisitor<R, D>, 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 <D> transformChildren(transformer: FirTransformer<D>, 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 <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirImplicitInvokeCallImpl {
|
||||||
|
annotations.transformInplace(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirImplicitInvokeCallImpl {
|
||||||
|
typeArguments.transformInplace(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformExplicitReceiver(transformer: FirTransformer<D>, data: D): FirImplicitInvokeCallImpl {
|
||||||
|
explicitReceiver = explicitReceiver?.transformSingle(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirImplicitInvokeCallImpl {
|
||||||
|
dispatchReceiver = dispatchReceiver.transformSingle(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformExtensionReceiver(transformer: FirTransformer<D>, data: D): FirImplicitInvokeCallImpl {
|
||||||
|
extensionReceiver = extensionReceiver.transformSingle(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirImplicitInvokeCallImpl {
|
||||||
|
calleeReference = calleeReference.transformSingle(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
|
||||||
|
typeRef = newTypeRef
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) {
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -85,6 +85,7 @@ import org.jetbrains.kotlin.fir.declarations.FirErrorFunction
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirErrorProperty
|
import org.jetbrains.kotlin.fir.declarations.FirErrorProperty
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
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.FirDelegatedConstructorCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirComponentCall
|
import org.jetbrains.kotlin.fir.expressions.FirComponentCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
|
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
|
||||||
@@ -457,6 +458,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
|
|||||||
return transformElement(functionCall, data)
|
return transformElement(functionCall, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open fun transformImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall, data: D): CompositeTransformResult<FirStatement> {
|
||||||
|
return transformElement(implicitInvokeCall, data)
|
||||||
|
}
|
||||||
|
|
||||||
open fun transformDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): CompositeTransformResult<FirStatement> {
|
open fun transformDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): CompositeTransformResult<FirStatement> {
|
||||||
return transformElement(delegatedConstructorCall, data)
|
return transformElement(delegatedConstructorCall, data)
|
||||||
}
|
}
|
||||||
@@ -957,6 +962,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
|
|||||||
return transformFunctionCall(functionCall, data)
|
return transformFunctionCall(functionCall, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final override fun visitImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall, data: D): CompositeTransformResult<FirStatement> {
|
||||||
|
return transformImplicitInvokeCall(implicitInvokeCall, data)
|
||||||
|
}
|
||||||
|
|
||||||
final override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): CompositeTransformResult<FirStatement> {
|
final override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): CompositeTransformResult<FirStatement> {
|
||||||
return transformDelegatedConstructorCall(delegatedConstructorCall, data)
|
return transformDelegatedConstructorCall(delegatedConstructorCall, data)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ import org.jetbrains.kotlin.fir.declarations.FirErrorFunction
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirErrorProperty
|
import org.jetbrains.kotlin.fir.declarations.FirErrorProperty
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
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.FirDelegatedConstructorCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirComponentCall
|
import org.jetbrains.kotlin.fir.expressions.FirComponentCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
|
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
|
||||||
@@ -297,6 +298,8 @@ abstract class FirVisitor<out R, in D> {
|
|||||||
|
|
||||||
open fun visitFunctionCall(functionCall: FirFunctionCall, data: D): R = visitElement(functionCall, data)
|
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 visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): R = visitElement(delegatedConstructorCall, data)
|
||||||
|
|
||||||
open fun visitComponentCall(componentCall: FirComponentCall, data: D): R = visitElement(componentCall, data)
|
open fun visitComponentCall(componentCall: FirComponentCall, data: D): R = visitElement(componentCall, data)
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ import org.jetbrains.kotlin.fir.declarations.FirErrorFunction
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirErrorProperty
|
import org.jetbrains.kotlin.fir.declarations.FirErrorProperty
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
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.FirDelegatedConstructorCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirComponentCall
|
import org.jetbrains.kotlin.fir.expressions.FirComponentCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
|
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
|
||||||
@@ -455,6 +456,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
|
|||||||
visitElement(functionCall)
|
visitElement(functionCall)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open fun visitImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall) {
|
||||||
|
visitElement(implicitInvokeCall)
|
||||||
|
}
|
||||||
|
|
||||||
open fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall) {
|
open fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall) {
|
||||||
visitElement(delegatedConstructorCall)
|
visitElement(delegatedConstructorCall)
|
||||||
}
|
}
|
||||||
@@ -955,6 +960,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
|
|||||||
visitFunctionCall(functionCall)
|
visitFunctionCall(functionCall)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final override fun visitImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall, data: Nothing?) {
|
||||||
|
visitImplicitInvokeCall(implicitInvokeCall)
|
||||||
|
}
|
||||||
|
|
||||||
final override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: Nothing?) {
|
final override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: Nothing?) {
|
||||||
visitDelegatedConstructorCall(delegatedConstructorCall)
|
visitDelegatedConstructorCall(delegatedConstructorCall)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1104,6 +1104,10 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
|
|||||||
visitCall(functionCall)
|
visitCall(functionCall)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall) {
|
||||||
|
visitFunctionCall(implicitInvokeCall)
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitComparisonExpression(comparisonExpression: FirComparisonExpression) {
|
override fun visitComparisonExpression(comparisonExpression: FirComparisonExpression) {
|
||||||
print("CMP(${comparisonExpression.operation.operator}, ")
|
print("CMP(${comparisonExpression.operation.operator}, ")
|
||||||
comparisonExpression.compareToCall.accept(this)
|
comparisonExpression.compareToCall.accept(this)
|
||||||
|
|||||||
@@ -98,5 +98,9 @@ abstract class FirDefaultTransformer<D> : FirTransformer<D>() {
|
|||||||
): CompositeTransformResult<FirStatement> {
|
): CompositeTransformResult<FirStatement> {
|
||||||
return transformResolvedQualifier(errorResolvedQualifier, data)
|
return transformResolvedQualifier(errorResolvedQualifier, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun transformImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall, data: D): CompositeTransformResult<FirStatement> {
|
||||||
|
return transformFunctionCall(implicitInvokeCall, data)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -91,5 +91,9 @@ abstract class FirDefaultVisitor<R, D> : FirVisitor<R, D>() {
|
|||||||
override fun visitErrorResolvedQualifier(errorResolvedQualifier: FirErrorResolvedQualifier, data: D): R {
|
override fun visitErrorResolvedQualifier(errorResolvedQualifier: FirErrorResolvedQualifier, data: D): R {
|
||||||
return visitResolvedQualifier(errorResolvedQualifier, data)
|
return visitResolvedQualifier(errorResolvedQualifier, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall, data: D): R {
|
||||||
|
return visitFunctionCall(implicitInvokeCall, data)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -91,4 +91,8 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() {
|
|||||||
override fun visitErrorResolvedQualifier(errorResolvedQualifier: FirErrorResolvedQualifier) {
|
override fun visitErrorResolvedQualifier(errorResolvedQualifier: FirErrorResolvedQualifier) {
|
||||||
return visitResolvedQualifier(errorResolvedQualifier)
|
return visitResolvedQualifier(errorResolvedQualifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall) {
|
||||||
|
return visitFunctionCall(implicitInvokeCall)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-3
@@ -65,6 +65,12 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
|
|||||||
fields from constructor without listOf("isPrimary", "attributes")
|
fields from constructor without listOf("isPrimary", "attributes")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val abstractFunctionCallBuilder by builder {
|
||||||
|
parents += qualifiedAccessBuilder
|
||||||
|
parents += callBuilder
|
||||||
|
fields from functionCall
|
||||||
|
}
|
||||||
|
|
||||||
for (constructorType in listOf("FirPrimaryConstructor", "FirConstructorImpl")) {
|
for (constructorType in listOf("FirPrimaryConstructor", "FirConstructorImpl")) {
|
||||||
builder(constructor, constructorType) {
|
builder(constructor, constructorType) {
|
||||||
parents += abstractConstructorBuilder
|
parents += abstractConstructorBuilder
|
||||||
@@ -148,9 +154,8 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
|
|||||||
useTypes(emptyArgumentListType)
|
useTypes(emptyArgumentListType)
|
||||||
}
|
}
|
||||||
|
|
||||||
builder(functionCall) {
|
val configurationForFunctionCallBuilder: LeafBuilderConfigurationContext.() -> Unit = {
|
||||||
parents += qualifiedAccessBuilder
|
parents += abstractFunctionCallBuilder
|
||||||
parents += callBuilder
|
|
||||||
defaultNoReceivers()
|
defaultNoReceivers()
|
||||||
openBuilder()
|
openBuilder()
|
||||||
default("argumentList") {
|
default("argumentList") {
|
||||||
@@ -159,6 +164,9 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
|
|||||||
useTypes(emptyArgumentListType)
|
useTypes(emptyArgumentListType)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
builder(functionCall, init = configurationForFunctionCallBuilder)
|
||||||
|
builder(implicitInvokeCall, init = configurationForFunctionCallBuilder)
|
||||||
|
|
||||||
builder(qualifiedAccessExpression) {
|
builder(qualifiedAccessExpression) {
|
||||||
parents += qualifiedAccessBuilder
|
parents += qualifiedAccessBuilder
|
||||||
defaultNoReceivers()
|
defaultNoReceivers()
|
||||||
|
|||||||
+1
@@ -102,6 +102,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
|
|||||||
val errorProperty = element("ErrorProperty", Declaration, variable, diagnosticHolder, typeParametersOwner)
|
val errorProperty = element("ErrorProperty", Declaration, variable, diagnosticHolder, typeParametersOwner)
|
||||||
val qualifiedAccessExpression = element("QualifiedAccessExpression", Expression, expression, qualifiedAccess)
|
val qualifiedAccessExpression = element("QualifiedAccessExpression", Expression, expression, qualifiedAccess)
|
||||||
val functionCall = element("FunctionCall", Expression, qualifiedAccessExpression, call)
|
val functionCall = element("FunctionCall", Expression, qualifiedAccessExpression, call)
|
||||||
|
val implicitInvokeCall = element("ImplicitInvokeCall", Expression, functionCall)
|
||||||
val delegatedConstructorCall = element("DelegatedConstructorCall", Expression, resolvable, call)
|
val delegatedConstructorCall = element("DelegatedConstructorCall", Expression, resolvable, call)
|
||||||
val componentCall = element("ComponentCall", Expression, functionCall)
|
val componentCall = element("ComponentCall", Expression, functionCall)
|
||||||
val callableReferenceAccess = element("CallableReferenceAccess", Expression, qualifiedAccessExpression)
|
val callableReferenceAccess = element("CallableReferenceAccess", Expression, qualifiedAccessExpression)
|
||||||
|
|||||||
Reference in New Issue
Block a user