SourceGenerators.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. using System;
  2. using System.Collections.Generic;
  3. using Google.ProtocolBuffers.Descriptors;
  4. namespace Google.ProtocolBuffers.ProtoGen {
  5. internal static class SourceGenerators {
  6. private static readonly Dictionary<Type, Func<IDescriptor, ISourceGenerator>> GeneratorFactories = new Dictionary<Type, Func<IDescriptor, ISourceGenerator>> {
  7. { typeof(FileDescriptor), descriptor => new UmbrellaClassGenerator((FileDescriptor) descriptor) },
  8. { typeof(EnumDescriptor), descriptor => new EnumGenerator((EnumDescriptor) descriptor) },
  9. { typeof(ServiceDescriptor), descriptor => new ServiceGenerator((ServiceDescriptor) descriptor) },
  10. { typeof(MessageDescriptor), descriptor => new MessageGenerator((MessageDescriptor) descriptor) },
  11. // For other fields, we have IFieldSourceGenerators.
  12. { typeof(FieldDescriptor), descriptor => new ExtensionGenerator((FieldDescriptor) descriptor) }
  13. };
  14. public static IFieldSourceGenerator CreateFieldGenerator(FieldDescriptor field) {
  15. switch (field.MappedType) {
  16. case MappedType.Message :
  17. return field.IsRepeated
  18. ? (IFieldSourceGenerator) new RepeatedMessageFieldGenerator(field)
  19. : new MessageFieldGenerator(field);
  20. case MappedType.Enum:
  21. return field.IsRepeated
  22. ? (IFieldSourceGenerator)new RepeatedEnumFieldGenerator(field)
  23. : new EnumFieldGenerator(field);
  24. default:
  25. return field.IsRepeated
  26. ? (IFieldSourceGenerator)new RepeatedPrimitiveFieldGenerator(field)
  27. : new PrimitiveFieldGenerator(field);
  28. }
  29. }
  30. public static ISourceGenerator CreateGenerator<T>(T descriptor) where T : IDescriptor {
  31. Func<IDescriptor, ISourceGenerator> factory;
  32. if (!GeneratorFactories.TryGetValue(typeof(T), out factory)) {
  33. throw new ArgumentException("No generator registered for " + typeof(T).Name);
  34. }
  35. return factory(descriptor);
  36. }
  37. }
  38. }