Extract CommonAnalysisResult and use it in K2MetadataKlibSerializer and MetadataSerializer

This commit is contained in:
Ivan Kochurkin
2023-01-17 22:20:49 +01:00
committed by Space Team
parent 44b7859356
commit 8a8823e81a
3 changed files with 24 additions and 19 deletions
@@ -14,11 +14,15 @@ import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.CommonPlatforms
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.CompilerEnvironment
import java.io.File
data class CommonAnalysisResult(val moduleDescriptor: ModuleDescriptor, val bindingContext: BindingContext)
internal val KotlinCoreEnvironment.destDir: File?
get() = configuration.get(CLIConfigurationKeys.METADATA_DESTINATION_DIRECTORY)
@@ -26,7 +30,7 @@ internal fun runCommonAnalysisForSerialization(
environment: KotlinCoreEnvironment,
dependOnBuiltins: Boolean,
dependencyContainerFactory: () -> CommonDependenciesContainer?
): AnalyzerWithCompilerReport? {
): CommonAnalysisResult? {
if (environment.destDir == null) {
val configuration = environment.configuration
val messageCollector = configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
@@ -36,25 +40,31 @@ internal fun runCommonAnalysisForSerialization(
val performanceManager = environment.configuration.getNotNull(CLIConfigurationKeys.PERF_MANAGER)
var analyzer: AnalyzerWithCompilerReport
var analysisResultWithHasErrors: AnalysisResultWithHasErrors
do {
performanceManager.notifyAnalysisStarted()
analyzer = runCommonAnalysisIteration(environment, dependOnBuiltins, dependencyContainerFactory())
val result = analyzer.analysisResult
analysisResultWithHasErrors = runCommonAnalysisIteration(environment, dependOnBuiltins, dependencyContainerFactory())
val result = analysisResultWithHasErrors.result
if (result is AnalysisResult.RetryWithAdditionalRoots) {
environment.addKotlinSourceRoots(result.additionalKotlinRoots)
}
performanceManager.notifyAnalysisFinished()
} while (result is AnalysisResult.RetryWithAdditionalRoots)
return if (analyzer.analysisResult.shouldGenerateCode) analyzer else null
val analysisResult = analysisResultWithHasErrors.result
return if (analysisResult.shouldGenerateCode && !analysisResultWithHasErrors.hasErrors)
CommonAnalysisResult(analysisResult.moduleDescriptor, analysisResult.bindingContext)
else
null
}
private data class AnalysisResultWithHasErrors(val result: AnalysisResult, val hasErrors: Boolean)
private fun runCommonAnalysisIteration(
environment: KotlinCoreEnvironment,
dependOnBuiltins: Boolean,
dependencyContainer: CommonDependenciesContainer?
): AnalyzerWithCompilerReport {
): AnalysisResultWithHasErrors {
val configuration = environment.configuration
val messageCollector = configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
val files = environment.getSourceFiles()
@@ -76,5 +86,5 @@ private fun runCommonAnalysisIteration(
}
}
return analyzer
}
return AnalysisResultWithHasErrors(analyzer.analysisResult, analyzer.hasErrors())
}
@@ -45,20 +45,16 @@ internal class K2MetadataKlibSerializer(private val metadataVersion: BuiltInsBin
val configuration = environment.configuration
val performanceManager = configuration.getNotNull(CLIConfigurationKeys.PERF_MANAGER)
val analyzer = runCommonAnalysisForSerialization(environment, true, dependencyContainerFactory = {
val analysisResult = runCommonAnalysisForSerialization(environment, true, dependencyContainerFactory = {
KlibMetadataDependencyContainer(
configuration,
LockBasedStorageManager("K2MetadataKlibSerializer")
)
})
if (analyzer == null || analyzer.hasErrors()) return
val (_, moduleDescriptor) = analyzer.analysisResult
}) ?: return
performanceManager.notifyGenerationStarted()
val destDir = checkNotNull(environment.destDir)
performSerialization(configuration, moduleDescriptor, destDir, environment.project)
performSerialization(configuration, analysisResult.moduleDescriptor, destDir, environment.project)
performanceManager.notifyGenerationFinished()
}
@@ -44,11 +44,10 @@ open class MetadataSerializer(
fun serialize(environment: KotlinCoreEnvironment) {
val performanceManager = environment.configuration.getNotNull(CLIConfigurationKeys.PERF_MANAGER)
val analyzer = runCommonAnalysisForSerialization(environment, dependOnOldBuiltIns, dependencyContainerFactory = { null })
val analysisResult = runCommonAnalysisForSerialization(environment, dependOnOldBuiltIns, dependencyContainerFactory = { null })
?: return
if (analyzer == null || analyzer.hasErrors()) return
val (bindingContext, moduleDescriptor) = analyzer.analysisResult
val (moduleDescriptor, bindingContext) = analysisResult
performanceManager.notifyGenerationStarted()
val destDir = checkNotNull(environment.destDir)