Introduce PackageFragment protobuf message for kjsm/builtins/common metadata

This commit is contained in:
Alexander Udalov
2017-01-31 16:22:55 +03:00
parent 2b1b1fb0d4
commit a36e457c12
12 changed files with 2622 additions and 2874 deletions
+5 -14
View File
@@ -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
@@ -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 =
@@ -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)
}
}
@@ -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
@@ -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)