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.
This commit is contained in:
Ilya Chernikov
2023-11-27 17:06:37 +01:00
committed by Space Team
parent b0f44e8f69
commit a29a7e6307
4 changed files with 23 additions and 22 deletions
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilder import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilder
import org.jetbrains.kotlin.fir.builder.DestructuringContext import org.jetbrains.kotlin.fir.builder.DestructuringContext
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder 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.declarations.FirVariable
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
@@ -80,7 +80,7 @@ fun MutableList<FirStatement>.addDestructuringStatements(
localEntries: Boolean, localEntries: Boolean,
) { ) {
with(DestructuringEntry) { with(DestructuringEntry) {
addDestructuringStatements( addDestructuringVariables(
moduleData, moduleData,
container, container,
multiDeclaration.entries, multiDeclaration.entries,
@@ -132,7 +132,7 @@ internal fun generateDestructuringBlock(
): FirBlock { ): FirBlock {
return buildBlock { return buildBlock {
source = multiDeclaration.toKtPsiSourceElement() source = multiDeclaration.toKtPsiSourceElement()
statements.addDestructuringStatements( statements.addDestructuringVariables(
moduleData, moduleData,
multiDeclaration, multiDeclaration,
container, container,
@@ -143,12 +143,15 @@ internal fun generateDestructuringBlock(
} }
context(AbstractRawFirBuilder<*>, DestructuringContext<KtDestructuringDeclarationEntry>) context(AbstractRawFirBuilder<*>, DestructuringContext<KtDestructuringDeclarationEntry>)
internal fun MutableList<FirStatement>.addDestructuringStatements( internal fun MutableList<in FirVariable>.addDestructuringVariables(
moduleData: FirModuleData, moduleData: FirModuleData,
multiDeclaration: KtDestructuringDeclaration, multiDeclaration: KtDestructuringDeclaration,
container: FirVariable, container: FirVariable,
tmpVariable: Boolean, tmpVariable: Boolean,
localEntries: 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
)
} }
@@ -1299,19 +1299,17 @@ open class PsiRawFirBuilder(
).apply { ).apply {
isDestructuringDeclarationContainerVariable = true isDestructuringDeclarationContainerVariable = true
} }
val destructuringBlock = generateDestructuringBlock( statements.add(destructuringContainerVar)
baseModuleData,
statements.addDestructuringVariables(
moduleData,
declaration, declaration,
destructuringContainerVar, destructuringContainerVar,
tmpVariable = false, tmpVariable = false,
localEntries = 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 -> { else -> {
statements.add(declaration.toFirStatement()) statements.add(declaration.toFirStatement())
@@ -1835,7 +1833,7 @@ open class PsiRawFirBuilder(
isLambda = true isLambda = true
hasExplicitParameterList = expression.functionLiteral.arrow != null hasExplicitParameterList = expression.functionLiteral.arrow != null
val destructuringStatements = mutableListOf<FirStatement>() val destructuringVariables = mutableListOf<FirStatement>()
for (valueParameter in literal.valueParameters) { for (valueParameter in literal.valueParameters) {
val multiDeclaration = valueParameter.destructuringDeclaration val multiDeclaration = valueParameter.destructuringDeclaration
valueParameters += if (multiDeclaration != null) { valueParameters += if (multiDeclaration != null) {
@@ -1852,7 +1850,7 @@ open class PsiRawFirBuilder(
isNoinline = false isNoinline = false
isVararg = false isVararg = false
} }
destructuringStatements.addDestructuringStatements( destructuringVariables.addDestructuringVariables(
baseModuleData, baseModuleData,
multiDeclaration, multiDeclaration,
multiParameter, multiParameter,
@@ -1881,7 +1879,7 @@ open class PsiRawFirBuilder(
val errorExpression = buildErrorExpression(source, ConeSyntaxDiagnostic("Lambda has no body")) val errorExpression = buildErrorExpression(source, ConeSyntaxDiagnostic("Lambda has no body"))
FirSingleExpressionBlock(errorExpression.toReturn()) FirSingleExpressionBlock(errorExpression.toReturn())
} else { } else {
val kind = runIf(destructuringStatements.isNotEmpty()) { val kind = runIf(destructuringVariables.isNotEmpty()) {
KtFakeSourceElementKind.LambdaDestructuringBlock KtFakeSourceElementKind.LambdaDestructuringBlock
} }
val bodyBlock = configureBlockWithoutBuilding(ktBody, kind).apply { val bodyBlock = configureBlockWithoutBuilding(ktBody, kind).apply {
@@ -1905,11 +1903,11 @@ open class PsiRawFirBuilder(
} }
}.build() }.build()
if (destructuringStatements.isNotEmpty()) { if (destructuringVariables.isNotEmpty()) {
// Destructured variables must be in a separate block so that they can be shadowed. // Destructured variables must be in a separate block so that they can be shadowed.
buildBlock { buildBlock {
source = bodyBlock.source?.realElement() source = bodyBlock.source?.realElement()
statements.addAll(destructuringStatements) statements.addAll(destructuringVariables)
statements.add(bodyBlock) statements.add(bodyBlock)
} }
} else { } else {
@@ -2739,7 +2737,7 @@ open class PsiRawFirBuilder(
extractedAnnotations = ktParameter.modifierList?.annotationEntries?.map { it.convert<FirAnnotation>() }, extractedAnnotations = ktParameter.modifierList?.annotationEntries?.map { it.convert<FirAnnotation>() },
) )
if (multiDeclaration != null) { if (multiDeclaration != null) {
blockBuilder.statements.addDestructuringStatements( blockBuilder.statements.addDestructuringVariables(
baseModuleData, baseModuleData,
multiDeclaration = multiDeclaration, multiDeclaration = multiDeclaration,
container = firLoopParameter, container = firLoopParameter,
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirVariable import org.jetbrains.kotlin.fir.declarations.FirVariable
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl 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.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -27,13 +26,14 @@ interface DestructuringContext<T> {
} }
context(AbstractRawFirBuilder<*>, DestructuringContext<T>) context(AbstractRawFirBuilder<*>, DestructuringContext<T>)
fun <T> MutableList<FirStatement>.addDestructuringStatements( fun <T> MutableList<in FirVariable>.addDestructuringVariables(
moduleData: FirModuleData, moduleData: FirModuleData,
container: FirVariable, container: FirVariable,
entries: List<T>, entries: List<T>,
isVar: Boolean, isVar: Boolean,
tmpVariable: Boolean, tmpVariable: Boolean,
localEntries: Boolean, localEntries: Boolean,
configure: (FirVariable) -> Unit = {}
) { ) {
if (tmpVariable) { if (tmpVariable) {
this += container this += container
@@ -53,6 +53,6 @@ fun <T> MutableList<FirStatement>.addDestructuringStatements(
status = FirDeclarationStatusImpl(if (localEntries) Visibilities.Local else Visibilities.Public, Modality.FINAL) status = FirDeclarationStatusImpl(if (localEntries) Visibilities.Local else Visibilities.Public, Modality.FINAL)
entry.extractAnnotationsTo(this, context.containerSymbol) entry.extractAnnotationsTo(this, context.containerSymbol)
} }
} }.also(configure)
} }
} }