diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/TopDownAnalyzerFacadeForJSIR.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/TopDownAnalyzerFacadeForJSIR.kt new file mode 100644 index 00000000000..b68449857c1 --- /dev/null +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/TopDownAnalyzerFacadeForJSIR.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2010-2019 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.ir.backend.js + +import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.context.ModuleContext +import org.jetbrains.kotlin.descriptors.PackageFragmentProvider +import org.jetbrains.kotlin.incremental.components.LookupTracker +import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider +import org.jetbrains.kotlin.js.analyze.AbstractTopDownAnalyzerFacadeForJS +import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration + +// TODO: put it in separated module `frontend.js` +object TopDownAnalyzerFacadeForJSIR : AbstractTopDownAnalyzerFacadeForJS() { + override fun loadIncrementalCacheMetadata( + incrementalData: IncrementalDataProvider, + moduleContext: ModuleContext, + lookupTracker: LookupTracker, + languageVersionSettings: LanguageVersionSettings + ): PackageFragmentProvider { + return JsFactories.DefaultDeserializedDescriptorFactory.createCachedPackageFragmentProvider( + incrementalData.compiledPackageParts.values.map { it.metadata }, + moduleContext.storageManager, + moduleContext.module, + CompilerDeserializationConfiguration(languageVersionSettings) + ) + } +} \ No newline at end of file diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt index d789f1d41f7..5eaeb7ee6f2 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt @@ -27,7 +27,6 @@ import org.jetbrains.kotlin.ir.util.ExpectDeclarationRemover import org.jetbrains.kotlin.ir.util.IrDeserializer import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.visitors.acceptVoid -import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS import org.jetbrains.kotlin.js.analyzer.JsAnalysisResult import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.konan.KonanVersionImpl @@ -39,7 +38,6 @@ import org.jetbrains.kotlin.library.impl.buildKoltinLibrary import org.jetbrains.kotlin.library.impl.createKotlinLibrary import org.jetbrains.kotlin.library.resolver.KotlinLibraryResolveResult import org.jetbrains.kotlin.library.resolver.TopologicalLibraryOrder -import org.jetbrains.kotlin.library.resolver.impl.libraryResolver import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus import org.jetbrains.kotlin.psi.KtFile @@ -50,7 +48,6 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContextUtils import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.StorageManager -import org.jetbrains.kotlin.util.Logger import org.jetbrains.kotlin.utils.DFS import java.io.File import org.jetbrains.kotlin.konan.file.File as KFile @@ -202,7 +199,7 @@ fun GeneratorContext.generateModuleFragment(files: List, deserializer: I private fun createBuiltIns(storageManager: StorageManager) = object : KotlinBuiltIns(storageManager) {} -private val JsFactories = KlibMetadataFactories(::createBuiltIns, DynamicTypeDeserializer) +internal val JsFactories = KlibMetadataFactories(::createBuiltIns, DynamicTypeDeserializer) fun getModuleDescriptorByLibrary(current: KotlinLibrary, mapping: Map): ModuleDescriptorImpl { val md = JsFactories.DefaultDeserializedDescriptorFactory.createDescriptorOptionalBuiltIns( @@ -243,7 +240,7 @@ private class ModulesStructure( fun runAnalysis(): JsAnalysisResult { val analysisResult = - TopDownAnalyzerFacadeForJS.analyzeFiles( + TopDownAnalyzerFacadeForJSIR.analyzeFiles( files, project, compilerConfiguration, @@ -254,7 +251,7 @@ private class ModulesStructure( ) ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() - TopDownAnalyzerFacadeForJS.checkForErrors(files, analysisResult.bindingContext) + TopDownAnalyzerFacadeForJSIR.checkForErrors(files, analysisResult.bindingContext) return analysisResult } @@ -361,11 +358,11 @@ fun serializeModuleIntoKlib( processCompiledFileData(VfsUtilCore.virtualToIoFile(ktFile.virtualFile), compiledKotlinFile) } - val compiledKotlinFiles = cleanFiles + additionalFiles + val compiledKotlinFiles = (cleanFiles + additionalFiles) val header = metadataSerializer.serializeHeader( moduleDescriptor, - compiledKotlinFiles.map { it.irData.fqName }.distinct(), + compiledKotlinFiles.map { it.irData.fqName }.distinct().sorted(), emptyList() ).toByteArray() incrementalResultsConsumer?.run { diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.kt index ecc23c854dd..d12674da10b 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.functions.functionInterfacePackageFragmentProvider 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.context.ContextForNewModule import org.jetbrains.kotlin.context.ModuleContext @@ -19,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.frontend.js.di.createTopDownAnalyzerForJs import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.LookupTracker +import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider import org.jetbrains.kotlin.js.analyzer.JsAnalysisResult import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.config.JsConfig @@ -34,15 +36,7 @@ import org.jetbrains.kotlin.serialization.js.ModuleKind import org.jetbrains.kotlin.serialization.js.PackagesWithHeaderMetadata import org.jetbrains.kotlin.utils.JsMetadataVersion -object TopDownAnalyzerFacadeForJS { - @JvmStatic - fun analyzeFiles( - files: Collection, - config: JsConfig - ): JsAnalysisResult { - config.init() - return analyzeFiles(files, config.project, config.configuration, config.moduleDescriptors, config.friendModuleDescriptors) - } +abstract class AbstractTopDownAnalyzerFacadeForJS { fun analyzeFiles( files: Collection, @@ -88,6 +82,13 @@ object TopDownAnalyzerFacadeForJS { return analyzeFilesWithGivenTrace(files, trace, context, configuration, additionalPackages) } + protected abstract fun loadIncrementalCacheMetadata( + incrementalData: IncrementalDataProvider, + moduleContext: ModuleContext, + lookupTracker: LookupTracker, + languageVersionSettings: LanguageVersionSettings + ): PackageFragmentProvider + fun analyzeFilesWithGivenTrace( files: Collection, trace: BindingTrace, @@ -98,30 +99,21 @@ object TopDownAnalyzerFacadeForJS { val lookupTracker = configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER) ?: LookupTracker.DO_NOTHING val expectActualTracker = configuration.get(CommonConfigurationKeys.EXPECT_ACTUAL_TRACKER) ?: ExpectActualTracker.DoNothing val languageVersionSettings = configuration.languageVersionSettings - val packageFragment = configuration[JSConfigurationKeys.INCREMENTAL_DATA_PROVIDER]?.let { incrementalData -> - val metadata = PackagesWithHeaderMetadata( - incrementalData.headerMetadata, - incrementalData.compiledPackageParts.values.map { it.metadata }, - JsMetadataVersion(*incrementalData.metadataVersion) - ) - KotlinJavascriptSerializationUtil.readDescriptors( - metadata, moduleContext.storageManager, moduleContext.module, - CompilerDeserializationConfiguration(languageVersionSettings), lookupTracker - ) + val packageFragment = configuration[JSConfigurationKeys.INCREMENTAL_DATA_PROVIDER]?.let { + loadIncrementalCacheMetadata(it, moduleContext, lookupTracker, languageVersionSettings) } val analyzerForJs = createTopDownAnalyzerForJs( - moduleContext, trace, - FileBasedDeclarationProviderFactory(moduleContext.storageManager, files), - languageVersionSettings, - lookupTracker, - expectActualTracker, - additionalPackages + listOfNotNull(packageFragment) + moduleContext, trace, + FileBasedDeclarationProviderFactory(moduleContext.storageManager, files), + languageVersionSettings, + lookupTracker, + expectActualTracker, + additionalPackages + listOfNotNull(packageFragment) ) analyzerForJs.analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, files) return JsAnalysisResult.success(trace, moduleContext.module) } - @JvmStatic fun checkForErrors(allFiles: Collection, bindingContext: BindingContext) { AnalyzingUtils.throwExceptionOnErrors(bindingContext) for (file in allFiles) { @@ -129,3 +121,32 @@ object TopDownAnalyzerFacadeForJS { } } } + +object TopDownAnalyzerFacadeForJS : AbstractTopDownAnalyzerFacadeForJS() { + + override fun loadIncrementalCacheMetadata( + incrementalData: IncrementalDataProvider, + moduleContext: ModuleContext, + lookupTracker: LookupTracker, + languageVersionSettings: LanguageVersionSettings + ): PackageFragmentProvider { + val metadata = PackagesWithHeaderMetadata( + incrementalData.headerMetadata, + incrementalData.compiledPackageParts.values.map { it.metadata }, + JsMetadataVersion(*incrementalData.metadataVersion) + ) + return KotlinJavascriptSerializationUtil.readDescriptors( + metadata, moduleContext.storageManager, moduleContext.module, + CompilerDeserializationConfiguration(languageVersionSettings), lookupTracker + ) + } + + @JvmStatic + fun analyzeFiles( + files: Collection, + config: JsConfig + ): JsAnalysisResult { + config.init() + return analyzeFiles(files, config.project, config.configuration, config.moduleDescriptors, config.friendModuleDescriptors) + } +}