[FIR] make script destructuring declaration initializer lazy expression
This change is required to properly support such declarations in lazy resolution mode as we usually replaced initializers with lazy expressions during the body calculation phase ^KT-62840
This commit is contained in:
committed by
Space Team
parent
898c8c002e
commit
9ca0bdcb80
+21
-11
@@ -1280,6 +1280,26 @@ open class PsiRawFirBuilder(
|
||||
}
|
||||
}
|
||||
|
||||
protected fun buildScriptDestructuringDeclaration(destructuringDeclaration: KtDestructuringDeclaration): FirVariable {
|
||||
val initializer = destructuringDeclaration.initializer
|
||||
val firInitializer = buildOrLazyExpression(initializer?.toFirSourceElement()) {
|
||||
initializer.toFirExpression { ConeSyntaxDiagnostic("Initializer required for destructuring declaration") }
|
||||
}
|
||||
|
||||
val destructuringContainerVar = generateTemporaryVariable(
|
||||
moduleData = baseModuleData,
|
||||
source = destructuringDeclaration.toFirSourceElement(),
|
||||
specialName = "destruct",
|
||||
initializer = firInitializer,
|
||||
origin = FirDeclarationOrigin.Synthetic.ScriptTopLevelDestructuringDeclarationContainer,
|
||||
extractAnnotationsTo = { extractAnnotationsTo(it) },
|
||||
).apply {
|
||||
isDestructuringDeclarationContainerVariable = true
|
||||
}
|
||||
|
||||
return destructuringContainerVar
|
||||
}
|
||||
|
||||
private fun convertScript(
|
||||
script: KtScript,
|
||||
fileName: String,
|
||||
@@ -1301,7 +1321,6 @@ open class PsiRawFirBuilder(
|
||||
while (scriptDeclarationsIter.hasNext()) {
|
||||
val declaration = scriptDeclarationsIter.next()
|
||||
val isLast = !scriptDeclarationsIter.hasNext()
|
||||
val declarationSource = declaration.toFirSourceElement()
|
||||
when (declaration) {
|
||||
is KtScriptInitializer -> {
|
||||
val initializer = buildAnonymousInitializer(
|
||||
@@ -1315,16 +1334,7 @@ open class PsiRawFirBuilder(
|
||||
declarations.add(initializer)
|
||||
}
|
||||
is KtDestructuringDeclaration -> {
|
||||
val destructuringContainerVar = generateTemporaryVariable(
|
||||
baseModuleData,
|
||||
declarationSource,
|
||||
"destruct",
|
||||
declaration.initializer.toFirExpression { ConeSyntaxDiagnostic("Initializer required for destructuring declaration") },
|
||||
origin = FirDeclarationOrigin.Synthetic.ScriptTopLevelDestructuringDeclarationContainer,
|
||||
extractAnnotationsTo = { extractAnnotationsTo(it) }
|
||||
).apply {
|
||||
isDestructuringDeclarationContainerVariable = true
|
||||
}
|
||||
val destructuringContainerVar = buildScriptDestructuringDeclaration(declaration)
|
||||
declarations.add(destructuringContainerVar)
|
||||
|
||||
declarations.addDestructuringVariables(
|
||||
|
||||
+4
-2
@@ -1,15 +1,17 @@
|
||||
FILE: scriptLevelDestructuringWithAnnotation.kts
|
||||
SCRIPT: <script-scriptLevelDestructuringWithAnnotation.kts>
|
||||
|
||||
@DestrAnno(LAZY_EXPRESSION) lval <destruct>: <implicit> = IntegerLiteral(0).to#(IntegerLiteral(1))
|
||||
@DestrAnno(LAZY_EXPRESSION) lval <destruct>: <implicit> = LAZY_EXPRESSION
|
||||
@LeftAnno(LAZY_EXPRESSION) public final val a: <implicit> = R|<local>/<destruct>|.component1#()
|
||||
|
||||
|
||||
@RightAnno(LAZY_EXPRESSION) public final val b: <implicit> = R|<local>/<destruct>|.component2#()
|
||||
|
||||
|
||||
@Destr2Anno(LAZY_EXPRESSION) lval <destruct>: <implicit> = IntegerLiteral(2).to#(IntegerLiteral(3))
|
||||
@Destr2Anno(LAZY_EXPRESSION) lval <destruct>: <implicit> = LAZY_EXPRESSION
|
||||
@SecondLeftAnno(LAZY_EXPRESSION) public final val c: <implicit> = R|<local>/<destruct>|.component1#()
|
||||
|
||||
|
||||
@SecondRightAnno(LAZY_EXPRESSION) public final val d: <implicit> = R|<local>/<destruct>|.component2#()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user