ExtensionGenerator.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Google.ProtocolBuffers.Descriptors;
  5. namespace Google.ProtocolBuffers.ProtoGen {
  6. internal class ExtensionGenerator : SourceGeneratorBase<FieldDescriptor>, ISourceGenerator {
  7. internal ExtensionGenerator(FieldDescriptor descriptor) : base(descriptor) {
  8. }
  9. public void Generate(TextGenerator writer) {
  10. string name = Helpers.UnderscoresToPascalCase(DescriptorUtil.GetFieldName(Descriptor));
  11. string type;
  12. switch (Descriptor.MappedType) {
  13. case MappedType.Message:
  14. type = DescriptorUtil.GetClassName(Descriptor.MessageType);
  15. break;
  16. case MappedType.Enum:
  17. type = DescriptorUtil.GetClassName(Descriptor.EnumType);
  18. break;
  19. default:
  20. type = DescriptorUtil.GetMappedTypeName(Descriptor.MappedType);
  21. break;
  22. }
  23. if (Descriptor.IsRepeated) {
  24. writer.WriteLine("{0} static readonly", ClassAccessLevel);
  25. writer.WriteLine(" pb::GeneratedExtensionBase<scg::IList<{0}>> {1} =", type, name);
  26. writer.WriteLine(" pb::GeneratedRepeatExtension<{0}>.CreateInstance(Descriptor.Extensions[{1}]);", type, Descriptor.Index);
  27. } else {
  28. writer.WriteLine("{0} static readonly pb::GeneratedExtensionBase<{1}> {2} =", ClassAccessLevel, type, name);
  29. writer.WriteLine(" pb::GeneratedSingleExtension<{0}>.CreateInstance(Descriptor.Extensions[{1}]);", type, Descriptor.Index);
  30. }
  31. }
  32. }
  33. }