[FIR] Add excessive delegated constructors to FIR tree

^KTIJ-25453 fixed

Merge-request: KT-MR-10379
Merged-by: Egor Kulikov <Egor.Kulikov@jetbrains.com>
This commit is contained in:
Egor Kulikov
2023-06-05 14:27:53 +00:00
committed by Space Team
parent 7fbdd8e0bc
commit 347c748182
32 changed files with 494 additions and 67 deletions
@@ -0,0 +1,58 @@
/*
* Copyright 2010-2023 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.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.references.FirReference
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 FirMultiDelegatedConstructorCall : FirDelegatedConstructorCall() {
abstract override val source: KtSourceElement?
abstract override val annotations: List<FirAnnotation>
abstract override val argumentList: FirArgumentList
abstract override val contextReceiverArguments: List<FirExpression>
abstract override val constructedTypeRef: FirTypeRef
abstract override val dispatchReceiver: FirExpression
abstract override val calleeReference: FirReference
abstract override val isThis: Boolean
abstract override val isSuper: Boolean
abstract val delegatedConstructorCalls: List<FirDelegatedConstructorCall>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitMultiDelegatedConstructorCall(this, data)
@Suppress("UNCHECKED_CAST")
override fun <E : FirElement, D> transform(transformer: FirTransformer<D>, data: D): E =
transformer.transformMultiDelegatedConstructorCall(this, data) as E
abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>)
abstract override fun replaceArgumentList(newArgumentList: FirArgumentList)
abstract override fun replaceContextReceiverArguments(newContextReceiverArguments: List<FirExpression>)
abstract override fun replaceConstructedTypeRef(newConstructedTypeRef: FirTypeRef)
abstract override fun replaceDispatchReceiver(newDispatchReceiver: FirExpression)
abstract override fun replaceCalleeReference(newCalleeReference: FirReference)
abstract fun replaceDelegatedConstructorCalls(newDelegatedConstructorCalls: List<FirDelegatedConstructorCall>)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirMultiDelegatedConstructorCall
abstract override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirMultiDelegatedConstructorCall
abstract override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirMultiDelegatedConstructorCall
abstract fun <D> transformDelegatedConstructorCalls(transformer: FirTransformer<D>, data: D): FirMultiDelegatedConstructorCall
}
@@ -0,0 +1,59 @@
/*
* Copyright 2010-2023 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.
*/
@file:Suppress("DuplicatedCode")
package org.jetbrains.kotlin.fir.expressions.builder
import kotlin.contracts.*
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirMultiDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.impl.FirMultiDelegatedConstructorCallImpl
import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
@FirBuilderDsl
class FirMultiDelegatedConstructorCallBuilder : FirAnnotationContainerBuilder {
val delegatedConstructorCalls: MutableList<FirDelegatedConstructorCall> = mutableListOf()
@OptIn(FirImplementationDetail::class)
override fun build(): FirMultiDelegatedConstructorCall {
return FirMultiDelegatedConstructorCallImpl(
delegatedConstructorCalls,
)
}
@Deprecated("Modification of 'source' has no impact for FirMultiDelegatedConstructorCallBuilder", level = DeprecationLevel.HIDDEN)
override var source: KtSourceElement?
get() = throw IllegalStateException()
set(_) {
throw IllegalStateException()
}
@Deprecated("Modification of 'annotations' has no impact for FirMultiDelegatedConstructorCallBuilder", level = DeprecationLevel.HIDDEN)
override val annotations: MutableList<FirAnnotation> = mutableListOf()
}
@OptIn(ExperimentalContracts::class)
inline fun buildMultiDelegatedConstructorCall(init: FirMultiDelegatedConstructorCallBuilder.() -> Unit = {}): FirMultiDelegatedConstructorCall {
contract {
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
}
return FirMultiDelegatedConstructorCallBuilder().apply(init).build()
}
@@ -0,0 +1,83 @@
/*
* Copyright 2010-2023 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.
*/
@file:Suppress("DuplicatedCode")
package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirMultiDelegatedConstructorCall
import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.*
import org.jetbrains.kotlin.fir.MutableOrEmptyList
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
class FirMultiDelegatedConstructorCallImpl @FirImplementationDetail constructor(
override val delegatedConstructorCalls: MutableList<FirDelegatedConstructorCall>,
) : FirMultiDelegatedConstructorCall() {
override val source: KtSourceElement? get() = delegatedConstructorCalls.last().source
override val annotations: List<FirAnnotation> get() = delegatedConstructorCalls.last().annotations
override val argumentList: FirArgumentList get() = delegatedConstructorCalls.last().argumentList
override val contextReceiverArguments: List<FirExpression> get() = delegatedConstructorCalls.last().contextReceiverArguments
override val constructedTypeRef: FirTypeRef get() = delegatedConstructorCalls.last().constructedTypeRef
override val dispatchReceiver: FirExpression get() = delegatedConstructorCalls.last().dispatchReceiver
override val calleeReference: FirReference get() = delegatedConstructorCalls.last().calleeReference
override val isThis: Boolean get() = delegatedConstructorCalls.last().isThis
override val isSuper: Boolean get() = !isThis
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
delegatedConstructorCalls.forEach { it.accept(visitor, data) }
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirMultiDelegatedConstructorCallImpl {
transformDelegatedConstructorCalls(transformer, data)
return this
}
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirMultiDelegatedConstructorCallImpl {
return this
}
override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirMultiDelegatedConstructorCallImpl {
return this
}
override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirMultiDelegatedConstructorCallImpl {
return this
}
override fun <D> transformDelegatedConstructorCalls(transformer: FirTransformer<D>, data: D): FirMultiDelegatedConstructorCallImpl {
delegatedConstructorCalls.transformInplace(transformer, data)
return this
}
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {}
override fun replaceArgumentList(newArgumentList: FirArgumentList) {}
override fun replaceContextReceiverArguments(newContextReceiverArguments: List<FirExpression>) {}
override fun replaceConstructedTypeRef(newConstructedTypeRef: FirTypeRef) {}
override fun replaceDispatchReceiver(newDispatchReceiver: FirExpression) {}
override fun replaceCalleeReference(newCalleeReference: FirReference) {}
override fun replaceDelegatedConstructorCalls(newDelegatedConstructorCalls: List<FirDelegatedConstructorCall>) {
delegatedConstructorCalls.clear()
delegatedConstructorCalls.addAll(newDelegatedConstructorCalls)
}
}
@@ -105,6 +105,7 @@ import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirIntegerLiteralOperatorCall
import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirMultiDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirComponentCall
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression
@@ -240,6 +241,8 @@ abstract class FirDefaultVisitor<out R, in D> : FirVisitor<R, D>() {
override fun visitImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall, data: D): R = visitFunctionCall(implicitInvokeCall, data)
override fun visitMultiDelegatedConstructorCall(multiDelegatedConstructorCall: FirMultiDelegatedConstructorCall, data: D): R = visitDelegatedConstructorCall(multiDelegatedConstructorCall, data)
override fun visitComponentCall(componentCall: FirComponentCall, data: D): R = visitFunctionCall(componentCall, data)
override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, data: D): R = visitQualifiedAccessExpression(callableReferenceAccess, data)
@@ -105,6 +105,7 @@ import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirIntegerLiteralOperatorCall
import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirMultiDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirComponentCall
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression
@@ -240,6 +241,8 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() {
override fun visitImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall) = visitFunctionCall(implicitInvokeCall)
override fun visitMultiDelegatedConstructorCall(multiDelegatedConstructorCall: FirMultiDelegatedConstructorCall) = visitDelegatedConstructorCall(multiDelegatedConstructorCall)
override fun visitComponentCall(componentCall: FirComponentCall) = visitFunctionCall(componentCall)
override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess) = visitQualifiedAccessExpression(callableReferenceAccess)
@@ -105,6 +105,7 @@ import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirIntegerLiteralOperatorCall
import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirMultiDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirComponentCall
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression
@@ -561,6 +562,10 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformElement(delegatedConstructorCall, data)
}
open fun transformMultiDelegatedConstructorCall(multiDelegatedConstructorCall: FirMultiDelegatedConstructorCall, data: D): FirStatement {
return transformElement(multiDelegatedConstructorCall, data)
}
open fun transformComponentCall(componentCall: FirComponentCall, data: D): FirStatement {
return transformElement(componentCall, data)
}
@@ -1161,6 +1166,10 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformDelegatedConstructorCall(delegatedConstructorCall, data)
}
final override fun visitMultiDelegatedConstructorCall(multiDelegatedConstructorCall: FirMultiDelegatedConstructorCall, data: D): FirStatement {
return transformMultiDelegatedConstructorCall(multiDelegatedConstructorCall, data)
}
final override fun visitComponentCall(componentCall: FirComponentCall, data: D): FirStatement {
return transformComponentCall(componentCall, data)
}
@@ -105,6 +105,7 @@ import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirIntegerLiteralOperatorCall
import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirMultiDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirComponentCall
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression
@@ -362,6 +363,8 @@ abstract class FirVisitor<out R, in D> {
open fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): R = visitElement(delegatedConstructorCall, data)
open fun visitMultiDelegatedConstructorCall(multiDelegatedConstructorCall: FirMultiDelegatedConstructorCall, data: D): R = visitElement(multiDelegatedConstructorCall, data)
open fun visitComponentCall(componentCall: FirComponentCall, data: D): R = visitElement(componentCall, data)
open fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, data: D): R = visitElement(callableReferenceAccess, data)
@@ -105,6 +105,7 @@ import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirIntegerLiteralOperatorCall
import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirMultiDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirComponentCall
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression
@@ -560,6 +561,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(delegatedConstructorCall)
}
open fun visitMultiDelegatedConstructorCall(multiDelegatedConstructorCall: FirMultiDelegatedConstructorCall) {
visitElement(multiDelegatedConstructorCall)
}
open fun visitComponentCall(componentCall: FirComponentCall) {
visitElement(componentCall)
}
@@ -1160,6 +1165,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitDelegatedConstructorCall(delegatedConstructorCall)
}
final override fun visitMultiDelegatedConstructorCall(multiDelegatedConstructorCall: FirMultiDelegatedConstructorCall, data: Nothing?) {
visitMultiDelegatedConstructorCall(multiDelegatedConstructorCall)
}
final override fun visitComponentCall(componentCall: FirComponentCall, data: Nothing?) {
visitComponentCall(componentCall)
}
@@ -726,6 +726,18 @@ class FirRenderer(
}
}
override fun visitMultiDelegatedConstructorCall(multiDelegatedConstructorCall: FirMultiDelegatedConstructorCall) {
var first = true
for (delegatedConstructorCall in multiDelegatedConstructorCall.delegatedConstructorCalls) {
if (first) {
first = false
} else {
printer.println()
}
visitDelegatedConstructorCall(delegatedConstructorCall)
}
}
override fun visitTypeRef(typeRef: FirTypeRef) {
annotationRenderer?.render(typeRef)
visitElement(typeRef)
@@ -129,6 +129,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val integerLiteralOperatorCall by element(Expression, functionCall)
val implicitInvokeCall by element(Expression, functionCall)
val delegatedConstructorCall by element(Expression, resolvable, call, contextReceiverArgumentListOwner)
val multiDelegatedConstructorCall by element(Expression, delegatedConstructorCall)
val componentCall by element(Expression, functionCall)
val callableReferenceAccess by element(Expression, qualifiedAccessExpression)
val thisReceiverExpression by element(Expression, qualifiedAccessExpression)
@@ -129,6 +129,46 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
useTypes(explicitThisReferenceType, explicitSuperReferenceType)
}
impl(multiDelegatedConstructorCall) {
default("source") {
value = "delegatedConstructorCalls.last().source"
withGetter = true
}
default("annotations") {
value = "delegatedConstructorCalls.last().annotations"
withGetter = true
}
default("argumentList") {
value = "delegatedConstructorCalls.last().argumentList"
withGetter = true
}
default("contextReceiverArguments") {
value = "delegatedConstructorCalls.last().contextReceiverArguments"
withGetter = true
}
default("constructedTypeRef") {
value = "delegatedConstructorCalls.last().constructedTypeRef"
withGetter = true
}
default("dispatchReceiver") {
value = "delegatedConstructorCalls.last().dispatchReceiver"
withGetter = true
}
default("calleeReference") {
value = "delegatedConstructorCalls.last().calleeReference"
withGetter = true
}
default("isThis") {
value = "delegatedConstructorCalls.last().isThis"
withGetter = true
}
default("isSuper") {
value = "!isThis"
withGetter = true
}
publicImplementation()
}
impl(delegatedConstructorCall, "FirLazyDelegatedConstructorCall") {
val error = """error("FirLazyDelegatedConstructorCall should be calculated before accessing")"""
default("source") {
@@ -418,6 +418,10 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
generateBooleanFields("this", "super")
}
multiDelegatedConstructorCall.configure {
+fieldList("delegatedConstructorCalls", delegatedConstructorCall, withReplace = true).withTransform()
}
valueParameter.configure {
+symbol("FirValueParameterSymbol")
+field("defaultValue", expression, nullable = true, withReplace = true)