From 067036c162e7d3335086ba6d4c872d59d8998e46 Mon Sep 17 00:00:00 2001 From: Egor Kulikov Date: Tue, 22 Nov 2022 14:43:53 +0000 Subject: [PATCH] RawFirBuilder refactoring Second step for KT-52615 Get rid of PsiHandlingMode Get rid of source in FirLazyBlock Refactor lazy creation Merge-request: KT-MR-7753 Merged-by: Egor Kulikov --- ...arationAndFirDeclarationEqualityChecker.kt | 2 - .../api/fir/file/builder/LLFirFileBuilder.kt | 2 - .../resolve/RawFirFileAnnotationBuilder.kt | 3 +- .../RawFirNonLocalDeclarationBuilder.kt | 3 +- .../lazy/resolve/RawFirUserTypeRefBuilder.kt | 3 +- .../AbstractFirLazyBodiesCalculatorTest.kt | 3 - .../AbstractFirLazyDeclarationResolveTest.kt | 10 +- .../AbstractPartialRawFirBuilderTestCase.kt | 3 +- .../benchmarks/AbstractSimpleFileBenchmark.kt | 3 +- .../jetbrains/kotlin/fir/pipeline/buildFir.kt | 3 +- .../FirResolveModularizedTotalKotlinTest.kt | 3 +- .../kotlin/fir/builder/RawFirBuilder.kt | 137 ++++++++++-------- .../builder/AbstractRawFirBuilderTestCase.kt | 1 - .../builder/FirLazyBlockBuilder.kt | 32 +--- .../fir/expressions/impl/FirLazyBlock.kt | 5 +- .../generator/ImplementationConfigurator.kt | 4 + .../fir/AbstractFirBaseDiagnosticsTest.kt | 2 - .../jetbrains/kotlin/fir/FirAnalyzerFacade.kt | 3 +- 18 files changed, 96 insertions(+), 126 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/KtDeclarationAndFirDeclarationEqualityChecker.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/KtDeclarationAndFirDeclarationEqualityChecker.kt index 03de7b03050..c48358ccb36 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/KtDeclarationAndFirDeclarationEqualityChecker.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/KtDeclarationAndFirDeclarationEqualityChecker.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecific import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.builder.BodyBuildingMode -import org.jetbrains.kotlin.fir.builder.PsiHandlingMode import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirClass @@ -180,7 +179,6 @@ object KtDeclarationAndFirDeclarationEqualityChecker { return RawFirBuilder( createEmptySession(), DummyScopeProvider, - psiMode = PsiHandlingMode.IDE, bodyBuildingMode = BodyBuildingMode.NORMAL ).buildTypeReference(this) } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LLFirFileBuilder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LLFirFileBuilder.kt index bd7222abbbc..91494967897 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LLFirFileBuilder.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LLFirFileBuilder.kt @@ -9,7 +9,6 @@ import org.jetbrains.kotlin.analysis.api.impl.barebone.annotations.ThreadSafe import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.builder.BodyBuildingMode -import org.jetbrains.kotlin.fir.builder.PsiHandlingMode import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirPhaseRunner @@ -26,7 +25,6 @@ internal class LLFirFileBuilder( RawFirBuilder( moduleComponents.session, moduleComponents.scopeProvider, - psiMode = PsiHandlingMode.IDE, bodyBuildingMode = BodyBuildingMode.LAZY_BODIES ).buildFirFile(ktFile) } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirFileAnnotationBuilder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirFileAnnotationBuilder.kt index 8900439ec41..cce3d56a1e1 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirFileAnnotationBuilder.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirFileAnnotationBuilder.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.builder.PsiHandlingMode import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.scopes.FirScopeProvider @@ -23,7 +22,7 @@ internal fun buildFileFirAnnotation( val replacementApplier = replacement?.Applier() - val builder = object : RawFirBuilder(session, baseScopeProvider, psiMode = PsiHandlingMode.IDE) { + val builder = object : RawFirBuilder(session, baseScopeProvider) { inner class VisitorWithReplacement : Visitor() { override fun convertElement(element: KtElement): FirElement? = super.convertElement(replacementApplier?.tryReplace(element) ?: element) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt index 6a7c3b8fb5e..300d3939996 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDeclarationDesignation import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.builder.BodyBuildingMode -import org.jetbrains.kotlin.fir.builder.PsiHandlingMode import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.isInner @@ -30,7 +29,7 @@ internal class RawFirNonLocalDeclarationBuilder private constructor( private val declarationToBuild: KtDeclaration, private val functionsToRebind: Set? = null, private val replacementApplier: RawFirReplacement.Applier? = null -) : RawFirBuilder(session, baseScopeProvider, psiMode = PsiHandlingMode.IDE, bodyBuildingMode = BodyBuildingMode.NORMAL) { +) : RawFirBuilder(session, baseScopeProvider, bodyBuildingMode = BodyBuildingMode.NORMAL) { companion object { fun buildWithReplacement( diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirUserTypeRefBuilder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirUserTypeRefBuilder.kt index 1adb65482b5..980ca42e84b 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirUserTypeRefBuilder.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirUserTypeRefBuilder.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve import org.jetbrains.kotlin.fir.* -import org.jetbrains.kotlin.fir.builder.PsiHandlingMode import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.types.FirUserTypeRef @@ -17,7 +16,7 @@ internal fun buildFirUserTypeRef( session: FirSession, baseScopeProvider: FirScopeProvider ): FirUserTypeRef { - val builder = object : RawFirBuilder(session, baseScopeProvider, psiMode = PsiHandlingMode.IDE) { + val builder = object : RawFirBuilder(session, baseScopeProvider) { fun build(): FirUserTypeRef = Visitor().visitTypeReference(typeReference, Unit) as FirUserTypeRef } builder.context.packageFqName = typeReference.containingKtFile.packageFqName diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyBodiesCalculatorTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyBodiesCalculatorTest.kt index 6f3093d3ac7..40f94fa766f 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyBodiesCalculatorTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyBodiesCalculatorTest.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.FirLazyBodie import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiSingleFileTest import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.builder.BodyBuildingMode -import org.jetbrains.kotlin.fir.builder.PsiHandlingMode import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.expressions.impl.FirLazyBlock import org.jetbrains.kotlin.fir.expressions.impl.FirLazyExpression @@ -38,7 +37,6 @@ abstract class AbstractFirLazyBodiesCalculatorTest : AbstractLowLevelApiSingleFi val laziedFirFile = RawFirBuilder( session, provider, - psiMode = PsiHandlingMode.IDE, bodyBuildingMode = BodyBuildingMode.LAZY_BODIES ).buildFirFile(ktFile) @@ -48,7 +46,6 @@ abstract class AbstractFirLazyBodiesCalculatorTest : AbstractLowLevelApiSingleFi val fullFirFile = RawFirBuilder( session, provider, - psiMode = PsiHandlingMode.IDE, bodyBuildingMode = BodyBuildingMode.NORMAL ).buildFirFile(ktFile) diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyDeclarationResolveTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyDeclarationResolveTest.kt index f475e18fc1b..bbc0019693e 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyDeclarationResolveTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyDeclarationResolveTest.kt @@ -40,10 +40,12 @@ abstract class AbstractFirLazyDeclarationResolveTest : AbstractLowLevelApiSingle var result: FirDeclaration? = null override fun visitElement(element: FirElement) { if (result != null) return - val declaration = element.realPsi as? KtDeclaration - if (element is FirDeclaration && declaration != null && declaration.name?.decapitalizeAsciiOnly() == "resolveMe") { - result = element - return + if (element is FirDeclaration) { + val declaration = element.realPsi as? KtDeclaration + if (declaration != null && declaration.name?.decapitalizeAsciiOnly() == "resolveMe") { + result = element + return + } } element.acceptChildren(this) } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractPartialRawFirBuilderTestCase.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractPartialRawFirBuilderTestCase.kt index 7d44daf1d02..5fdefc134b4 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractPartialRawFirBuilderTestCase.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractPartialRawFirBuilderTestCase.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.RawFirNonLoc import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiSingleFileTest import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.builder.PsiHandlingMode import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.psi @@ -111,7 +110,7 @@ abstract class AbstractPartialRawFirBuilderTestCase : AbstractLowLevelApiSingleF } val session = FirSessionFactoryHelper.createEmptySession() - val firBuilder = RawFirBuilder(session, scopeProvider, PsiHandlingMode.IDE) + val firBuilder = RawFirBuilder(session, scopeProvider) val original = firBuilder.buildFirFile(file) val designationBuilder = DesignationBuilder(elementToBuild) diff --git a/benchmarks/src/org/jetbrains/kotlin/benchmarks/AbstractSimpleFileBenchmark.kt b/benchmarks/src/org/jetbrains/kotlin/benchmarks/AbstractSimpleFileBenchmark.kt index f74ebb5343f..02ccde97b1e 100644 --- a/benchmarks/src/org/jetbrains/kotlin/benchmarks/AbstractSimpleFileBenchmark.kt +++ b/benchmarks/src/org/jetbrains/kotlin/benchmarks/AbstractSimpleFileBenchmark.kt @@ -27,7 +27,6 @@ import org.jetbrains.kotlin.context.withProject import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.fir.FirTestSessionFactoryHelper -import org.jetbrains.kotlin.fir.builder.PsiHandlingMode import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.java.FirJavaElementFinder import org.jetbrains.kotlin.fir.resolve.providers.firProvider @@ -157,7 +156,7 @@ abstract class AbstractSimpleFileBenchmark { .uniteWith(TopDownAnalyzerFacadeForJVM.AllJavaSourcesInProjectScope(env.project)) val session = FirTestSessionFactoryHelper.createSessionForTests(env.toAbstractProjectEnvironment(), scope.toAbstractProjectFileSearchScope()) val firProvider = session.firProvider as FirProviderImpl - val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider, PsiHandlingMode.COMPILER) + val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider) val totalTransformer = FirTotalResolveProcessor(session) val firFile = builder.buildFirFile(file).also(firProvider::recordFile) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/buildFir.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/buildFir.kt index a015cc3c640..1d5cdaaf19c 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/buildFir.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/buildFir.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.pipeline import org.jetbrains.kotlin.KtSourceFile import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.builder.PsiHandlingMode import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir @@ -46,7 +45,7 @@ fun FirSession.buildFirViaLightTree( fun FirSession.buildFirFromKtFiles(ktFiles: Collection): List { val firProvider = (firProvider as FirProviderImpl) - val builder = RawFirBuilder(this, firProvider.kotlinScopeProvider, PsiHandlingMode.COMPILER) + val builder = RawFirBuilder(this, firProvider.kotlinScopeProvider) return ktFiles.map { builder.buildFirFile(it).also { firFile -> firProvider.recordFile(firFile) diff --git a/compiler/fir/modularized-tests/tests/org/jetbrains/kotlin/fir/FirResolveModularizedTotalKotlinTest.kt b/compiler/fir/modularized-tests/tests/org/jetbrains/kotlin/fir/FirResolveModularizedTotalKotlinTest.kt index 6a6e4872722..d15540e9c45 100644 --- a/compiler/fir/modularized-tests/tests/org/jetbrains/kotlin/fir/FirResolveModularizedTotalKotlinTest.kt +++ b/compiler/fir/modularized-tests/tests/org/jetbrains/kotlin/fir/FirResolveModularizedTotalKotlinTest.kt @@ -20,7 +20,6 @@ import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory import org.jetbrains.kotlin.fir.analysis.collectors.AbstractDiagnosticCollector import org.jetbrains.kotlin.fir.analysis.collectors.FirDiagnosticsCollector -import org.jetbrains.kotlin.fir.builder.PsiHandlingMode import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.dump.MultiModuleHtmlFirDump @@ -162,7 +161,7 @@ class FirResolveModularizedTotalKotlinTest : AbstractModularizedTest() { } bench.buildFiles(lightTree2Fir, allSourceFiles) } else { - val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider, PsiHandlingMode.COMPILER) + val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider) bench.buildFiles(builder, ktFiles) } diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index f87d981ad2d..939a21cad29 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.builder import com.intellij.psi.PsiElement import com.intellij.psi.tree.IElementType +import com.intellij.util.AstLoadingFilter import org.jetbrains.kotlin.* import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.builtins.StandardNames.BACKING_FIELD @@ -51,14 +52,8 @@ import org.jetbrains.kotlin.utils.addToStdlib.runIf open class RawFirBuilder( session: FirSession, val baseScopeProvider: FirScopeProvider, - private val psiMode: PsiHandlingMode, bodyBuildingMode: BodyBuildingMode = BodyBuildingMode.NORMAL ) : BaseFirBuilder(session) { - - @Deprecated("Please replace with primary constructor call") - constructor(session: FirSession, baseScopeProvider: FirScopeProvider, mode: BodyBuildingMode = BodyBuildingMode.NORMAL) : - this(session, baseScopeProvider, psiMode = PsiHandlingMode.IDE, bodyBuildingMode = mode) - protected open fun bindFunctionTarget(target: FirFunctionTarget, function: FirFunction) = target.bind(function) var mode: BodyBuildingMode = bodyBuildingMode @@ -74,6 +69,15 @@ open class RawFirBuilder( } } + private inline fun runOnStubs(crossinline body: () -> T): T { + return when (mode) { + BodyBuildingMode.NORMAL -> body() + BodyBuildingMode.LAZY_BODIES -> { + AstLoadingFilter.disallowTreeLoading { body() } + } + } + } + fun buildFirFile(file: KtFile): FirFile { return file.accept(Visitor(), Unit) as FirFile } @@ -165,6 +169,28 @@ open class RawFirBuilder( private inline fun KtElement.convert(): R = convertElement(this) as R + private inline fun buildOrLazy(build: () -> T, noinline lazy: () -> T): T { + return when (mode) { + BodyBuildingMode.NORMAL -> build() + BodyBuildingMode.LAZY_BODIES -> runOnStubs(lazy) + } + } + + private inline fun buildOrLazyExpression( + sourceElement: KtSourceElement?, + buildExpression: () -> FirExpression, + ): FirExpression { + return buildOrLazy(buildExpression, { + buildLazyExpression { + source = sourceElement + } + }) + } + + private inline fun buildOrLazyBlock(buildBlock: () -> FirBlock): FirBlock { + return buildOrLazy(buildBlock, ::buildLazyBlock) + } + open fun convertElement(element: KtElement): FirElement? = element.accept(this@Visitor, Unit) @@ -317,28 +343,22 @@ open class RawFirBuilder( } private fun KtDeclarationWithBody.buildFirBody(): Pair = - when { - !hasBody() -> - null to null - mode == BodyBuildingMode.LAZY_BODIES -> { - val block = buildLazyBlock { - source = bodyExpression?.toFirSourceElement() - ?: error("hasBody() == true but body is null") - } - block to null - } - hasBlockBody() -> { - val block = bodyBlockExpression?.accept(this@Visitor, Unit) as? FirBlock - if (hasContractEffectList()) { - block to null + if (hasBody()) { + buildOrLazyBlock { + if (hasBlockBody()) { + val block = bodyBlockExpression?.accept(this@Visitor, Unit) as? FirBlock + return@buildFirBody if (hasContractEffectList()) { + block to null + } else { + block.extractContractDescriptionIfPossible() + } } else { - block.extractContractDescriptionIfPossible() + val result = { bodyExpression }.toFirExpression("Function has no body (but should)") + FirSingleExpressionBlock(result.toReturn(baseSource = result.source)) } - } - else -> { - val result = { bodyExpression }.toFirExpression("Function has no body (but should)") - FirSingleExpressionBlock(result.toReturn(baseSource = result.source)) to null - } + } to null + } else { + null to null } private fun ValueArgument?.toFirExpression(): FirExpression { @@ -497,13 +517,7 @@ open class RawFirBuilder( Visibilities.Private } val status = obtainPropertyComponentStatus(componentVisibility, this, property) - val backingFieldInitializer = when { - mode == BodyBuildingMode.LAZY_BODIES -> buildLazyExpression { - source = this@toFirBackingField?.initializer?.toFirSourceElement() - } - this?.hasInitializer() != true -> null - else -> this@toFirBackingField.initializer?.toFirExpression("Should have initializer") - } + val backingFieldInitializer = this?.toInitializerExpression() val returnType = this?.returnTypeReference.toFirOrImplicitType() val source = this?.toFirSourceElement() return if (this != null) { @@ -950,7 +964,10 @@ open class RawFirBuilder( if (hasModifier(INNER_KEYWORD)) dispatchReceiverForInnerClassConstructor() else null override fun visitKtFile(file: KtFile, data: Unit): FirElement { - context.packageFqName = if (psiMode == PsiHandlingMode.COMPILER) file.packageFqNameByTree else file.packageFqName + context.packageFqName = when (mode) { + BodyBuildingMode.NORMAL -> file.packageFqNameByTree + BodyBuildingMode.LAZY_BODIES -> file.packageFqName + } return buildFile { source = file.toFirSourceElement() moduleData = baseModuleData @@ -1573,6 +1590,13 @@ open class RawFirBuilder( } } + private fun KtDeclarationWithInitializer.toInitializerExpression() = + runIf (hasInitializer()) { + buildOrLazyExpression(initializer?.toFirSourceElement()) { + initializer.toFirExpression("Should have initializer") + } + } + private fun KtProperty.toFirProperty( ownerRegularOrAnonymousObjectSymbol: FirClassSymbol<*>?, ownerRegularClassTypeParametersCount: Int?, @@ -1581,14 +1605,7 @@ open class RawFirBuilder( val propertyType = typeReference.toFirOrImplicitType() val propertyName = nameAsSafeName val isVar = isVar - val propertyInitializer = when { - !hasInitializer() -> null - mode == BodyBuildingMode.LAZY_BODIES -> buildLazyExpression { - source = initializer?.toFirSourceElement() - } - else -> initializer.toFirExpression("Should have initializer") - - } + val propertyInitializer = toInitializerExpression() val propertySource = toFirSourceElement() @@ -1680,14 +1697,11 @@ open class RawFirBuilder( } if (hasDelegate()) { - fun extractDelegateExpression() = when (mode) { - BodyBuildingMode.NORMAL -> this@toFirProperty.delegate?.expression.toFirExpression("Should have delegate") - BodyBuildingMode.LAZY_BODIES -> this@toFirProperty.delegate?.expression?.let { - buildLazyExpression { source = it.toFirSourceElement() } - } ?: buildErrorExpression { - ConeSimpleDiagnostic("Should have delegate", DiagnosticKind.ExpressionExpected) + fun extractDelegateExpression() = this@toFirProperty.delegate?.expression?.let { expression -> + buildOrLazyExpression(expression.toFirSourceElement()) { + expression.toFirExpression("Should have delegate") } - } + } ?: buildErrorExpression { ConeSimpleDiagnostic("Should have delegate", DiagnosticKind.ExpressionExpected) } val delegateBuilder = FirWrappedDelegateExpressionBuilder().apply { val delegateExpression = extractDelegateExpression() @@ -1905,7 +1919,8 @@ open class RawFirBuilder( source = expression.toFirSourceElement() for (statement in expression.statements) { val firStatement = statement.toFirStatement { "Statement expected: ${statement.text}" } - val isForLoopBlock = firStatement is FirBlock && firStatement.source?.kind == KtFakeSourceElementKind.DesugaredForLoop + val isForLoopBlock = + firStatement is FirBlock && firStatement.source?.kind == KtFakeSourceElementKind.DesugaredForLoop if (firStatement !is FirBlock || isForLoopBlock || firStatement.annotations.isNotEmpty()) { statements += firStatement } else { @@ -2500,7 +2515,10 @@ open class RawFirBuilder( override fun visitParenthesizedExpression(expression: KtParenthesizedExpression, data: Unit): FirElement { context.forwardLabelUsagePermission(expression, expression.expression) return expression.expression?.accept(this, data) - ?: buildErrorExpression(expression.toFirSourceElement(), ConeSimpleDiagnostic("Empty parentheses", DiagnosticKind.Syntax)) + ?: buildErrorExpression( + expression.toFirSourceElement(), + ConeSimpleDiagnostic("Empty parentheses", DiagnosticKind.Syntax) + ) } override fun visitLabeledExpression(expression: KtLabeledExpression, data: Unit): FirElement { @@ -2546,7 +2564,10 @@ open class RawFirBuilder( baseModuleData, multiDeclaration.toFirSourceElement(), "destruct", - multiDeclaration.initializer.toFirExpression("Initializer required for destructuring declaration", DiagnosticKind.Syntax), + multiDeclaration.initializer.toFirExpression( + "Initializer required for destructuring declaration", + DiagnosticKind.Syntax + ), extractAnnotationsTo = { extractAnnotationsTo(it) } ) return generateDestructuringBlock( @@ -2621,15 +2642,3 @@ enum class BodyBuildingMode { if (lazyBodies) LAZY_BODIES else NORMAL } } - -enum class PsiHandlingMode { - /** - * Do not build any stubs while handling PSI - */ - COMPILER, - - /** - * Build stubs if possible while handling PSI - */ - IDE; -} diff --git a/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt b/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt index bad2446839b..46107e6d154 100644 --- a/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt +++ b/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilderTestCase.kt @@ -84,7 +84,6 @@ abstract class AbstractRawFirBuilderTestCase : KtParsingTestCase( return RawFirBuilder( session, StubFirScopeProvider, - psiMode = PsiHandlingMode.COMPILER, bodyBuildingMode = bodyBuildingMode ).buildFirFile(this) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirLazyBlockBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirLazyBlockBuilder.kt index 85dc0ef9464..80c731c5cee 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirLazyBlockBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirLazyBlockBuilder.kt @@ -25,33 +25,7 @@ import org.jetbrains.kotlin.fir.visitors.* * DO NOT MODIFY IT MANUALLY */ -@FirBuilderDsl -class FirLazyBlockBuilder : FirAnnotationContainerBuilder, FirExpressionBuilder { - override var source: KtSourceElement? = null - - @OptIn(FirImplementationDetail::class) - override fun build(): FirBlock { - return FirLazyBlock( - source, - ) - } - - - @Deprecated("Modification of 'annotations' has no impact for FirLazyBlockBuilder", level = DeprecationLevel.HIDDEN) - override val annotations: MutableList = mutableListOf() - - @Deprecated("Modification of 'typeRef' has no impact for FirLazyBlockBuilder", level = DeprecationLevel.HIDDEN) - override var typeRef: FirTypeRef - get() = throw IllegalStateException() - set(_) { - throw IllegalStateException() - } -} - -@OptIn(ExperimentalContracts::class) -inline fun buildLazyBlock(init: FirLazyBlockBuilder.() -> Unit = {}): FirBlock { - contract { - callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE) - } - return FirLazyBlockBuilder().apply(init).build() +@OptIn(FirImplementationDetail::class) +fun buildLazyBlock(): FirBlock { + return FirLazyBlock() } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirLazyBlock.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirLazyBlock.kt index c436f4c0071..2d3f81da9a8 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirLazyBlock.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirLazyBlock.kt @@ -20,9 +20,8 @@ import org.jetbrains.kotlin.fir.visitors.* * DO NOT MODIFY IT MANUALLY */ -class FirLazyBlock @FirImplementationDetail constructor( - override val source: KtSourceElement?, -) : FirBlock() { +class FirLazyBlock : FirBlock() { + override val source: KtSourceElement? get() = error("FirLazyBlock should be calculated before accessing") override val annotations: List get() = error("FirLazyBlock should be calculated before accessing") override val statements: List get() = error("FirLazyBlock should be calculated before accessing") override val typeRef: FirTypeRef get() = error("FirLazyBlock should be calculated before accessing") diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index 3c92bc1d3fa..5daad1c6ce5 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -142,6 +142,10 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() impl(block, "FirLazyBlock") { val error = """error("FirLazyBlock should be calculated before accessing")""" + default("source") { + value = error + withGetter = true + } default("statements") { value = error withGetter = true diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt index f909264d2f5..7f606bd4bdc 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt @@ -30,7 +30,6 @@ import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.KtDiagnostic import org.jetbrains.kotlin.diagnostics.PsiDiagnosticUtils import org.jetbrains.kotlin.fir.builder.BodyBuildingMode -import org.jetbrains.kotlin.fir.builder.PsiHandlingMode import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider @@ -142,7 +141,6 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() { val firBuilder = RawFirBuilder( session, firProvider.kotlinScopeProvider, - psiMode = if (useLazyBodiesModeForRawFir) PsiHandlingMode.IDE else PsiHandlingMode.COMPILER, bodyBuildingMode = BodyBuildingMode.lazyBodies(useLazyBodiesModeForRawFir) ) ktFiles.mapTo(firFiles) { diff --git a/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/fir/FirAnalyzerFacade.kt b/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/fir/FirAnalyzerFacade.kt index 0121e1a7868..9b465b6f554 100644 --- a/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/fir/FirAnalyzerFacade.kt +++ b/compiler/tests-compiler-utils/tests/org/jetbrains/kotlin/fir/FirAnalyzerFacade.kt @@ -18,7 +18,6 @@ import org.jetbrains.kotlin.fir.backend.Fir2IrResult import org.jetbrains.kotlin.fir.backend.jvm.Fir2IrJvmSpecialAnnotationSymbolProvider import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter -import org.jetbrains.kotlin.fir.builder.PsiHandlingMode import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir @@ -69,7 +68,7 @@ class FirAnalyzerFacade( } } } else { - val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider, PsiHandlingMode.COMPILER) + val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider) ktFiles.map { builder.buildFirFile(it).also { firFile -> firProvider.recordFile(firFile)