diff options
author | Jon Skeet <skeet@pobox.com> | 2008-10-22 07:11:17 +0100 |
---|---|---|
committer | Jon Skeet <skeet@pobox.com> | 2008-10-22 07:11:17 +0100 |
commit | e60ce8bfafca616ed4fd430ae4f82360de165e80 (patch) | |
tree | cb1a82655772f4995c02debb31cfeb208960acf1 /csharp/ProtoGen/SourceGenerators.cs | |
parent | 7f90d8ee57d4af4215bc31dbb07726c023c5e047 (diff) | |
download | protobuf-e60ce8bfafca616ed4fd430ae4f82360de165e80.tar.gz protobuf-e60ce8bfafca616ed4fd430ae4f82360de165e80.tar.bz2 protobuf-e60ce8bfafca616ed4fd430ae4f82360de165e80.zip |
Final commit before changing layout
Diffstat (limited to 'csharp/ProtoGen/SourceGenerators.cs')
-rw-r--r-- | csharp/ProtoGen/SourceGenerators.cs | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/csharp/ProtoGen/SourceGenerators.cs b/csharp/ProtoGen/SourceGenerators.cs new file mode 100644 index 00000000..c775e419 --- /dev/null +++ b/csharp/ProtoGen/SourceGenerators.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using Google.ProtocolBuffers.Descriptors; + +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) } + }; + + public static IFieldSourceGenerator CreateFieldGenerator(FieldDescriptor field) { + switch (field.MappedType) { + case MappedType.Message : + return field.IsRepeated + ? (IFieldSourceGenerator) new RepeatedMessageFieldGenerator(field) + : new MessageFieldGenerator(field); + case MappedType.Enum: + return field.IsRepeated + ? (IFieldSourceGenerator)new RepeatedEnumFieldGenerator(field) + : new EnumFieldGenerator(field); + default: + return field.IsRepeated + ? (IFieldSourceGenerator)new RepeatedPrimitiveFieldGenerator(field) + : new PrimitiveFieldGenerator(field); + } + } + + public static ISourceGenerator CreateGenerator<T>(T descriptor) where T : IDescriptor { + Func<IDescriptor, ISourceGenerator> factory; + if (!GeneratorFactories.TryGetValue(typeof(T), out factory)) { + throw new ArgumentException("No generator registered for " + typeof(T).Name); + } + return factory(descriptor); + } + } +} |