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
@@ -173,6 +173,10 @@ message Class {
repeated int32 nested_class_name = 7 [packed = true, (name_id_in_table) = true];
repeated Constructor constructor = 8;
repeated Function function = 9;
repeated Property property = 10;
repeated Callable member = 11;
repeated int32 enum_entry = 12 [packed = true, (name_id_in_table) = true];
@@ -194,6 +198,84 @@ message Class {
message Package {
repeated Callable member = 1;
repeated Constructor constructor = 2;
repeated Function function = 3;
repeated Property property = 4;
extensions 100 to 199;
}
message Constructor {
/*
hasAnnotations
Visibility
isSecondary
*/
optional int32 flags = 1;
repeated ValueParameter value_parameter = 2;
extensions 100 to 199;
}
message Function {
/*
hasAnnotations
Visibility
Modality
MemberKind
isOperator
isInfix
*/
optional int32 flags = 1;
required int32 name = 2 [(name_id_in_table) = true];
required Type return_type = 3;
repeated TypeParameter type_parameter = 4;
optional Type receiver_type = 5;
repeated ValueParameter value_parameter = 6;
extensions 100 to 199;
}
message Property {
/*
hasAnnotations
Visibility
Modality
MemberKind
isVar
hasGetter
hasSetter
isConst
lateinit
hasConstant
*/
optional int32 flags = 1;
required int32 name = 2 [(name_id_in_table) = true];
required Type return_type = 3;
repeated TypeParameter type_parameter = 4;
optional Type receiver_type = 5;
optional ValueParameter setter_value_parameter = 6;
/*
hasAnnotations
Visibility
Modality
isNotDefault
*/
optional int32 getter_flags = 7 /* absent => same as property */;
optional int32 setter_flags = 8 /* absent => same as property */;
extensions 100 to 199;
}
@@ -26,34 +26,47 @@ public class Flags {
// Common
public static final FlagField<Boolean> HAS_ANNOTATIONS = FlagField.booleanFirst();
public static final FlagField<ProtoBuf.Visibility> VISIBILITY = FlagField.after(HAS_ANNOTATIONS, ProtoBuf.Visibility.values());
public static final FlagField<ProtoBuf.Modality> MODALITY = FlagField.after(VISIBILITY, ProtoBuf.Modality.values());
// Class
public static final FlagField<ProtoBuf.Class.Kind> CLASS_KIND = FlagField.after(MODALITY, ProtoBuf.Class.Kind.values());
public static final FlagField<Boolean> INNER = FlagField.booleanAfter(CLASS_KIND);
// Callables
public static final FlagField<ProtoBuf.CallableKind> CALLABLE_KIND = FlagField.after(MODALITY, ProtoBuf.CallableKind.values());
public static final FlagField<ProtoBuf.MemberKind> MEMBER_KIND = FlagField.after(CALLABLE_KIND, ProtoBuf.MemberKind.values());
public static final FlagField<Boolean> HAS_GETTER = FlagField.booleanAfter(MEMBER_KIND);
public static final FlagField<Boolean> HAS_SETTER = FlagField.booleanAfter(HAS_GETTER);
public static final FlagField<Boolean> HAS_CONSTANT = FlagField.booleanAfter(HAS_SETTER);
public static final FlagField<Boolean> IS_CONST = FlagField.booleanAfter(HAS_CONSTANT);
// Constructors
public static final FlagField<Boolean> LATE_INIT = FlagField.booleanAfter(IS_CONST);
public static final FlagField<Boolean> IS_SECONDARY = FlagField.booleanAfter(VISIBILITY);
public static final FlagField<Boolean> IS_OPERATOR = FlagField.booleanAfter(LATE_INIT);
// Functions
public static final FlagField<Boolean> IS_OPERATOR = FlagField.booleanAfter(MEMBER_KIND);
public static final FlagField<Boolean> IS_INFIX = FlagField.booleanAfter(IS_OPERATOR);
// Properties
public static final FlagField<Boolean> IS_VAR = FlagField.booleanAfter(MEMBER_KIND);
public static final FlagField<Boolean> HAS_GETTER = FlagField.booleanAfter(IS_VAR);
public static final FlagField<Boolean> HAS_SETTER = FlagField.booleanAfter(HAS_GETTER);
public static final FlagField<Boolean> IS_CONST = FlagField.booleanAfter(HAS_SETTER);
public static final FlagField<Boolean> LATE_INIT = FlagField.booleanAfter(IS_CONST);
public static final FlagField<Boolean> HAS_CONSTANT = FlagField.booleanAfter(LATE_INIT);
// Old callables. TODO: delete
public static final FlagField<Boolean> OLD_HAS_GETTER = FlagField.booleanAfter(MEMBER_KIND);
public static final FlagField<Boolean> OLD_HAS_SETTER = FlagField.booleanAfter(OLD_HAS_GETTER);
public static final FlagField<Boolean> OLD_HAS_CONSTANT = FlagField.booleanAfter(OLD_HAS_SETTER);
public static final FlagField<Boolean> OLD_IS_CONST = FlagField.booleanAfter(OLD_HAS_CONSTANT);
public static final FlagField<Boolean> OLD_LATE_INIT = FlagField.booleanAfter(OLD_IS_CONST);
public static final FlagField<Boolean> OLD_IS_OPERATOR = FlagField.booleanAfter(OLD_LATE_INIT);
public static final FlagField<Boolean> OLD_IS_INFIX = FlagField.booleanAfter(OLD_IS_OPERATOR);
// Parameters
public static final FlagField<Boolean> DECLARES_DEFAULT_VALUE = FlagField.booleanAfter(HAS_ANNOTATIONS);
@@ -129,14 +142,67 @@ public class Flags {
| VISIBILITY.toFlags(visibility(visibility))
| MEMBER_KIND.toFlags(memberKind(memberKind))
| CALLABLE_KIND.toFlags(callableKind)
| HAS_GETTER.toFlags(hasGetter)
| HAS_SETTER.toFlags(hasSetter)
| HAS_CONSTANT.toFlags(hasConstant)
| LATE_INIT.toFlags(lateInit)
| IS_CONST.toFlags(isConst)
| OLD_HAS_GETTER.toFlags(hasGetter)
| OLD_HAS_SETTER.toFlags(hasSetter)
| OLD_HAS_CONSTANT.toFlags(hasConstant)
| OLD_LATE_INIT.toFlags(lateInit)
| OLD_IS_CONST.toFlags(isConst)
| OLD_IS_OPERATOR.toFlags(isOperator)
| OLD_IS_INFIX.toFlags(isInfix)
;
}
public static int getConstructorFlags(
boolean hasAnnotations,
@NotNull Visibility visibility,
boolean isSecondary
) {
return HAS_ANNOTATIONS.toFlags(hasAnnotations)
| VISIBILITY.toFlags(visibility(visibility))
| IS_SECONDARY.toFlags(isSecondary)
;
}
public static int getFunctionFlags(
boolean hasAnnotations,
@NotNull Visibility visibility,
@NotNull Modality modality,
@NotNull CallableMemberDescriptor.Kind memberKind,
boolean isOperator,
boolean isInfix
) {
return HAS_ANNOTATIONS.toFlags(hasAnnotations)
| VISIBILITY.toFlags(visibility(visibility))
| MODALITY.toFlags(modality(modality))
| MEMBER_KIND.toFlags(memberKind(memberKind))
| IS_OPERATOR.toFlags(isOperator)
| IS_INFIX.toFlags(isInfix)
;
;
}
public static int getPropertyFlags(
boolean hasAnnotations,
@NotNull Visibility visibility,
@NotNull Modality modality,
@NotNull CallableMemberDescriptor.Kind memberKind,
boolean isVar,
boolean hasGetter,
boolean hasSetter,
boolean hasConstant,
boolean isConst,
boolean lateInit
) {
return HAS_ANNOTATIONS.toFlags(hasAnnotations)
| VISIBILITY.toFlags(visibility(visibility))
| MODALITY.toFlags(modality(modality))
| MEMBER_KIND.toFlags(memberKind(memberKind))
| IS_VAR.toFlags(isVar)
| HAS_GETTER.toFlags(hasGetter)
| HAS_SETTER.toFlags(hasSetter)
| IS_CONST.toFlags(isConst)
| LATE_INIT.toFlags(lateInit)
| HAS_CONSTANT.toFlags(hasConstant)
;
}
public static int getAccessorFlags(
File diff suppressed because it is too large Load Diff
@@ -56,13 +56,13 @@ public class MemberDeserializer(private val c: DeserializationContext) {
Deserialization.memberKind(Flags.MEMBER_KIND.get(flags)),
proto,
c.nameResolver,
Flags.LATE_INIT.get(flags),
Flags.IS_CONST.get(flags)
Flags.OLD_LATE_INIT.get(flags),
Flags.OLD_IS_CONST.get(flags)
)
val local = c.childContext(property, proto.getTypeParameterList())
val hasGetter = Flags.HAS_GETTER.get(flags)
val hasGetter = Flags.OLD_HAS_GETTER.get(flags)
val receiverAnnotations = if (hasGetter)
getReceiverParameterAnnotations(proto, AnnotatedCallableKind.PROPERTY_GETTER)
else
@@ -99,7 +99,7 @@ public class MemberDeserializer(private val c: DeserializationContext) {
null
}
val setter = if (Flags.HAS_SETTER.get(flags)) {
val setter = if (Flags.OLD_HAS_SETTER.get(flags)) {
val setterFlags = proto.getSetterFlags()
val isNotDefault = proto.hasSetterFlags() && Flags.IS_NOT_DEFAULT.get(setterFlags)
if (isNotDefault) {
@@ -125,7 +125,7 @@ public class MemberDeserializer(private val c: DeserializationContext) {
null
}
if (Flags.HAS_CONSTANT.get(flags)) {
if (Flags.OLD_HAS_CONSTANT.get(flags)) {
property.setCompileTimeInitializer(
c.storageManager.createNullableLazyValue {
val container = c.containingDeclaration.asProtoContainer()!!
@@ -152,8 +152,8 @@ public class MemberDeserializer(private val c: DeserializationContext) {
local.typeDeserializer.type(proto.returnType),
Deserialization.modality(Flags.MODALITY.get(proto.flags)),
Deserialization.visibility(Flags.VISIBILITY.get(proto.flags)),
Flags.IS_OPERATOR.get(proto.flags),
Flags.IS_INFIX.get(proto.flags)
Flags.OLD_IS_OPERATOR.get(proto.flags),
Flags.OLD_IS_INFIX.get(proto.flags)
)
return function
}