Simplify code in JS serialization related to module descriptors

Do not use `JsModuleDescriptor<...>` where only its `data` is needed
This commit is contained in:
Alexander Udalov
2018-07-11 19:32:19 +02:00
parent 77405b2cca
commit ae6627fe94
9 changed files with 79 additions and 134 deletions
@@ -16,6 +16,9 @@
package org.jetbrains.kotlin.serialization.js
class JsModuleDescriptor<out T>(val name: String, val kind: ModuleKind, val imported: List<String>, val data: T) {
fun <S> copy(newData: S) = JsModuleDescriptor(name, kind, imported, newData)
}
class JsModuleDescriptor<out T>(
val name: String,
val kind: ModuleKind,
val imported: List<String>,
val data: T
)
@@ -51,34 +51,6 @@ import java.util.zip.GZIPOutputStream
object KotlinJavascriptSerializationUtil {
const val CLASS_METADATA_FILE_EXTENSION: String = "kjsm"
@JvmStatic
fun readModule(
metadata: ByteArray,
storageManager: StorageManager,
module: ModuleDescriptor,
configuration: DeserializationConfiguration,
lookupTracker: LookupTracker
): JsModuleDescriptor<PackageFragmentProvider?> =
readModuleFromProto(readModuleAsProto(metadata, module.name.asString()), storageManager, module, configuration, lookupTracker)
fun readModuleAsProto(metadata: ByteArray, name: String): JsModuleDescriptor<KotlinJavaScriptLibraryParts> =
metadata.deserializeToLibraryParts(name)
@JvmStatic
fun readModuleFromProto(
jsModule: JsModuleDescriptor<KotlinJavaScriptLibraryParts>,
storageManager: StorageManager, module: ModuleDescriptor,
configuration: DeserializationConfiguration,
lookupTracker: LookupTracker
): JsModuleDescriptor<PackageFragmentProvider?> {
val (header, packageFragmentProtos) = jsModule.data
return jsModule.copy(
createKotlinJavascriptPackageFragmentProvider(
storageManager, module, header, packageFragmentProtos, configuration, lookupTracker
)
)
}
fun readDescriptors(
metadata: PackagesWithHeaderMetadata,
storageManager: StorageManager,
@@ -334,27 +306,30 @@ object KotlinJavascriptSerializationUtil {
}
}
private fun ByteArray.deserializeToLibraryParts(name: String): JsModuleDescriptor<KotlinJavaScriptLibraryParts> {
val (header, content) = GZIPInputStream(ByteArrayInputStream(this)).use { stream ->
@JvmStatic
fun readModuleAsProto(metadata: ByteArray): KotlinJavaScriptLibraryParts {
val (header, content) = GZIPInputStream(ByteArrayInputStream(metadata)).use { stream ->
JsProtoBuf.Header.parseDelimitedFrom(stream, JsSerializerProtocol.extensionRegistry) to
JsProtoBuf.Library.parseFrom(stream, JsSerializerProtocol.extensionRegistry)
}
return JsModuleDescriptor(
name = name,
data = KotlinJavaScriptLibraryParts(header, content.packageFragmentList),
kind = when (content.kind) {
null, JsProtoBuf.Library.Kind.PLAIN -> ModuleKind.PLAIN
JsProtoBuf.Library.Kind.AMD -> ModuleKind.AMD
JsProtoBuf.Library.Kind.COMMON_JS -> ModuleKind.COMMON_JS
JsProtoBuf.Library.Kind.UMD -> ModuleKind.UMD
},
imported = content.importedModuleList
)
val moduleKind = when (content.kind) {
null, JsProtoBuf.Library.Kind.PLAIN -> ModuleKind.PLAIN
JsProtoBuf.Library.Kind.AMD -> ModuleKind.AMD
JsProtoBuf.Library.Kind.COMMON_JS -> ModuleKind.COMMON_JS
JsProtoBuf.Library.Kind.UMD -> ModuleKind.UMD
}
return KotlinJavaScriptLibraryParts(header, content.packageFragmentList, moduleKind, content.importedModuleList)
}
}
data class KotlinJavaScriptLibraryParts(val header: JsProtoBuf.Header, val body: List<ProtoBuf.PackageFragment>)
data class KotlinJavaScriptLibraryParts(
val header: JsProtoBuf.Header,
val body: List<ProtoBuf.PackageFragment>,
val kind: ModuleKind,
val importedModules: List<String>
)
internal fun DeclarationDescriptor.extractFileId(): Int? = when (this) {
is DeserializedClassDescriptor -> classProto.getExtension(JsProtoBuf.classContainingFileId)