KT-12877: serialize information about file annotations. For each top-level declaration store containing file. Use this information to properly handle file-targeted JsModule.

This commit is contained in:
Alexey Andreev
2016-06-28 17:49:17 +03:00
committed by Alexey Andreev
parent 6df40559f0
commit ac703dfda6
35 changed files with 2087 additions and 165 deletions
+8
View File
@@ -21,8 +21,14 @@ import "core/deserialization/src/descriptors.proto";
option java_outer_classname = "JsProtoBuf";
option optimize_for = LITE_RUNTIME;
message File {
required int32 id = 1;
repeated Annotation annotation = 2;
}
extend Class {
repeated Annotation class_annotation = 130;
optional int32 class_containing_file_id = 135;
}
extend Constructor {
@@ -31,11 +37,13 @@ extend Constructor {
extend Function {
repeated Annotation function_annotation = 130;
optional int32 function_containing_file_id = 135;
}
extend Property {
repeated Annotation property_annotation = 130;
optional Annotation.Argument.Value compile_time_value = 131;
optional int32 property_containing_file_id = 135;
}
extend EnumEntry {
@@ -8,15 +8,600 @@ public final class JsProtoBuf {
public static void registerAllExtensions(
org.jetbrains.kotlin.protobuf.ExtensionRegistryLite registry) {
registry.add(org.jetbrains.kotlin.serialization.js.JsProtoBuf.classAnnotation);
registry.add(org.jetbrains.kotlin.serialization.js.JsProtoBuf.classContainingFileId);
registry.add(org.jetbrains.kotlin.serialization.js.JsProtoBuf.constructorAnnotation);
registry.add(org.jetbrains.kotlin.serialization.js.JsProtoBuf.functionAnnotation);
registry.add(org.jetbrains.kotlin.serialization.js.JsProtoBuf.functionContainingFileId);
registry.add(org.jetbrains.kotlin.serialization.js.JsProtoBuf.propertyAnnotation);
registry.add(org.jetbrains.kotlin.serialization.js.JsProtoBuf.compileTimeValue);
registry.add(org.jetbrains.kotlin.serialization.js.JsProtoBuf.propertyContainingFileId);
registry.add(org.jetbrains.kotlin.serialization.js.JsProtoBuf.enumEntryAnnotation);
registry.add(org.jetbrains.kotlin.serialization.js.JsProtoBuf.parameterAnnotation);
registry.add(org.jetbrains.kotlin.serialization.js.JsProtoBuf.typeAnnotation);
registry.add(org.jetbrains.kotlin.serialization.js.JsProtoBuf.typeParameterAnnotation);
}
public interface FileOrBuilder extends
// @@protoc_insertion_point(interface_extends:org.jetbrains.kotlin.serialization.js.File)
org.jetbrains.kotlin.protobuf.MessageLiteOrBuilder {
/**
* <code>required int32 id = 1;</code>
*/
boolean hasId();
/**
* <code>required int32 id = 1;</code>
*/
int getId();
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 2;</code>
*/
java.util.List<org.jetbrains.kotlin.serialization.ProtoBuf.Annotation>
getAnnotationList();
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 2;</code>
*/
org.jetbrains.kotlin.serialization.ProtoBuf.Annotation getAnnotation(int index);
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 2;</code>
*/
int getAnnotationCount();
}
/**
* Protobuf type {@code org.jetbrains.kotlin.serialization.js.File}
*/
public static final class File extends
org.jetbrains.kotlin.protobuf.GeneratedMessageLite implements
// @@protoc_insertion_point(message_implements:org.jetbrains.kotlin.serialization.js.File)
FileOrBuilder {
// Use File.newBuilder() to construct.
private File(org.jetbrains.kotlin.protobuf.GeneratedMessageLite.Builder builder) {
super(builder);
this.unknownFields = builder.getUnknownFields();
}
private File(boolean noInit) { this.unknownFields = org.jetbrains.kotlin.protobuf.ByteString.EMPTY;}
private static final File defaultInstance;
public static File getDefaultInstance() {
return defaultInstance;
}
public File getDefaultInstanceForType() {
return defaultInstance;
}
private final org.jetbrains.kotlin.protobuf.ByteString unknownFields;
private File(
org.jetbrains.kotlin.protobuf.CodedInputStream input,
org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry)
throws org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException {
initFields();
int mutable_bitField0_ = 0;
org.jetbrains.kotlin.protobuf.ByteString.Output unknownFieldsOutput =
org.jetbrains.kotlin.protobuf.ByteString.newOutput();
org.jetbrains.kotlin.protobuf.CodedOutputStream unknownFieldsCodedOutput =
org.jetbrains.kotlin.protobuf.CodedOutputStream.newInstance(
unknownFieldsOutput);
try {
boolean done = false;
while (!done) {
int tag = input.readTag();
switch (tag) {
case 0:
done = true;
break;
default: {
if (!parseUnknownField(input, unknownFieldsCodedOutput,
extensionRegistry, tag)) {
done = true;
}
break;
}
case 8: {
bitField0_ |= 0x00000001;
id_ = input.readInt32();
break;
}
case 18: {
if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
annotation_ = new java.util.ArrayList<org.jetbrains.kotlin.serialization.ProtoBuf.Annotation>();
mutable_bitField0_ |= 0x00000002;
}
annotation_.add(input.readMessage(org.jetbrains.kotlin.serialization.ProtoBuf.Annotation.PARSER, extensionRegistry));
break;
}
}
}
} catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) {
throw e.setUnfinishedMessage(this);
} catch (java.io.IOException e) {
throw new org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException(
e.getMessage()).setUnfinishedMessage(this);
} finally {
if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
annotation_ = java.util.Collections.unmodifiableList(annotation_);
}
try {
unknownFieldsCodedOutput.flush();
} catch (java.io.IOException e) {
// Should not happen
} finally {
unknownFields = unknownFieldsOutput.toByteString();
}
makeExtensionsImmutable();
}
}
public static org.jetbrains.kotlin.protobuf.Parser<File> PARSER =
new org.jetbrains.kotlin.protobuf.AbstractParser<File>() {
public File parsePartialFrom(
org.jetbrains.kotlin.protobuf.CodedInputStream input,
org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry)
throws org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException {
return new File(input, extensionRegistry);
}
};
@java.lang.Override
public org.jetbrains.kotlin.protobuf.Parser<File> getParserForType() {
return PARSER;
}
private int bitField0_;
public static final int ID_FIELD_NUMBER = 1;
private int id_;
/**
* <code>required int32 id = 1;</code>
*/
public boolean hasId() {
return ((bitField0_ & 0x00000001) == 0x00000001);
}
/**
* <code>required int32 id = 1;</code>
*/
public int getId() {
return id_;
}
public static final int ANNOTATION_FIELD_NUMBER = 2;
private java.util.List<org.jetbrains.kotlin.serialization.ProtoBuf.Annotation> annotation_;
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 2;</code>
*/
public java.util.List<org.jetbrains.kotlin.serialization.ProtoBuf.Annotation> getAnnotationList() {
return annotation_;
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 2;</code>
*/
public java.util.List<? extends org.jetbrains.kotlin.serialization.ProtoBuf.AnnotationOrBuilder>
getAnnotationOrBuilderList() {
return annotation_;
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 2;</code>
*/
public int getAnnotationCount() {
return annotation_.size();
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 2;</code>
*/
public org.jetbrains.kotlin.serialization.ProtoBuf.Annotation getAnnotation(int index) {
return annotation_.get(index);
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 2;</code>
*/
public org.jetbrains.kotlin.serialization.ProtoBuf.AnnotationOrBuilder getAnnotationOrBuilder(
int index) {
return annotation_.get(index);
}
private void initFields() {
id_ = 0;
annotation_ = java.util.Collections.emptyList();
}
private byte memoizedIsInitialized = -1;
public final boolean isInitialized() {
byte isInitialized = memoizedIsInitialized;
if (isInitialized == 1) return true;
if (isInitialized == 0) return false;
if (!hasId()) {
memoizedIsInitialized = 0;
return false;
}
for (int i = 0; i < getAnnotationCount(); i++) {
if (!getAnnotation(i).isInitialized()) {
memoizedIsInitialized = 0;
return false;
}
}
memoizedIsInitialized = 1;
return true;
}
public void writeTo(org.jetbrains.kotlin.protobuf.CodedOutputStream output)
throws java.io.IOException {
getSerializedSize();
if (((bitField0_ & 0x00000001) == 0x00000001)) {
output.writeInt32(1, id_);
}
for (int i = 0; i < annotation_.size(); i++) {
output.writeMessage(2, annotation_.get(i));
}
output.writeRawBytes(unknownFields);
}
private int memoizedSerializedSize = -1;
public int getSerializedSize() {
int size = memoizedSerializedSize;
if (size != -1) return size;
size = 0;
if (((bitField0_ & 0x00000001) == 0x00000001)) {
size += org.jetbrains.kotlin.protobuf.CodedOutputStream
.computeInt32Size(1, id_);
}
for (int i = 0; i < annotation_.size(); i++) {
size += org.jetbrains.kotlin.protobuf.CodedOutputStream
.computeMessageSize(2, annotation_.get(i));
}
size += unknownFields.size();
memoizedSerializedSize = size;
return size;
}
private static final long serialVersionUID = 0L;
@java.lang.Override
protected java.lang.Object writeReplace()
throws java.io.ObjectStreamException {
return super.writeReplace();
}
public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.File parseFrom(
org.jetbrains.kotlin.protobuf.ByteString data)
throws org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.File parseFrom(
org.jetbrains.kotlin.protobuf.ByteString data,
org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry)
throws org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.File parseFrom(byte[] data)
throws org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.File parseFrom(
byte[] data,
org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry)
throws org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.File parseFrom(java.io.InputStream input)
throws java.io.IOException {
return PARSER.parseFrom(input);
}
public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.File parseFrom(
java.io.InputStream input,
org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return PARSER.parseFrom(input, extensionRegistry);
}
public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.File parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return PARSER.parseDelimitedFrom(input);
}
public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.File parseDelimitedFrom(
java.io.InputStream input,
org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return PARSER.parseDelimitedFrom(input, extensionRegistry);
}
public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.File parseFrom(
org.jetbrains.kotlin.protobuf.CodedInputStream input)
throws java.io.IOException {
return PARSER.parseFrom(input);
}
public static org.jetbrains.kotlin.serialization.js.JsProtoBuf.File parseFrom(
org.jetbrains.kotlin.protobuf.CodedInputStream input,
org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return PARSER.parseFrom(input, extensionRegistry);
}
public static Builder newBuilder() { return Builder.create(); }
public Builder newBuilderForType() { return newBuilder(); }
public static Builder newBuilder(org.jetbrains.kotlin.serialization.js.JsProtoBuf.File prototype) {
return newBuilder().mergeFrom(prototype);
}
public Builder toBuilder() { return newBuilder(this); }
/**
* Protobuf type {@code org.jetbrains.kotlin.serialization.js.File}
*/
public static final class Builder extends
org.jetbrains.kotlin.protobuf.GeneratedMessageLite.Builder<
org.jetbrains.kotlin.serialization.js.JsProtoBuf.File, Builder>
implements
// @@protoc_insertion_point(builder_implements:org.jetbrains.kotlin.serialization.js.File)
org.jetbrains.kotlin.serialization.js.JsProtoBuf.FileOrBuilder {
// Construct using org.jetbrains.kotlin.serialization.js.JsProtoBuf.File.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
private void maybeForceBuilderInitialization() {
}
private static Builder create() {
return new Builder();
}
public Builder clear() {
super.clear();
id_ = 0;
bitField0_ = (bitField0_ & ~0x00000001);
annotation_ = java.util.Collections.emptyList();
bitField0_ = (bitField0_ & ~0x00000002);
return this;
}
public Builder clone() {
return create().mergeFrom(buildPartial());
}
public org.jetbrains.kotlin.serialization.js.JsProtoBuf.File getDefaultInstanceForType() {
return org.jetbrains.kotlin.serialization.js.JsProtoBuf.File.getDefaultInstance();
}
public org.jetbrains.kotlin.serialization.js.JsProtoBuf.File build() {
org.jetbrains.kotlin.serialization.js.JsProtoBuf.File result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
return result;
}
public org.jetbrains.kotlin.serialization.js.JsProtoBuf.File buildPartial() {
org.jetbrains.kotlin.serialization.js.JsProtoBuf.File result = new org.jetbrains.kotlin.serialization.js.JsProtoBuf.File(this);
int from_bitField0_ = bitField0_;
int to_bitField0_ = 0;
if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
to_bitField0_ |= 0x00000001;
}
result.id_ = id_;
if (((bitField0_ & 0x00000002) == 0x00000002)) {
annotation_ = java.util.Collections.unmodifiableList(annotation_);
bitField0_ = (bitField0_ & ~0x00000002);
}
result.annotation_ = annotation_;
result.bitField0_ = to_bitField0_;
return result;
}
public Builder mergeFrom(org.jetbrains.kotlin.serialization.js.JsProtoBuf.File other) {
if (other == org.jetbrains.kotlin.serialization.js.JsProtoBuf.File.getDefaultInstance()) return this;
if (other.hasId()) {
setId(other.getId());
}
if (!other.annotation_.isEmpty()) {
if (annotation_.isEmpty()) {
annotation_ = other.annotation_;
bitField0_ = (bitField0_ & ~0x00000002);
} else {
ensureAnnotationIsMutable();
annotation_.addAll(other.annotation_);
}
}
setUnknownFields(
getUnknownFields().concat(other.unknownFields));
return this;
}
public final boolean isInitialized() {
if (!hasId()) {
return false;
}
for (int i = 0; i < getAnnotationCount(); i++) {
if (!getAnnotation(i).isInitialized()) {
return false;
}
}
return true;
}
public Builder mergeFrom(
org.jetbrains.kotlin.protobuf.CodedInputStream input,
org.jetbrains.kotlin.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
org.jetbrains.kotlin.serialization.js.JsProtoBuf.File parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) {
parsedMessage = (org.jetbrains.kotlin.serialization.js.JsProtoBuf.File) e.getUnfinishedMessage();
throw e;
} finally {
if (parsedMessage != null) {
mergeFrom(parsedMessage);
}
}
return this;
}
private int bitField0_;
private int id_ ;
/**
* <code>required int32 id = 1;</code>
*/
public boolean hasId() {
return ((bitField0_ & 0x00000001) == 0x00000001);
}
/**
* <code>required int32 id = 1;</code>
*/
public int getId() {
return id_;
}
/**
* <code>required int32 id = 1;</code>
*/
public Builder setId(int value) {
bitField0_ |= 0x00000001;
id_ = value;
return this;
}
/**
* <code>required int32 id = 1;</code>
*/
public Builder clearId() {
bitField0_ = (bitField0_ & ~0x00000001);
id_ = 0;
return this;
}
private java.util.List<org.jetbrains.kotlin.serialization.ProtoBuf.Annotation> annotation_ =
java.util.Collections.emptyList();
private void ensureAnnotationIsMutable() {
if (!((bitField0_ & 0x00000002) == 0x00000002)) {
annotation_ = new java.util.ArrayList<org.jetbrains.kotlin.serialization.ProtoBuf.Annotation>(annotation_);
bitField0_ |= 0x00000002;
}
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 2;</code>
*/
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 = 2;</code>
*/
public int getAnnotationCount() {
return annotation_.size();
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 2;</code>
*/
public org.jetbrains.kotlin.serialization.ProtoBuf.Annotation getAnnotation(int index) {
return annotation_.get(index);
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 2;</code>
*/
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 = 2;</code>
*/
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 = 2;</code>
*/
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 = 2;</code>
*/
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 = 2;</code>
*/
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 = 2;</code>
*/
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 = 2;</code>
*/
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 = 2;</code>
*/
public Builder clearAnnotation() {
annotation_ = java.util.Collections.emptyList();
bitField0_ = (bitField0_ & ~0x00000002);
return this;
}
/**
* <code>repeated .org.jetbrains.kotlin.serialization.Annotation annotation = 2;</code>
*/
public Builder removeAnnotation(int index) {
ensureAnnotationIsMutable();
annotation_.remove(index);
return this;
}
// @@protoc_insertion_point(builder_scope:org.jetbrains.kotlin.serialization.js.File)
}
static {
defaultInstance = new File(true);
defaultInstance.initFields();
}
// @@protoc_insertion_point(class_scope:org.jetbrains.kotlin.serialization.js.File)
}
public interface ClassesOrBuilder extends
// @@protoc_insertion_point(interface_extends:org.jetbrains.kotlin.serialization.js.Classes)
org.jetbrains.kotlin.protobuf.MessageLiteOrBuilder {
@@ -1890,6 +2475,22 @@ public final class JsProtoBuf {
org.jetbrains.kotlin.protobuf.WireFormat.FieldType.MESSAGE,
false,
org.jetbrains.kotlin.serialization.ProtoBuf.Annotation.class);
public static final int CLASS_CONTAINING_FILE_ID_FIELD_NUMBER = 135;
/**
* <code>extend .org.jetbrains.kotlin.serialization.Class { ... }</code>
*/
public static final
org.jetbrains.kotlin.protobuf.GeneratedMessageLite.GeneratedExtension<
org.jetbrains.kotlin.serialization.ProtoBuf.Class,
java.lang.Integer> classContainingFileId = org.jetbrains.kotlin.protobuf.GeneratedMessageLite
.newSingularGeneratedExtension(
org.jetbrains.kotlin.serialization.ProtoBuf.Class.getDefaultInstance(),
0,
null,
null,
135,
org.jetbrains.kotlin.protobuf.WireFormat.FieldType.INT32,
java.lang.Integer.class);
public static final int CONSTRUCTOR_ANNOTATION_FIELD_NUMBER = 130;
/**
* <code>extend .org.jetbrains.kotlin.serialization.Constructor { ... }</code>
@@ -1922,6 +2523,22 @@ public final class JsProtoBuf {
org.jetbrains.kotlin.protobuf.WireFormat.FieldType.MESSAGE,
false,
org.jetbrains.kotlin.serialization.ProtoBuf.Annotation.class);
public static final int FUNCTION_CONTAINING_FILE_ID_FIELD_NUMBER = 135;
/**
* <code>extend .org.jetbrains.kotlin.serialization.Function { ... }</code>
*/
public static final
org.jetbrains.kotlin.protobuf.GeneratedMessageLite.GeneratedExtension<
org.jetbrains.kotlin.serialization.ProtoBuf.Function,
java.lang.Integer> functionContainingFileId = org.jetbrains.kotlin.protobuf.GeneratedMessageLite
.newSingularGeneratedExtension(
org.jetbrains.kotlin.serialization.ProtoBuf.Function.getDefaultInstance(),
0,
null,
null,
135,
org.jetbrains.kotlin.protobuf.WireFormat.FieldType.INT32,
java.lang.Integer.class);
public static final int PROPERTY_ANNOTATION_FIELD_NUMBER = 130;
/**
* <code>extend .org.jetbrains.kotlin.serialization.Property { ... }</code>
@@ -1954,6 +2571,22 @@ public final class JsProtoBuf {
131,
org.jetbrains.kotlin.protobuf.WireFormat.FieldType.MESSAGE,
org.jetbrains.kotlin.serialization.ProtoBuf.Annotation.Argument.Value.class);
public static final int PROPERTY_CONTAINING_FILE_ID_FIELD_NUMBER = 135;
/**
* <code>extend .org.jetbrains.kotlin.serialization.Property { ... }</code>
*/
public static final
org.jetbrains.kotlin.protobuf.GeneratedMessageLite.GeneratedExtension<
org.jetbrains.kotlin.serialization.ProtoBuf.Property,
java.lang.Integer> propertyContainingFileId = org.jetbrains.kotlin.protobuf.GeneratedMessageLite
.newSingularGeneratedExtension(
org.jetbrains.kotlin.serialization.ProtoBuf.Property.getDefaultInstance(),
0,
null,
null,
135,
org.jetbrains.kotlin.protobuf.WireFormat.FieldType.INT32,
java.lang.Integer.class);
public static final int ENUM_ENTRY_ANNOTATION_FIELD_NUMBER = 130;
/**
* <code>extend .org.jetbrains.kotlin.serialization.EnumEntry { ... }</code>
@@ -0,0 +1,28 @@
/*
* Copyright 2010-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.serialization.js
import org.jetbrains.kotlin.psi.KtFile
class KotlinFileRegistry {
private val fileIdsImpl = mutableMapOf<KtFile, Int>()
fun lookup(file: KtFile) = fileIdsImpl.getOrPut(file) { fileIdsImpl.size }
val fileIds: Map<KtFile, Int>
get() = fileIdsImpl
}
@@ -16,13 +16,22 @@
package org.jetbrains.kotlin.serialization.js
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.protobuf.CodedInputStream
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.deserialization.AnnotationDeserializer
import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragment
import org.jetbrains.kotlin.serialization.deserialization.NameResolverImpl
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedSimpleFunctionDescriptor
import org.jetbrains.kotlin.storage.StorageManager
import java.io.InputStream
@@ -37,6 +46,20 @@ class KotlinJavascriptPackageFragment(
NameResolverImpl.read(stream)
}
private val fileMap: Map<Int, FileHolder> by lazy {
loadResource(KotlinJavascriptSerializedResourcePaths.getFileListFilePath(fqName))?.use { rawInput ->
val input = CodedInputStream.newInstance(rawInput)
val count = input.readInt32()
val result = mutableListOf<JsProtoBuf.File>()
(1..count).forEach { result += JsProtoBuf.File.parseFrom(input) }
result.map { it.id to FileHolder(it.annotationList) }.toMap()
}.orEmpty()
}
private val annotationDeserializer: AnnotationDeserializer by lazy {
AnnotationDeserializer(module, components.notFoundClasses)
}
override val classDataFinder = KotlinJavascriptClassDataFinder(nameResolver, loadResource)
override fun computeMemberScope(): DeserializedPackageMemberScope =
@@ -56,4 +79,24 @@ class KotlinJavascriptPackageFragment(
private fun loadResourceSure(path: String): InputStream =
loadResource(path) ?: throw IllegalStateException("Resource not found in classpath: $path")
fun getContainingFileAnnotations(descriptor: DeclarationDescriptor): List<AnnotationDescriptor> {
if (DescriptorUtils.getParentOfType(descriptor, PackageFragmentDescriptor::class.java) != this) {
throw IllegalArgumentException("Provided descriptor $descriptor does not belong to this package $this")
}
val fileId = when (descriptor) {
is DeserializedClassDescriptor -> descriptor.classProto.getExtension(JsProtoBuf.classContainingFileId)
is DeserializedSimpleFunctionDescriptor -> descriptor.proto.getExtension(JsProtoBuf.functionContainingFileId)
is DeserializedPropertyDescriptor -> descriptor.proto.getExtension(JsProtoBuf.propertyContainingFileId)
else -> null
}
return fileId?.let { fileMap[it] }?.annotations.orEmpty()
}
private inner class FileHolder(val annotationsProto: List<ProtoBuf.Annotation>) {
val annotations: List<AnnotationDescriptor> by lazy {
annotationsProto.map { annotationDeserializer.deserializeAnnotation(it, nameResolver) }
}
}
}
@@ -19,10 +19,13 @@ package org.jetbrains.kotlin.serialization.js
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.protobuf.ByteString
import org.jetbrains.kotlin.protobuf.CodedOutputStream
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.classId
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.StringTableImpl
@@ -51,7 +54,7 @@ object KotlinJavascriptSerializationUtil {
}
private val STRING_TABLE_DEFAULT_BYTES = run {
val serializer = DescriptorSerializer.createTopLevel(KotlinJavascriptSerializerExtension())
val serializer = DescriptorSerializer.createTopLevel(KotlinJavascriptSerializerExtension(KotlinFileRegistry()))
val stream = ByteArrayOutputStream()
serializer.stringTable.serializeTo(stream)
stream.toByteArray()
@@ -75,8 +78,7 @@ object KotlinJavascriptSerializationUtil {
val packageFqNames = getPackages(contentMap).map(::FqName).toSet()
if (packageFqNames.isEmpty()) return null
return createKotlinJavascriptPackageFragmentProvider(storageManager, moduleDescriptor, packageFqNames, configuration) {
path ->
return createKotlinJavascriptPackageFragmentProvider(storageManager, moduleDescriptor, packageFqNames, configuration) { path ->
if (!contentMap.containsKey(path)) {
when {
isPackageMetadataFile(path) ->
@@ -118,16 +120,18 @@ object KotlinJavascriptSerializationUtil {
return byteStream.toByteArray()
}
fun metadataAsString(jsDescriptor: JsModuleDescriptor<ModuleDescriptor>): String =
KotlinJavascriptMetadataUtils.formatMetadataAsString(jsDescriptor.name, jsDescriptor.toBinaryMetadata())
fun metadataAsString(bindingContext: BindingContext, jsDescriptor: JsModuleDescriptor<ModuleDescriptor>): String =
KotlinJavascriptMetadataUtils.formatMetadataAsString(jsDescriptor.name, jsDescriptor.toBinaryMetadata(bindingContext))
fun serializePackage(module: ModuleDescriptor, fqName: FqName, writeFun: (String, ByteArray) -> Unit) {
fun serializePackage(bindingContext: BindingContext, module: ModuleDescriptor, fqName: FqName,
writeFun: (String, ByteArray) -> Unit) {
val packageView = module.getPackage(fqName)
// TODO: ModuleDescriptor should be able to return the package only with the contents of that module, without dependencies
val skip: (DeclarationDescriptor) -> Boolean = { DescriptorUtils.getContainingModule(it) != module }
val serializerExtension = KotlinJavascriptSerializerExtension()
val fileRegistry = KotlinFileRegistry()
val serializerExtension = KotlinJavascriptSerializerExtension(fileRegistry)
val serializer = DescriptorSerializer.createTopLevel(serializerExtension)
val classifierDescriptors = DescriptorSerializer.sort(packageView.memberScope.getContributedDescriptors(
@@ -141,6 +145,9 @@ object KotlinJavascriptSerializationUtil {
}
}, skip)
writeFun(KotlinJavascriptSerializedResourcePaths.getFileListFilePath(fqName),
serializeFiles(fileRegistry, bindingContext, AnnotationSerializer(serializer.stringTable)))
val packageStream = ByteArrayOutputStream()
val fragments = packageView.fragments
val members = fragments
@@ -190,15 +197,34 @@ object KotlinJavascriptSerializationUtil {
}
}
private fun serializeFiles(fileRegistry: KotlinFileRegistry, bindingContext: BindingContext,
serializer: AnnotationSerializer): ByteArray {
val filesProto = JsProtoBuf.Files.newBuilder()
for ((file, id) in fileRegistry.fileIds) {
val fileProto = JsProtoBuf.File.newBuilder()
fileProto.id = id
for (annotationPsi in file.annotationEntries) {
val annotation = bindingContext[BindingContext.ANNOTATION, annotationPsi]!!
fileProto.addAnnotation(serializer.serializeAnnotation(annotation))
}
filesProto.addFile(fileProto)
}
return ByteArrayOutputStream().use { out ->
filesProto.build().writeTo(out)
out
}.toByteArray()
}
private fun getFileName(classDescriptor: ClassDescriptor): String {
return KotlinJavascriptSerializedResourcePaths.getClassMetadataPath(classDescriptor.classId!!)
}
fun toContentMap(module: ModuleDescriptor): Map<String, ByteArray> {
fun toContentMap(bindingContext: BindingContext, module: ModuleDescriptor): Map<String, ByteArray> {
val contentMap = hashMapOf<String, ByteArray>()
getPackagesFqNames(module).forEach {
serializePackage(module, it) {
serializePackage(bindingContext, module, it) {
fileName, bytes -> contentMap[fileName] = bytes
}
}
@@ -243,7 +269,8 @@ object KotlinJavascriptSerializationUtil {
return result.map { it.substringAfter('/').replace('/', '.') }.toSet()
}
private fun JsModuleDescriptor<ModuleDescriptor>.toBinaryMetadata() = contentMapToByteArray(toContentMap(data), kind, imported)
private fun JsModuleDescriptor<ModuleDescriptor>.toBinaryMetadata(bindingContext: BindingContext) =
contentMapToByteArray(toContentMap(bindingContext, data), kind, imported)
}
private fun ByteArray.readAsContentMap(name: String): JsModuleDescriptor<Map<String, ByteArray>> {
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.name.Name
object KotlinJavascriptSerializedResourcePaths {
private val CLASSES_FILE_EXTENSION = "kotlin_classes"
private val STRING_TABLE_FILE_EXTENSION = "kotlin_string_table"
private val FILE_LIST_FILE_EXTENSION = "kotlin_file_table"
fun getClassesInPackageFilePath(fqName: FqName): String =
fqName.toPath().withSepIfNotEmpty() + shortName(fqName) + "." + CLASSES_FILE_EXTENSION
@@ -39,6 +40,8 @@ object KotlinJavascriptSerializedResourcePaths {
fun getStringTableFilePath(fqName: FqName): String =
fqName.toPath().withSepIfNotEmpty() + shortName(fqName) + "." + STRING_TABLE_FILE_EXTENSION
fun getFileListFilePath(fqName: FqName) = fqName.toPath().withSepIfNotEmpty() + shortName(fqName) + "." + FILE_LIST_FILE_EXTENSION
private fun FqName.toPath() = this.asString().replace('.', '/')
private fun String.withSepIfNotEmpty() = if (this.isEmpty()) this else this + "/"
@@ -16,16 +16,55 @@
package org.jetbrains.kotlin.serialization.js
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.protobuf.ExtensionRegistryLite
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.source.PsiSourceFile
import org.jetbrains.kotlin.serialization.KotlinSerializerExtensionBase
import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.SerializerExtensionProtocol
import org.jetbrains.kotlin.types.FlexibleType
class KotlinJavascriptSerializerExtension : KotlinSerializerExtensionBase(JsSerializerProtocol) {
class KotlinJavascriptSerializerExtension(private val fileRegistry: KotlinFileRegistry) :
KotlinSerializerExtensionBase(JsSerializerProtocol) {
override fun serializeFlexibleType(flexibleType: FlexibleType, lowerProto: ProtoBuf.Type.Builder, upperProto: ProtoBuf.Type.Builder) {
lowerProto.flexibleTypeCapabilitiesId = stringTable.getStringIndex(DynamicTypeDeserializer.id)
}
override fun serializeClass(descriptor: ClassDescriptor, proto: ProtoBuf.Class.Builder) {
val id = getFileId(descriptor)
if (id != null) {
proto.setExtension(JsProtoBuf.classContainingFileId, id)
}
super.serializeClass(descriptor, proto)
}
override fun serializeProperty(descriptor: PropertyDescriptor, proto: ProtoBuf.Property.Builder) {
val id = getFileId(descriptor)
if (id != null) {
proto.setExtension(JsProtoBuf.propertyContainingFileId, id)
}
super.serializeProperty(descriptor, proto)
}
override fun serializeFunction(descriptor: FunctionDescriptor, proto: ProtoBuf.Function.Builder) {
val id = getFileId(descriptor)
if (id != null) {
proto.setExtension(JsProtoBuf.functionContainingFileId, id)
}
super.serializeFunction(descriptor, proto)
}
private fun getFileId(descriptor: DeclarationDescriptor): Int? {
if (!DescriptorUtils.isTopLevelDeclaration(descriptor) || descriptor !is DeclarationDescriptorWithSource) return null
val file = descriptor.source.containingFile
if (file !is PsiSourceFile) return null
val psiFile = file.psiFile
return (psiFile as? KtFile)?.let { fileRegistry.lookup(it) }
}
}
object JsSerializerProtocol : SerializerExtensionProtocol(