[Test] Drop convertToIr method from AbstractFirAnalyzerFacade

We are going to use `convertToIr` from `ModuleCompilerAnalyzedOutput`
without an intermediate wrapper.
This commit is contained in:
Ivan Kylchik
2023-07-16 17:10:58 +02:00
committed by Space Team
parent 3c9eb87c8d
commit 6e45c9d4c7
7 changed files with 72 additions and 120 deletions
@@ -10,11 +10,9 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.collectDiagnosticsForFile
import org.jetbrains.kotlin.diagnostics.KtDiagnostic
import org.jetbrains.kotlin.fir.AbstractFirAnalyzerFacade
import org.jetbrains.kotlin.fir.backend.Fir2IrCommonMemberStorage
import org.jetbrains.kotlin.fir.backend.Fir2IrExtensions
import org.jetbrains.kotlin.fir.backend.Fir2IrResult
import org.jetbrains.kotlin.fir.backend.IrBuiltInsOverFir
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.pipeline.FirResult
import org.jetbrains.kotlin.fir.pipeline.ModuleCompilerAnalyzedOutput
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.psi.KtFile
@@ -28,6 +26,12 @@ open class LowLevelFirAnalyzerFacade(
override val scopeSession: ScopeSession
get() = ScopeSession()
override val result: FirResult
get() {
val output = ModuleCompilerAnalyzedOutput(firResolveSession.useSiteFirSession, scopeSession, allFirFiles.values.toList())
return FirResult(listOf(output))
}
private var resolved: Boolean = false
override fun runCheckers(): Map<FirFile, List<KtDiagnostic>> {
@@ -45,12 +49,4 @@ open class LowLevelFirAnalyzerFacade(
}
override fun runResolution(): List<FirFile> = allFirFiles.values.toList()
override fun convertToIr(
fir2IrExtensions: Fir2IrExtensions,
commonMemberStorage: Fir2IrCommonMemberStorage,
irBuiltIns: IrBuiltInsOverFir?
): Fir2IrResult = shouldNotBeCalled()
}
private fun shouldNotBeCalled(): Nothing = error("Should not be called for LL test")
@@ -18,8 +18,6 @@ import org.jetbrains.kotlin.constant.EvaluatedConstTracker
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.fir.AbstractFirAnalyzerFacade
import org.jetbrains.kotlin.fir.FirAnalyzerFacade
import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.backend.js.FirJsKotlinMangler
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
@@ -35,7 +33,6 @@ import org.jetbrains.kotlin.ir.backend.js.incrementalDataProvider
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerDesc
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerIr
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.util.KotlinMangler
import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary
import org.jetbrains.kotlin.library.unresolvedDependencies
import org.jetbrains.kotlin.storage.LockBasedStorageManager
@@ -88,16 +85,12 @@ class Fir2IrJsResultsConverter(
for ((index, part) in inputArtifact.partsForDependsOnModules.withIndex()) {
val (irModuleFragment, components, pluginContext) =
part.firAnalyzerFacade.convertToJsIr(
part.firFiles.values,
fir2IrExtensions = Fir2IrExtensions.Default,
part.firAnalyzerFacade.result.outputs.single().convertToJsIr(
module,
configuration,
testServices,
commonMemberStorage,
irBuiltIns,
irMangler,
generateSignatures = true,
)
irBuiltIns = components.irBuiltIns
mainPluginContext = pluginContext
@@ -156,36 +149,31 @@ class Fir2IrJsResultsConverter(
}
}
fun AbstractFirAnalyzerFacade.convertToJsIr(
firFiles: Collection<FirFile>,
fir2IrExtensions: Fir2IrExtensions,
fun ModuleCompilerAnalyzedOutput.convertToJsIr(
module: TestModule,
configuration: CompilerConfiguration,
testServices: TestServices,
commonMemberStorage: Fir2IrCommonMemberStorage,
irBuiltIns: IrBuiltInsOverFir?,
irMangler: KotlinMangler.IrMangler,
generateSignatures: Boolean
irBuiltIns: IrBuiltInsOverFir?
): Fir2IrResult {
this as FirAnalyzerFacade
// TODO: consider avoiding repeated libraries resolution
val libraries = resolveLibraries(configuration, getAllJsDependenciesPaths(module, testServices))
val (dependencies, builtIns) = loadResolvedLibraries(libraries, configuration.languageVersionSettings, testServices)
val fir2IrConfiguration = Fir2IrConfiguration(
languageVersionSettings = configuration.languageVersionSettings,
linkViaSignatures = generateSignatures,
linkViaSignatures = true,
evaluatedConstTracker = configuration
.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()),
inlineConstTracker = null,
)
return ModuleCompilerAnalyzedOutput(this.session, this.scopeSession, firFiles.toList()).convertToIr(
fir2IrExtensions,
return convertToIr(
Fir2IrExtensions.Default,
fir2IrConfiguration,
commonMemberStorage,
irBuiltIns,
irMangler,
JsManglerIr,
Fir2IrVisibilityConverter.Default,
builtIns ?: DefaultBuiltIns.Instance // TODO: consider passing externally,
).also {
@@ -7,21 +7,21 @@ package org.jetbrains.kotlin.test.frontend.fir
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
import org.jetbrains.kotlin.backend.jvm.JvmIrDeserializerImpl
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.jvm.compiler.NoScopeRecordCliBindingTrace
import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM
import org.jetbrains.kotlin.codegen.ClassBuilderFactories
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.constant.EvaluatedConstTracker
import org.jetbrains.kotlin.container.get
import org.jetbrains.kotlin.fir.FirAnalyzerFacade
import org.jetbrains.kotlin.fir.backend.Fir2IrCommonMemberStorage
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.Fir2IrConfiguration
import org.jetbrains.kotlin.fir.backend.IrBuiltInsOverFir
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendExtension
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler
import org.jetbrains.kotlin.fir.backend.jvm.JvmFir2IrExtensions
import org.jetbrains.kotlin.fir.pipeline.applyIrGenerationExtensions
import org.jetbrains.kotlin.fir.backend.jvm.*
import org.jetbrains.kotlin.fir.pipeline.signatureComposerForJvmFir2Ir
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler
@@ -88,15 +88,29 @@ class Fir2IrJvmResultsConverter(
lateinit var backendInput: JvmIrCodegenFactory.JvmIrBackendInput
lateinit var mainModuleComponents: Fir2IrComponents
val firAnalyzerFacade = inputArtifact.partsForDependsOnModules.last().firAnalyzerFacade as? FirAnalyzerFacade
val generateSignatures = firAnalyzerFacade?.fir2IrConfiguration?.linkViaSignatures == true
val generateSignatures = compilerConfigurationProvider.getCompilerConfiguration(module)
.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES)
val commonMemberStorage = Fir2IrCommonMemberStorage(signatureComposerForJvmFir2Ir(generateSignatures), FirJvmKotlinMangler())
var irBuiltIns: IrBuiltInsOverFir? = null
for ((index, firOutputPart) in inputArtifact.partsForDependsOnModules.withIndex()) {
val (irModuleFragment, components, pluginContext) = firOutputPart.firAnalyzerFacade.convertToIr(
fir2IrExtensions, commonMemberStorage, irBuiltIns
val compilerConfiguration = compilerConfigurationProvider.getCompilerConfiguration(module)
val fir2IrConfiguration = Fir2IrConfiguration(
languageVersionSettings = module.languageVersionSettings,
linkViaSignatures = compilerConfiguration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES),
evaluatedConstTracker = compilerConfiguration
.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()),
inlineConstTracker = compilerConfiguration[CommonConfigurationKeys.INLINE_CONST_TRACKER],
)
val (irModuleFragment, components, pluginContext) = firOutputPart.firAnalyzerFacade.result.outputs.single().convertToIr(
fir2IrExtensions,
fir2IrConfiguration,
commonMemberStorage,
irBuiltIns,
irMangler,
FirJvmVisibilityConverter,
DefaultBuiltIns.Instance
)
irBuiltIns = components.irBuiltIns
@@ -18,8 +18,6 @@ import org.jetbrains.kotlin.constant.EvaluatedConstTracker
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.fir.AbstractFirAnalyzerFacade
import org.jetbrains.kotlin.fir.FirAnalyzerFacade
import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.backend.js.FirJsKotlinMangler
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
@@ -35,7 +33,6 @@ import org.jetbrains.kotlin.ir.backend.js.incrementalDataProvider
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerDesc
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerIr
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.util.KotlinMangler
import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary
import org.jetbrains.kotlin.library.unresolvedDependencies
import org.jetbrains.kotlin.storage.LockBasedStorageManager
@@ -84,20 +81,14 @@ class Fir2IrWasmResultsConverter(
val commonMemberStorage = Fir2IrCommonMemberStorage(IdSignatureDescriptor(JsManglerDesc), FirJsKotlinMangler())
val irMangler = JsManglerIr
for ((index, part) in inputArtifact.partsForDependsOnModules.withIndex()) {
val (irModuleFragment, components, pluginContext) =
part.firAnalyzerFacade.convertToWasmIr(
part.firFiles.values,
fir2IrExtensions = Fir2IrExtensions.Default,
part.firAnalyzerFacade.result.outputs.single().convertToWasmIr(
module,
configuration,
testServices,
commonMemberStorage,
irBuiltIns,
irMangler,
generateSignatures = true,
)
irBuiltIns = components.irBuiltIns
mainPluginContext = pluginContext
@@ -129,7 +120,7 @@ class Fir2IrWasmResultsConverter(
diagnosticReporter = DiagnosticReporterFactory.createReporter(),
hasErrors = inputArtifact.hasErrors,
descriptorMangler = commonMemberStorage.symbolTable.signaturer.mangler,
irMangler = irMangler,
irMangler = JsManglerIr,
firMangler = commonMemberStorage.firSignatureComposer.mangler,
) { file, irActualizedResult ->
val (firFile, components) = firFilesAndComponentsBySourceFile[file]
@@ -154,36 +145,31 @@ class Fir2IrWasmResultsConverter(
}
}
fun AbstractFirAnalyzerFacade.convertToWasmIr(
firFiles: Collection<FirFile>,
fir2IrExtensions: Fir2IrExtensions,
fun ModuleCompilerAnalyzedOutput.convertToWasmIr(
module: TestModule,
configuration: CompilerConfiguration,
testServices: TestServices,
commonMemberStorage: Fir2IrCommonMemberStorage,
irBuiltIns: IrBuiltInsOverFir?,
irMangler: KotlinMangler.IrMangler,
generateSignatures: Boolean
irBuiltIns: IrBuiltInsOverFir?
): Fir2IrResult {
this as FirAnalyzerFacade
// TODO: consider avoiding repeated libraries resolution
val libraries = resolveWasmLibraries(module, testServices, configuration)
val (dependencies, builtIns) = loadResolvedLibraries(libraries, configuration.languageVersionSettings, testServices)
val fir2IrConfiguration = Fir2IrConfiguration(
languageVersionSettings = configuration.languageVersionSettings,
linkViaSignatures = generateSignatures,
linkViaSignatures = true,
evaluatedConstTracker = configuration
.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()),
inlineConstTracker = null,
)
return ModuleCompilerAnalyzedOutput(this.session, this.scopeSession, firFiles.toList()).convertToIr(
fir2IrExtensions,
return convertToIr(
Fir2IrExtensions.Default,
fir2IrConfiguration,
commonMemberStorage,
irBuiltIns,
irMangler,
JsManglerIr,
Fir2IrVisibilityConverter.Default,
builtIns ?: DefaultBuiltIns.Instance // TODO: consider passing externally,
).also {
@@ -16,14 +16,11 @@ import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM
import org.jetbrains.kotlin.cli.jvm.compiler.VfsBasedProjectEnvironment
import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots
import org.jetbrains.kotlin.cli.jvm.config.jvmModularRoots
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.constant.EvaluatedConstTracker
import org.jetbrains.kotlin.container.topologicalSort
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.backend.Fir2IrConfiguration
import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers
import org.jetbrains.kotlin.fir.deserialization.ModuleDataProvider
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
@@ -270,7 +267,6 @@ open class FirFrontendFacade(
val sessionProvider = moduleInfoProvider.firSessionProvider
val project = compilerConfigurationProvider.getProject(module)
val compilerConfiguration = compilerConfigurationProvider.getCompilerConfiguration(module)
PsiElementFinder.EP.getPoint(project).unregisterExtension(JavaElementFinder::class.java)
@@ -304,13 +300,6 @@ open class FirFrontendFacade(
val firAnalyzerFacade = FirAnalyzerFacade(
moduleBasedSession,
Fir2IrConfiguration(
languageVersionSettings = module.languageVersionSettings,
linkViaSignatures = compilerConfiguration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES),
evaluatedConstTracker = compilerConfiguration
.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()),
inlineConstTracker = compilerConfiguration[CommonConfigurationKeys.INLINE_CONST_TRACKER],
),
ktFiles,
lightTreeFiles,
parser,
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.analyzer.AnalysisResult
import org.jetbrains.kotlin.asJava.finder.JavaElementFinder
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
import org.jetbrains.kotlin.backend.jvm.JvmIrDeserializerImpl
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.GroupingMessageCollector
@@ -33,10 +34,7 @@ import org.jetbrains.kotlin.fir.FirAnalyzerFacade
import org.jetbrains.kotlin.fir.FirTestSessionFactoryHelper
import org.jetbrains.kotlin.fir.backend.Fir2IrCommonMemberStorage
import org.jetbrains.kotlin.fir.backend.Fir2IrConfiguration
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendExtension
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler
import org.jetbrains.kotlin.fir.backend.jvm.JvmFir2IrExtensions
import org.jetbrains.kotlin.fir.backend.jvm.*
import org.jetbrains.kotlin.fir.pipeline.signatureComposerForJvmFir2Ir
import org.jetbrains.kotlin.ir.backend.jvm.jvmResolveLibraries
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler
@@ -118,31 +116,36 @@ object GenerationUtils {
getPackagePartProvider = packagePartProvider
)
val linkViaSignatures = configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES)
// TODO: add running checkers and check that it's safe to compile
val firAnalyzerFacade = FirAnalyzerFacade(
session,
Fir2IrConfiguration(
languageVersionSettings = configuration.languageVersionSettings,
linkViaSignatures = configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES),
evaluatedConstTracker = configuration
.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()),
inlineConstTracker = configuration[CommonConfigurationKeys.INLINE_CONST_TRACKER],
),
files,
emptyList(),
FirParser.Psi,
)
val fir2IrExtensions = JvmFir2IrExtensions(configuration, JvmIrDeserializerImpl(), JvmIrMangler)
val commonMemberStorage = Fir2IrCommonMemberStorage(
signatureComposerForJvmFir2Ir(firAnalyzerFacade.fir2IrConfiguration.linkViaSignatures),
FirJvmKotlinMangler(),
val fir2IrConfiguration = Fir2IrConfiguration(
languageVersionSettings = configuration.languageVersionSettings,
linkViaSignatures = linkViaSignatures,
evaluatedConstTracker = configuration
.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()),
inlineConstTracker = configuration[CommonConfigurationKeys.INLINE_CONST_TRACKER],
)
val (moduleFragment, components, pluginContext) = firAnalyzerFacade.convertToIr(
val commonMemberStorage = Fir2IrCommonMemberStorage(signatureComposerForJvmFir2Ir(linkViaSignatures), FirJvmKotlinMangler())
firAnalyzerFacade.runResolution()
val (moduleFragment, components, pluginContext) = firAnalyzerFacade.result.outputs.single().convertToIr(
fir2IrExtensions,
fir2IrConfiguration,
commonMemberStorage,
irBuiltIns = null
irBuiltIns = null,
JvmIrMangler,
FirJvmVisibilityConverter,
DefaultBuiltIns.Instance
)
val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext
@@ -6,35 +6,26 @@
package org.jetbrains.kotlin.fir
import org.jetbrains.kotlin.KtSourceFile
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.diagnostics.KtDiagnostic
import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.pipeline.*
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.FirParser
abstract class AbstractFirAnalyzerFacade {
abstract val scopeSession: ScopeSession
abstract val result: FirResult
abstract fun runCheckers(): Map<FirFile, List<KtDiagnostic>>
abstract fun runResolution(): List<FirFile>
abstract fun convertToIr(
fir2IrExtensions: Fir2IrExtensions,
commonMemberStorage: Fir2IrCommonMemberStorage,
irBuiltIns: IrBuiltInsOverFir?
): Fir2IrResult
}
class FirAnalyzerFacade(
val session: FirSession,
val fir2IrConfiguration: Fir2IrConfiguration,
val ktFiles: Collection<KtFile> = emptyList(), // may be empty if light tree mode enabled
val lightTreeFiles: Collection<KtSourceFile> = emptyList(), // may be empty if light tree mode disabled
val parser: FirParser,
@@ -45,6 +36,9 @@ class FirAnalyzerFacade(
override val scopeSession: ScopeSession
get() = _scopeSession!!
override val result: FirResult
get() = FirResult(listOf(ModuleCompilerAnalyzedOutput(session, scopeSession, firFiles!!)))
private var collectedDiagnostics: Map<FirFile, List<KtDiagnostic>>? = null
private fun buildRawFir() {
@@ -68,22 +62,4 @@ class FirAnalyzerFacade(
collectedDiagnostics = session.runCheckers(scopeSession, firFiles!!, DiagnosticReporterFactory.createPendingReporter())
return collectedDiagnostics!!
}
override fun convertToIr(
fir2IrExtensions: Fir2IrExtensions,
commonMemberStorage: Fir2IrCommonMemberStorage,
irBuiltIns: IrBuiltInsOverFir?
): Fir2IrResult {
if (_scopeSession == null) runResolution()
return ModuleCompilerAnalyzedOutput(this.session, this.scopeSession, firFiles!!.toList()).convertToIr(
fir2IrExtensions,
fir2IrConfiguration,
commonMemberStorage,
irBuiltIns,
JvmIrMangler,
FirJvmVisibilityConverter,
DefaultBuiltIns.Instance
)
}
}