From c1f69ca8d61c17716c0ffbf150e55002cc3cc8ad Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Fri, 12 Apr 2019 20:50:36 +0300 Subject: [PATCH] JS: prepare to cache package metadata --- .../kotlin/js/facade/K2JSTranslator.kt | 54 ++++++++++++++----- .../kotlin/js/facade/TranslationResult.kt | 8 +-- 2 files changed, 46 insertions(+), 16 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/facade/K2JSTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/facade/K2JSTranslator.kt index da900437e63..d729159dc3f 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/facade/K2JSTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/facade/K2JSTranslator.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.js.facade import com.intellij.openapi.vfs.VfsUtilCore import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.* +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS import org.jetbrains.kotlin.js.analyzer.JsAnalysisResult @@ -48,6 +49,9 @@ import org.jetbrains.kotlin.js.backend.ast.JsStatement import org.jetbrains.kotlin.js.coroutine.transformCoroutines import org.jetbrains.kotlin.js.inline.util.collectDefinedNamesInAllScopes import org.jetbrains.kotlin.js.translate.general.AstGenerationResult +import org.jetbrains.kotlin.metadata.ProtoBuf +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf @@ -82,7 +86,8 @@ class K2JSTranslator @JvmOverloads constructor( reporter: JsConfig.Reporter, units: List, mainCallParameters: MainCallParameters, - analysisResult: JsAnalysisResult? = null + analysisResult: JsAnalysisResult? = null, + packageMetadata: MutableMap = mutableMapOf() ): TranslationResult { val files = ArrayList() for (unit in units) { @@ -95,7 +100,7 @@ class K2JSTranslator @JvmOverloads constructor( ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() - return translate(reporter, files, units, mainCallParameters, actualAnalysisResult) + return translate(reporter, files, units, mainCallParameters, actualAnalysisResult, packageMetadata) } @Throws(TranslationException::class) @@ -104,7 +109,8 @@ class K2JSTranslator @JvmOverloads constructor( files: List, allUnits: List, mainCallParameters: MainCallParameters, - analysisResult: JsAnalysisResult + analysisResult: JsAnalysisResult, + packageMetadata: MutableMap ): TranslationResult { val bindingTrace = analysisResult.bindingTrace TopDownAnalyzerFacadeForJS.checkForErrors(files, bindingTrace.bindingContext) @@ -134,7 +140,8 @@ class K2JSTranslator @JvmOverloads constructor( expandIsCalls(translationResult.newFragments) checkCanceled() - trySaveIncrementalData(translationResult, pathResolver, bindingTrace, moduleDescriptor) + updatePackageMetadata(translationResult, bindingTrace, moduleDescriptor, packageMetadata) + trySaveIncrementalData(translationResult, pathResolver, bindingTrace, moduleDescriptor, packageMetadata) checkCanceled() // Global phases @@ -154,7 +161,8 @@ class K2JSTranslator @JvmOverloads constructor( diagnostics, importedModules, moduleDescriptor, - bindingTrace.bindingContext + bindingTrace.bindingContext, + packageMetadata ) } } @@ -163,11 +171,37 @@ class K2JSTranslator @JvmOverloads constructor( ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() } + private fun serializeScope(bindingContext: BindingContext, moduleDescriptor: ModuleDescriptor, packageName: FqName, scope: Collection): ProtoBuf.PackageFragment { + val metadataVersion = config.configuration.get(CommonConfigurationKeys.METADATA_VERSION) + return KotlinJavascriptSerializationUtil.serializeDescriptors( + bindingContext, + moduleDescriptor, + scope, + packageName, + config.configuration.languageVersionSettings, + metadataVersion ?: JsMetadataVersion.INSTANCE + ) + } + + private fun updatePackageMetadata( + translationResult: AstGenerationResult, + bindingTrace: BindingTrace, + moduleDescriptor: ModuleDescriptor, + packageMetadata: MutableMap + ) { + translationResult.translatedSourceFiles.keys.mapTo(mutableSetOf()) { it.file.packageFqName }.forEach { packageName -> + val memberScope = moduleDescriptor.getPackage(packageName).memberScope.getContributedDescriptors() + val bytes = serializeScope(bindingTrace.bindingContext, moduleDescriptor, packageName, memberScope).toByteArray() + packageMetadata[packageName] = bytes + } + } + private fun trySaveIncrementalData( translationResult: AstGenerationResult, pathResolver: SourceFilePathResolver, bindingTrace: BindingTrace, - moduleDescriptor: ModuleDescriptor + moduleDescriptor: ModuleDescriptor, + packageMetadata: Map ) { // TODO Maybe switch validation on for recompile if (incrementalResults == null && !shouldValidateJsAst) return @@ -187,13 +221,7 @@ class K2JSTranslator @JvmOverloads constructor( serializer.serialize(fragment, output) val binaryAst = output.toByteArray() - val scope = fileTranslationResult.memberScope - val metadataVersion = config.configuration.get(CommonConfigurationKeys.METADATA_VERSION) - val packagePart = KotlinJavascriptSerializationUtil.serializeDescriptors( - bindingTrace.bindingContext, moduleDescriptor, scope, file.packageFqName, - config.configuration.languageVersionSettings, - metadataVersion ?: JsMetadataVersion.INSTANCE - ) + val packagePart = serializeScope(bindingTrace.bindingContext, moduleDescriptor, file.packageFqName, fileTranslationResult.memberScope) val inlineData = serializeInlineData(fileTranslationResult.inlineFunctionTags) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/facade/TranslationResult.kt b/js/js.translator/src/org/jetbrains/kotlin/js/facade/TranslationResult.kt index b55a6816810..f8dfc59990d 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/facade/TranslationResult.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/facade/TranslationResult.kt @@ -55,7 +55,8 @@ abstract class TranslationResult protected constructor(val diagnostics: Diagnost diagnostics: Diagnostics, private val importedModules: List, val moduleDescriptor: ModuleDescriptor, - val bindingContext: BindingContext + val bindingContext: BindingContext, + val packageMetadata: Map ) : TranslationResult(diagnostics) { @Suppress("unused") // Used in kotlin-web-demo in WebDemoTranslatorFacade fun getCode(): String { @@ -111,8 +112,9 @@ abstract class TranslationResult protected constructor(val diagnostics: Diagnost kind = config.moduleKind, imported = importedModules ) - val serializedMetadata = KotlinJavascriptSerializationUtil.serializeMetadata( - bindingContext, moduleDescription, + val serializedMetadata = KotlinJavascriptSerializationUtil.SerializedMetadata( + packageMetadata, + moduleDescription, config.configuration.languageVersionSettings, config.configuration.get(CommonConfigurationKeys.METADATA_VERSION) as? JsMetadataVersion ?: JsMetadataVersion.INSTANCE )