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