[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:
committed by
Space Team
parent
1a5fa8d3f6
commit
03fc0fd381
+3
@@ -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
|
||||
|
||||
-40
@@ -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
|
||||
}
|
||||
-53
@@ -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()
|
||||
}
|
||||
-57
@@ -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)
|
||||
}
|
||||
|
||||
+3
-1
@@ -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,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+7
-1
@@ -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)
|
||||
}
|
||||
|
||||
-1
@@ -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)
|
||||
|
||||
-10
@@ -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"
|
||||
|
||||
+1
@@ -331,6 +331,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
|
||||
|
||||
anonymousFunctionExpression.configure {
|
||||
+field(anonymousFunction).withTransform()
|
||||
+booleanField("isTrailingLambda", withReplace = true)
|
||||
}
|
||||
|
||||
typeParameter.configure {
|
||||
|
||||
Reference in New Issue
Block a user