159 lines
6.4 KiB
C#
159 lines
6.4 KiB
C#
|
|
using Google.Protobuf.Reflection;
|
|||
|
|
|
|||
|
|
namespace ProtoBuf.Reflection
|
|||
|
|
{
|
|||
|
|
partial class CommonCodeGenerator
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// Represents the union summary of a one-of declaration
|
|||
|
|
/// </summary>
|
|||
|
|
protected class OneOfStub
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// The underlying descriptor
|
|||
|
|
/// </summary>
|
|||
|
|
public OneofDescriptorProto OneOf { get; }
|
|||
|
|
|
|||
|
|
internal OneOfStub(OneofDescriptorProto decl)
|
|||
|
|
{
|
|||
|
|
OneOf = decl;
|
|||
|
|
}
|
|||
|
|
internal int Count32 { get; private set; }
|
|||
|
|
internal int Count64 { get; private set; }
|
|||
|
|
internal int Count128 { get; private set; }
|
|||
|
|
internal int CountRef { get; private set; }
|
|||
|
|
internal int CountTotal => CountRef + Count32 + Count64;
|
|||
|
|
|
|||
|
|
private void AccountFor(FieldDescriptorProto.Type type, string typeName)
|
|||
|
|
{
|
|||
|
|
switch (type)
|
|||
|
|
{
|
|||
|
|
case FieldDescriptorProto.Type.TypeBool:
|
|||
|
|
case FieldDescriptorProto.Type.TypeEnum:
|
|||
|
|
case FieldDescriptorProto.Type.TypeFixed32:
|
|||
|
|
case FieldDescriptorProto.Type.TypeFloat:
|
|||
|
|
case FieldDescriptorProto.Type.TypeInt32:
|
|||
|
|
case FieldDescriptorProto.Type.TypeSfixed32:
|
|||
|
|
case FieldDescriptorProto.Type.TypeSint32:
|
|||
|
|
case FieldDescriptorProto.Type.TypeUint32:
|
|||
|
|
Count32++;
|
|||
|
|
break;
|
|||
|
|
case FieldDescriptorProto.Type.TypeDouble:
|
|||
|
|
case FieldDescriptorProto.Type.TypeFixed64:
|
|||
|
|
case FieldDescriptorProto.Type.TypeInt64:
|
|||
|
|
case FieldDescriptorProto.Type.TypeSfixed64:
|
|||
|
|
case FieldDescriptorProto.Type.TypeSint64:
|
|||
|
|
case FieldDescriptorProto.Type.TypeUint64:
|
|||
|
|
Count32++;
|
|||
|
|
Count64++;
|
|||
|
|
break;
|
|||
|
|
case FieldDescriptorProto.Type.TypeMessage:
|
|||
|
|
switch(typeName)
|
|||
|
|
{
|
|||
|
|
case ".google.protobuf.Timestamp":
|
|||
|
|
case ".google.protobuf.Duration":
|
|||
|
|
Count64++;
|
|||
|
|
break;
|
|||
|
|
case ".bcl.Guid":
|
|||
|
|
Count128++;
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
CountRef++;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
CountRef++;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
internal string GetStorage(FieldDescriptorProto.Type type, string typeName)
|
|||
|
|
{
|
|||
|
|
switch (type)
|
|||
|
|
{
|
|||
|
|
case FieldDescriptorProto.Type.TypeBool:
|
|||
|
|
return "Boolean";
|
|||
|
|
case FieldDescriptorProto.Type.TypeInt32:
|
|||
|
|
case FieldDescriptorProto.Type.TypeSfixed32:
|
|||
|
|
case FieldDescriptorProto.Type.TypeSint32:
|
|||
|
|
case FieldDescriptorProto.Type.TypeFixed32:
|
|||
|
|
case FieldDescriptorProto.Type.TypeEnum:
|
|||
|
|
return "Int32";
|
|||
|
|
case FieldDescriptorProto.Type.TypeFloat:
|
|||
|
|
return "Single";
|
|||
|
|
case FieldDescriptorProto.Type.TypeUint32:
|
|||
|
|
return "UInt32";
|
|||
|
|
case FieldDescriptorProto.Type.TypeDouble:
|
|||
|
|
return "Double";
|
|||
|
|
case FieldDescriptorProto.Type.TypeFixed64:
|
|||
|
|
case FieldDescriptorProto.Type.TypeInt64:
|
|||
|
|
case FieldDescriptorProto.Type.TypeSfixed64:
|
|||
|
|
case FieldDescriptorProto.Type.TypeSint64:
|
|||
|
|
return "Int64";
|
|||
|
|
case FieldDescriptorProto.Type.TypeUint64:
|
|||
|
|
return "UInt64";
|
|||
|
|
case FieldDescriptorProto.Type.TypeMessage:
|
|||
|
|
switch (typeName)
|
|||
|
|
{
|
|||
|
|
case ".google.protobuf.Timestamp":
|
|||
|
|
return "DateTime";
|
|||
|
|
case ".google.protobuf.Duration":
|
|||
|
|
return "TimeSpan";
|
|||
|
|
case ".bcl.Guid":
|
|||
|
|
return "Guid";
|
|||
|
|
default:
|
|||
|
|
return "Object";
|
|||
|
|
}
|
|||
|
|
default:
|
|||
|
|
return "Object";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
internal static OneOfStub[] Build(GeneratorContext context, DescriptorProto message)
|
|||
|
|
{
|
|||
|
|
if (message.OneofDecls.Count == 0) return null;
|
|||
|
|
var stubs = new OneOfStub[message.OneofDecls.Count];
|
|||
|
|
int index = 0;
|
|||
|
|
foreach (var decl in message.OneofDecls)
|
|||
|
|
{
|
|||
|
|
stubs[index++] = new OneOfStub(decl);
|
|||
|
|
}
|
|||
|
|
foreach (var field in message.Fields)
|
|||
|
|
{
|
|||
|
|
if (field.ShouldSerializeOneofIndex())
|
|||
|
|
{
|
|||
|
|
stubs[field.OneofIndex].AccountFor(field.type, field.TypeName);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return stubs;
|
|||
|
|
}
|
|||
|
|
private bool isFirst = true;
|
|||
|
|
internal bool IsFirst()
|
|||
|
|
{
|
|||
|
|
if (isFirst)
|
|||
|
|
{
|
|||
|
|
isFirst = false;
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
internal string GetUnionType()
|
|||
|
|
{
|
|||
|
|
if (Count128 != 0)
|
|||
|
|
{
|
|||
|
|
return CountRef == 0 ? "DiscriminatedUnion128" : "DiscriminatedUnion128Object";
|
|||
|
|
}
|
|||
|
|
if (Count64 != 0)
|
|||
|
|
{
|
|||
|
|
return CountRef == 0 ? "DiscriminatedUnion64" : "DiscriminatedUnion64Object";
|
|||
|
|
}
|
|||
|
|
if (Count32 != 0)
|
|||
|
|
{
|
|||
|
|
return CountRef == 0 ? "DiscriminatedUnion32" : "DiscriminatedUnion32Object";
|
|||
|
|
}
|
|||
|
|
return "DiscriminatedUnionObject";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|