[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:
committed by
Space Team
parent
338c533a58
commit
6135a98e4e
+29
-28
@@ -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(
|
||||
|
||||
+6
-6
@@ -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
|
||||
+6
-6
@@ -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
|
||||
Reference in New Issue
Block a user