From b74dcb77e3cbee0b3ac82e1e3c9f0b4deba11b20 Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Wed, 13 Mar 2024 09:44:21 +0100 Subject: [PATCH] [FIR] Add opt-in to replaceIsTrailingLambda #KT-66553 --- .../converter/LightTreeRawFirExpressionBuilder.kt | 2 ++ .../org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt | 2 ++ .../fir/expressions/FirAnonymousFunctionExpression.kt | 1 + .../org/jetbrains/kotlin/fir/expressions/RawFirApi.kt | 9 +++++++++ .../impl/FirAnonymousFunctionExpressionImpl.kt | 2 ++ .../kotlin/fir/tree/generator/NodeConfigurator.kt | 4 +++- .../src/org/jetbrains/kotlin/fir/tree/generator/Types.kt | 1 + .../jetbrains/kotlin/fir/tree/generator/model/Field.kt | 4 ++++ .../jetbrains/kotlin/fir/tree/generator/printer/utils.kt | 1 + .../jetbrains/kotlin/generators/tree/AbstractField.kt | 2 ++ .../kotlin/generators/tree/printer/printUtils.kt | 5 +++++ 11 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/RawFirApi.kt diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirExpressionBuilder.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirExpressionBuilder.kt index 22d0ad8d2d1..bd125d485ad 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirExpressionBuilder.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirExpressionBuilder.kt @@ -1515,6 +1515,8 @@ class LightTreeRawFirExpressionBuilder( LABELED_EXPRESSION, ANNOTATED_EXPRESSION, -> container += getAsFirExpression(node).apply { + // TODO(KT-66553) remove and set in builder + @OptIn(RawFirApi::class) replaceIsTrailingLambda(newIsTrailingLambda = true) } } diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt index d9da9bf3320..1add94d919c 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt @@ -905,6 +905,8 @@ open class PsiRawFirBuilder( buildOrLazyExpression((argument as? PsiElement)?.toFirSourceElement()) { argument.toFirExpression() } arguments += when (argument) { is KtLambdaArgument -> argumentExpression.apply { + // TODO(KT-66553) remove and set in builder + @OptIn(RawFirApi::class) (this as? FirAnonymousFunctionExpression)?.replaceIsTrailingLambda(true) } else -> argumentExpression diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirAnonymousFunctionExpression.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirAnonymousFunctionExpression.kt index f8c25caa56e..ffdda2b58fc 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirAnonymousFunctionExpression.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirAnonymousFunctionExpression.kt @@ -37,6 +37,7 @@ abstract class FirAnonymousFunctionExpression : FirExpression() { abstract override fun replaceAnnotations(newAnnotations: List) + @RawFirApi abstract fun replaceIsTrailingLambda(newIsTrailingLambda: Boolean) abstract override fun transformAnnotations(transformer: FirTransformer, data: D): FirAnonymousFunctionExpression diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/RawFirApi.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/RawFirApi.kt new file mode 100644 index 00000000000..d3f8877b9f1 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/RawFirApi.kt @@ -0,0 +1,9 @@ +/* + * 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. + */ + +package org.jetbrains.kotlin.fir.expressions + +@RequiresOptIn("API is only for raw FIR building.") +annotation class RawFirApi diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAnonymousFunctionExpressionImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAnonymousFunctionExpressionImpl.kt index f1b5b255d7e..d33ab3b9d04 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAnonymousFunctionExpressionImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/impl/FirAnonymousFunctionExpressionImpl.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression +import org.jetbrains.kotlin.fir.expressions.RawFirApi import org.jetbrains.kotlin.fir.expressions.UnresolvedExpressionTypeAccess import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.coneTypeOrNull @@ -42,6 +43,7 @@ internal class FirAnonymousFunctionExpressionImpl( anonymousFunction.replaceAnnotations(newAnnotations) } + @RawFirApi override fun replaceIsTrailingLambda(newIsTrailingLambda: Boolean) { isTrailingLambda = newIsTrailingLambda } diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index 58361425e97..26cf5ff9561 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -332,7 +332,9 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild anonymousFunctionExpression.configure { +field(anonymousFunction).withTransform() - +booleanField("isTrailingLambda", withReplace = true) + +booleanField("isTrailingLambda", withReplace = true).apply { + replaceOptInAnnotation = rawFirApi + } } typeParameter.configure { diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt index 9cad8db05eb..24c591ed535 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/Types.kt @@ -124,4 +124,5 @@ val firTransformerType = generatedType("visitors", "FirTransformer") val resolveStateAccessAnnotation = type("fir.declarations", "ResolveStateAccess", kind = TypeKind.Class) val unresolvedExpressionTypeAccessAnnotation = type("fir.expressions", "UnresolvedExpressionTypeAccess", kind = TypeKind.Class) +val rawFirApi = type("fir.expressions", "RawFirApi", kind = TypeKind.Class) val firBuilderDslAnnotation = type("fir.builder", "FirBuilderDsl", kind = TypeKind.Class) diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Field.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Field.kt index 9922b01b21f..57916090908 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Field.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/model/Field.kt @@ -103,6 +103,10 @@ class FieldWithDefault(override val origin: Field) : Field(), AbstractFieldWithD get() = origin.optInAnnotation set(_) {} + override var replaceOptInAnnotation: ClassRef<*>? + get() = origin.replaceOptInAnnotation + set(_) {} + override var defaultValueInImplementation: String? = origin.defaultValueInImplementation override var defaultValueInBuilder: String? = null override var isMutable: Boolean = origin.isMutable diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/utils.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/utils.kt index fad144c62a9..21731253bbd 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/utils.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/utils.kt @@ -78,6 +78,7 @@ fun SmartPrinter.replaceFunctionDeclaration( implementationKind == ImplementationKind.AbstractClass || implementationKind == ImplementationKind.SealedClass }, override = override, + optInAnnotation = field.replaceOptInAnnotation, ) } diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractField.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractField.kt index 1c5a46d8466..c874140ef14 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractField.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/AbstractField.kt @@ -27,6 +27,7 @@ abstract class AbstractField> { open val arbitraryImportables: MutableList = mutableListOf() open var optInAnnotation: ClassRef<*>? = null + open var replaceOptInAnnotation: ClassRef<*>? = null abstract var isMutable: Boolean open val withGetter: Boolean get() = false @@ -102,6 +103,7 @@ abstract class AbstractField> { copy.isLateinit = isLateinit copy.arbitraryImportables += arbitraryImportables copy.optInAnnotation = optInAnnotation + copy.replaceOptInAnnotation = replaceOptInAnnotation copy.isMutable = isMutable copy.deprecation = deprecation copy.visibility = visibility diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/printer/printUtils.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/printer/printUtils.kt index da37d2849a1..b8491497758 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/printer/printUtils.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/printer/printUtils.kt @@ -117,7 +117,12 @@ fun SmartPrinter.printFunctionDeclaration( override: Boolean = false, isInline: Boolean = false, allParametersOnSeparateLines: Boolean = false, + optInAnnotation: ClassRef<*>? = null, ) { + optInAnnotation?.let { + println("@", it.render()) + } + if (visibility != Visibility.PUBLIC) { print(visibility.name.toLowerCaseAsciiOnly(), " ") }