JS: prepare to cache package metadata
This commit is contained in:
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.js.facade
|
|||||||
import com.intellij.openapi.vfs.VfsUtilCore
|
import com.intellij.openapi.vfs.VfsUtilCore
|
||||||
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
||||||
import org.jetbrains.kotlin.config.*
|
import org.jetbrains.kotlin.config.*
|
||||||
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS
|
import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS
|
||||||
import org.jetbrains.kotlin.js.analyzer.JsAnalysisResult
|
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.coroutine.transformCoroutines
|
||||||
import org.jetbrains.kotlin.js.inline.util.collectDefinedNamesInAllScopes
|
import org.jetbrains.kotlin.js.inline.util.collectDefinedNamesInAllScopes
|
||||||
import org.jetbrains.kotlin.js.translate.general.AstGenerationResult
|
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.resolve.BindingTrace
|
||||||
import org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf
|
import org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf
|
||||||
|
|
||||||
@@ -82,7 +86,8 @@ class K2JSTranslator @JvmOverloads constructor(
|
|||||||
reporter: JsConfig.Reporter,
|
reporter: JsConfig.Reporter,
|
||||||
units: List<TranslationUnit>,
|
units: List<TranslationUnit>,
|
||||||
mainCallParameters: MainCallParameters,
|
mainCallParameters: MainCallParameters,
|
||||||
analysisResult: JsAnalysisResult? = null
|
analysisResult: JsAnalysisResult? = null,
|
||||||
|
packageMetadata: MutableMap<FqName, ByteArray> = mutableMapOf()
|
||||||
): TranslationResult {
|
): TranslationResult {
|
||||||
val files = ArrayList<KtFile>()
|
val files = ArrayList<KtFile>()
|
||||||
for (unit in units) {
|
for (unit in units) {
|
||||||
@@ -95,7 +100,7 @@ class K2JSTranslator @JvmOverloads constructor(
|
|||||||
|
|
||||||
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
||||||
|
|
||||||
return translate(reporter, files, units, mainCallParameters, actualAnalysisResult)
|
return translate(reporter, files, units, mainCallParameters, actualAnalysisResult, packageMetadata)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Throws(TranslationException::class)
|
@Throws(TranslationException::class)
|
||||||
@@ -104,7 +109,8 @@ class K2JSTranslator @JvmOverloads constructor(
|
|||||||
files: List<KtFile>,
|
files: List<KtFile>,
|
||||||
allUnits: List<TranslationUnit>,
|
allUnits: List<TranslationUnit>,
|
||||||
mainCallParameters: MainCallParameters,
|
mainCallParameters: MainCallParameters,
|
||||||
analysisResult: JsAnalysisResult
|
analysisResult: JsAnalysisResult,
|
||||||
|
packageMetadata: MutableMap<FqName, ByteArray>
|
||||||
): TranslationResult {
|
): TranslationResult {
|
||||||
val bindingTrace = analysisResult.bindingTrace
|
val bindingTrace = analysisResult.bindingTrace
|
||||||
TopDownAnalyzerFacadeForJS.checkForErrors(files, bindingTrace.bindingContext)
|
TopDownAnalyzerFacadeForJS.checkForErrors(files, bindingTrace.bindingContext)
|
||||||
@@ -134,7 +140,8 @@ class K2JSTranslator @JvmOverloads constructor(
|
|||||||
expandIsCalls(translationResult.newFragments)
|
expandIsCalls(translationResult.newFragments)
|
||||||
checkCanceled()
|
checkCanceled()
|
||||||
|
|
||||||
trySaveIncrementalData(translationResult, pathResolver, bindingTrace, moduleDescriptor)
|
updatePackageMetadata(translationResult, bindingTrace, moduleDescriptor, packageMetadata)
|
||||||
|
trySaveIncrementalData(translationResult, pathResolver, bindingTrace, moduleDescriptor, packageMetadata)
|
||||||
checkCanceled()
|
checkCanceled()
|
||||||
|
|
||||||
// Global phases
|
// Global phases
|
||||||
@@ -154,7 +161,8 @@ class K2JSTranslator @JvmOverloads constructor(
|
|||||||
diagnostics,
|
diagnostics,
|
||||||
importedModules,
|
importedModules,
|
||||||
moduleDescriptor,
|
moduleDescriptor,
|
||||||
bindingTrace.bindingContext
|
bindingTrace.bindingContext,
|
||||||
|
packageMetadata
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -163,11 +171,37 @@ class K2JSTranslator @JvmOverloads constructor(
|
|||||||
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
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(
|
private fun trySaveIncrementalData(
|
||||||
translationResult: AstGenerationResult,
|
translationResult: AstGenerationResult,
|
||||||
pathResolver: SourceFilePathResolver,
|
pathResolver: SourceFilePathResolver,
|
||||||
bindingTrace: BindingTrace,
|
bindingTrace: BindingTrace,
|
||||||
moduleDescriptor: ModuleDescriptor
|
moduleDescriptor: ModuleDescriptor,
|
||||||
|
packageMetadata: Map<FqName, ByteArray>
|
||||||
) {
|
) {
|
||||||
// TODO Maybe switch validation on for recompile
|
// TODO Maybe switch validation on for recompile
|
||||||
if (incrementalResults == null && !shouldValidateJsAst) return
|
if (incrementalResults == null && !shouldValidateJsAst) return
|
||||||
@@ -187,13 +221,7 @@ class K2JSTranslator @JvmOverloads constructor(
|
|||||||
serializer.serialize(fragment, output)
|
serializer.serialize(fragment, output)
|
||||||
val binaryAst = output.toByteArray()
|
val binaryAst = output.toByteArray()
|
||||||
|
|
||||||
val scope = fileTranslationResult.memberScope
|
val packagePart = serializeScope(bindingTrace.bindingContext, moduleDescriptor, file.packageFqName, 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 inlineData = serializeInlineData(fileTranslationResult.inlineFunctionTags)
|
val inlineData = serializeInlineData(fileTranslationResult.inlineFunctionTags)
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,8 @@ abstract class TranslationResult protected constructor(val diagnostics: Diagnost
|
|||||||
diagnostics: Diagnostics,
|
diagnostics: Diagnostics,
|
||||||
private val importedModules: List<String>,
|
private val importedModules: List<String>,
|
||||||
val moduleDescriptor: ModuleDescriptor,
|
val moduleDescriptor: ModuleDescriptor,
|
||||||
val bindingContext: BindingContext
|
val bindingContext: BindingContext,
|
||||||
|
val packageMetadata: Map<FqName, ByteArray>
|
||||||
) : TranslationResult(diagnostics) {
|
) : TranslationResult(diagnostics) {
|
||||||
@Suppress("unused") // Used in kotlin-web-demo in WebDemoTranslatorFacade
|
@Suppress("unused") // Used in kotlin-web-demo in WebDemoTranslatorFacade
|
||||||
fun getCode(): String {
|
fun getCode(): String {
|
||||||
@@ -111,8 +112,9 @@ abstract class TranslationResult protected constructor(val diagnostics: Diagnost
|
|||||||
kind = config.moduleKind,
|
kind = config.moduleKind,
|
||||||
imported = importedModules
|
imported = importedModules
|
||||||
)
|
)
|
||||||
val serializedMetadata = KotlinJavascriptSerializationUtil.serializeMetadata(
|
val serializedMetadata = KotlinJavascriptSerializationUtil.SerializedMetadata(
|
||||||
bindingContext, moduleDescription,
|
packageMetadata,
|
||||||
|
moduleDescription,
|
||||||
config.configuration.languageVersionSettings,
|
config.configuration.languageVersionSettings,
|
||||||
config.configuration.get(CommonConfigurationKeys.METADATA_VERSION) as? JsMetadataVersion ?: JsMetadataVersion.INSTANCE
|
config.configuration.get(CommonConfigurationKeys.METADATA_VERSION) as? JsMetadataVersion ?: JsMetadataVersion.INSTANCE
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user