Serialize value parameter indices on JVM

This will help to load annotations on value parameters
This commit is contained in:
Alexander Udalov
2013-10-21 19:43:30 +04:00
parent 011e2675ab
commit 4105455179
9 changed files with 87 additions and 10 deletions
@@ -152,6 +152,7 @@ public class FunctionCodegen extends ParentCodegenAwareImpl {
if (kind == JvmMethodParameterKind.VALUE) {
ValueParameterDescriptor parameter = iterator.next();
v.getMemberMap().recordIndexForValueParameter(parameter, i);
AnnotationCodegen.forParameter(i, mv, typeMapper).genAnnotations(parameter);
}
}
@@ -48,6 +48,18 @@ public class JavaSerializerExtension extends SerializerExtension {
saveImplClassName(callable, proto, nameTable);
}
@Override
public void serializeValueParameter(
@NotNull ValueParameterDescriptor descriptor,
@NotNull ProtoBuf.Callable.ValueParameter.Builder proto,
@NotNull NameTable nameTable
) {
Integer index = memberMap.getIndexForValueParameter(descriptor);
if (index != null) {
proto.setExtension(JavaProtoBuf.index, index);
}
}
private void saveSignature(
@NotNull CallableMemberDescriptor callable,
@NotNull ProtoBuf.Callable.Builder proto,
@@ -24,6 +24,7 @@ import org.jetbrains.asm4.commons.Method;
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import java.util.*;
@@ -33,6 +34,7 @@ public final class MemberMap {
private final Map<PropertyDescriptor, Method> syntheticMethodForProperty = new HashMap<PropertyDescriptor, Method>();
private final Map<CallableMemberDescriptor, String> implClassNameForCallable = new HashMap<CallableMemberDescriptor, String>();
private final Set<PropertyDescriptor> staticFieldInOuterClass = new HashSet<PropertyDescriptor>();
private final Map<ValueParameterDescriptor, Integer> indexForValueParameter = new HashMap<ValueParameterDescriptor, Integer>();
@NotNull
public static MemberMap union(@NotNull Collection<MemberMap> maps) {
@@ -57,6 +59,10 @@ public final class MemberMap {
for (PropertyDescriptor property : map.staticFieldInOuterClass) {
result.recordStaticFieldInOuterClass(property);
}
for (Map.Entry<ValueParameterDescriptor, Integer> entry : map.indexForValueParameter.entrySet()) {
result.recordIndexForValueParameter(entry.getKey(), entry.getValue());
}
}
return result;
@@ -87,6 +93,11 @@ public final class MemberMap {
assert added : "Duplicate static field in outer class: " + property;
}
public void recordIndexForValueParameter(@NotNull ValueParameterDescriptor descriptor, int index) {
Integer old = indexForValueParameter.put(descriptor, index);
assert old == null || old == index : "Duplicate index for value parameter: " + descriptor;
}
@Nullable
public Method getMethodOfDescriptor(@NotNull FunctionDescriptor descriptor) {
return methodForFunction.get(descriptor);
@@ -111,11 +122,17 @@ public final class MemberMap {
return staticFieldInOuterClass.contains(property);
}
@Nullable
public Integer getIndexForValueParameter(@NotNull ValueParameterDescriptor descriptor) {
return indexForValueParameter.get(descriptor);
}
@Override
public String toString() {
return "Functions: " + methodForFunction.size() +
", fields: " + fieldForProperty.size() +
", synthetic methods: " + syntheticMethodForProperty.size() +
", impl class names: " + implClassNameForCallable.size();
", impl class names: " + implClassNameForCallable.size() +
", value parameters: " + indexForValueParameter.size();
}
}
@@ -189,6 +189,7 @@ message Callable {
required Type type = 3;
optional Type vararg_element_type = 4;
extensions 100 to 199;
}
repeated ValueParameter value_parameter = 7;
@@ -272,7 +272,8 @@ public class DescriptorSerializer {
return ProtoBuf.Callable.CallableKind.FUN;
}
private ProtoBuf.Callable.ValueParameter.Builder valueParameter(ValueParameterDescriptor descriptor) {
@NotNull
private ProtoBuf.Callable.ValueParameter.Builder valueParameter(@NotNull ValueParameterDescriptor descriptor) {
ProtoBuf.Callable.ValueParameter.Builder builder = ProtoBuf.Callable.ValueParameter.newBuilder();
builder.setFlags(Flags.getValueParameterFlags(hasAnnotations(descriptor), descriptor.declaresDefaultValue()));
@@ -286,6 +287,8 @@ public class DescriptorSerializer {
builder.setVarargElementType(type(varargElementType));
}
extension.serializeValueParameter(descriptor, builder, nameTable);
return builder;
}
@@ -7515,8 +7515,9 @@ public final class ProtoBuf {
// @@protoc_insertion_point(enum_scope:org.jetbrains.jet.descriptors.serialization.Callable.CallableKind)
}
public interface ValueParameterOrBuilder
extends com.google.protobuf.MessageLiteOrBuilder {
public interface ValueParameterOrBuilder extends
com.google.protobuf.GeneratedMessageLite.
ExtendableMessageOrBuilder<ValueParameter> {
// optional int32 flags = 1;
/**
@@ -7574,10 +7575,10 @@ public final class ProtoBuf {
* Protobuf type {@code org.jetbrains.jet.descriptors.serialization.Callable.ValueParameter}
*/
public static final class ValueParameter extends
com.google.protobuf.GeneratedMessageLite
implements ValueParameterOrBuilder {
com.google.protobuf.GeneratedMessageLite.ExtendableMessage<
ValueParameter> implements ValueParameterOrBuilder {
// Use ValueParameter.newBuilder() to construct.
private ValueParameter(com.google.protobuf.GeneratedMessageLite.Builder builder) {
private ValueParameter(com.google.protobuf.GeneratedMessageLite.ExtendableBuilder<org.jetbrains.jet.descriptors.serialization.ProtoBuf.Callable.ValueParameter, ?> builder) {
super(builder);
}
@@ -7781,6 +7782,10 @@ public final class ProtoBuf {
return false;
}
}
if (!extensionsAreInitialized()) {
memoizedIsInitialized = 0;
return false;
}
memoizedIsInitialized = 1;
return true;
}
@@ -7788,6 +7793,9 @@ public final class ProtoBuf {
public void writeTo(com.google.protobuf.CodedOutputStream output)
throws java.io.IOException {
getSerializedSize();
com.google.protobuf.GeneratedMessageLite
.ExtendableMessage<org.jetbrains.jet.descriptors.serialization.ProtoBuf.Callable.ValueParameter>.ExtensionWriter extensionWriter =
newExtensionWriter();
if (((bitField0_ & 0x00000001) == 0x00000001)) {
output.writeInt32(1, flags_);
}
@@ -7800,6 +7808,7 @@ public final class ProtoBuf {
if (((bitField0_ & 0x00000008) == 0x00000008)) {
output.writeMessage(4, varargElementType_);
}
extensionWriter.writeUntil(200, output);
}
private int memoizedSerializedSize = -1;
@@ -7824,6 +7833,7 @@ public final class ProtoBuf {
size += com.google.protobuf.CodedOutputStream
.computeMessageSize(4, varargElementType_);
}
size += extensionsSerializedSize();
memoizedSerializedSize = size;
return size;
}
@@ -7899,9 +7909,8 @@ public final class ProtoBuf {
* Protobuf type {@code org.jetbrains.jet.descriptors.serialization.Callable.ValueParameter}
*/
public static final class Builder extends
com.google.protobuf.GeneratedMessageLite.Builder<
org.jetbrains.jet.descriptors.serialization.ProtoBuf.Callable.ValueParameter, Builder>
implements org.jetbrains.jet.descriptors.serialization.ProtoBuf.Callable.ValueParameterOrBuilder {
com.google.protobuf.GeneratedMessageLite.ExtendableBuilder<
org.jetbrains.jet.descriptors.serialization.ProtoBuf.Callable.ValueParameter, Builder> implements org.jetbrains.jet.descriptors.serialization.ProtoBuf.Callable.ValueParameterOrBuilder {
// Construct using org.jetbrains.jet.descriptors.serialization.ProtoBuf.Callable.ValueParameter.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
@@ -7980,6 +7989,7 @@ public final class ProtoBuf {
if (other.hasVarargElementType()) {
mergeVarargElementType(other.getVarargElementType());
}
this.mergeExtensionFields(other);
return this;
}
@@ -8002,6 +8012,10 @@ public final class ProtoBuf {
return false;
}
}
if (!extensionsAreInitialized()) {
return false;
}
return true;
}
@@ -19,6 +19,7 @@ package org.jetbrains.jet.descriptors.serialization;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
public abstract class SerializerExtension {
public static final SerializerExtension DEFAULT = new SerializerExtension() {};
@@ -33,4 +34,11 @@ public abstract class SerializerExtension {
@NotNull NameTable nameTable
) {
}
public void serializeValueParameter(
@NotNull ValueParameterDescriptor descriptor,
@NotNull ProtoBuf.Callable.ValueParameter.Builder proto,
@NotNull NameTable nameTable
) {
}
}
@@ -81,3 +81,8 @@ extend Callable {
// 2) annotations on properties in traits are written to TImpl classes
optional int32 impl_class_name = 102;
}
extend Callable.ValueParameter {
// Index of the corresponding parameter of this method in JVM (counting receiver parameters, enum constructor synthetic parameters, etc.)
optional int32 index = 100;
}
@@ -10,6 +10,7 @@ public final class JavaProtoBuf {
registry.add(org.jetbrains.jet.descriptors.serialization.JavaProtoBuf.methodSignature);
registry.add(org.jetbrains.jet.descriptors.serialization.JavaProtoBuf.propertySignature);
registry.add(org.jetbrains.jet.descriptors.serialization.JavaProtoBuf.implClassName);
registry.add(org.jetbrains.jet.descriptors.serialization.JavaProtoBuf.index);
}
public interface JavaTypeOrBuilder
extends com.google.protobuf.MessageLiteOrBuilder {
@@ -2840,6 +2841,21 @@ public final class JavaProtoBuf {
null,
102,
com.google.protobuf.WireFormat.FieldType.INT32);
public static final int INDEX_FIELD_NUMBER = 100;
/**
* <code>extend .org.jetbrains.jet.descriptors.serialization.Callable.ValueParameter { ... }</code>
*/
public static final
com.google.protobuf.GeneratedMessageLite.GeneratedExtension<
org.jetbrains.jet.descriptors.serialization.ProtoBuf.Callable.ValueParameter,
java.lang.Integer> index = com.google.protobuf.GeneratedMessageLite
.newSingularGeneratedExtension(
org.jetbrains.jet.descriptors.serialization.ProtoBuf.Callable.ValueParameter.getDefaultInstance(),
0,
null,
null,
100,
com.google.protobuf.WireFormat.FieldType.INT32);
static {
}