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:
committed by
Space Team
parent
b0f44e8f69
commit
a29a7e6307
+2
-2
@@ -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,
|
||||
|
||||
+6
-3
@@ -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
|
||||
)
|
||||
}
|
||||
|
||||
+12
-14
@@ -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,
|
||||
|
||||
+3
-3
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user