PrimitiveFieldGenerator.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System;
  2. using Google.ProtocolBuffers.Descriptors;
  3. namespace Google.ProtocolBuffers.ProtoGen {
  4. // TODO(jonskeet): Refactor this. There's loads of common code here.
  5. internal class PrimitiveFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator {
  6. internal PrimitiveFieldGenerator(FieldDescriptor descriptor)
  7. : base(descriptor) {
  8. }
  9. public void GenerateMembers(TextGenerator writer) {
  10. writer.WriteLine("private bool has{0};", CapitalizedName);
  11. writer.WriteLine("private {0} {1}_ = {2};", TypeName, Name, DefaultValue);
  12. writer.WriteLine("public bool Has{0} {{", CapitalizedName);
  13. writer.WriteLine(" get {{ return has{0}; }}", CapitalizedName);
  14. writer.WriteLine("}");
  15. writer.WriteLine("public {0} {1} {{", TypeName, PropertyName);
  16. writer.WriteLine(" get {{ return {0}_; }}", Name);
  17. writer.WriteLine("}");
  18. }
  19. public void GenerateBuilderMembers(TextGenerator writer) {
  20. writer.WriteLine("public bool Has{0} {{", CapitalizedName);
  21. writer.WriteLine(" get {{ return result.Has{0}; }}", CapitalizedName);
  22. writer.WriteLine("}");
  23. writer.WriteLine("public {0} {1} {{", TypeName, PropertyName);
  24. writer.WriteLine(" get {{ return result.{0}; }}", PropertyName);
  25. writer.WriteLine(" set {{ Set{0}(value); }}", CapitalizedName);
  26. writer.WriteLine("}");
  27. writer.WriteLine("public Builder Set{0}({1} value) {{", CapitalizedName, TypeName);
  28. writer.WriteLine(" result.has{0} = true;", CapitalizedName);
  29. writer.WriteLine(" result.{0}_ = value;", Name);
  30. writer.WriteLine(" return this;");
  31. writer.WriteLine("}");
  32. writer.WriteLine("public Builder Clear{0}() {{", CapitalizedName);
  33. writer.WriteLine(" result.has{0} = false;", CapitalizedName);
  34. writer.WriteLine(" result.{0}_ = {1};", Name, DefaultValue);
  35. writer.WriteLine(" return this;");
  36. writer.WriteLine("}");
  37. }
  38. public void GenerateMergingCode(TextGenerator writer) {
  39. writer.WriteLine("if (other.Has{0}) {{", CapitalizedName);
  40. writer.WriteLine(" {0} = other.{0};", PropertyName);
  41. writer.WriteLine("}");
  42. }
  43. public void GenerateBuildingCode(TextGenerator writer) {
  44. // Nothing to do here for primitive types
  45. }
  46. public void GenerateParsingCode(TextGenerator writer) {
  47. writer.WriteLine("{0} = input.Read{1}();", PropertyName, CapitalizedTypeName);
  48. }
  49. public void GenerateSerializationCode(TextGenerator writer) {
  50. writer.WriteLine("if (Has{0}) {{", CapitalizedName);
  51. writer.WriteLine(" output.Write{0}({1}, {2});", CapitalizedTypeName, Number, PropertyName);
  52. writer.WriteLine("}");
  53. }
  54. public void GenerateSerializedSizeCode(TextGenerator writer) {
  55. writer.WriteLine("if (Has{0}) {{", CapitalizedName);
  56. writer.WriteLine(" size += pb::CodedOutputStream.Compute{0}Size({1}, {2});",
  57. CapitalizedTypeName, Number, PropertyName);
  58. writer.WriteLine("}");
  59. }
  60. }
  61. }