Split ProtoBuf.Callable to three messages: constructor, function, property

Serialize both at the moment, will drop the old one after bootstrap
This commit is contained in:
Alexander Udalov
2015-09-30 16:41:12 +03:00
parent 041af28166
commit ad735cd788
10 changed files with 12155 additions and 191 deletions
@@ -129,6 +129,10 @@ public class DescriptorSerializer {
}
}
for (ConstructorDescriptor descriptor : classDescriptor.getConstructors()) {
builder.addConstructor(constructorProto(descriptor));
}
for (ConstructorDescriptor constructorDescriptor : getSecondaryConstructors(classDescriptor)) {
builder.addSecondaryConstructor(callableProto(constructorDescriptor));
}
@@ -138,6 +142,13 @@ public class DescriptorSerializer {
CallableMemberDescriptor member = (CallableMemberDescriptor) descriptor;
if (member.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) continue;
builder.addMember(callableProto(member));
if (descriptor instanceof PropertyDescriptor) {
builder.addProperty(propertyProto((PropertyDescriptor) descriptor));
}
else if (descriptor instanceof FunctionDescriptor) {
builder.addFunction(functionProto((FunctionDescriptor) descriptor));
}
}
}
@@ -161,6 +172,143 @@ public class DescriptorSerializer {
return builder;
}
@NotNull
public ProtoBuf.Property.Builder propertyProto(@NotNull PropertyDescriptor descriptor) {
ProtoBuf.Property.Builder builder = ProtoBuf.Property.newBuilder();
DescriptorSerializer local = createChildSerializer();
boolean hasGetter = false;
boolean hasSetter = false;
boolean lateInit = descriptor.isLateInit();
boolean isConst = descriptor.isConst();
ConstantValue<?> compileTimeConstant = descriptor.getCompileTimeInitializer();
boolean hasConstant = !(compileTimeConstant == null || compileTimeConstant instanceof NullValue);
boolean hasAnnotations = !descriptor.getAnnotations().getAllAnnotations().isEmpty();
int propertyFlags = Flags.getAccessorFlags(
hasAnnotations,
descriptor.getVisibility(),
descriptor.getModality(),
false
);
PropertyGetterDescriptor getter = descriptor.getGetter();
if (getter != null) {
hasGetter = true;
int accessorFlags = getAccessorFlags(getter);
if (accessorFlags != propertyFlags) {
builder.setGetterFlags(accessorFlags);
}
}
PropertySetterDescriptor setter = descriptor.getSetter();
if (setter != null) {
hasSetter = true;
int accessorFlags = getAccessorFlags(setter);
if (accessorFlags != propertyFlags) {
builder.setSetterFlags(accessorFlags);
}
if (!setter.isDefault()) {
for (ValueParameterDescriptor valueParameterDescriptor : setter.getValueParameters()) {
builder.setSetterValueParameter(local.valueParameter(valueParameterDescriptor));
}
}
}
builder.setFlags(Flags.getPropertyFlags(
hasAnnotations,
descriptor.getVisibility(),
descriptor.getModality(),
descriptor.getKind(),
descriptor.isVar(),
hasGetter,
hasSetter,
hasConstant,
isConst,
lateInit
));
builder.setName(getSimpleNameIndex(descriptor.getName()));
builder.setReturnType(local.type(descriptor.getType()));
for (TypeParameterDescriptor typeParameterDescriptor : descriptor.getTypeParameters()) {
builder.addTypeParameter(local.typeParameter(typeParameterDescriptor));
}
ReceiverParameterDescriptor receiverParameter = descriptor.getExtensionReceiverParameter();
if (receiverParameter != null) {
builder.setReceiverType(local.type(receiverParameter.getType()));
}
extension.serializeProperty(descriptor, builder);
return builder;
}
@NotNull
public ProtoBuf.Function.Builder functionProto(@NotNull FunctionDescriptor descriptor) {
ProtoBuf.Function.Builder builder = ProtoBuf.Function.newBuilder();
DescriptorSerializer local = createChildSerializer();
builder.setFlags(Flags.getFunctionFlags(
hasAnnotations(descriptor),
descriptor.getVisibility(),
descriptor.getModality(),
descriptor.getKind(),
descriptor.isOperator(),
descriptor.isInfix()
));
builder.setName(getSimpleNameIndex(descriptor.getName()));
//noinspection ConstantConditions
builder.setReturnType(local.type(descriptor.getReturnType()));
for (TypeParameterDescriptor typeParameterDescriptor : descriptor.getTypeParameters()) {
builder.addTypeParameter(local.typeParameter(typeParameterDescriptor));
}
ReceiverParameterDescriptor receiverParameter = descriptor.getExtensionReceiverParameter();
if (receiverParameter != null) {
builder.setReceiverType(local.type(receiverParameter.getType()));
}
for (ValueParameterDescriptor valueParameterDescriptor : descriptor.getValueParameters()) {
builder.addValueParameter(local.valueParameter(valueParameterDescriptor));
}
extension.serializeFunction(descriptor, builder);
return builder;
}
@NotNull
public ProtoBuf.Constructor.Builder constructorProto(@NotNull ConstructorDescriptor descriptor) {
ProtoBuf.Constructor.Builder builder = ProtoBuf.Constructor.newBuilder();
DescriptorSerializer local = createChildSerializer();
builder.setFlags(Flags.getConstructorFlags(
hasAnnotations(descriptor),
descriptor.getVisibility(),
!descriptor.isPrimary()
));
for (ValueParameterDescriptor valueParameterDescriptor : descriptor.getValueParameters()) {
builder.addValueParameter(local.valueParameter(valueParameterDescriptor));
}
extension.serializeConstructor(descriptor, builder);
return builder;
}
@NotNull
public ProtoBuf.Callable.Builder callableProto(@NotNull CallableMemberDescriptor descriptor) {
ProtoBuf.Callable.Builder builder = ProtoBuf.Callable.newBuilder();
@@ -17,10 +17,7 @@
package org.jetbrains.kotlin.serialization;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor;
import org.jetbrains.kotlin.descriptors.ClassDescriptor;
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor;
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.types.JetType;
import java.util.Collection;
@@ -35,6 +32,15 @@ public abstract class SerializerExtension {
public void serializePackage(@NotNull Collection<PackageFragmentDescriptor> packageFragments, @NotNull ProtoBuf.Package.Builder proto) {
}
public void serializeConstructor(@NotNull ConstructorDescriptor descriptor, @NotNull ProtoBuf.Constructor.Builder proto) {
}
public void serializeFunction(@NotNull FunctionDescriptor descriptor, @NotNull ProtoBuf.Function.Builder proto) {
}
public void serializeProperty(@NotNull PropertyDescriptor descriptor, @NotNull ProtoBuf.Property.Builder proto) {
}
public void serializeCallable(@NotNull CallableMemberDescriptor callable, @NotNull ProtoBuf.Callable.Builder proto) {
}