[FIR] Remove FirLambdaArgumentExpression

It's not really necessary if the information about if the lambda was a
trailing lambda can be directly saved in FirAnonymousFunctionExpression.

Removing the FIR node uncovered a couple of bugs
(UNINITIALIZED_ENUM_ENTRY, ERROR_IN_CONTRACT_DESCRIPTION) that were
caused by assuming that a lambda is always a trailing lambda.

#KT-66124
This commit is contained in:
Kirill Rakhman
2024-03-04 11:59:13 +01:00
committed by Space Team
parent 1a5fa8d3f6
commit 03fc0fd381
66 changed files with 302 additions and 351 deletions
@@ -24,6 +24,7 @@ abstract class FirAnonymousFunctionExpression : FirExpression() {
abstract override val coneTypeOrNull: ConeKotlinType?
abstract override val annotations: List<FirAnnotation>
abstract val anonymousFunction: FirAnonymousFunction
abstract val isTrailingLambda: Boolean
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitAnonymousFunctionExpression(this, data)
@@ -36,6 +37,8 @@ abstract class FirAnonymousFunctionExpression : FirExpression() {
abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>)
abstract fun replaceIsTrailingLambda(newIsTrailingLambda: Boolean)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirAnonymousFunctionExpression
abstract fun <D> transformAnonymousFunction(transformer: FirTransformer<D>, data: D): FirAnonymousFunctionExpression
@@ -1,40 +0,0 @@
/*
* Copyright 2010-2024 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.
*/
// This file was generated automatically. See compiler/fir/tree/tree-generator/Readme.md.
// DO NOT MODIFY IT MANUALLY.
package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
/**
* Generated from: [org.jetbrains.kotlin.fir.tree.generator.FirTreeBuilder.lambdaArgumentExpression]
*/
abstract class FirLambdaArgumentExpression : FirWrappedArgumentExpression() {
abstract override val source: KtSourceElement?
@UnresolvedExpressionTypeAccess
abstract override val coneTypeOrNull: ConeKotlinType?
abstract override val annotations: List<FirAnnotation>
abstract override val expression: FirExpression
abstract override val isSpread: Boolean
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitLambdaArgumentExpression(this, data)
@Suppress("UNCHECKED_CAST")
override fun <E : FirElement, D> transform(transformer: FirTransformer<D>, data: D): E =
transformer.transformLambdaArgumentExpression(this, data) as E
abstract override fun replaceConeTypeOrNull(newConeTypeOrNull: ConeKotlinType?)
abstract override fun replaceAnnotations(newAnnotations: List<FirAnnotation>)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirLambdaArgumentExpression
}
@@ -1,53 +0,0 @@
/*
* Copyright 2010-2024 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.
*/
// This file was generated automatically. See compiler/fir/tree/tree-generator/Readme.md.
// DO NOT MODIFY IT MANUALLY.
@file:Suppress("DuplicatedCode", "unused")
package org.jetbrains.kotlin.fir.expressions.builder
import kotlin.contracts.*
import org.jetbrains.kotlin.KtSourceElement
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.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirLambdaArgumentExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirLambdaArgumentExpressionImpl
import org.jetbrains.kotlin.fir.types.ConeKotlinType
@FirBuilderDsl
class FirLambdaArgumentExpressionBuilder : FirAnnotationContainerBuilder, FirExpressionBuilder {
override var source: KtSourceElement? = null
override val annotations: MutableList<FirAnnotation> = mutableListOf()
lateinit var expression: FirExpression
override fun build(): FirLambdaArgumentExpression {
return FirLambdaArgumentExpressionImpl(
source,
annotations.toMutableOrEmpty(),
expression,
)
}
@Deprecated("Modification of 'coneTypeOrNull' has no impact for FirLambdaArgumentExpressionBuilder", level = DeprecationLevel.HIDDEN)
override var coneTypeOrNull: ConeKotlinType?
get() = throw IllegalStateException()
set(_) {
throw IllegalStateException()
}
}
@OptIn(ExperimentalContracts::class)
inline fun buildLambdaArgumentExpression(init: FirLambdaArgumentExpressionBuilder.() -> Unit): FirLambdaArgumentExpression {
contract {
callsInPlace(init, InvocationKind.EXACTLY_ONCE)
}
return FirLambdaArgumentExpressionBuilder().apply(init).build()
}
@@ -1,57 +0,0 @@
/*
* Copyright 2010-2024 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.
*/
// This file was generated automatically. See compiler/fir/tree/tree-generator/Readme.md.
// DO NOT MODIFY IT MANUALLY.
@file:Suppress("DuplicatedCode")
package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.MutableOrEmptyList
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirLambdaArgumentExpression
import org.jetbrains.kotlin.fir.expressions.UnresolvedExpressionTypeAccess
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.fir.visitors.transformInplace
internal class FirLambdaArgumentExpressionImpl(
override val source: KtSourceElement?,
override var annotations: MutableOrEmptyList<FirAnnotation>,
override var expression: FirExpression,
) : FirLambdaArgumentExpression() {
@OptIn(UnresolvedExpressionTypeAccess::class)
override val coneTypeOrNull: ConeKotlinType?
get() = expression.coneTypeOrNull
override val isSpread: Boolean
get() = false
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
annotations.forEach { it.accept(visitor, data) }
expression.accept(visitor, data)
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirLambdaArgumentExpressionImpl {
transformAnnotations(transformer, data)
expression = expression.transform(transformer, data)
return this
}
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirLambdaArgumentExpressionImpl {
annotations.transformInplace(transformer, data)
return this
}
override fun replaceConeTypeOrNull(newConeTypeOrNull: ConeKotlinType?) {}
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
annotations = newAnnotations.toMutableOrEmpty()
}
}
@@ -170,9 +170,6 @@ abstract class FirDefaultVisitor<out R, in D> : FirVisitor<R, D>() {
override fun visitWrappedArgumentExpression(wrappedArgumentExpression: FirWrappedArgumentExpression, data: D): R =
visitWrappedExpression(wrappedArgumentExpression, data)
override fun visitLambdaArgumentExpression(lambdaArgumentExpression: FirLambdaArgumentExpression, data: D): R =
visitWrappedArgumentExpression(lambdaArgumentExpression, data)
override fun visitSpreadArgumentExpression(spreadArgumentExpression: FirSpreadArgumentExpression, data: D): R =
visitWrappedArgumentExpression(spreadArgumentExpression, data)
@@ -120,8 +120,6 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() {
override fun visitWrappedArgumentExpression(wrappedArgumentExpression: FirWrappedArgumentExpression) = visitWrappedExpression(wrappedArgumentExpression)
override fun visitLambdaArgumentExpression(lambdaArgumentExpression: FirLambdaArgumentExpression) = visitWrappedArgumentExpression(lambdaArgumentExpression)
override fun visitSpreadArgumentExpression(spreadArgumentExpression: FirSpreadArgumentExpression) = visitWrappedArgumentExpression(spreadArgumentExpression)
override fun visitNamedArgumentExpression(namedArgumentExpression: FirNamedArgumentExpression) = visitWrappedArgumentExpression(namedArgumentExpression)
@@ -923,14 +923,6 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformWrappedArgumentExpression(wrappedArgumentExpression, data)
}
open fun transformLambdaArgumentExpression(lambdaArgumentExpression: FirLambdaArgumentExpression, data: D): FirStatement {
return transformElement(lambdaArgumentExpression, data)
}
final override fun visitLambdaArgumentExpression(lambdaArgumentExpression: FirLambdaArgumentExpression, data: D): FirStatement {
return transformLambdaArgumentExpression(lambdaArgumentExpression, data)
}
open fun transformSpreadArgumentExpression(spreadArgumentExpression: FirSpreadArgumentExpression, data: D): FirStatement {
return transformElement(spreadArgumentExpression, data)
}
@@ -359,9 +359,6 @@ abstract class FirVisitor<out R, in D> {
open fun visitWrappedArgumentExpression(wrappedArgumentExpression: FirWrappedArgumentExpression, data: D): R =
visitElement(wrappedArgumentExpression, data)
open fun visitLambdaArgumentExpression(lambdaArgumentExpression: FirLambdaArgumentExpression, data: D): R =
visitElement(lambdaArgumentExpression, data)
open fun visitSpreadArgumentExpression(spreadArgumentExpression: FirSpreadArgumentExpression, data: D): R =
visitElement(spreadArgumentExpression, data)
@@ -923,14 +923,6 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(wrappedArgumentExpression)
}
final override fun visitLambdaArgumentExpression(lambdaArgumentExpression: FirLambdaArgumentExpression, data: Nothing?) {
visitLambdaArgumentExpression(lambdaArgumentExpression)
}
open fun visitLambdaArgumentExpression(lambdaArgumentExpression: FirLambdaArgumentExpression) {
visitElement(lambdaArgumentExpression)
}
final override fun visitSpreadArgumentExpression(spreadArgumentExpression: FirSpreadArgumentExpression, data: Nothing?) {
visitSpreadArgumentExpression(spreadArgumentExpression)
}
@@ -21,11 +21,13 @@ import kotlin.contracts.contract
class FirAnonymousFunctionExpressionBuilder : FirAnnotationContainerBuilder, FirExpressionBuilder {
override var source: KtSourceElement? = null
lateinit var anonymousFunction: FirAnonymousFunction
var isTrailingLambda: Boolean = false
override fun build(): FirAnonymousFunctionExpression {
return FirAnonymousFunctionExpressionImpl(
source,
anonymousFunction
anonymousFunction,
isTrailingLambda,
)
}
@@ -19,8 +19,10 @@ import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled
@OptIn(UnresolvedExpressionTypeAccess::class)
internal class FirAnonymousFunctionExpressionImpl(
override val source: KtSourceElement?,
override var anonymousFunction: FirAnonymousFunction
override var anonymousFunction: FirAnonymousFunction,
override var isTrailingLambda: Boolean,
) : FirAnonymousFunctionExpression() {
@UnresolvedExpressionTypeAccess
override val coneTypeOrNull: ConeKotlinType?
get() = anonymousFunction.typeRef.coneTypeOrNull
@@ -40,6 +42,10 @@ internal class FirAnonymousFunctionExpressionImpl(
anonymousFunction.replaceAnnotations(newAnnotations)
}
override fun replaceIsTrailingLambda(newIsTrailingLambda: Boolean) {
isTrailingLambda = newIsTrailingLambda
}
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirAnonymousFunctionExpressionImpl {
return this
}
@@ -435,6 +435,7 @@ class FirRenderer(
}
override fun visitAnonymousFunctionExpression(anonymousFunctionExpression: FirAnonymousFunctionExpression) {
if (anonymousFunctionExpression.isTrailingLambda) print("<L> = ")
visitAnonymousFunction(anonymousFunctionExpression.anonymousFunction)
}
@@ -732,11 +733,6 @@ class FirRenderer(
spreadArgumentExpression.expression.accept(this)
}
override fun visitLambdaArgumentExpression(lambdaArgumentExpression: FirLambdaArgumentExpression) {
print("<L> = ")
lambdaArgumentExpression.expression.accept(this)
}
override fun visitVarargArgumentsExpression(varargArgumentsExpression: FirVarargArgumentsExpression) {
print("vararg(")
renderSeparated(varargArgumentsExpression.arguments, visitor)
@@ -744,8 +740,17 @@ class FirRenderer(
}
override fun visitSamConversionExpression(samConversionExpression: FirSamConversionExpression) {
val expression = samConversionExpression.expression
if (expression is FirAnonymousFunctionExpression && expression.isTrailingLambda) {
print("<L> = SAM(")
expression.anonymousFunction.accept(this)
print(")")
return
}
print("SAM(")
samConversionExpression.expression.accept(this)
expression.accept(this)
print(")")
}
@@ -70,11 +70,6 @@ abstract class FirDefaultTransformer<D> : FirTransformer<D>() {
return transformJump(breakExpression, data)
}
override fun transformLambdaArgumentExpression(lambdaArgumentExpression: FirLambdaArgumentExpression, data: D): FirStatement {
return transformWrappedArgumentExpression(lambdaArgumentExpression, data)
}
override fun transformSpreadArgumentExpression(spreadArgumentExpression: FirSpreadArgumentExpression, data: D): FirStatement {
return transformWrappedArgumentExpression(spreadArgumentExpression, data)
}
@@ -143,7 +143,6 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val getClassCall by element(Expression, expression, call)
val wrappedExpression by element(Expression, expression)
val wrappedArgumentExpression by element(Expression, wrappedExpression)
val lambdaArgumentExpression by element(Expression, wrappedArgumentExpression)
val spreadArgumentExpression by element(Expression, wrappedArgumentExpression)
val namedArgumentExpression by element(Expression, wrappedArgumentExpression)
val varargArgumentsExpression by element(Expression, expression)
@@ -316,16 +316,6 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
}
}
impl(lambdaArgumentExpression) {
default("isSpread") {
value = "false"
withGetter = true
}
default("coneTypeOrNull") {
delegate = "expression"
}
}
impl(spreadArgumentExpression) {
default("isSpread") {
value = "true"
@@ -331,6 +331,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
anonymousFunctionExpression.configure {
+field(anonymousFunction).withTransform()
+booleanField("isTrailingLambda", withReplace = true)
}
typeParameter.configure {