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.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<FirStatement>.addDestructuringStatements(
localEntries: Boolean,
) {
with(DestructuringEntry) {
addDestructuringStatements(
addDestructuringVariables(
moduleData,
container,
multiDeclaration.entries,
@@ -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<KtDestructuringDeclarationEntry>)
internal fun MutableList<FirStatement>.addDestructuringStatements(
internal fun MutableList<in FirVariable>.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
)
}
@@ -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<FirStatement>()
val destructuringVariables = mutableListOf<FirStatement>()
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<FirAnnotation>() },
)
if (multiDeclaration != null) {
blockBuilder.statements.addDestructuringStatements(
blockBuilder.statements.addDestructuringVariables(
baseModuleData,
multiDeclaration = multiDeclaration,
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.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<T> {
}
context(AbstractRawFirBuilder<*>, DestructuringContext<T>)
fun <T> MutableList<FirStatement>.addDestructuringStatements(
fun <T> MutableList<in FirVariable>.addDestructuringVariables(
moduleData: FirModuleData,
container: FirVariable,
entries: List<T>,
isVar: Boolean,
tmpVariable: Boolean,
localEntries: Boolean,
configure: (FirVariable) -> Unit = {}
) {
if (tmpVariable) {
this += container
@@ -53,6 +53,6 @@ fun <T> MutableList<FirStatement>.addDestructuringStatements(
status = FirDeclarationStatusImpl(if (localEntries) Visibilities.Local else Visibilities.Public, Modality.FINAL)
entry.extractAnnotationsTo(this, context.containerSymbol)
}
}
}.also(configure)
}
}