[LL FIR] do not rebuild entire script for lazy calculation of result$$ property

After the previous commit, it is possible to rebuild initializer for
`result$$` property without a full script creation.
Also, this commit fixes anchor symbol for annotations
inside script statements

^KT-65344
This commit is contained in:
Dmitrii Gridin
2024-02-02 21:29:16 +01:00
committed by Space Team
parent 338c533a58
commit 6135a98e4e
6 changed files with 83 additions and 85 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -1304,24 +1304,15 @@ open class PsiRawFirBuilder(
val declarationSource = declaration.toFirSourceElement()
when (declaration) {
is KtScriptInitializer -> {
val firBlock =
if (isLast) {
// the last one need to be analyzed in script configurator to decide on result property
// therefore no lazy conversion in this case
withForcedLocalContext { declaration.body.toFirBlock() }
} else {
buildOrLazyBlock { withForcedLocalContext { declaration.body.toFirBlock() } }
}
declarations.add(
buildAnonymousInitializer {
moduleData = baseModuleData
origin = FirDeclarationOrigin.Source
source = declarationSource
body = firBlock
declaration.extractAnnotationsTo(this)
containingDeclarationSymbol = scriptSymbol
}
val initializer = buildAnonymousInitializer(
initializer = declaration,
containingDeclarationSymbol = scriptSymbol,
// the last one need to be analyzed in script configurator to decide on result property
// therefore no lazy conversion in this case
allowLazyBody = !isLast,
)
declarations.add(initializer)
}
is KtDestructuringDeclaration -> {
val destructuringContainerVar = generateTemporaryVariable(
@@ -2237,24 +2228,34 @@ open class PsiRawFirBuilder(
}
override fun visitAnonymousInitializer(initializer: KtAnonymousInitializer, data: FirElement?): FirElement {
return buildAnonymousInitializer(initializer, null)
return buildAnonymousInitializer(initializer, containingDeclarationSymbol = null)
}
private fun buildAnonymousInitializer(initializer: KtAnonymousInitializer, containingDeclarationSymbol: FirBasedSymbol<*>?) =
buildAnonymousInitializer {
withContainerSymbol(symbol) {
source = initializer.toFirSourceElement()
moduleData = baseModuleData
origin = FirDeclarationOrigin.Source
body = buildOrLazyBlock {
protected fun buildAnonymousInitializer(
initializer: KtAnonymousInitializer,
containingDeclarationSymbol: FirBasedSymbol<*>?,
allowLazyBody: Boolean = true,
) = buildAnonymousInitializer {
withContainerSymbol(symbol) {
source = initializer.toFirSourceElement()
moduleData = baseModuleData
origin = FirDeclarationOrigin.Source
body = if (allowLazyBody) {
buildOrLazyBlock {
withForcedLocalContext {
initializer.body.toFirBlock()
}
}
this.containingDeclarationSymbol = containingDeclarationSymbol
initializer.extractAnnotationsTo(this)
} else {
withForcedLocalContext {
initializer.body.toFirBlock()
}
}
this.containingDeclarationSymbol = containingDeclarationSymbol
initializer.extractAnnotationsTo(this)
}
}
override fun visitProperty(property: KtProperty, data: FirElement?): FirElement {
return property.toFirProperty(
@@ -1,23 +1,23 @@
@DestrAnno(<strcat>(String(destr 1 ), prop#))
owner -> FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotation.kts>
owner -> FirAnonymousInitializerSymbol <init>
context -> FirPropertySymbol <local>/<destruct> from FirAnonymousInitializerSymbol <init> from FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotation.kts> from FirFileSymbol scriptStatementLevelDestructuringWithAnnotation.kts
@LeftAnno(<strcat>(String(a ), prop#))
owner -> FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotation.kts>
owner -> FirAnonymousInitializerSymbol <init>
context -> FirPropertySymbol <local>/a from FirAnonymousInitializerSymbol <init> from FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotation.kts> from FirFileSymbol scriptStatementLevelDestructuringWithAnnotation.kts
@RightAnno(<strcat>(String(b ), prop#))
owner -> FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotation.kts>
owner -> FirAnonymousInitializerSymbol <init>
context -> FirPropertySymbol <local>/b from FirAnonymousInitializerSymbol <init> from FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotation.kts> from FirFileSymbol scriptStatementLevelDestructuringWithAnnotation.kts
@Destr2Anno(<strcat>(String(destr 1 ), prop#))
owner -> FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotation.kts>
owner -> FirAnonymousInitializerSymbol <init>
context -> FirPropertySymbol <local>/<destruct> from FirAnonymousInitializerSymbol <init> from FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotation.kts> from FirFileSymbol scriptStatementLevelDestructuringWithAnnotation.kts
@SecondLeftAnno(<strcat>(String(c ), prop#))
owner -> FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotation.kts>
owner -> FirAnonymousInitializerSymbol <init>
context -> FirPropertySymbol <local>/c from FirAnonymousInitializerSymbol <init> from FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotation.kts> from FirFileSymbol scriptStatementLevelDestructuringWithAnnotation.kts
@SecondRightAnno(<strcat>(String(d ), prop#))
owner -> FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotation.kts>
owner -> FirAnonymousInitializerSymbol <init>
context -> FirPropertySymbol <local>/d from FirAnonymousInitializerSymbol <init> from FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotation.kts> from FirFileSymbol scriptStatementLevelDestructuringWithAnnotation.kts
@@ -1,23 +1,23 @@
@DestrAnno(<strcat>(String(destr 1 ), prop#))
owner -> FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotationAsLastStatement.kts>
owner -> FirAnonymousInitializerSymbol <init>
context -> FirPropertySymbol <local>/<destruct> from FirAnonymousInitializerSymbol <init> from FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotationAsLastStatement.kts> from FirFileSymbol scriptStatementLevelDestructuringWithAnnotationAsLastStatement.kts
@LeftAnno(<strcat>(String(a ), prop#))
owner -> FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotationAsLastStatement.kts>
owner -> FirAnonymousInitializerSymbol <init>
context -> FirPropertySymbol <local>/a from FirAnonymousInitializerSymbol <init> from FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotationAsLastStatement.kts> from FirFileSymbol scriptStatementLevelDestructuringWithAnnotationAsLastStatement.kts
@RightAnno(<strcat>(String(b ), prop#))
owner -> FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotationAsLastStatement.kts>
owner -> FirAnonymousInitializerSymbol <init>
context -> FirPropertySymbol <local>/b from FirAnonymousInitializerSymbol <init> from FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotationAsLastStatement.kts> from FirFileSymbol scriptStatementLevelDestructuringWithAnnotationAsLastStatement.kts
@Destr2Anno(<strcat>(String(destr 1 ), prop#))
owner -> FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotationAsLastStatement.kts>
owner -> FirAnonymousInitializerSymbol <init>
context -> FirPropertySymbol <local>/<destruct> from FirAnonymousInitializerSymbol <init> from FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotationAsLastStatement.kts> from FirFileSymbol scriptStatementLevelDestructuringWithAnnotationAsLastStatement.kts
@SecondLeftAnno(<strcat>(String(c ), prop#))
owner -> FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotationAsLastStatement.kts>
owner -> FirAnonymousInitializerSymbol <init>
context -> FirPropertySymbol <local>/c from FirAnonymousInitializerSymbol <init> from FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotationAsLastStatement.kts> from FirFileSymbol scriptStatementLevelDestructuringWithAnnotationAsLastStatement.kts
@SecondRightAnno(<strcat>(String(d ), prop#))
owner -> FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotationAsLastStatement.kts>
owner -> FirAnonymousInitializerSymbol <init>
context -> FirPropertySymbol <local>/d from FirAnonymousInitializerSymbol <init> from FirScriptSymbol util.<script-scriptStatementLevelDestructuringWithAnnotationAsLastStatement.kts> from FirFileSymbol scriptStatementLevelDestructuringWithAnnotationAsLastStatement.kts