From a29a7e630775008d08cf8bd60e4ccbd75084ab3b Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Mon, 27 Nov 2023 17:06:37 +0100 Subject: [PATCH] FIR: refactor destructuring declaration building helpers rename them since they generate variables with initialization, rather than arbitrary statements, and this fact is used in scripts and also add initialization helper, used for scripting support too. --- .../lightTree/fir/DestructuringDeclaration.kt | 4 +-- .../kotlin/fir/builder/PsiConversionUtils.kt | 9 ++++--- .../kotlin/fir/builder/PsiRawFirBuilder.kt | 26 +++++++++---------- .../kotlin/fir/builder/Destructuring.kt | 6 ++--- 4 files changed, 23 insertions(+), 22 deletions(-) diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/DestructuringDeclaration.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/DestructuringDeclaration.kt index db8f99c7ecf..7e58a38fef9 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/DestructuringDeclaration.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/DestructuringDeclaration.kt @@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilder import org.jetbrains.kotlin.fir.builder.DestructuringContext import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder -import org.jetbrains.kotlin.fir.builder.addDestructuringStatements +import org.jetbrains.kotlin.fir.builder.addDestructuringVariables import org.jetbrains.kotlin.fir.declarations.FirVariable import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall @@ -80,7 +80,7 @@ fun MutableList.addDestructuringStatements( localEntries: Boolean, ) { with(DestructuringEntry) { - addDestructuringStatements( + addDestructuringVariables( moduleData, container, multiDeclaration.entries, diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiConversionUtils.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiConversionUtils.kt index 3ca0c4662d8..6019bf04d39 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiConversionUtils.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiConversionUtils.kt @@ -132,7 +132,7 @@ internal fun generateDestructuringBlock( ): FirBlock { return buildBlock { source = multiDeclaration.toKtPsiSourceElement() - statements.addDestructuringStatements( + statements.addDestructuringVariables( moduleData, multiDeclaration, container, @@ -143,12 +143,15 @@ internal fun generateDestructuringBlock( } context(AbstractRawFirBuilder<*>, DestructuringContext) -internal fun MutableList.addDestructuringStatements( +internal fun MutableList.addDestructuringVariables( moduleData: FirModuleData, multiDeclaration: KtDestructuringDeclaration, container: FirVariable, tmpVariable: Boolean, localEntries: Boolean, + configure: (FirVariable) -> Unit = {} ) { - addDestructuringStatements(moduleData, container, multiDeclaration.entries, multiDeclaration.isVar, tmpVariable, localEntries) + this@addDestructuringVariables.addDestructuringVariables( + moduleData, container, multiDeclaration.entries, multiDeclaration.isVar, tmpVariable, localEntries, configure + ) } 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 f2ebb78aa5f..4dcddacc53f 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 @@ -1299,19 +1299,17 @@ open class PsiRawFirBuilder( ).apply { isDestructuringDeclarationContainerVariable = true } - val destructuringBlock = generateDestructuringBlock( - baseModuleData, + statements.add(destructuringContainerVar) + + statements.addDestructuringVariables( + moduleData, declaration, destructuringContainerVar, tmpVariable = false, localEntries = false, - ).apply { - statements.forEach { - (it as FirProperty).destructuringDeclarationContainerVariable = destructuringContainerVar.symbol - } + ) { + (it as FirProperty).destructuringDeclarationContainerVariable = destructuringContainerVar.symbol } - statements.add(destructuringContainerVar) - statements.addAll(destructuringBlock.statements) } else -> { statements.add(declaration.toFirStatement()) @@ -1835,7 +1833,7 @@ open class PsiRawFirBuilder( isLambda = true hasExplicitParameterList = expression.functionLiteral.arrow != null - val destructuringStatements = mutableListOf() + val destructuringVariables = mutableListOf() for (valueParameter in literal.valueParameters) { val multiDeclaration = valueParameter.destructuringDeclaration valueParameters += if (multiDeclaration != null) { @@ -1852,7 +1850,7 @@ open class PsiRawFirBuilder( isNoinline = false isVararg = false } - destructuringStatements.addDestructuringStatements( + destructuringVariables.addDestructuringVariables( baseModuleData, multiDeclaration, multiParameter, @@ -1881,7 +1879,7 @@ open class PsiRawFirBuilder( val errorExpression = buildErrorExpression(source, ConeSyntaxDiagnostic("Lambda has no body")) FirSingleExpressionBlock(errorExpression.toReturn()) } else { - val kind = runIf(destructuringStatements.isNotEmpty()) { + val kind = runIf(destructuringVariables.isNotEmpty()) { KtFakeSourceElementKind.LambdaDestructuringBlock } val bodyBlock = configureBlockWithoutBuilding(ktBody, kind).apply { @@ -1905,11 +1903,11 @@ open class PsiRawFirBuilder( } }.build() - if (destructuringStatements.isNotEmpty()) { + if (destructuringVariables.isNotEmpty()) { // Destructured variables must be in a separate block so that they can be shadowed. buildBlock { source = bodyBlock.source?.realElement() - statements.addAll(destructuringStatements) + statements.addAll(destructuringVariables) statements.add(bodyBlock) } } else { @@ -2739,7 +2737,7 @@ open class PsiRawFirBuilder( extractedAnnotations = ktParameter.modifierList?.annotationEntries?.map { it.convert() }, ) if (multiDeclaration != null) { - blockBuilder.statements.addDestructuringStatements( + blockBuilder.statements.addDestructuringVariables( baseModuleData, multiDeclaration = multiDeclaration, container = firLoopParameter, diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/Destructuring.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/Destructuring.kt index dadbd7b6421..ea9cace1308 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/Destructuring.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/Destructuring.kt @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirVariable import org.jetbrains.kotlin.fir.declarations.builder.buildProperty import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl -import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.types.FirTypeRef @@ -27,13 +26,14 @@ interface DestructuringContext { } context(AbstractRawFirBuilder<*>, DestructuringContext) -fun MutableList.addDestructuringStatements( +fun MutableList.addDestructuringVariables( moduleData: FirModuleData, container: FirVariable, entries: List, isVar: Boolean, tmpVariable: Boolean, localEntries: Boolean, + configure: (FirVariable) -> Unit = {} ) { if (tmpVariable) { this += container @@ -53,6 +53,6 @@ fun MutableList.addDestructuringStatements( status = FirDeclarationStatusImpl(if (localEntries) Visibilities.Local else Visibilities.Public, Modality.FINAL) entry.extractAnnotationsTo(this, context.containerSymbol) } - } + }.also(configure) } } \ No newline at end of file