aboutsummaryrefslogtreecommitdiff
path: root/src/ProtoGen
diff options
context:
space:
mode:
Diffstat (limited to 'src/ProtoGen')
-rw-r--r--src/ProtoGen/EnumFieldGenerator.cs20
-rw-r--r--src/ProtoGen/ExtensionGenerator.cs2
-rw-r--r--src/ProtoGen/FieldGeneratorBase.cs7
-rw-r--r--src/ProtoGen/MessageFieldGenerator.cs6
-rw-r--r--src/ProtoGen/MessageGenerator.cs84
-rw-r--r--src/ProtoGen/PrimitiveFieldGenerator.cs8
-rw-r--r--src/ProtoGen/ProtoGen.csproj10
-rw-r--r--src/ProtoGen/RepeatedEnumFieldGenerator.cs53
-rw-r--r--src/ProtoGen/RepeatedMessageFieldGenerator.cs26
-rw-r--r--src/ProtoGen/RepeatedPrimitiveFieldGenerator.cs35
-rw-r--r--src/ProtoGen/SourceGenerators.cs99
11 files changed, 124 insertions, 226 deletions
diff --git a/src/ProtoGen/EnumFieldGenerator.cs b/src/ProtoGen/EnumFieldGenerator.cs
index 763c18ab..d5e8c636 100644
--- a/src/ProtoGen/EnumFieldGenerator.cs
+++ b/src/ProtoGen/EnumFieldGenerator.cs
@@ -40,8 +40,8 @@ namespace Google.ProtocolBuffers.ProtoGen
{
internal class EnumFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator
{
- internal EnumFieldGenerator(FieldDescriptor descriptor)
- : base(descriptor)
+ internal EnumFieldGenerator(FieldDescriptor descriptor, int fieldOrdinal)
+ : base(descriptor, fieldOrdinal)
{
}
@@ -107,26 +107,12 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine(" unknownFields.MergeVarintField({0}, (ulong)(int)unknown);", Number);
}
writer.WriteLine("}");
-
- // TO DO(jonskeet): Make a more efficient way of doing this
- //writer.WriteLine("int rawValue = input.ReadEnum();");
- //writer.WriteLine("if (!global::System.Enum.IsDefined(typeof({0}), rawValue)) {{", TypeName);
- //if (!UseLiteRuntime)
- //{
- // writer.WriteLine(" if (unknownFields == null) {"); // First unknown field - create builder now
- // writer.WriteLine(" unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);");
- // writer.WriteLine(" }");
- // writer.WriteLine(" unknownFields.MergeVarintField({0}, (ulong) rawValue);", Number);
- //}
- //writer.WriteLine("} else {");
- //writer.WriteLine(" {0} = ({1}) rawValue;", PropertyName, TypeName);
- //writer.WriteLine("}");
}
public void GenerateSerializationCode(TextGenerator writer)
{
writer.WriteLine("if (has{0}) {{", PropertyName);
- writer.WriteLine(" output.WriteEnum({0}, \"{2}\", (int) {1}, {1}.ToString());", Number, PropertyName, Descriptor.Name);
+ writer.WriteLine(" output.WriteEnum({0}, field_names[{2}], (int) {1}, {1}.ToString());", Number, PropertyName, FieldOrdinal);
writer.WriteLine("}");
}
diff --git a/src/ProtoGen/ExtensionGenerator.cs b/src/ProtoGen/ExtensionGenerator.cs
index ce37b2de..824718bf 100644
--- a/src/ProtoGen/ExtensionGenerator.cs
+++ b/src/ProtoGen/ExtensionGenerator.cs
@@ -48,7 +48,7 @@ namespace Google.ProtocolBuffers.ProtoGen
private readonly string name;
internal ExtensionGenerator(FieldDescriptor descriptor)
- : base(descriptor)
+ : base(descriptor, 0)
{
if (Descriptor.ExtensionScope != null)
{
diff --git a/src/ProtoGen/FieldGeneratorBase.cs b/src/ProtoGen/FieldGeneratorBase.cs
index 4d2ec438..77a8765c 100644
--- a/src/ProtoGen/FieldGeneratorBase.cs
+++ b/src/ProtoGen/FieldGeneratorBase.cs
@@ -42,15 +42,20 @@ namespace Google.ProtocolBuffers.ProtoGen
{
internal abstract class FieldGeneratorBase : SourceGeneratorBase<FieldDescriptor>
{
- protected FieldGeneratorBase(FieldDescriptor descriptor)
+ private readonly int _fieldOrdinal;
+
+ protected FieldGeneratorBase(FieldDescriptor descriptor, int fieldOrdinal)
: base(descriptor)
{
+ _fieldOrdinal = fieldOrdinal;
}
public abstract void WriteHash(TextGenerator writer);
public abstract void WriteEquals(TextGenerator writer);
public abstract void WriteToString(TextGenerator writer);
+ public int FieldOrdinal { get { return _fieldOrdinal; } }
+
private static bool AllPrintableAscii(string text)
{
foreach (char c in text)
diff --git a/src/ProtoGen/MessageFieldGenerator.cs b/src/ProtoGen/MessageFieldGenerator.cs
index c5b3a6a5..cb365954 100644
--- a/src/ProtoGen/MessageFieldGenerator.cs
+++ b/src/ProtoGen/MessageFieldGenerator.cs
@@ -40,8 +40,8 @@ namespace Google.ProtocolBuffers.ProtoGen
{
internal class MessageFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator
{
- internal MessageFieldGenerator(FieldDescriptor descriptor)
- : base(descriptor)
+ internal MessageFieldGenerator(FieldDescriptor descriptor, int fieldOrdinal)
+ : base(descriptor, fieldOrdinal)
{
}
@@ -129,7 +129,7 @@ namespace Google.ProtocolBuffers.ProtoGen
public void GenerateSerializationCode(TextGenerator writer)
{
writer.WriteLine("if (has{0}) {{", PropertyName);
- writer.WriteLine(" output.Write{0}({1}, \"{3}\", {2});", MessageOrGroup, Number, PropertyName, Descriptor.Name);
+ writer.WriteLine(" output.Write{0}({1}, field_names[{3}], {2});", MessageOrGroup, Number, PropertyName, FieldOrdinal);
writer.WriteLine("}");
}
diff --git a/src/ProtoGen/MessageGenerator.cs b/src/ProtoGen/MessageGenerator.cs
index 65a2d896..fe30e49a 100644
--- a/src/ProtoGen/MessageGenerator.cs
+++ b/src/ProtoGen/MessageGenerator.cs
@@ -44,6 +44,8 @@ namespace Google.ProtocolBuffers.ProtoGen
{
internal class MessageGenerator : SourceGeneratorBase<MessageDescriptor>, ISourceGenerator
{
+ private string[] _fieldNames;
+
internal MessageGenerator(MessageDescriptor descriptor) : base(descriptor)
{
}
@@ -136,6 +138,33 @@ namespace Google.ProtocolBuffers.ProtoGen
}
}
+ public string[] FieldNames
+ {
+ get
+ {
+ if (_fieldNames == null)
+ {
+ List<string> names = new List<string>();
+ foreach (FieldDescriptor fieldDescriptor in Descriptor.Fields)
+ names.Add(fieldDescriptor.Name);
+ //if you change this, the search must also change in GenerateBuilderParsingMethods
+ names.Sort(StringComparer.Ordinal);
+ _fieldNames = names.ToArray();
+ }
+ return _fieldNames;
+ }
+ }
+
+ internal int FieldOrdinal(FieldDescriptor field)
+ {
+ return Array.BinarySearch(FieldNames, field.Name, StringComparer.Ordinal);
+ }
+
+ private IFieldSourceGenerator CreateFieldGenerator(FieldDescriptor fieldDescriptor)
+ {
+ return SourceGenerators.CreateFieldGenerator(fieldDescriptor, FieldOrdinal(fieldDescriptor));
+ }
+
public void Generate(TextGenerator writer)
{
writer.WriteLine("[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]");
@@ -148,6 +177,18 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.Indent();
// Must call BuildPartial() to make sure all lists are made read-only
writer.WriteLine("private static readonly {0} defaultInstance = new Builder().BuildPartial();", ClassName);
+
+ if (OptimizeSpeed)
+ {
+ writer.WriteLine("private static readonly string[] _{0}FieldNames = new string[] {{ {2}{1}{2} }};",
+ NameHelpers.UnderscoresToCamelCase(ClassName), String.Join("\", \"", FieldNames), FieldNames.Length > 0 ? "\"" : "");
+ List<string> tags = new List<string>();
+ foreach (string name in FieldNames)
+ tags.Add(WireFormat.MakeTag(Descriptor.FindFieldByName(name)).ToString());
+
+ writer.WriteLine("private static readonly uint[] _{0}FieldTags = new uint[] {{ {1} }};",
+ NameHelpers.UnderscoresToCamelCase(ClassName), String.Join(", ", tags.ToArray()));
+ }
writer.WriteLine("public static {0} DefaultInstance {{", ClassName);
writer.WriteLine(" get { return defaultInstance; }");
writer.WriteLine("}");
@@ -202,7 +243,7 @@ namespace Google.ProtocolBuffers.ProtoGen
// Rats: we lose the debug comment here :(
writer.WriteLine("public const int {0} = {1};", GetFieldConstantName(fieldDescriptor),
fieldDescriptor.FieldNumber);
- SourceGenerators.CreateFieldGenerator(fieldDescriptor).GenerateMembers(writer);
+ CreateFieldGenerator(fieldDescriptor).GenerateMembers(writer);
writer.WriteLine();
}
@@ -244,7 +285,7 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine("int hash = GetType().GetHashCode();");
foreach (FieldDescriptor fieldDescriptor in Descriptor.Fields)
{
- SourceGenerators.CreateFieldGenerator(fieldDescriptor).WriteHash(writer);
+ CreateFieldGenerator(fieldDescriptor).WriteHash(writer);
}
if (callbase) writer.WriteLine("hash ^= base.GetHashCode();");
writer.WriteLine("return hash;");
@@ -258,7 +299,7 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine("if (other == null) return false;");
foreach (FieldDescriptor fieldDescriptor in Descriptor.Fields)
{
- SourceGenerators.CreateFieldGenerator(fieldDescriptor).WriteEquals(writer);
+ CreateFieldGenerator(fieldDescriptor).WriteEquals(writer);
}
if (callbase) writer.WriteLine("if (!base.Equals(other)) return false;");
writer.WriteLine("return true;");
@@ -274,7 +315,7 @@ namespace Google.ProtocolBuffers.ProtoGen
delegate(FieldDescriptor a, FieldDescriptor b) { return a.FieldNumber.CompareTo(b.FieldNumber); }));
foreach (FieldDescriptor fieldDescriptor in sorted)
{
- SourceGenerators.CreateFieldGenerator(fieldDescriptor).WriteToString(writer);
+ CreateFieldGenerator(fieldDescriptor).WriteToString(writer);
}
if (callbase) writer.WriteLine("base.PrintTo(writer);");
writer.Outdent();
@@ -295,6 +336,7 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.Indent();
// Make sure we've computed the serialized length, so that packed fields are generated correctly.
writer.WriteLine("int size = SerializedSize;");
+ writer.WriteLine("string[] field_names = _{0}FieldNames;", NameHelpers.UnderscoresToCamelCase(ClassName));
if (Descriptor.Proto.ExtensionRangeList.Count > 0)
{
writer.WriteLine(
@@ -349,7 +391,7 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine("size = 0;");
foreach (FieldDescriptor field in Descriptor.Fields)
{
- SourceGenerators.CreateFieldGenerator(field).GenerateSerializedSizeCode(writer);
+ CreateFieldGenerator(field).GenerateSerializedSizeCode(writer);
}
if (Descriptor.Proto.ExtensionRangeCount > 0)
{
@@ -376,9 +418,9 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine();
}
- private static void GenerateSerializeOneField(TextGenerator writer, FieldDescriptor fieldDescriptor)
+ private void GenerateSerializeOneField(TextGenerator writer, FieldDescriptor fieldDescriptor)
{
- SourceGenerators.CreateFieldGenerator(fieldDescriptor).GenerateSerializationCode(writer);
+ CreateFieldGenerator(fieldDescriptor).GenerateSerializationCode(writer);
}
private static void GenerateSerializeOneExtensionRange(TextGenerator writer, ExtensionRange extensionRange)
@@ -509,7 +551,7 @@ namespace Google.ProtocolBuffers.ProtoGen
{
writer.WriteLine();
// No field comment :(
- SourceGenerators.CreateFieldGenerator(field).GenerateBuilderMembers(writer);
+ CreateFieldGenerator(field).GenerateBuilderMembers(writer);
}
writer.Outdent();
writer.WriteLine("}");
@@ -554,7 +596,7 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine("}");
foreach (FieldDescriptor field in Descriptor.Fields)
{
- SourceGenerators.CreateFieldGenerator(field).GenerateBuildingCode(writer);
+ CreateFieldGenerator(field).GenerateBuildingCode(writer);
}
writer.WriteLine("{0} returnMe = result;", ClassName);
writer.WriteLine("result = null;");
@@ -581,7 +623,7 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine("if (other == {0}.DefaultInstance) return this;", FullClassName);
foreach (FieldDescriptor field in Descriptor.Fields)
{
- SourceGenerators.CreateFieldGenerator(field).GenerateMergingCode(writer);
+ CreateFieldGenerator(field).GenerateMergingCode(writer);
}
// if message type has extensions
if (Descriptor.Proto.ExtensionRangeCount > 0)
@@ -619,6 +661,26 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine("string field_name;");
writer.WriteLine("while (input.ReadTag(out tag, out field_name)) {");
writer.Indent();
+ writer.WriteLine("if(tag == 0 && field_name != null) {");
+ writer.Indent();
+ //if you change from StringComparer.Ordinal, the array sort in FieldNames { get; } must also change
+ writer.WriteLine("int field_ordinal = global::System.Array.BinarySearch(_{0}FieldNames, field_name, global::System.StringComparer.Ordinal);",
+ NameHelpers.UnderscoresToCamelCase(ClassName));
+ writer.WriteLine("if(field_ordinal >= 0)");
+ writer.WriteLine(" tag = _{0}FieldTags[field_ordinal];", NameHelpers.UnderscoresToCamelCase(ClassName));
+ writer.WriteLine("else {");
+ if (!UseLiteRuntime)
+ {
+ writer.WriteLine(" if (unknownFields == null) {"); // First unknown field - create builder now
+ writer.WriteLine(" unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);");
+ writer.WriteLine(" }");
+ }
+ writer.WriteLine(" ParseUnknownField(input, {0}extensionRegistry, tag, field_name);", UseLiteRuntime ? "" : "unknownFields, ");
+ writer.WriteLine(" continue;");
+ writer.WriteLine("}");
+ writer.Outdent();
+ writer.WriteLine("}");
+
writer.WriteLine("switch (tag) {");
writer.Indent();
writer.WriteLine("case 0: {"); // 0 signals EOF / limit reached
@@ -661,7 +723,7 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine("case {0}: {{", tag);
writer.Indent();
- SourceGenerators.CreateFieldGenerator(field).GenerateParsingCode(writer);
+ CreateFieldGenerator(field).GenerateParsingCode(writer);
writer.WriteLine("break;");
writer.Outdent();
writer.WriteLine("}");
diff --git a/src/ProtoGen/PrimitiveFieldGenerator.cs b/src/ProtoGen/PrimitiveFieldGenerator.cs
index 7fc583c3..6296cdc7 100644
--- a/src/ProtoGen/PrimitiveFieldGenerator.cs
+++ b/src/ProtoGen/PrimitiveFieldGenerator.cs
@@ -41,8 +41,8 @@ namespace Google.ProtocolBuffers.ProtoGen
// TODO(jonskeet): Refactor this. There's loads of common code here.
internal class PrimitiveFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator
{
- internal PrimitiveFieldGenerator(FieldDescriptor descriptor)
- : base(descriptor)
+ internal PrimitiveFieldGenerator(FieldDescriptor descriptor, int fieldOrdinal)
+ : base(descriptor, fieldOrdinal)
{
}
@@ -97,13 +97,13 @@ namespace Google.ProtocolBuffers.ProtoGen
public void GenerateParsingCode(TextGenerator writer)
{
- writer.WriteLine("result.has{0} |= input.Read{1}(ref result.{2}_);", PropertyName, CapitalizedTypeName, Name);
+ writer.WriteLine("result.has{0} = input.Read{1}(ref result.{2}_);", PropertyName, CapitalizedTypeName, Name);
}
public void GenerateSerializationCode(TextGenerator writer)
{
writer.WriteLine("if (has{0}) {{", PropertyName);
- writer.WriteLine(" output.Write{0}({1}, \"{3}\", {2});", CapitalizedTypeName, Number, PropertyName, Descriptor.Name);
+ writer.WriteLine(" output.Write{0}({1}, field_names[{3}], {2});", CapitalizedTypeName, Number, PropertyName, FieldOrdinal);
writer.WriteLine("}");
}
diff --git a/src/ProtoGen/ProtoGen.csproj b/src/ProtoGen/ProtoGen.csproj
index b865a53a..fa93aa78 100644
--- a/src/ProtoGen/ProtoGen.csproj
+++ b/src/ProtoGen/ProtoGen.csproj
@@ -56,10 +56,6 @@
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
- <Reference Include="Google.ProtocolBuffers, Version=2.3.0.277, Culture=neutral, PublicKeyToken=17b3b1f090c3ea48, processorArchitecture=MSIL">
- <SpecificVersion>False</SpecificVersion>
- <HintPath>..\..\build\2.3.0.304\Google.ProtocolBuffers.dll</HintPath>
- </Reference>
<Reference Include="mscorlib" />
<Reference Include="System" />
<Reference Include="System.Data" />
@@ -113,6 +109,12 @@
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\ProtocolBuffers\ProtocolBuffers.csproj">
+ <Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project>
+ <Name>ProtocolBuffers</Name>
+ </ProjectReference>
+ </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
diff --git a/src/ProtoGen/RepeatedEnumFieldGenerator.cs b/src/ProtoGen/RepeatedEnumFieldGenerator.cs
index 27aabf58..c84d1025 100644
--- a/src/ProtoGen/RepeatedEnumFieldGenerator.cs
+++ b/src/ProtoGen/RepeatedEnumFieldGenerator.cs
@@ -41,8 +41,8 @@ namespace Google.ProtocolBuffers.ProtoGen
{
internal class RepeatedEnumFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator
{
- internal RepeatedEnumFieldGenerator(FieldDescriptor descriptor)
- : base(descriptor)
+ internal RepeatedEnumFieldGenerator(FieldDescriptor descriptor, int fieldOrdinal)
+ : base(descriptor, fieldOrdinal)
{
}
@@ -125,37 +125,6 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine(" unknownFields.MergeVarintField({0}, (ulong)(int)rawValue);", Number);
writer.WriteLine("}");
}
-
- //// If packed, set up the while loop
- //if (Descriptor.IsPacked)
- //{
- // writer.WriteLine("int length = input.ReadInt32();");
- // writer.WriteLine("int oldLimit = input.PushLimit(length);");
- // writer.WriteLine("while (!input.ReachedLimit) {");
- // writer.Indent();
- //}
-
- //// Read and store the enum
- //// TO DO(jonskeet): Make a more efficient way of doing this
- //writer.WriteLine("int rawValue = input.ReadEnum();");
- //writer.WriteLine("if (!global::System.Enum.IsDefined(typeof({0}), rawValue)) {{", TypeName);
- //if (!UseLiteRuntime)
- //{
- // writer.WriteLine(" if (unknownFields == null) {"); // First unknown field - create builder now
- // writer.WriteLine(" unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);");
- // writer.WriteLine(" }");
- // writer.WriteLine(" unknownFields.MergeVarintField({0}, (ulong) rawValue);", Number);
- //}
- //writer.WriteLine("} else {");
- //writer.WriteLine(" Add{0}(({1}) rawValue);", PropertyName, TypeName);
- //writer.WriteLine("}");
-
- //if (Descriptor.IsPacked)
- //{
- // writer.Outdent();
- // writer.WriteLine("}");
- // writer.WriteLine("input.PopLimit(oldLimit);");
- //}
}
public void GenerateSerializationCode(TextGenerator writer)
@@ -163,23 +132,9 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine("if ({0}_.Count > 0) {{", Name);
writer.Indent();
if (Descriptor.IsPacked)
- writer.WriteLine("output.WritePackedArray(pbd::FieldType.{3}, {0}, \"{2}\", {1}MemoizedSerializedSize, {1}_);", Number, Name, Descriptor.Name, Descriptor.FieldType);
+ writer.WriteLine("output.WritePackedArray(pbd::FieldType.{3}, {0}, field_names[{2}], {1}MemoizedSerializedSize, {1}_);", Number, Name, FieldOrdinal, Descriptor.FieldType);
else
- writer.WriteLine("output.WriteArray(pbd::FieldType.{3}, {0}, \"{2}\", {1}_);", Number, Name, Descriptor.Name, Descriptor.FieldType);
- //if (Descriptor.IsPacked)
- //{
- // writer.WriteLine("output.WriteRawVarint32({0});", WireFormat.MakeTag(Descriptor));
- // writer.WriteLine("output.WriteRawVarint32((uint) {0}MemoizedSerializedSize);", Name);
- // writer.WriteLine("foreach (int element in {0}_) {{", Name);
- // writer.WriteLine(" output.WriteEnumNoTag(element);");
- // writer.WriteLine("}");
- //}
- //else
- //{
- // writer.WriteLine("foreach (int element in {0}_) {{", Name);
- // writer.WriteLine(" output.WriteEnum({0}, element);", Number);
- // writer.WriteLine("}");
- //}
+ writer.WriteLine("output.WriteArray(pbd::FieldType.{3}, {0}, field_names[{2}], {1}_);", Number, Name, FieldOrdinal, Descriptor.FieldType);
writer.Outdent();
writer.WriteLine("}");
}
diff --git a/src/ProtoGen/RepeatedMessageFieldGenerator.cs b/src/ProtoGen/RepeatedMessageFieldGenerator.cs
index 23f06a18..0708cd63 100644
--- a/src/ProtoGen/RepeatedMessageFieldGenerator.cs
+++ b/src/ProtoGen/RepeatedMessageFieldGenerator.cs
@@ -41,8 +41,8 @@ namespace Google.ProtocolBuffers.ProtoGen
{
internal class RepeatedMessageFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator
{
- internal RepeatedMessageFieldGenerator(FieldDescriptor descriptor)
- : base(descriptor)
+ internal RepeatedMessageFieldGenerator(FieldDescriptor descriptor, int fieldOrdinal)
+ : base(descriptor, fieldOrdinal)
{
}
@@ -123,33 +123,13 @@ namespace Google.ProtocolBuffers.ProtoGen
public void GenerateParsingCode(TextGenerator writer)
{
writer.WriteLine("input.Read{0}Array(tag, field_name, result.{1}_, {2}.DefaultInstance, extensionRegistry);", MessageOrGroup, Name, TypeName);
-
- //writer.WriteLine("{0}.Builder subBuilder = {0}.CreateBuilder();", TypeName);
- //if (Descriptor.FieldType == FieldType.Group)
- //{
- // writer.WriteLine("input.ReadGroup({0}, subBuilder, extensionRegistry);", Number);
- //}
- //else
- //{
- // writer.WriteLine("input.ReadMessage(subBuilder, extensionRegistry);");
- //}
- //writer.WriteLine("Add{0}(subBuilder.BuildPartial());", PropertyName);
}
public void GenerateSerializationCode(TextGenerator writer)
{
writer.WriteLine("if ({0}_.Count > 0) {{", Name);
writer.Indent();
-
- // Arrays of message types do not currently support 'packed' storage
- //if (Descriptor.IsPacked)
- // writer.WriteLine("output.WritePackedArray(pbd::FieldType.{3}, {0}, \"{2}\", {1}MemoizedSerializedSize, {1}_);", Number, Name, Descriptor.Name, Descriptor.FieldType);
- //else
- writer.WriteLine("output.WriteArray(pbd::FieldType.{3}, {0}, \"{2}\", {1}_);", Number, Name, Descriptor.Name, Descriptor.FieldType);
-
- //writer.WriteLine("foreach ({0} element in {1}List) {{", TypeName, PropertyName);
- //writer.WriteLine(" output.Write{0}({1}, element);", MessageOrGroup, Number);
- //writer.WriteLine("}");
+ writer.WriteLine("output.WriteArray(pbd::FieldType.{3}, {0}, field_names[{2}], {1}_);", Number, Name, FieldOrdinal, Descriptor.FieldType);
writer.Outdent();
writer.WriteLine("}");
}
diff --git a/src/ProtoGen/RepeatedPrimitiveFieldGenerator.cs b/src/ProtoGen/RepeatedPrimitiveFieldGenerator.cs
index d6536281..535645d4 100644
--- a/src/ProtoGen/RepeatedPrimitiveFieldGenerator.cs
+++ b/src/ProtoGen/RepeatedPrimitiveFieldGenerator.cs
@@ -41,8 +41,8 @@ namespace Google.ProtocolBuffers.ProtoGen
{
internal class RepeatedPrimitiveFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator
{
- internal RepeatedPrimitiveFieldGenerator(FieldDescriptor descriptor)
- : base(descriptor)
+ internal RepeatedPrimitiveFieldGenerator(FieldDescriptor descriptor, int fieldOrdinal)
+ : base(descriptor, fieldOrdinal)
{
}
@@ -122,19 +122,6 @@ namespace Google.ProtocolBuffers.ProtoGen
public void GenerateParsingCode(TextGenerator writer)
{
writer.WriteLine("input.ReadPrimitiveArray(pbd::FieldType.{1}, tag, field_name, result.{0}_);", Name, Descriptor.FieldType);
- //if (Descriptor.IsPacked)
- //{
- // writer.WriteLine("int length = input.ReadInt32();");
- // writer.WriteLine("int limit = input.PushLimit(length);");
- // writer.WriteLine("while (!input.ReachedLimit) {");
- // writer.WriteLine(" Add{0}(input.Read{1}());", PropertyName, CapitalizedTypeName);
- // writer.WriteLine("}");
- // writer.WriteLine("input.PopLimit(limit);");
- //}
- //else
- //{
- // writer.WriteLine("Add{0}(input.Read{1}());", PropertyName, CapitalizedTypeName);
- //}
}
public void GenerateSerializationCode(TextGenerator writer)
@@ -142,23 +129,9 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine("if ({0}_.Count > 0) {{", Name);
writer.Indent();
if (Descriptor.IsPacked)
- writer.WriteLine("output.WritePackedArray(pbd::FieldType.{3}, {0}, \"{2}\", {1}MemoizedSerializedSize, {1}_);", Number, Name, Descriptor.Name, Descriptor.FieldType);
+ writer.WriteLine("output.WritePackedArray(pbd::FieldType.{3}, {0}, field_names[{2}], {1}MemoizedSerializedSize, {1}_);", Number, Name, FieldOrdinal, Descriptor.FieldType);
else
- writer.WriteLine("output.WriteArray(pbd::FieldType.{3}, {0}, \"{2}\", {1}_);", Number, Name, Descriptor.Name, Descriptor.FieldType);
- //if (Descriptor.IsPacked)
- //{
- // writer.WriteLine("output.WriteRawVarint32({0});", WireFormat.MakeTag(Descriptor));
- // writer.WriteLine("output.WriteRawVarint32((uint) {0}MemoizedSerializedSize);", Name);
- // writer.WriteLine("foreach ({0} element in {1}_) {{", TypeName, Name);
- // writer.WriteLine(" output.Write{0}NoTag(element);", CapitalizedTypeName);
- // writer.WriteLine("}");
- //}
- //else
- //{
- // writer.WriteLine("foreach ({0} element in {1}_) {{", TypeName, Name);
- // writer.WriteLine(" output.Write{0}({1}, element);", CapitalizedTypeName, Number);
- // writer.WriteLine("}");
- //}
+ writer.WriteLine("output.WriteArray(pbd::FieldType.{3}, {0}, field_names[{2}], {1}_);", Number, Name, FieldOrdinal, Descriptor.FieldType);
writer.Outdent();
writer.WriteLine("}");
}
diff --git a/src/ProtoGen/SourceGenerators.cs b/src/ProtoGen/SourceGenerators.cs
index 398868cb..7d73110e 100644
--- a/src/ProtoGen/SourceGenerators.cs
+++ b/src/ProtoGen/SourceGenerators.cs
@@ -44,98 +44,33 @@ namespace Google.ProtocolBuffers.ProtoGen
internal static class SourceGenerators
{
- private static readonly Dictionary<Type, Func<IDescriptor, ISourceGenerator>> GeneratorFactories = new Dictionary
- <Type, Func<IDescriptor, ISourceGenerator>>
- {
- {
- typeof
- (
- FileDescriptor
- )
- ,
- descriptor
- =>
- new UmbrellaClassGenerator
- ((
- FileDescriptor
- )
- descriptor)
- },
- {
- typeof
- (
- EnumDescriptor
- )
- ,
- descriptor
- =>
- new EnumGenerator
- ((
- EnumDescriptor
- )
- descriptor)
- },
- {
- typeof
- (
- ServiceDescriptor
- )
- ,
- descriptor
- =>
- new ServiceGenerator
- ((
- ServiceDescriptor
- )
- descriptor)
- },
- {
- typeof
- (
- MessageDescriptor
- )
- ,
- descriptor
- =>
- new MessageGenerator
- ((
- MessageDescriptor
- )
- descriptor)
- },
- // For other fields, we have IFieldSourceGenerators.
- {
- typeof
- (
- FieldDescriptor
- )
- ,
- descriptor
- =>
- new ExtensionGenerator
- ((
- FieldDescriptor
- )
- descriptor)
- }
- };
+ private static readonly Dictionary<Type, Func<IDescriptor, ISourceGenerator>> GeneratorFactories =
+ new Dictionary<Type, Func<IDescriptor, ISourceGenerator>>
+ {
+ {typeof(FileDescriptor),descriptor=>new UmbrellaClassGenerator((FileDescriptor)descriptor)},
+ {typeof(EnumDescriptor),descriptor=>new EnumGenerator((EnumDescriptor)descriptor)},
+ {typeof(ServiceDescriptor),descriptor=>new ServiceGenerator((ServiceDescriptor)descriptor)},
+ {typeof(MessageDescriptor),descriptor=>new MessageGenerator((MessageDescriptor)descriptor)},
+ // For other fields, we have IFieldSourceGenerators.
+ {typeof(FieldDescriptor),descriptor=>new ExtensionGenerator((FieldDescriptor)descriptor)}
+ };
- public static IFieldSourceGenerator CreateFieldGenerator(FieldDescriptor field)
+ public static IFieldSourceGenerator CreateFieldGenerator(FieldDescriptor field, int fieldOrdinal)
{
switch (field.MappedType)
{
case MappedType.Message:
return field.IsRepeated
- ? (IFieldSourceGenerator) new RepeatedMessageFieldGenerator(field)
- : new MessageFieldGenerator(field);
+ ? (IFieldSourceGenerator) new RepeatedMessageFieldGenerator(field, fieldOrdinal)
+ : new MessageFieldGenerator(field, fieldOrdinal);
case MappedType.Enum:
return field.IsRepeated
- ? (IFieldSourceGenerator) new RepeatedEnumFieldGenerator(field)
- : new EnumFieldGenerator(field);
+ ? (IFieldSourceGenerator)new RepeatedEnumFieldGenerator(field, fieldOrdinal)
+ : new EnumFieldGenerator(field, fieldOrdinal);
default:
return field.IsRepeated
- ? (IFieldSourceGenerator) new RepeatedPrimitiveFieldGenerator(field)
- : new PrimitiveFieldGenerator(field);
+ ? (IFieldSourceGenerator)new RepeatedPrimitiveFieldGenerator(field, fieldOrdinal)
+ : new PrimitiveFieldGenerator(field, fieldOrdinal);
}
}