JS: prepare to cache package metadata

This commit is contained in:
Anton Bannykh
2019-04-12 20:50:36 +03:00
parent fc7fea4863
commit c1f69ca8d6
2 changed files with 46 additions and 16 deletions
@@ -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<TranslationUnit>,
mainCallParameters: MainCallParameters,
analysisResult: JsAnalysisResult? = null
analysisResult: JsAnalysisResult? = null,
packageMetadata: MutableMap<FqName, ByteArray> = mutableMapOf()
): TranslationResult {
val files = ArrayList<KtFile>()
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<KtFile>,
allUnits: List<TranslationUnit>,
mainCallParameters: MainCallParameters,
analysisResult: JsAnalysisResult
analysisResult: JsAnalysisResult,
packageMetadata: MutableMap<FqName, ByteArray>
): 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<DeclarationDescriptor>): 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<FqName, ByteArray>
) {
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<FqName, ByteArray>
) {
// 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)
@@ -55,7 +55,8 @@ abstract class TranslationResult protected constructor(val diagnostics: Diagnost
diagnostics: Diagnostics,
private val importedModules: List<String>,
val moduleDescriptor: ModuleDescriptor,
val bindingContext: BindingContext
val bindingContext: BindingContext,
val packageMetadata: Map<FqName, ByteArray>
) : 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
)