Introduce PackageFragment protobuf message for kjsm/builtins/common metadata
This commit is contained in:
@@ -84,6 +84,10 @@ extend TypeParameter {
|
||||
repeated Annotation type_parameter_annotation = 130;
|
||||
}
|
||||
|
||||
extend PackageFragment {
|
||||
optional Files package_fragment_files = 130;
|
||||
}
|
||||
|
||||
message Classes {
|
||||
// id in StringTable
|
||||
repeated int32 class_name = 1 [packed = true];
|
||||
@@ -97,22 +101,9 @@ message Library {
|
||||
UMD = 4;
|
||||
}
|
||||
|
||||
// This is a copy of BuiltIns in builtins.proto
|
||||
// TODO: combine the two
|
||||
message Part {
|
||||
optional StringTable strings = 1;
|
||||
optional QualifiedNameTable qualified_names = 2;
|
||||
|
||||
optional Package package = 3;
|
||||
|
||||
repeated Class class = 4;
|
||||
|
||||
optional Files files = 130;
|
||||
}
|
||||
|
||||
optional Kind kind = 1 [default = PLAIN];
|
||||
|
||||
repeated Part part = 2;
|
||||
repeated PackageFragment package_fragment = 2;
|
||||
|
||||
repeated string imported_module = 3;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+2
-1
@@ -20,11 +20,12 @@ import org.jetbrains.kotlin.descriptors.SourceElement
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.serialization.ClassData
|
||||
import org.jetbrains.kotlin.serialization.ClassDataWithSource
|
||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder
|
||||
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
|
||||
|
||||
class KotlinJavascriptClassDataFinder(
|
||||
proto: JsProtoBuf.Library.Part,
|
||||
proto: ProtoBuf.PackageFragment,
|
||||
private val nameResolver: NameResolver
|
||||
) : ClassDataFinder {
|
||||
private val classIdToProto =
|
||||
|
||||
+2
-2
@@ -38,11 +38,11 @@ class KotlinJavascriptPackageFragment(
|
||||
fqName: FqName,
|
||||
storageManager: StorageManager,
|
||||
module: ModuleDescriptor,
|
||||
private val proto: JsProtoBuf.Library.Part,
|
||||
private val proto: ProtoBuf.PackageFragment,
|
||||
private val nameResolver: NameResolver
|
||||
) : DeserializedPackageFragment(fqName, storageManager, module) {
|
||||
private val fileMap: Map<Int, FileHolder> by storageManager.createLazyValue {
|
||||
proto.files.fileList.withIndex().associate { (index, file) ->
|
||||
proto.getExtension(JsProtoBuf.packageFragmentFiles).fileList.withIndex().associate { (index, file) ->
|
||||
(if (file.hasId()) file.id else index) to FileHolder(file.annotationList)
|
||||
}
|
||||
}
|
||||
|
||||
+15
-11
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||
import org.jetbrains.kotlin.serialization.AnnotationSerializer
|
||||
import org.jetbrains.kotlin.serialization.DescriptorSerializer
|
||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration
|
||||
import org.jetbrains.kotlin.storage.StorageManager
|
||||
import org.jetbrains.kotlin.utils.JsMetadataVersion
|
||||
@@ -46,7 +47,7 @@ object KotlinJavascriptSerializationUtil {
|
||||
return jsModule.copy(createKotlinJavascriptPackageFragmentProvider(storageManager, module, jsModule.data, configuration))
|
||||
}
|
||||
|
||||
fun serializeMetadata(
|
||||
private fun serializeMetadata(
|
||||
bindingContext: BindingContext,
|
||||
module: ModuleDescriptor,
|
||||
moduleKind: ModuleKind,
|
||||
@@ -67,9 +68,9 @@ object KotlinJavascriptSerializationUtil {
|
||||
importedModules.forEach { builder.addImportedModule(it) }
|
||||
|
||||
for (fqName in getPackagesFqNames(module)) {
|
||||
val part = serializePackage(bindingContext, module, fqName)
|
||||
if (part.hasPackage() || part.class_Count > 0) {
|
||||
builder.addPart(part)
|
||||
val fragment = serializePackageFragment(bindingContext, module, fqName)
|
||||
if (fragment.hasPackage() || fragment.class_Count > 0) {
|
||||
builder.addPackageFragment(fragment)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,8 +80,8 @@ object KotlinJavascriptSerializationUtil {
|
||||
fun metadataAsString(bindingContext: BindingContext, jsDescriptor: JsModuleDescriptor<ModuleDescriptor>): String =
|
||||
KotlinJavascriptMetadataUtils.formatMetadataAsString(jsDescriptor.name, jsDescriptor.serializeToBinaryMetadata(bindingContext))
|
||||
|
||||
fun serializePackage(bindingContext: BindingContext, module: ModuleDescriptor, fqName: FqName): JsProtoBuf.Library.Part {
|
||||
val builder = JsProtoBuf.Library.Part.newBuilder()
|
||||
private fun serializePackageFragment(bindingContext: BindingContext, module: ModuleDescriptor, fqName: FqName): ProtoBuf.PackageFragment {
|
||||
val builder = ProtoBuf.PackageFragment.newBuilder()
|
||||
|
||||
val packageView = module.getPackage(fqName)
|
||||
|
||||
@@ -122,7 +123,10 @@ object KotlinJavascriptSerializationUtil {
|
||||
setExtension(JsProtoBuf.packageFqName, stringTable.getPackageFqNameIndex(fqName))
|
||||
}.build()
|
||||
|
||||
builder.files = serializeFiles(fileRegistry, bindingContext, AnnotationSerializer(stringTable))
|
||||
builder.setExtension(
|
||||
JsProtoBuf.packageFragmentFiles,
|
||||
serializeFiles(fileRegistry, bindingContext, AnnotationSerializer(stringTable))
|
||||
)
|
||||
|
||||
val (strings, qualifiedNames) = stringTable.buildProto()
|
||||
builder.strings = strings
|
||||
@@ -155,7 +159,7 @@ object KotlinJavascriptSerializationUtil {
|
||||
val contentMap = hashMapOf<String, ByteArray>()
|
||||
|
||||
for (fqName in getPackagesFqNames(module)) {
|
||||
val part = serializePackage(bindingContext, module, fqName)
|
||||
val part = serializePackageFragment(bindingContext, module, fqName)
|
||||
if (part.class_Count == 0 && part.`package`.let { packageProto ->
|
||||
packageProto.functionCount == 0 && packageProto.propertyCount == 0 && packageProto.typeAliasCount == 0
|
||||
}) continue
|
||||
@@ -176,7 +180,7 @@ object KotlinJavascriptSerializationUtil {
|
||||
return contentMap
|
||||
}
|
||||
|
||||
fun serializeHeader(packageFqName: FqName?): JsProtoBuf.Header {
|
||||
private fun serializeHeader(packageFqName: FqName?): JsProtoBuf.Header {
|
||||
val header = JsProtoBuf.Header.newBuilder()
|
||||
|
||||
if (packageFqName != null) {
|
||||
@@ -218,7 +222,7 @@ object KotlinJavascriptSerializationUtil {
|
||||
}.toByteArray()
|
||||
}
|
||||
|
||||
private fun ByteArray.deserializeToLibraryParts(name: String): JsModuleDescriptor<List<JsProtoBuf.Library.Part>> {
|
||||
private fun ByteArray.deserializeToLibraryParts(name: String): JsModuleDescriptor<List<ProtoBuf.PackageFragment>> {
|
||||
val content = GZIPInputStream(ByteArrayInputStream(this)).use { stream ->
|
||||
JsProtoBuf.Header.parseDelimitedFrom(stream, JsSerializerProtocol.extensionRegistry)
|
||||
JsProtoBuf.Library.parseFrom(stream, JsSerializerProtocol.extensionRegistry)
|
||||
@@ -226,7 +230,7 @@ object KotlinJavascriptSerializationUtil {
|
||||
|
||||
return JsModuleDescriptor(
|
||||
name = name,
|
||||
data = content.partList,
|
||||
data = content.packageFragmentList,
|
||||
kind = when (content.kind) {
|
||||
null, JsProtoBuf.Library.Kind.PLAIN -> ModuleKind.PLAIN
|
||||
JsProtoBuf.Library.Kind.AMD -> ModuleKind.AMD
|
||||
|
||||
+7
-6
@@ -20,23 +20,24 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
|
||||
import org.jetbrains.kotlin.descriptors.PackageFragmentProviderImpl
|
||||
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.deserialization.*
|
||||
import org.jetbrains.kotlin.storage.StorageManager
|
||||
|
||||
fun createKotlinJavascriptPackageFragmentProvider(
|
||||
storageManager: StorageManager,
|
||||
module: ModuleDescriptor,
|
||||
libraryParts: List<JsProtoBuf.Library.Part>,
|
||||
packageFragmentProtos: List<ProtoBuf.PackageFragment>,
|
||||
configuration: DeserializationConfiguration
|
||||
): PackageFragmentProvider {
|
||||
val packageFragments = libraryParts.map { part ->
|
||||
val nameResolver = NameResolverImpl(part.strings, part.qualifiedNames)
|
||||
val packageFragments = packageFragmentProtos.map { proto ->
|
||||
val nameResolver = NameResolverImpl(proto.strings, proto.qualifiedNames)
|
||||
val fqName = when {
|
||||
part.hasPackage() -> nameResolver.getPackageFqName(part.`package`.getExtension(JsProtoBuf.packageFqName))
|
||||
part.class_Count > 0 -> nameResolver.getClassId(part.class_OrBuilderList.first().fqName).packageFqName
|
||||
proto.hasPackage() -> nameResolver.getPackageFqName(proto.`package`.getExtension(JsProtoBuf.packageFqName))
|
||||
proto.class_Count > 0 -> nameResolver.getClassId(proto.class_OrBuilderList.first().fqName).packageFqName
|
||||
else -> throw IllegalStateException("Invalid library part: either a Package or a Class must be present")
|
||||
}
|
||||
KotlinJavascriptPackageFragment(fqName, storageManager, module, part, nameResolver)
|
||||
KotlinJavascriptPackageFragment(fqName, storageManager, module, proto, nameResolver)
|
||||
}
|
||||
|
||||
val provider = PackageFragmentProviderImpl(packageFragments)
|
||||
|
||||
Reference in New Issue
Block a user