JS: write/read module annotation FQ names to/from metadata

#KT-22759 In Progress
This commit is contained in:
Alexander Udalov
2018-01-23 15:37:00 +01:00
parent ff33e0bad3
commit 396a5ab352
6 changed files with 1515 additions and 63 deletions
File diff suppressed because it is too large Load Diff
+7
View File
@@ -31,6 +31,13 @@ message Header {
optional int32 js_code_binary_version = 2 [default = 1]; optional int32 js_code_binary_version = 2 [default = 1];
optional string package_fq_name = 3; optional string package_fq_name = 3;
optional StringTable strings = 4;
optional QualifiedNameTable qualified_names = 5;
// Annotations on the whole module
repeated Annotation annotation = 6;
} }
message File { message File {
@@ -73,6 +73,50 @@ public final class JsProtoBuf {
*/ */
org.jetbrains.kotlin.protobuf.ByteString org.jetbrains.kotlin.protobuf.ByteString
getPackageFqNameBytes(); getPackageFqNameBytes();
/**
* <code>optional .org.jetbrains.kotlin.serialization.StringTable strings = 4;</code>
*/
boolean hasStrings();
/**
* <code>optional .org.jetbrains.kotlin.serialization.StringTable strings = 4;</code>
*/
org.jetbrains.kotlin.serialization.ProtoBuf.StringTable getStrings();
/**
* <code>optional .org.jetbrains.kotlin.serialization.QualifiedNameTable qualified_names = 5;</code>
*/
boolean hasQualifiedNames();
/**
* <code>optional .org.jetbrains.kotlin.serialization.QualifiedNameTable qualified_names = 5;</code>
*/
org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable getQualifiedNames();
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
java.util.List<org.jetbrains.kotlin.serialization.ProtoBuf.Annotation>
getAnnotationList();
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
org.jetbrains.kotlin.serialization.ProtoBuf.Annotation getAnnotation(int index);
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
int getAnnotationCount();
} }
/** /**
* Protobuf type {@code org.jetbrains.kotlin.serialization.js.Header} * Protobuf type {@code org.jetbrains.kotlin.serialization.js.Header}
@@ -140,6 +184,40 @@ public final class JsProtoBuf {
packageFqName_ = bs; packageFqName_ = bs;
break; break;
} }
case 34: {
org.jetbrains.kotlin.serialization.ProtoBuf.StringTable.Builder subBuilder = null;
if (((bitField0_ & 0x00000008) == 0x00000008)) {
subBuilder = strings_.toBuilder();
}
strings_ = input.readMessage(org.jetbrains.kotlin.serialization.ProtoBuf.StringTable.PARSER, extensionRegistry);
if (subBuilder != null) {
subBuilder.mergeFrom(strings_);
strings_ = subBuilder.buildPartial();
}
bitField0_ |= 0x00000008;
break;
}
case 42: {
org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.Builder subBuilder = null;
if (((bitField0_ & 0x00000010) == 0x00000010)) {
subBuilder = qualifiedNames_.toBuilder();
}
qualifiedNames_ = input.readMessage(org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.PARSER, extensionRegistry);
if (subBuilder != null) {
subBuilder.mergeFrom(qualifiedNames_);
qualifiedNames_ = subBuilder.buildPartial();
}
bitField0_ |= 0x00000010;
break;
}
case 50: {
if (!((mutable_bitField0_ & 0x00000020) == 0x00000020)) {
annotation_ = new java.util.ArrayList<org.jetbrains.kotlin.serialization.ProtoBuf.Annotation>();
mutable_bitField0_ |= 0x00000020;
}
annotation_.add(input.readMessage(org.jetbrains.kotlin.serialization.ProtoBuf.Annotation.PARSER, extensionRegistry));
break;
}
} }
} }
} catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) { } catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) {
@@ -148,6 +226,9 @@ public final class JsProtoBuf {
throw new org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException( throw new org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException(
e.getMessage()).setUnfinishedMessage(this); e.getMessage()).setUnfinishedMessage(this);
} finally { } finally {
if (((mutable_bitField0_ & 0x00000020) == 0x00000020)) {
annotation_ = java.util.Collections.unmodifiableList(annotation_);
}
try { try {
unknownFieldsCodedOutput.flush(); unknownFieldsCodedOutput.flush();
} catch (java.io.IOException e) { } catch (java.io.IOException e) {
@@ -262,10 +343,98 @@ public final class JsProtoBuf {
} }
} }
public static final int STRINGS_FIELD_NUMBER = 4;
private org.jetbrains.kotlin.serialization.ProtoBuf.StringTable strings_;
/**
* <code>optional .org.jetbrains.kotlin.serialization.StringTable strings = 4;</code>
*/
public boolean hasStrings() {
return ((bitField0_ & 0x00000008) == 0x00000008);
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.StringTable strings = 4;</code>
*/
public org.jetbrains.kotlin.serialization.ProtoBuf.StringTable getStrings() {
return strings_;
}
public static final int QUALIFIED_NAMES_FIELD_NUMBER = 5;
private org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable qualifiedNames_;
/**
* <code>optional .org.jetbrains.kotlin.serialization.QualifiedNameTable qualified_names = 5;</code>
*/
public boolean hasQualifiedNames() {
return ((bitField0_ & 0x00000010) == 0x00000010);
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.QualifiedNameTable qualified_names = 5;</code>
*/
public org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable getQualifiedNames() {
return qualifiedNames_;
}
public static final int ANNOTATION_FIELD_NUMBER = 6;
private java.util.List<org.jetbrains.kotlin.serialization.ProtoBuf.Annotation> annotation_;
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
public java.util.List<org.jetbrains.kotlin.serialization.ProtoBuf.Annotation> getAnnotationList() {
return annotation_;
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
public java.util.List<? extends org.jetbrains.kotlin.serialization.ProtoBuf.AnnotationOrBuilder>
getAnnotationOrBuilderList() {
return annotation_;
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
public int getAnnotationCount() {
return annotation_.size();
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
public org.jetbrains.kotlin.serialization.ProtoBuf.Annotation getAnnotation(int index) {
return annotation_.get(index);
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
public org.jetbrains.kotlin.serialization.ProtoBuf.AnnotationOrBuilder getAnnotationOrBuilder(
int index) {
return annotation_.get(index);
}
private void initFields() { private void initFields() {
flags_ = 0; flags_ = 0;
jsCodeBinaryVersion_ = 1; jsCodeBinaryVersion_ = 1;
packageFqName_ = ""; packageFqName_ = "";
strings_ = org.jetbrains.kotlin.serialization.ProtoBuf.StringTable.getDefaultInstance();
qualifiedNames_ = org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.getDefaultInstance();
annotation_ = java.util.Collections.emptyList();
} }
private byte memoizedIsInitialized = -1; private byte memoizedIsInitialized = -1;
public final boolean isInitialized() { public final boolean isInitialized() {
@@ -273,6 +442,18 @@ public final class JsProtoBuf {
if (isInitialized == 1) return true; if (isInitialized == 1) return true;
if (isInitialized == 0) return false; if (isInitialized == 0) return false;
if (hasQualifiedNames()) {
if (!getQualifiedNames().isInitialized()) {
memoizedIsInitialized = 0;
return false;
}
}
for (int i = 0; i < getAnnotationCount(); i++) {
if (!getAnnotation(i).isInitialized()) {
memoizedIsInitialized = 0;
return false;
}
}
memoizedIsInitialized = 1; memoizedIsInitialized = 1;
return true; return true;
} }
@@ -289,6 +470,15 @@ public final class JsProtoBuf {
if (((bitField0_ & 0x00000004) == 0x00000004)) { if (((bitField0_ & 0x00000004) == 0x00000004)) {
output.writeBytes(3, getPackageFqNameBytes()); output.writeBytes(3, getPackageFqNameBytes());
} }
if (((bitField0_ & 0x00000008) == 0x00000008)) {
output.writeMessage(4, strings_);
}
if (((bitField0_ & 0x00000010) == 0x00000010)) {
output.writeMessage(5, qualifiedNames_);
}
for (int i = 0; i < annotation_.size(); i++) {
output.writeMessage(6, annotation_.get(i));
}
output.writeRawBytes(unknownFields); output.writeRawBytes(unknownFields);
} }
@@ -310,6 +500,18 @@ public final class JsProtoBuf {
size += org.jetbrains.kotlin.protobuf.CodedOutputStream size += org.jetbrains.kotlin.protobuf.CodedOutputStream
.computeBytesSize(3, getPackageFqNameBytes()); .computeBytesSize(3, getPackageFqNameBytes());
} }
if (((bitField0_ & 0x00000008) == 0x00000008)) {
size += org.jetbrains.kotlin.protobuf.CodedOutputStream
.computeMessageSize(4, strings_);
}
if (((bitField0_ & 0x00000010) == 0x00000010)) {
size += org.jetbrains.kotlin.protobuf.CodedOutputStream
.computeMessageSize(5, qualifiedNames_);
}
for (int i = 0; i < annotation_.size(); i++) {
size += org.jetbrains.kotlin.protobuf.CodedOutputStream
.computeMessageSize(6, annotation_.get(i));
}
size += unknownFields.size(); size += unknownFields.size();
memoizedSerializedSize = size; memoizedSerializedSize = size;
return size; return size;
@@ -410,6 +612,12 @@ public final class JsProtoBuf {
bitField0_ = (bitField0_ & ~0x00000002); bitField0_ = (bitField0_ & ~0x00000002);
packageFqName_ = ""; packageFqName_ = "";
bitField0_ = (bitField0_ & ~0x00000004); bitField0_ = (bitField0_ & ~0x00000004);
strings_ = org.jetbrains.kotlin.serialization.ProtoBuf.StringTable.getDefaultInstance();
bitField0_ = (bitField0_ & ~0x00000008);
qualifiedNames_ = org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.getDefaultInstance();
bitField0_ = (bitField0_ & ~0x00000010);
annotation_ = java.util.Collections.emptyList();
bitField0_ = (bitField0_ & ~0x00000020);
return this; return this;
} }
@@ -445,6 +653,19 @@ public final class JsProtoBuf {
to_bitField0_ |= 0x00000004; to_bitField0_ |= 0x00000004;
} }
result.packageFqName_ = packageFqName_; result.packageFqName_ = packageFqName_;
if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
to_bitField0_ |= 0x00000008;
}
result.strings_ = strings_;
if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
to_bitField0_ |= 0x00000010;
}
result.qualifiedNames_ = qualifiedNames_;
if (((bitField0_ & 0x00000020) == 0x00000020)) {
annotation_ = java.util.Collections.unmodifiableList(annotation_);
bitField0_ = (bitField0_ & ~0x00000020);
}
result.annotation_ = annotation_;
result.bitField0_ = to_bitField0_; result.bitField0_ = to_bitField0_;
return result; return result;
} }
@@ -461,6 +682,22 @@ public final class JsProtoBuf {
bitField0_ |= 0x00000004; bitField0_ |= 0x00000004;
packageFqName_ = other.packageFqName_; packageFqName_ = other.packageFqName_;
}
if (other.hasStrings()) {
mergeStrings(other.getStrings());
}
if (other.hasQualifiedNames()) {
mergeQualifiedNames(other.getQualifiedNames());
}
if (!other.annotation_.isEmpty()) {
if (annotation_.isEmpty()) {
annotation_ = other.annotation_;
bitField0_ = (bitField0_ & ~0x00000020);
} else {
ensureAnnotationIsMutable();
annotation_.addAll(other.annotation_);
}
} }
setUnknownFields( setUnknownFields(
getUnknownFields().concat(other.unknownFields)); getUnknownFields().concat(other.unknownFields));
@@ -468,6 +705,18 @@ public final class JsProtoBuf {
} }
public final boolean isInitialized() { public final boolean isInitialized() {
if (hasQualifiedNames()) {
if (!getQualifiedNames().isInitialized()) {
return false;
}
}
for (int i = 0; i < getAnnotationCount(); i++) {
if (!getAnnotation(i).isInitialized()) {
return false;
}
}
return true; return true;
} }
@@ -662,6 +911,299 @@ public final class JsProtoBuf {
return this; return this;
} }
private org.jetbrains.kotlin.serialization.ProtoBuf.StringTable strings_ = org.jetbrains.kotlin.serialization.ProtoBuf.StringTable.getDefaultInstance();
/**
* <code>optional .org.jetbrains.kotlin.serialization.StringTable strings = 4;</code>
*/
public boolean hasStrings() {
return ((bitField0_ & 0x00000008) == 0x00000008);
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.StringTable strings = 4;</code>
*/
public org.jetbrains.kotlin.serialization.ProtoBuf.StringTable getStrings() {
return strings_;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.StringTable strings = 4;</code>
*/
public Builder setStrings(org.jetbrains.kotlin.serialization.ProtoBuf.StringTable value) {
if (value == null) {
throw new NullPointerException();
}
strings_ = value;
bitField0_ |= 0x00000008;
return this;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.StringTable strings = 4;</code>
*/
public Builder setStrings(
org.jetbrains.kotlin.serialization.ProtoBuf.StringTable.Builder builderForValue) {
strings_ = builderForValue.build();
bitField0_ |= 0x00000008;
return this;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.StringTable strings = 4;</code>
*/
public Builder mergeStrings(org.jetbrains.kotlin.serialization.ProtoBuf.StringTable value) {
if (((bitField0_ & 0x00000008) == 0x00000008) &&
strings_ != org.jetbrains.kotlin.serialization.ProtoBuf.StringTable.getDefaultInstance()) {
strings_ =
org.jetbrains.kotlin.serialization.ProtoBuf.StringTable.newBuilder(strings_).mergeFrom(value).buildPartial();
} else {
strings_ = value;
}
bitField0_ |= 0x00000008;
return this;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.StringTable strings = 4;</code>
*/
public Builder clearStrings() {
strings_ = org.jetbrains.kotlin.serialization.ProtoBuf.StringTable.getDefaultInstance();
bitField0_ = (bitField0_ & ~0x00000008);
return this;
}
private org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable qualifiedNames_ = org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.getDefaultInstance();
/**
* <code>optional .org.jetbrains.kotlin.serialization.QualifiedNameTable qualified_names = 5;</code>
*/
public boolean hasQualifiedNames() {
return ((bitField0_ & 0x00000010) == 0x00000010);
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.QualifiedNameTable qualified_names = 5;</code>
*/
public org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable getQualifiedNames() {
return qualifiedNames_;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.QualifiedNameTable qualified_names = 5;</code>
*/
public Builder setQualifiedNames(org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable value) {
if (value == null) {
throw new NullPointerException();
}
qualifiedNames_ = value;
bitField0_ |= 0x00000010;
return this;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.QualifiedNameTable qualified_names = 5;</code>
*/
public Builder setQualifiedNames(
org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.Builder builderForValue) {
qualifiedNames_ = builderForValue.build();
bitField0_ |= 0x00000010;
return this;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.QualifiedNameTable qualified_names = 5;</code>
*/
public Builder mergeQualifiedNames(org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable value) {
if (((bitField0_ & 0x00000010) == 0x00000010) &&
qualifiedNames_ != org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.getDefaultInstance()) {
qualifiedNames_ =
org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.newBuilder(qualifiedNames_).mergeFrom(value).buildPartial();
} else {
qualifiedNames_ = value;
}
bitField0_ |= 0x00000010;
return this;
}
/**
* <code>optional .org.jetbrains.kotlin.serialization.QualifiedNameTable qualified_names = 5;</code>
*/
public Builder clearQualifiedNames() {
qualifiedNames_ = org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.getDefaultInstance();
bitField0_ = (bitField0_ & ~0x00000010);
return this;
}
private java.util.List<org.jetbrains.kotlin.serialization.ProtoBuf.Annotation> annotation_ =
java.util.Collections.emptyList();
private void ensureAnnotationIsMutable() {
if (!((bitField0_ & 0x00000020) == 0x00000020)) {
annotation_ = new java.util.ArrayList<org.jetbrains.kotlin.serialization.ProtoBuf.Annotation>(annotation_);
bitField0_ |= 0x00000020;
}
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
public java.util.List<org.jetbrains.kotlin.serialization.ProtoBuf.Annotation> getAnnotationList() {
return java.util.Collections.unmodifiableList(annotation_);
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
public int getAnnotationCount() {
return annotation_.size();
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
public org.jetbrains.kotlin.serialization.ProtoBuf.Annotation getAnnotation(int index) {
return annotation_.get(index);
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
public Builder setAnnotation(
int index, org.jetbrains.kotlin.serialization.ProtoBuf.Annotation value) {
if (value == null) {
throw new NullPointerException();
}
ensureAnnotationIsMutable();
annotation_.set(index, value);
return this;
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
public Builder setAnnotation(
int index, org.jetbrains.kotlin.serialization.ProtoBuf.Annotation.Builder builderForValue) {
ensureAnnotationIsMutable();
annotation_.set(index, builderForValue.build());
return this;
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
public Builder addAnnotation(org.jetbrains.kotlin.serialization.ProtoBuf.Annotation value) {
if (value == null) {
throw new NullPointerException();
}
ensureAnnotationIsMutable();
annotation_.add(value);
return this;
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
public Builder addAnnotation(
int index, org.jetbrains.kotlin.serialization.ProtoBuf.Annotation value) {
if (value == null) {
throw new NullPointerException();
}
ensureAnnotationIsMutable();
annotation_.add(index, value);
return this;
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
public Builder addAnnotation(
org.jetbrains.kotlin.serialization.ProtoBuf.Annotation.Builder builderForValue) {
ensureAnnotationIsMutable();
annotation_.add(builderForValue.build());
return this;
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
public Builder addAnnotation(
int index, org.jetbrains.kotlin.serialization.ProtoBuf.Annotation.Builder builderForValue) {
ensureAnnotationIsMutable();
annotation_.add(index, builderForValue.build());
return this;
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
public Builder addAllAnnotation(
java.lang.Iterable<? extends org.jetbrains.kotlin.serialization.ProtoBuf.Annotation> values) {
ensureAnnotationIsMutable();
org.jetbrains.kotlin.protobuf.AbstractMessageLite.Builder.addAll(
values, annotation_);
return this;
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
public Builder clearAnnotation() {
annotation_ = java.util.Collections.emptyList();
bitField0_ = (bitField0_ & ~0x00000020);
return this;
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 6;</code>
*
* <pre>
* Annotations on the whole module
* </pre>
*/
public Builder removeAnnotation(int index) {
ensureAnnotationIsMutable();
annotation_.remove(index);
return this;
}
// @@protoc_insertion_point(builder_scope:org.jetbrains.kotlin.serialization.js.Header) // @@protoc_insertion_point(builder_scope:org.jetbrains.kotlin.serialization.js.Header)
} }
@@ -21,13 +21,11 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.descriptors.SourceFile import org.jetbrains.kotlin.descriptors.SourceFile
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.deserialization.AnnotationDeserializer import org.jetbrains.kotlin.serialization.deserialization.*
import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration
import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragmentImpl
import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.storage.getValue import org.jetbrains.kotlin.storage.getValue
@@ -65,11 +63,18 @@ class KotlinJavascriptPackageFragment(
} }
} }
private class JsContainerSource( class JsContainerSource(
private val fqName: FqName, private val fqName: FqName,
header: JsProtoBuf.Header, header: JsProtoBuf.Header,
configuration: DeserializationConfiguration configuration: DeserializationConfiguration
) : DeserializedContainerSource { ) : DeserializedContainerSource {
val annotations: List<ClassId> =
if (header.annotationCount == 0) emptyList()
else NameResolverImpl(header.strings, header.qualifiedNames).let { nameResolver ->
// TODO: read arguments of module annotations
header.annotationList.map { annotation -> nameResolver.getClassId(annotation.id) }
}
// TODO // TODO
override fun getContainingFile(): SourceFile = SourceFile.NO_SOURCE_FILE override fun getContainingFile(): SourceFile = SourceFile.NO_SOURCE_FILE
@@ -16,10 +16,12 @@
package org.jetbrains.kotlin.serialization.js package org.jetbrains.kotlin.serialization.js
import org.jetbrains.kotlin.config.AnalysisFlag
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.isPreRelease import org.jetbrains.kotlin.config.isPreRelease
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.protobuf.CodedInputStream import org.jetbrains.kotlin.protobuf.CodedInputStream
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
@@ -29,6 +31,7 @@ import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.serialization.AnnotationSerializer import org.jetbrains.kotlin.serialization.AnnotationSerializer
import org.jetbrains.kotlin.serialization.DescriptorSerializer import org.jetbrains.kotlin.serialization.DescriptorSerializer
import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.StringTableImpl
import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor
@@ -224,7 +227,7 @@ object KotlinJavascriptSerializationUtil {
version.forEach(this::writeInt) version.forEach(this::writeInt)
} }
serializeHeader(fqName, languageVersionSettings).writeDelimitedTo(stream) serializeHeader(module, fqName, languageVersionSettings).writeDelimitedTo(stream)
part.writeTo(stream) part.writeTo(stream)
contentMap[JsSerializerProtocol.getKjsmFilePath(fqName)] = stream.toByteArray() contentMap[JsSerializerProtocol.getKjsmFilePath(fqName)] = stream.toByteArray()
@@ -236,7 +239,9 @@ object KotlinJavascriptSerializationUtil {
private fun ProtoBuf.PackageFragment.isEmpty(): Boolean = private fun ProtoBuf.PackageFragment.isEmpty(): Boolean =
class_Count == 0 && `package`.let { it.functionCount == 0 && it.propertyCount == 0 && it.typeAliasCount == 0 } class_Count == 0 && `package`.let { it.functionCount == 0 && it.propertyCount == 0 && it.typeAliasCount == 0 }
fun serializeHeader(packageFqName: FqName?, languageVersionSettings: LanguageVersionSettings): JsProtoBuf.Header { fun serializeHeader(
module: ModuleDescriptor, packageFqName: FqName?, languageVersionSettings: LanguageVersionSettings
): JsProtoBuf.Header {
val header = JsProtoBuf.Header.newBuilder() val header = JsProtoBuf.Header.newBuilder()
if (packageFqName != null) { if (packageFqName != null) {
@@ -247,6 +252,20 @@ object KotlinJavascriptSerializationUtil {
header.flags = 1 header.flags = 1
} }
val experimentalAnnotationFqNames = languageVersionSettings.getFlag(AnalysisFlag.experimental)
if (experimentalAnnotationFqNames.isNotEmpty()) {
val stringTable = StringTableImpl()
for (fqName in experimentalAnnotationFqNames) {
val descriptor = module.resolveClassByFqName(FqName(fqName), NoLookupLocation.FOR_ALREADY_TRACKED) ?: continue
header.addAnnotation(ProtoBuf.Annotation.newBuilder().apply {
id = stringTable.getFqNameIndex(descriptor)
})
}
val (strings, qualifiedNames) = stringTable.buildProto()
header.strings = strings
header.qualifiedNames = qualifiedNames
}
// TODO: write JS code binary version // TODO: write JS code binary version
return header.build() return header.build()
@@ -278,7 +297,7 @@ object KotlinJavascriptSerializationUtil {
): ByteArray { ): ByteArray {
return ByteArrayOutputStream().apply { return ByteArrayOutputStream().apply {
GZIPOutputStream(this).use { stream -> GZIPOutputStream(this).use { stream ->
serializeHeader(null, languageVersionSettings).writeDelimitedTo(stream) serializeHeader(data, null, languageVersionSettings).writeDelimitedTo(stream)
serializeMetadata(bindingContext, data, kind, imported).writeTo(stream) serializeMetadata(bindingContext, data, kind, imported).writeTo(stream)
} }
}.toByteArray() }.toByteArray()
@@ -184,7 +184,7 @@ public final class K2JSTranslator {
} }
LanguageVersionSettings settings = CommonConfigurationKeysKt.getLanguageVersionSettings(config.getConfiguration()); LanguageVersionSettings settings = CommonConfigurationKeysKt.getLanguageVersionSettings(config.getConfiguration());
incrementalResults.processHeader(serializationUtil.serializeHeader(null, settings).toByteArray()); incrementalResults.processHeader(serializationUtil.serializeHeader(moduleDescriptor, null, settings).toByteArray());
} }
RemoveDuplicateImportsKt.removeDuplicateImports(translationResult.getProgram()); RemoveDuplicateImportsKt.removeDuplicateImports(translationResult.getProgram());