diff --git a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt index 5a318091483..87dc03b14d5 100644 --- a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt +++ b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.serialization.builtins -import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInClassDescriptorFactory @@ -15,19 +14,18 @@ import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoots import org.jetbrains.kotlin.cli.common.messages.* import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.cli.jvm.config.configureJdkClasspathRoots import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots +import org.jetbrains.kotlin.cli.jvm.config.configureJdkClasspathRoots +import org.jetbrains.kotlin.cli.metadata.CommonAnalysisResult import org.jetbrains.kotlin.cli.metadata.MetadataSerializer import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.impl.EmptyPackageFragmentDescriptor import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.serialization.KotlinSerializerExtensionBase @@ -35,76 +33,78 @@ import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerial import org.jetbrains.kotlin.storage.LockBasedStorageManager import java.io.File -class BuiltInsSerializer(dependOnOldBuiltIns: Boolean) : MetadataSerializer(BuiltInsBinaryVersion.INSTANCE, dependOnOldBuiltIns) { - fun serialize( +class BuiltInsSerializer( + configuration: CompilerConfiguration, + environment: KotlinCoreEnvironment, + dependOnOldBuiltIns: Boolean +) : MetadataSerializer(configuration, environment, dependOnOldBuiltIns, BuiltInsBinaryVersion.INSTANCE) { + companion object { + fun analyzeAndSerialize( destDir: File, srcDirs: List, extraClassPath: List, + dependOnOldBuiltIns: Boolean, onComplete: (totalSize: Int, totalFiles: Int) -> Unit - ) { - val rootDisposable = Disposer.newDisposable() - val messageCollector = createMessageCollector() - val performanceManager = object : CommonCompilerPerformanceManager(presentableName = "test") {} - try { - val configuration = CompilerConfiguration().apply { - put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector) + ) { + val rootDisposable = Disposer.newDisposable() + val messageCollector = createMessageCollector() + val performanceManager = object : CommonCompilerPerformanceManager(presentableName = "test") {} + try { + val configuration = CompilerConfiguration().apply { + put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector) - addKotlinSourceRoots(srcDirs.map { it.path }) - addJvmClasspathRoots(extraClassPath) - configureJdkClasspathRoots() + addKotlinSourceRoots(srcDirs.map { it.path }) + addJvmClasspathRoots(extraClassPath) + configureJdkClasspathRoots() - put(CLIConfigurationKeys.METADATA_DESTINATION_DIRECTORY, destDir) - put(CommonConfigurationKeys.MODULE_NAME, "module for built-ins serialization") - put(CLIConfigurationKeys.PERF_MANAGER, performanceManager) + put(CLIConfigurationKeys.METADATA_DESTINATION_DIRECTORY, destDir) + put(CommonConfigurationKeys.MODULE_NAME, "module for built-ins serialization") + put(CLIConfigurationKeys.PERF_MANAGER, performanceManager) + } + + val environment = KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES) + + val serializer = BuiltInsSerializer(configuration, environment, dependOnOldBuiltIns) + serializer.analyzeAndSerialize() + + onComplete(serializer.totalSize, serializer.totalFiles) + } finally { + messageCollector.flush() + Disposer.dispose(rootDisposable) } - - val environment = KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES) - - serialize(environment) - - onComplete(totalSize, totalFiles) } - finally { - messageCollector.flush() - Disposer.dispose(rootDisposable) - } - } - private fun createMessageCollector() = object : GroupingMessageCollector( + private fun createMessageCollector() = object : GroupingMessageCollector( PrintingMessageCollector(System.err, MessageRenderer.PLAIN_RELATIVE_PATHS, false), false - ) { - override fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageSourceLocation?) { - // Only report diagnostics without a particular location because there's plenty of errors in built-in sources - // (functions without bodies, incorrect combination of modifiers, etc.) - if (location == null) { - super.report(severity, message, location) + ) { + override fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageSourceLocation?) { + // Only report diagnostics without a particular location because there's plenty of errors in built-in sources + // (functions without bodies, incorrect combination of modifiers, etc.) + if (location == null) { + super.report(severity, message, location) + } } } } - override fun performSerialization( - files: Collection, - bindingContext: BindingContext, - module: ModuleDescriptor, - destDir: File, - project: Project?, - languageVersionSettings: LanguageVersionSettings, - ) { + override fun serialize(analysisResult: CommonAnalysisResult, destDir: File) { + val files = environment.getSourceFiles() + val module = analysisResult.moduleDescriptor + destDir.deleteRecursively() if (!destDir.mkdirs()) { throw AssertionError("Could not make directories: " + destDir) } - files.map { it.packageFqName }.toSet().forEach { - fqName -> + files.map { it.packageFqName }.toSet().forEach { fqName -> val packageView = module.getPackage(fqName) PackageSerializer( packageView.memberScope.getContributedDescriptors(DescriptorKindFilter.CLASSIFIERS) + createCloneable(module), packageView.fragments.flatMap { fragment -> DescriptorUtils.getAllDescriptors(fragment.getMemberScope()) }, packageView.fqName, File(destDir, BuiltInSerializerProtocol.getBuiltInsFilePath(packageView.fqName)), - languageVersionSettings, + environment.configuration.languageVersionSettings, ).run() } } @@ -118,6 +118,6 @@ class BuiltInsSerializer(dependOnOldBuiltIns: Boolean) : MetadataSerializer(Buil EmptyPackageFragmentDescriptor(module, StandardNames.BUILT_INS_PACKAGE_FQ_NAME) } return factory.createClass(ClassId.topLevel(StandardNames.FqNames.cloneable.toSafe())) - ?: error("Could not create kotlin.Cloneable in $module") + ?: error("Could not create kotlin.Cloneable in $module") } } diff --git a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/run.kt b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/run.kt index 3ad5f6f4f81..b004a0f6c98 100644 --- a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/run.kt +++ b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/run.kt @@ -41,7 +41,7 @@ found top-level declarations to (*.kotlin_builtins files)""" val missing = srcDirs.filterNot(File::exists) assert(missing.isEmpty()) { "These source directories are missing: $missing" } - BuiltInsSerializer(dependOnOldBuiltIns = false).serialize(destDir, srcDirs, listOf()) { totalSize, totalFiles -> + BuiltInsSerializer.analyzeAndSerialize(destDir, srcDirs, listOf(), dependOnOldBuiltIns = false) { totalSize, totalFiles -> if (System.getProperty("kotlin.builtins.serializer.log") == "true") { println("Total bytes written: $totalSize to $totalFiles files") } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/AbstractMetadataSerializer.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/AbstractMetadataSerializer.kt new file mode 100644 index 00000000000..3467a32022f --- /dev/null +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/AbstractMetadataSerializer.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2010-2023 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. + */ + +package org.jetbrains.kotlin.cli.metadata + +import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys +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.CompilerConfiguration +import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion +import java.io.File + +abstract class AbstractMetadataSerializer( + val configuration: CompilerConfiguration, + val environment: KotlinCoreEnvironment, + definedMetadataVersion: BuiltInsBinaryVersion? = null +) { + protected val metadataVersion = + definedMetadataVersion ?: configuration.get(CommonConfigurationKeys.METADATA_VERSION) as? BuiltInsBinaryVersion + ?: BuiltInsBinaryVersion.INSTANCE + + fun analyzeAndSerialize() { + val destDir = environment.destDir + if (destDir == null) { + val configuration = environment.configuration + val messageCollector = configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) + messageCollector.report(CompilerMessageSeverity.ERROR, "Specify destination via -d") + return + } + + val analysisResult = analyze() ?: return + + val performanceManager = environment.configuration.getNotNull(CLIConfigurationKeys.PERF_MANAGER) + performanceManager.notifyGenerationStarted() + serialize(analysisResult, destDir) + performanceManager.notifyGenerationFinished() + } + + protected abstract fun analyze(): T? + + protected abstract fun serialize(analysisResult: T, destDir: File) +} \ No newline at end of file diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/CommonAnalysis.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/CommonAnalysis.kt index 5d7519f0be6..be938639098 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/CommonAnalysis.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/CommonAnalysis.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.analyzer.common.CommonDependenciesContainer import org.jetbrains.kotlin.analyzer.common.CommonResolverForModuleFactory import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport -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 @@ -31,13 +30,6 @@ internal fun runCommonAnalysisForSerialization( dependOnBuiltins: Boolean, dependencyContainerFactory: () -> CommonDependenciesContainer? ): CommonAnalysisResult? { - if (environment.destDir == null) { - val configuration = environment.configuration - val messageCollector = configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) - messageCollector.report(CompilerMessageSeverity.ERROR, "Specify destination via -d") - return null - } - val performanceManager = environment.configuration.getNotNull(CLIConfigurationKeys.PERF_MANAGER) var analysisResultWithHasErrors: AnalysisResultWithHasErrors diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/FirMetadataSerializer.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/FirMetadataSerializer.kt index dd5986e8c81..fa1046ffc9c 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/FirMetadataSerializer.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/FirMetadataSerializer.kt @@ -5,13 +5,11 @@ package org.jetbrains.kotlin.cli.metadata -import com.intellij.openapi.Disposable import com.intellij.openapi.vfs.StandardFileSystems import com.intellij.openapi.vfs.VirtualFileManager import org.jetbrains.kotlin.KtSourceFile import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys -import org.jetbrains.kotlin.cli.common.CommonCompilerPerformanceManager import org.jetbrains.kotlin.cli.common.fir.FirDiagnosticsCompilerResultsReporter import org.jetbrains.kotlin.cli.jvm.compiler.* import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.collectSources @@ -28,6 +26,8 @@ import org.jetbrains.kotlin.fir.pipeline.ModuleCompilerAnalyzedOutput import org.jetbrains.kotlin.fir.pipeline.buildFirFromKtFiles import org.jetbrains.kotlin.fir.pipeline.buildFirViaLightTree import org.jetbrains.kotlin.fir.pipeline.resolveAndCheckFir +import org.jetbrains.kotlin.fir.serialization.FirElementAwareSerializableStringTable +import org.jetbrains.kotlin.fir.serialization.FirKLibSerializerExtension import org.jetbrains.kotlin.fir.serialization.serializeSingleFirFile import org.jetbrains.kotlin.fir.session.FirCommonSessionFactory import org.jetbrains.kotlin.fir.session.IncrementalCompilationContext @@ -40,31 +40,20 @@ import org.jetbrains.kotlin.library.impl.buildKotlinLibrary import org.jetbrains.kotlin.library.metadata.KlibMetadataHeaderFlags import org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf import org.jetbrains.kotlin.library.metadata.KlibMetadataVersion -import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion import org.jetbrains.kotlin.modules.TargetId import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.CommonPlatforms import org.jetbrains.kotlin.psi.KtFile import java.io.File -internal class FirMetadataSerializer(private val metadataVersion: BuiltInsBinaryVersion) { - fun serialize(environment: KotlinCoreEnvironment, rootDisposable: Disposable) { +internal class FirMetadataSerializer( + configuration: CompilerConfiguration, + environment: KotlinCoreEnvironment +) : AbstractMetadataSerializer(configuration, environment) { + override fun analyze(): ModuleCompilerAnalyzedOutput? { val performanceManager = environment.configuration.getNotNull(CLIConfigurationKeys.PERF_MANAGER) - performanceManager.notifyAnalysisStarted() - val compilerResult = runFirCompiler(environment, performanceManager, rootDisposable) ?: return - performanceManager.notifyAnalysisFinished() - performanceManager.notifyGenerationStarted() - performSerialization(compilerResult, environment.configuration, checkNotNull(environment.destDir)) - performanceManager.notifyGenerationFinished() - } - - private fun runFirCompiler( - environment: KotlinCoreEnvironment, - performanceManager: CommonCompilerPerformanceManager, - rootDisposable: Disposable - ): ModuleCompilerAnalyzedOutput? { val configuration = environment.configuration val messageCollector = configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) val moduleName = Name.special("<${configuration.getNotNull(CommonConfigurationKeys.MODULE_NAME)}>") @@ -164,19 +153,30 @@ internal class FirMetadataSerializer(private val metadataVersion: BuiltInsBinary null } else { result + }.also { + performanceManager.notifyAnalysisFinished() } } - private fun performSerialization(firOutput: ModuleCompilerAnalyzedOutput, configuration: CompilerConfiguration, destDir: File) { + override fun serialize(analysisResult: ModuleCompilerAnalyzedOutput, destDir: File) { val fragments = mutableMapOf>() - for (firFile in firOutput.fir) { - val packageFragment = serializeSingleFirFile(firFile, firOutput.session, firOutput.scopeSession, metadataVersion) + val (session, scopeSession, fir) = analysisResult + + val languageVersionSettings = environment.configuration.languageVersionSettings + for (firFile in fir) { + val packageFragment = serializeSingleFirFile( + firFile, + session, + scopeSession, + FirKLibSerializerExtension(session, metadataVersion, FirElementAwareSerializableStringTable()), + languageVersionSettings + ) fragments.getOrPut(firFile.packageFqName.asString()) { mutableListOf() }.add(packageFragment.toByteArray()) } val header = KlibMetadataProtoBuf.Header.newBuilder() - header.moduleName = firOutput.session.moduleData.name.asString() + header.moduleName = session.moduleData.name.asString() if (configuration.languageVersionSettings.isPreRelease()) { header.flags = KlibMetadataHeaderFlags.PRE_RELEASE diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataCompiler.kt index 8c34517d866..55c8add57f3 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataCompiler.kt @@ -112,17 +112,13 @@ class K2MetadataCompiler : CLICompiler() { checkKotlinPackageUsage(environment.configuration, environment.getSourceFiles()) try { - val metadataVersion = - configuration.get(CommonConfigurationKeys.METADATA_VERSION) as? BuiltInsBinaryVersion ?: BuiltInsBinaryVersion.INSTANCE - if (configuration.getBoolean(CommonConfigurationKeys.USE_FIR)) { - FirMetadataSerializer(metadataVersion).serialize(environment, rootDisposable) - } else { - if (arguments.expectActualLinker) { - K2MetadataKlibSerializer(metadataVersion).serialize(environment) - } else { - MetadataSerializer(metadataVersion, true).serialize(environment) - } + val useFir = configuration.getBoolean(CommonConfigurationKeys.USE_FIR) + val metadataSerializer = when { + useFir -> FirMetadataSerializer(configuration, environment) + arguments.expectActualLinker -> K2MetadataKlibSerializer(configuration, environment) + else -> MetadataSerializer(configuration, environment, dependOnOldBuiltIns = true) } + metadataSerializer.analyzeAndSerialize() } catch (e: CompilationException) { collector.report(EXCEPTION, OutputMessageUtil.renderException(e), MessageUtil.psiElementToMessageLocation(e.element)) return ExitCode.INTERNAL_ERROR diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt index 71771e4ec8f..6d2b398fcf9 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.cli.metadata -import com.intellij.openapi.project.Project import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.common.CommonDependenciesContainer import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices @@ -29,7 +28,6 @@ import org.jetbrains.kotlin.library.impl.BuiltInsPlatform import org.jetbrains.kotlin.library.impl.buildKotlinLibrary import org.jetbrains.kotlin.library.metadata.* import org.jetbrains.kotlin.library.metadata.impl.KlibMetadataModuleDescriptorFactoryImpl -import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.CommonPlatforms import org.jetbrains.kotlin.platform.TargetPlatform @@ -40,30 +38,23 @@ import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.utils.keysToMap import java.io.File -internal class K2MetadataKlibSerializer(private val metadataVersion: BuiltInsBinaryVersion) { - fun serialize(environment: KotlinCoreEnvironment) { - val configuration = environment.configuration - val performanceManager = configuration.getNotNull(CLIConfigurationKeys.PERF_MANAGER) - - val analysisResult = runCommonAnalysisForSerialization(environment, true, dependencyContainerFactory = { +internal class K2MetadataKlibSerializer( + configuration: CompilerConfiguration, + environment: KotlinCoreEnvironment +) : AbstractMetadataSerializer(configuration, environment) { + override fun analyze(): CommonAnalysisResult? { + return runCommonAnalysisForSerialization(environment, true, dependencyContainerFactory = { KlibMetadataDependencyContainer( configuration, LockBasedStorageManager("K2MetadataKlibSerializer") ) - }) ?: return - - performanceManager.notifyGenerationStarted() - val destDir = checkNotNull(environment.destDir) - performSerialization(configuration, analysisResult.moduleDescriptor, destDir, environment.project) - performanceManager.notifyGenerationFinished() + }) } - private fun performSerialization( - configuration: CompilerConfiguration, - module: ModuleDescriptor, - destDir: File, - project: Project - ) { + override fun serialize(analysisResult: CommonAnalysisResult, destDir: File) { + val project = environment.project + val module = analysisResult.moduleDescriptor + val serializedMetadata: SerializedMetadata = KlibMetadataMonolithicSerializer( configuration.languageVersionSettings, metadataVersion, diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/MetadataSerializer.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/MetadataSerializer.kt index c8ff070b981..4b4da95d2c2 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/MetadataSerializer.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/MetadataSerializer.kt @@ -6,15 +6,14 @@ package org.jetbrains.kotlin.cli.metadata import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.codegen.JvmCodegenUtil +import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion @@ -35,33 +34,24 @@ import java.io.DataOutputStream import java.io.File open class MetadataSerializer( - private val metadataVersion: BuiltInsBinaryVersion, - private val dependOnOldBuiltIns: Boolean -) { + configuration: CompilerConfiguration, + environment: KotlinCoreEnvironment, + private val dependOnOldBuiltIns: Boolean, + definedMetadataVersion: BuiltInsBinaryVersion? = null +) : AbstractMetadataSerializer(configuration, environment, definedMetadataVersion) { protected var totalSize = 0 protected var totalFiles = 0 - fun serialize(environment: KotlinCoreEnvironment) { - val performanceManager = environment.configuration.getNotNull(CLIConfigurationKeys.PERF_MANAGER) - - val analysisResult = runCommonAnalysisForSerialization(environment, dependOnOldBuiltIns, dependencyContainerFactory = { null }) - ?: return - - val (moduleDescriptor, bindingContext) = analysisResult - - performanceManager.notifyGenerationStarted() - val destDir = checkNotNull(environment.destDir) - performSerialization( - environment.getSourceFiles(), bindingContext, moduleDescriptor, destDir, environment.project, - environment.configuration.languageVersionSettings - ) - performanceManager.notifyGenerationFinished() + override fun analyze(): CommonAnalysisResult? { + return runCommonAnalysisForSerialization(environment, dependOnOldBuiltIns, dependencyContainerFactory = { null }) } - protected open fun performSerialization( - files: Collection, bindingContext: BindingContext, module: ModuleDescriptor, destDir: File, project: Project?, - languageVersionSettings: LanguageVersionSettings, - ) { + override fun serialize(analysisResult: CommonAnalysisResult, destDir: File) { + val languageVersionSettings = environment.configuration.languageVersionSettings + val files = environment.getSourceFiles() + val project = environment.project + val (module, bindingContext) = analysisResult + val packageTable = hashMapOf() for (file in files) { diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerTest.kt b/compiler/tests/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerTest.kt index f117638b03e..1c03bb9d7df 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerTest.kt @@ -33,11 +33,12 @@ import java.io.FileInputStream class BuiltInsSerializerTest : TestCaseWithTmpdir() { private fun doTest(fileName: String) { val source = "compiler/testData/serialization/builtinsSerializer/$fileName" - BuiltInsSerializer(dependOnOldBuiltIns = true).serialize( - tmpdir, - srcDirs = listOf(File(source)), - extraClassPath = listOf(ForTestCompileRuntime.runtimeJarForTests()), - onComplete = { _, _ -> } + BuiltInsSerializer.analyzeAndSerialize( + tmpdir, + srcDirs = listOf(File(source)), + extraClassPath = listOf(ForTestCompileRuntime.runtimeJarForTests()), + dependOnOldBuiltIns = true, + onComplete = { _, _ -> } ) val module = KotlinTestUtils.createEmptyModule("", DefaultBuiltIns.Instance)