aboutsummaryrefslogtreecommitdiff
path: root/csharp/ProtoGen
diff options
context:
space:
mode:
Diffstat (limited to 'csharp/ProtoGen')
-rw-r--r--csharp/ProtoGen/DependencyResolutionException.cs17
-rw-r--r--csharp/ProtoGen/DescriptorUtil.cs108
-rw-r--r--csharp/ProtoGen/EnumFieldGenerator.cs75
-rw-r--r--csharp/ProtoGen/EnumGenerator.cs19
-rw-r--r--csharp/ProtoGen/ExtensionGenerator.cs37
-rw-r--r--csharp/ProtoGen/FieldGeneratorBase.cs130
-rw-r--r--csharp/ProtoGen/Generator.cs138
-rw-r--r--csharp/ProtoGen/GeneratorOptions.cs69
-rw-r--r--csharp/ProtoGen/Helpers.cs78
-rw-r--r--csharp/ProtoGen/IFieldSourceGenerator.cs11
-rw-r--r--csharp/ProtoGen/ISourceGenerator.cs5
-rw-r--r--csharp/ProtoGen/InvalidOptionsException.cs36
-rw-r--r--csharp/ProtoGen/MessageFieldGenerator.cs92
-rw-r--r--csharp/ProtoGen/MessageGenerator.cs453
-rw-r--r--csharp/ProtoGen/PrimitiveFieldGenerator.cs70
-rw-r--r--csharp/ProtoGen/Program.cs47
-rw-r--r--csharp/ProtoGen/Properties/AssemblyInfo.cs42
-rw-r--r--csharp/ProtoGen/Properties/Google.ProtocolBuffers.ProtoGen.snkbin596 -> 0 bytes
-rw-r--r--csharp/ProtoGen/ProtoGen.csproj85
-rw-r--r--csharp/ProtoGen/ProtoGen.csproj.user6
-rw-r--r--csharp/ProtoGen/RepeatedEnumFieldGenerator.cs90
-rw-r--r--csharp/ProtoGen/RepeatedMessageFieldGenerator.cs100
-rw-r--r--csharp/ProtoGen/RepeatedPrimitiveFieldGenerator.cs84
-rw-r--r--csharp/ProtoGen/ServiceGenerator.cs138
-rw-r--r--csharp/ProtoGen/SourceFileGenerator.cs29
-rw-r--r--csharp/ProtoGen/SourceGeneratorBase.cs50
-rw-r--r--csharp/ProtoGen/SourceGenerators.cs42
-rw-r--r--csharp/ProtoGen/UmbrellaClassGenerator.cs96
-rw-r--r--csharp/ProtoGen/app.config3
29 files changed, 0 insertions, 2150 deletions
diff --git a/csharp/ProtoGen/DependencyResolutionException.cs b/csharp/ProtoGen/DependencyResolutionException.cs
deleted file mode 100644
index 4e483fc1..00000000
--- a/csharp/ProtoGen/DependencyResolutionException.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Google.ProtocolBuffers.ProtoGen {
- /// <summary>
- /// Exception thrown when dependencies within a descriptor set can't be resolved.
- /// </summary>
- public sealed class DependencyResolutionException : Exception {
- public DependencyResolutionException(string message) : base(message) {
- }
-
- public DependencyResolutionException(string format, params object[] args)
- : base(string.Format(format, args)) {
- }
- }
-}
diff --git a/csharp/ProtoGen/DescriptorUtil.cs b/csharp/ProtoGen/DescriptorUtil.cs
deleted file mode 100644
index e70ad468..00000000
--- a/csharp/ProtoGen/DescriptorUtil.cs
+++ /dev/null
@@ -1,108 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using Google.ProtocolBuffers.Descriptors;
-using Google.ProtocolBuffers.DescriptorProtos;
-
-namespace Google.ProtocolBuffers.ProtoGen {
- /// <summary>
- /// Utility class for determining namespaces etc.
- /// </summary>
- internal static class DescriptorUtil {
-
- internal static bool NestClasses(IDescriptor descriptor) {
- // Defaults to false
- return descriptor.File.Options.GetExtension(CSharpOptions.CSharpNestClasses);
- }
-
- internal static string GetNamespace(FileDescriptor descriptor) {
- if (descriptor.Name == "google/protobuf/descriptor.proto") {
- return typeof(DescriptorProtoFile).Namespace;
- }
- return descriptor.Options.HasExtension(CSharpOptions.CSharpNamespace) ?
- descriptor.Options.GetExtension(CSharpOptions.CSharpNamespace) : descriptor.Package;
- }
-
- // Groups are hacky: The name of the field is just the lower-cased name
- // of the group type. In C#, though, we would like to retain the original
- // capitalization of the type name.
- internal static string GetFieldName(FieldDescriptor descriptor) {
- if (descriptor.FieldType == FieldType.Group) {
- return descriptor.MessageType.Name;
- } else {
- return descriptor.Name;
- }
- }
-
- internal static string GetClassName(IDescriptor descriptor) {
- return ToCSharpName(descriptor.FullName, descriptor.File);
- }
-
- internal static string GetFullUmbrellaClassName(FileDescriptor descriptor) {
- string result = GetNamespace(descriptor);
- if (result != "") result += '.';
- result += GetUmbrellaClassName(descriptor);
- return "global::" + result;
- }
-
- internal static string GetUmbrellaClassName(FileDescriptor descriptor) {
- if (descriptor.Name == "google/protobuf/descriptor.proto") {
- return typeof(DescriptorProtoFile).Name;
- }
- FileOptions options = descriptor.Options;
- if (options.HasExtension(CSharpOptions.CSharpUmbrellaClassname)) {
- return descriptor.Options.GetExtension(CSharpOptions.CSharpUmbrellaClassname);
- }
- int lastSlash = descriptor.Name.LastIndexOf('/');
- string baseName = descriptor.Name.Substring(lastSlash + 1);
- return Helpers.UnderscoresToPascalCase(StripProto(baseName));
- }
-
- private static string StripProto(string text) {
- if (!Helpers.StripSuffix(ref text, ".protodevel")) {
- Helpers.StripSuffix(ref text, ".proto");
- }
- return text;
- }
-
- private static string ToCSharpName(string name, FileDescriptor file) {
- string result;
- if (!NestClasses(file)) {
- result = GetNamespace(file);
- } else {
- result = GetUmbrellaClassName(file);
- }
- if (result != "") {
- result += '.';
- }
- string classname;
- if (file.Package == "") {
- classname = name;
- } else {
- // Strip the proto package from full_name since we've replaced it with
- // the C# namespace.
- classname = name.Substring(file.Package.Length + 1);
- }
- result += classname.Replace(".", ".Types.");
- return "global::" + result;
- }
-
- internal static string GetMappedTypeName(MappedType type) {
- switch(type) {
- case MappedType.Int32: return "int";
- case MappedType.Int64: return "long";
- case MappedType.UInt32: return "uint";
- case MappedType.UInt64: return "ulong";
- case MappedType.Single: return "float";
- case MappedType.Double: return "double";
- case MappedType.Boolean: return "bool";
- case MappedType.String: return "string";
- case MappedType.ByteString: return "pb::ByteString";
- case MappedType.Enum: return null;
- case MappedType.Message: return null;
- default:
- throw new ArgumentOutOfRangeException("Unknown mapped type " + type);
- }
- }
- }
-}
diff --git a/csharp/ProtoGen/EnumFieldGenerator.cs b/csharp/ProtoGen/EnumFieldGenerator.cs
deleted file mode 100644
index 9f6a56f2..00000000
--- a/csharp/ProtoGen/EnumFieldGenerator.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using Google.ProtocolBuffers.Descriptors;
-
-namespace Google.ProtocolBuffers.ProtoGen {
- internal class EnumFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator {
- internal EnumFieldGenerator(FieldDescriptor descriptor)
- : base(descriptor) {
- }
-
- public void GenerateMembers(TextGenerator writer) {
- writer.WriteLine("private bool has{0};", CapitalizedName);
- writer.WriteLine("private {0} {1}_ = {2};", TypeName, Name, DefaultValue);
- writer.WriteLine("public bool Has{0} {{", CapitalizedName);
- writer.WriteLine(" get {{ return has{0}; }}", CapitalizedName);
- writer.WriteLine("}");
- writer.WriteLine("public {0} {1} {{", TypeName, PropertyName);
- writer.WriteLine(" get {{ return {0}_; }}", Name);
- writer.WriteLine("}");
- }
-
- public void GenerateBuilderMembers(TextGenerator writer) {
- writer.WriteLine("public bool Has{0} {{", CapitalizedName);
- writer.WriteLine(" get {{ return result.Has{0}; }}", CapitalizedName);
- writer.WriteLine("}");
- writer.WriteLine("public {0} {1} {{", TypeName, PropertyName);
- writer.WriteLine(" get {{ return result.{0}; }}", PropertyName);
- writer.WriteLine(" set {{ Set{0}(value); }}", CapitalizedName);
- writer.WriteLine("}");
- writer.WriteLine("public Builder Set{0}({1} value) {{", CapitalizedName, TypeName);
- writer.WriteLine(" result.has{0} = true;", CapitalizedName);
- writer.WriteLine(" result.{0}_ = value;", Name);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- writer.WriteLine("public Builder Clear{0}() {{", CapitalizedName);
- writer.WriteLine(" result.has{0} = false;", CapitalizedName);
- writer.WriteLine(" result.{0}_ = {1};", Name, DefaultValue);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- }
-
- public void GenerateMergingCode(TextGenerator writer) {
- writer.WriteLine("if (other.Has{0}) {{", CapitalizedName);
- writer.WriteLine(" {0} = other.{0};", PropertyName);
- writer.WriteLine("}");
- }
-
- public void GenerateBuildingCode(TextGenerator writer) {
- // Nothing to do here for enum types
- }
-
- public void GenerateParsingCode(TextGenerator writer) {
- // TODO(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);
- 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}) {{", CapitalizedName);
- writer.WriteLine(" output.WriteEnum({0}, (int) {1});", Number, PropertyName);
- writer.WriteLine("}");
- }
-
- public void GenerateSerializedSizeCode(TextGenerator writer) {
- writer.WriteLine("if (Has{0}) {{", CapitalizedName);
- writer.WriteLine(" size += pb::CodedOutputStream.ComputeEnumSize({0}, (int) {1});", Number, PropertyName);
- writer.WriteLine("}");
- }
- }
-}
diff --git a/csharp/ProtoGen/EnumGenerator.cs b/csharp/ProtoGen/EnumGenerator.cs
deleted file mode 100644
index 0de6b89c..00000000
--- a/csharp/ProtoGen/EnumGenerator.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using Google.ProtocolBuffers.Descriptors;
-
-namespace Google.ProtocolBuffers.ProtoGen {
- internal class EnumGenerator : SourceGeneratorBase<EnumDescriptor>, ISourceGenerator {
- internal EnumGenerator(EnumDescriptor descriptor) : base(descriptor) {
- }
-
- public void Generate(TextGenerator writer) {
- writer.WriteLine("{0} enum {1} {{", ClassAccessLevel, Descriptor.Name);
- writer.Indent();
- foreach (EnumValueDescriptor value in Descriptor.Values) {
- writer.WriteLine("{0} = {1},", value.Name, value.Number);
- }
- writer.Outdent();
- writer.WriteLine("}");
- writer.WriteLine();
- }
- }
-}
diff --git a/csharp/ProtoGen/ExtensionGenerator.cs b/csharp/ProtoGen/ExtensionGenerator.cs
deleted file mode 100644
index 9c235456..00000000
--- a/csharp/ProtoGen/ExtensionGenerator.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using Google.ProtocolBuffers.Descriptors;
-
-namespace Google.ProtocolBuffers.ProtoGen {
- internal class ExtensionGenerator : SourceGeneratorBase<FieldDescriptor>, ISourceGenerator {
- internal ExtensionGenerator(FieldDescriptor descriptor) : base(descriptor) {
- }
-
- public void Generate(TextGenerator writer) {
- string name = Helpers.UnderscoresToPascalCase(DescriptorUtil.GetFieldName(Descriptor));
-
- string type;
- switch (Descriptor.MappedType) {
- case MappedType.Message:
- type = DescriptorUtil.GetClassName(Descriptor.MessageType);
- break;
- case MappedType.Enum:
- type = DescriptorUtil.GetClassName(Descriptor.EnumType);
- break;
- default:
- type = DescriptorUtil.GetMappedTypeName(Descriptor.MappedType);
- break;
- }
-
- if (Descriptor.IsRepeated) {
- writer.WriteLine("{0} static readonly", ClassAccessLevel);
- writer.WriteLine(" pb::GeneratedExtensionBase<scg::IList<{0}>> {1} =", type, name);
- writer.WriteLine(" pb::GeneratedRepeatExtension<{0}>.CreateInstance(Descriptor.Extensions[{1}]);", type, Descriptor.Index);
- } else {
- writer.WriteLine("{0} static readonly pb::GeneratedExtensionBase<{1}> {2} =", ClassAccessLevel, type, name);
- writer.WriteLine(" pb::GeneratedSingleExtension<{0}>.CreateInstance(Descriptor.Extensions[{1}]);", type, Descriptor.Index);
- }
- }
- }
-}
diff --git a/csharp/ProtoGen/FieldGeneratorBase.cs b/csharp/ProtoGen/FieldGeneratorBase.cs
deleted file mode 100644
index 9103e0c1..00000000
--- a/csharp/ProtoGen/FieldGeneratorBase.cs
+++ /dev/null
@@ -1,130 +0,0 @@
-using System;
-using Google.ProtocolBuffers.Descriptors;
-using System.Globalization;
-
-namespace Google.ProtocolBuffers.ProtoGen {
- internal abstract class FieldGeneratorBase : SourceGeneratorBase<FieldDescriptor> {
- protected FieldGeneratorBase(FieldDescriptor descriptor)
- : base(descriptor) {
- }
-
- private static bool AllPrintableAscii(string text) {
- foreach (char c in text) {
- if (c < 0x20 || c > 0x7e) {
- return false;
- }
- }
- return true;
- }
-
- protected string DefaultValue {
- get {
- string suffix = "";
- switch (Descriptor.FieldType) {
- case FieldType.Float: suffix = "F"; break;
- case FieldType.Double: suffix = "D"; break;
- case FieldType.Int64: suffix = "L"; break;
- case FieldType.UInt64: suffix = "UL"; break;
- }
- switch (Descriptor.FieldType) {
- case FieldType.Float:
- case FieldType.Double:
- case FieldType.Int32:
- case FieldType.Int64:
- case FieldType.SInt32:
- case FieldType.SInt64:
- case FieldType.SFixed32:
- case FieldType.SFixed64:
- case FieldType.UInt32:
- case FieldType.UInt64:
- case FieldType.Fixed32:
- case FieldType.Fixed64:
- // The simple Object.ToString converts using the current culture.
- // We want to always use the invariant culture so it's predictable.
- IConvertible value = (IConvertible) Descriptor.DefaultValue;
- return value.ToString(CultureInfo.InvariantCulture) + suffix;
- case FieldType.Bool:
- return (bool) Descriptor.DefaultValue ? "true" : "false";
-
- case FieldType.Bytes:
- if (!Descriptor.HasDefaultValue) {
- return "pb::ByteString.Empty";
- }
- return string.Format("(pb::ByteString) {0}.Descriptor.Fields[{1}].DefaultValue", TypeName, Number);
- case FieldType.String:
- if (AllPrintableAscii(Descriptor.Proto.DefaultValue)) {
- // All chars are ASCII and printable. In this case we only
- // need to escape quotes and backslashes.
- return "\"" + Descriptor.Proto.DefaultValue
- .Replace("\\", "\\\\")
- .Replace("'", "\\'")
- .Replace("\"", "\\\"")
- + "\"";
- }
- return string.Format("(string) {0}.Descriptor.Fields[{1}].DefaultValue", TypeName, Number);
- case FieldType.Enum:
- return TypeName + "." + ((EnumValueDescriptor) Descriptor.DefaultValue).Name;
- case FieldType.Message:
- case FieldType.Group:
- return TypeName + ".DefaultInstance";
- default:
- throw new InvalidOperationException("Invalid field descriptor type");
- }
- }
- }
-
- /// <summary>
- /// Usually the same as CapitalizedName, except when the enclosing type has the same name,
- /// in which case an underscore is appended.
- /// </summary>
- protected string PropertyName {
- get {
- string ret = CapitalizedName;
- if (ret == Descriptor.ContainingType.Name) {
- ret += "_";
- }
- return ret;
- }
- }
-
- protected string CapitalizedName {
- get { return Helpers.UnderscoresToPascalCase(DescriptorUtil.GetFieldName(Descriptor)); }
- }
-
- protected string Name {
- get { return Helpers.UnderscoresToCamelCase(DescriptorUtil.GetFieldName(Descriptor)); }
- }
-
- protected int Number {
- get { return Descriptor.FieldNumber; }
- }
-
- protected string TypeName {
- get {
- switch (Descriptor.FieldType) {
- case FieldType.Enum:
- return DescriptorUtil.GetClassName(Descriptor.EnumType);
- case FieldType.Message:
- case FieldType.Group:
- return DescriptorUtil.GetClassName(Descriptor.MessageType);
- default:
- return DescriptorUtil.GetMappedTypeName(Descriptor.MappedType);
- }
- }
- }
-
- protected string MessageOrGroup {
- get { return Descriptor.FieldType == FieldType.Group ? "Group" : "Message"; }
- }
-
- /// <summary>
- /// Returns the type name as used in CodedInputStream method names: SFixed32, UInt32 etc.
- /// </summary>
- protected string CapitalizedTypeName {
- get {
- // Our enum names match perfectly. How serendipitous.
- return Descriptor.FieldType.ToString();
- }
- }
- }
-}
diff --git a/csharp/ProtoGen/Generator.cs b/csharp/ProtoGen/Generator.cs
deleted file mode 100644
index f656386b..00000000
--- a/csharp/ProtoGen/Generator.cs
+++ /dev/null
@@ -1,138 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using Google.ProtocolBuffers.DescriptorProtos;
-using System.IO;
-using Google.ProtocolBuffers.Descriptors;
-using Google.ProtocolBuffers.Collections;
-
-namespace Google.ProtocolBuffers.ProtoGen {
- /// <summary>
- /// Code generator for protocol buffers. Only C# is supported at the moment.
- /// </summary>
- public sealed class Generator {
-
- readonly GeneratorOptions options;
-
- private Generator(GeneratorOptions options) {
- options.Validate();
- this.options = options;
- }
-
- /// <summary>
- /// Returns a generator configured with the specified options.
- /// </summary>
- public static Generator CreateGenerator(GeneratorOptions options) {
- return new Generator(options);
- }
-
- public void Generate() {
- foreach (string inputFile in options.InputFiles) {
- FileDescriptorSet descriptorProtos;
- ExtensionRegistry extensionRegistry = ExtensionRegistry.CreateInstance();
- extensionRegistry.Add(CSharpOptions.CSharpUmbrellaClassname);
- extensionRegistry.Add(CSharpOptions.CSharpMultipleFiles);
- extensionRegistry.Add(CSharpOptions.CSharpNamespace);
- extensionRegistry.Add(CSharpOptions.CSharpNestClasses);
- extensionRegistry.Add(CSharpOptions.CSharpPublicClasses);
- using (Stream inputStream = File.OpenRead(inputFile)) {
- descriptorProtos = FileDescriptorSet.ParseFrom(inputStream, extensionRegistry);
- }
- IList<FileDescriptor> descriptors = ConvertDescriptors(descriptorProtos);
-
- foreach (FileDescriptor descriptor in descriptors) {
- Generate(descriptor);
- }
- }
- }
-
- /// <summary>
- /// Generates code for a particular file. All dependencies must
- /// already have been resolved.
- /// </summary>
- private void Generate(FileDescriptor descriptor) {
- string umbrellaClass = DescriptorUtil.GetUmbrellaClassName(descriptor);
- string ns = DescriptorUtil.GetNamespace(descriptor);
- using (TextWriter textWriter = File.CreateText(Path.Combine(options.OutputDirectory, umbrellaClass + ".cs"))) {
- TextGenerator writer = new TextGenerator(textWriter);
-
- UmbrellaClassGenerator ucg = new UmbrellaClassGenerator(descriptor);
- ucg.Generate(writer);
- /*
- GenerateSiblings(umbrellaSource, descriptor, descriptor.MessageTypes);
- GenerateSiblings(umbrellaSource, descriptor, descriptor.EnumTypes);
- GenerateSiblings(umbrellaSource, descriptor, descriptor.Services);*/
- }
- }
-
- private static void GenerateSiblings<T>(SourceFileGenerator parentSourceGenerator, FileDescriptor file, IEnumerable<T> siblings)
- where T : IDescriptor {
- }
-
- /// <summary>
- /// Resolves any dependencies and converts FileDescriptorProtos into FileDescriptors.
- /// The list returned is in the same order as the protos are listed in the descriptor set.
- /// Note: this method is internal rather than private to allow testing.
- /// </summary>
- /// <exception cref="DependencyResolutionException">Not all dependencies could be resolved.</exception>
- internal static IList<FileDescriptor> ConvertDescriptors(FileDescriptorSet descriptorProtos) {
- // Simple strategy: Keep going through the list of protos to convert, only doing ones where
- // we've already converted all the dependencies, until we get to a stalemate
- IList<FileDescriptorProto> fileList = descriptorProtos.FileList;
- FileDescriptor[] converted = new FileDescriptor[fileList.Count];
-
- Dictionary<string, FileDescriptor> convertedMap = new Dictionary<string, FileDescriptor>();
-
- int totalConverted = 0;
-
- bool madeProgress = true;
- while (madeProgress && totalConverted < converted.Length) {
- madeProgress = false;
- for (int i = 0; i < converted.Length; i++) {
- if (converted[i] != null) {
- // Already done this one
- continue;
- }
- FileDescriptorProto candidate = fileList[i];
- FileDescriptor[] dependencies = new FileDescriptor[candidate.DependencyList.Count];
- bool foundAllDependencies = true;
- for (int j = 0; j < dependencies.Length; j++) {
- if (!convertedMap.TryGetValue(candidate.DependencyList[j], out dependencies[j])) {
- foundAllDependencies = false;
- break;
- }
- }
- if (!foundAllDependencies) {
- continue;
- }
- madeProgress = true;
- totalConverted++;
- converted[i] = FileDescriptor.BuildFrom(candidate, dependencies);
- convertedMap[candidate.Name] = converted[i];
- }
- }
- if (!madeProgress) {
- StringBuilder remaining = new StringBuilder();
- for (int i = 0; i < converted.Length; i++) {
- if (converted[i] == null) {
- if (remaining.Length != 0) {
- remaining.Append(", ");
- }
- FileDescriptorProto failure = fileList[i];
- remaining.Append(failure.Name);
- remaining.Append(":");
- foreach (string dependency in failure.DependencyList) {
- if (!convertedMap.ContainsKey(dependency)) {
- remaining.Append(" ");
- remaining.Append(dependency);
- }
- }
- remaining.Append(";");
- }
- }
- throw new DependencyResolutionException("Unable to resolve all dependencies: " + remaining);
- }
- return Lists.AsReadOnly(converted);
- }
- }
-}
diff --git a/csharp/ProtoGen/GeneratorOptions.cs b/csharp/ProtoGen/GeneratorOptions.cs
deleted file mode 100644
index c37352ed..00000000
--- a/csharp/ProtoGen/GeneratorOptions.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-using System.Collections.Generic;
-using System.IO;
-
-namespace Google.ProtocolBuffers.ProtoGen {
-
- /// <summary>
- /// All the configuration required for the generator - where to generate
- /// output files, the location of input files etc. While this isn't immutable
- /// in practice, the contents shouldn't be changed after being passed to
- /// the generator.
- /// </summary>
- public sealed class GeneratorOptions {
-
- public string OutputDirectory { get; set; }
- public IList<string> InputFiles { get; set; }
-
- /// <summary>
- /// Attempts to validate the options, but doesn't throw an exception if they're invalid.
- /// Instead, when this method returns false, the output variable will contain a collection
- /// of reasons for the validation failure.
- /// </summary>
- /// <param name="reasons">Variable to receive a list of reasons in case of validation failure.</param>
- /// <returns>true if the options are valid; false otherwise</returns>
- public bool TryValidate(out IList<string> reasons) {
- List<string> tmpReasons = new List<string>();
-
- // Output directory validation
- if (string.IsNullOrEmpty(OutputDirectory)) {
- tmpReasons.Add("No output directory specified");
- } else {
- if (!Directory.Exists(OutputDirectory)) {
- tmpReasons.Add("Specified output directory (" + OutputDirectory + " doesn't exist.");
- }
- }
-
- // Input file validation (just in terms of presence)
- if (InputFiles == null || InputFiles.Count == 0) {
- tmpReasons.Add("No input files specified");
- } else {
- foreach (string input in InputFiles) {
- FileInfo fi = new FileInfo(input);
- if (!fi.Exists) {
- tmpReasons.Add("Input file " + input + " doesn't exist.");
- }
- }
- }
-
- if (tmpReasons.Count != 0) {
- reasons = tmpReasons;
- return false;
- }
-
- reasons = null;
- return true;
- }
-
- /// <summary>
- /// Validates that all the options have been set and are valid,
- /// throwing an exception if they haven't.
- /// </summary>
- /// <exception cref="InvalidOptionsException">The options are invalid.</exception>
- public void Validate() {
- IList<string> reasons;
- if (!TryValidate(out reasons)) {
- throw new InvalidOptionsException(reasons);
- }
- }
- }
-}
diff --git a/csharp/ProtoGen/Helpers.cs b/csharp/ProtoGen/Helpers.cs
deleted file mode 100644
index 79a2912c..00000000
--- a/csharp/ProtoGen/Helpers.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-using System;
-using System.Text;
-using Google.ProtocolBuffers.DescriptorProtos;
-using Google.ProtocolBuffers.Descriptors;
-namespace Google.ProtocolBuffers.ProtoGen {
-
- /// <summary>
- /// Helpers to resolve class names etc.
- /// </summary>
- internal static class Helpers {
- internal static string UnderscoresToPascalCase(string input) {
- return UnderscoresToPascalOrCamelCase(input, true);
- }
-
- internal static string UnderscoresToCamelCase(string input) {
- return UnderscoresToPascalOrCamelCase(input, false);
- }
-
- internal static void WriteNamespaces(TextGenerator writer) {
- writer.WriteLine("using pb = global::Google.ProtocolBuffers;");
- writer.WriteLine("using pbc = global::Google.ProtocolBuffers.Collections;");
- writer.WriteLine("using pbd = global::Google.ProtocolBuffers.Descriptors;");
- writer.WriteLine("using scg = global::System.Collections.Generic;");
- }
-
- /// <summary>
- /// Converts a string to Pascal or Camel case. The first letter is capitalized or
- /// lower-cased depending on <paramref name="pascal"/> is true.
- /// After the first letter, any punctuation is removed but triggers capitalization
- /// of the next letter. Digits are preserved but trigger capitalization of the next
- /// letter.
- /// All capitalisation is done in the invariant culture.
- /// </summary>
- private static string UnderscoresToPascalOrCamelCase(string input, bool pascal) {
- StringBuilder result = new StringBuilder();
- bool capitaliseNext = pascal;
- for (int i=0; i < input.Length; i++) {
- char c = input[i];
- if ('a' <= c && c <= 'z') {
- if (capitaliseNext) {
- result.Append(char.ToUpperInvariant(c));
- } else {
- result.Append(c);
- }
- capitaliseNext = false;
- } else if ('A' <= c && c <= 'Z') {
- if (i == 0 && !pascal) {
- // Force first letter to lower-case unless explicitly told to
- // capitalize it.
- result.Append(char.ToLowerInvariant(c));
- } else {
- // Capital letters after the first are left as-is.
- result.Append(c);
- }
- capitaliseNext = false;
- } else if ('0' <= c && c <= '9') {
- result.Append(c);
- capitaliseNext = true;
- } else {
- capitaliseNext = true;
- }
- }
- return result.ToString();
- }
-
- /// <summary>
- /// Attempts to strip a suffix from a string, returning whether
- /// or not the suffix was actually present.
- /// </summary>
- internal static bool StripSuffix(ref string text, string suffix) {
- if (text.EndsWith(suffix)) {
- text = text.Substring(0, text.Length - suffix.Length);
- return true;
- }
- return false;
- }
- }
-}
diff --git a/csharp/ProtoGen/IFieldSourceGenerator.cs b/csharp/ProtoGen/IFieldSourceGenerator.cs
deleted file mode 100644
index a64043c8..00000000
--- a/csharp/ProtoGen/IFieldSourceGenerator.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-namespace Google.ProtocolBuffers.ProtoGen {
- internal interface IFieldSourceGenerator {
- void GenerateMembers(TextGenerator writer);
- void GenerateBuilderMembers(TextGenerator writer);
- void GenerateMergingCode(TextGenerator writer);
- void GenerateBuildingCode(TextGenerator writer);
- void GenerateParsingCode(TextGenerator writer);
- void GenerateSerializationCode(TextGenerator writer);
- void GenerateSerializedSizeCode(TextGenerator writer);
- }
-}
diff --git a/csharp/ProtoGen/ISourceGenerator.cs b/csharp/ProtoGen/ISourceGenerator.cs
deleted file mode 100644
index 16e7c29a..00000000
--- a/csharp/ProtoGen/ISourceGenerator.cs
+++ /dev/null
@@ -1,5 +0,0 @@
-namespace Google.ProtocolBuffers.ProtoGen {
- internal interface ISourceGenerator {
- void Generate(TextGenerator writer);
- }
-}
diff --git a/csharp/ProtoGen/InvalidOptionsException.cs b/csharp/ProtoGen/InvalidOptionsException.cs
deleted file mode 100644
index aee03228..00000000
--- a/csharp/ProtoGen/InvalidOptionsException.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using Google.ProtocolBuffers.Collections;
-
-namespace Google.ProtocolBuffers.ProtoGen {
- /// <summary>
- /// Exception thrown to indicate that the options passed were invalid.
- /// </summary>
- public sealed class InvalidOptionsException : Exception {
-
- private readonly IList<string> reasons;
-
- /// <summary>
- /// An immutable list of reasons why the options were invalid.
- /// </summary>
- public IList<string> Reasons {
- get { return reasons; }
- }
-
- public InvalidOptionsException(IList<string> reasons)
- : base(BuildMessage(reasons)) {
- this.reasons = Lists.AsReadOnly(reasons);
- }
-
- private static string BuildMessage(IEnumerable<string> reasons) {
- StringBuilder builder = new StringBuilder("Invalid options:");
- builder.AppendLine();
- foreach (string reason in reasons) {
- builder.Append(" ");
- builder.AppendLine(reason);
- }
- return builder.ToString();
- }
- }
-}
diff --git a/csharp/ProtoGen/MessageFieldGenerator.cs b/csharp/ProtoGen/MessageFieldGenerator.cs
deleted file mode 100644
index c73edfc0..00000000
--- a/csharp/ProtoGen/MessageFieldGenerator.cs
+++ /dev/null
@@ -1,92 +0,0 @@
-using Google.ProtocolBuffers.Descriptors;
-
-namespace Google.ProtocolBuffers.ProtoGen {
- internal class MessageFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator {
-
- internal MessageFieldGenerator(FieldDescriptor descriptor)
- : base(descriptor) {
- }
-
- public void GenerateMembers(TextGenerator writer) {
- writer.WriteLine("private bool has{0};", CapitalizedName);
- writer.WriteLine("private {0} {1}_ = {2};", TypeName, Name, DefaultValue);
- writer.WriteLine("public bool Has{0} {{", CapitalizedName);
- writer.WriteLine(" get {{ return has{0}; }}", CapitalizedName);
- writer.WriteLine("}");
- writer.WriteLine("public {0} {1} {{", TypeName, CapitalizedName);
- writer.WriteLine(" get {{ return {0}_; }}", Name);
- writer.WriteLine("}");
- }
-
- public void GenerateBuilderMembers(TextGenerator writer) {
- writer.WriteLine("public bool Has{0} {{", CapitalizedName);
- writer.WriteLine(" get {{ return result.Has{0}; }}", CapitalizedName);
- writer.WriteLine("}");
- writer.WriteLine("public {0} {1} {{", TypeName, CapitalizedName);
- writer.WriteLine(" get {{ return result.{0}; }}", CapitalizedName);
- writer.WriteLine(" set {{ Set{0}(value); }}", CapitalizedName);
- writer.WriteLine("}");
- writer.WriteLine("public Builder Set{0}({1} value) {{", CapitalizedName, TypeName);
- writer.WriteLine(" result.has{0} = true;", CapitalizedName);
- writer.WriteLine(" result.{0}_ = value;", Name);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- writer.WriteLine("public Builder Set{0}({1}.Builder builderForValue) {{", CapitalizedName, TypeName);
- writer.WriteLine(" result.has{0} = true;", CapitalizedName);
- writer.WriteLine(" result.{0}_ = builderForValue.Build();", Name);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- writer.WriteLine("public Builder Merge{0}({1} value) {{", CapitalizedName, TypeName);
- writer.WriteLine(" if (result.Has{0} &&", CapitalizedName);
- writer.WriteLine(" result.{0}_ != {1}) {{", Name, DefaultValue);
- writer.WriteLine(" result.{0}_ = {1}.CreateBuilder(result.{0}_).MergeFrom(value).BuildPartial();", Name, TypeName);
- writer.WriteLine(" } else {");
- writer.WriteLine(" result.{0}_ = value;", Name);
- writer.WriteLine(" }");
- writer.WriteLine(" result.has{0} = true;", CapitalizedName);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- writer.WriteLine("public Builder Clear{0}() {{", CapitalizedName);
- writer.WriteLine(" result.has{0} = false;", CapitalizedName);
- writer.WriteLine(" result.{0}_ = {1};", Name, DefaultValue);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- }
-
- public void GenerateMergingCode(TextGenerator writer) {
- writer.WriteLine("if (other.Has{0}) {{", CapitalizedName);
- writer.WriteLine(" Merge{0}(other.{0});", CapitalizedName);
- writer.WriteLine("}");
- }
-
- public void GenerateBuildingCode(TextGenerator writer) {
- // Nothing to do for singular fields
- }
-
- public void GenerateParsingCode(TextGenerator writer) {
- writer.WriteLine("{0}.Builder subBuilder = {0}.CreateBuilder();", TypeName);
- writer.WriteLine("if (Has{0}) {{", CapitalizedName);
- writer.WriteLine(" subBuilder.MergeFrom({0});", CapitalizedName);
- writer.WriteLine("}");
- if (Descriptor.FieldType == FieldType.Group) {
- writer.WriteLine("input.ReadGroup({0}, subBuilder, extensionRegistry);", Number);
- } else {
- writer.WriteLine("input.ReadMessage(subBuilder, extensionRegistry);");
- }
- writer.WriteLine("{0} = subBuilder.BuildPartial();", CapitalizedName);
- }
-
- public void GenerateSerializationCode(TextGenerator writer) {
- writer.WriteLine("if (Has{0}) {{", CapitalizedName);
- writer.WriteLine(" output.Write{0}({1}, {2});", MessageOrGroup, Number, CapitalizedName);
- writer.WriteLine("}");
- }
-
- public void GenerateSerializedSizeCode(TextGenerator writer) {
- writer.WriteLine("if (Has{0}) {{", CapitalizedName);
- writer.WriteLine(" size += pb::CodedOutputStream.Compute{0}Size({1}, {2});",
- MessageOrGroup, Number, CapitalizedName);
- writer.WriteLine("}");
- }
- }
-}
diff --git a/csharp/ProtoGen/MessageGenerator.cs b/csharp/ProtoGen/MessageGenerator.cs
deleted file mode 100644
index ba48c85c..00000000
--- a/csharp/ProtoGen/MessageGenerator.cs
+++ /dev/null
@@ -1,453 +0,0 @@
-using System.Collections;
-using Google.ProtocolBuffers.Descriptors;
-using Google.ProtocolBuffers.DescriptorProtos;
-using System.Collections.Generic;
-
-using ExtensionRange = Google.ProtocolBuffers.DescriptorProtos.DescriptorProto.Types.ExtensionRange;
-
-namespace Google.ProtocolBuffers.ProtoGen {
- internal class MessageGenerator : SourceGeneratorBase<MessageDescriptor>, ISourceGenerator {
- internal MessageGenerator(MessageDescriptor descriptor) : base(descriptor) {
- }
-
- private string ClassName {
- get { return Descriptor.Name; }
- }
-
- private string FullClassName {
- get { return DescriptorUtil.GetClassName(Descriptor); }
- }
-
- /// <summary>
- /// Get an identifier that uniquely identifies this type within the file.
- /// This is used to declare static variables related to this type at the
- /// outermost file scope.
- /// </summary>
- static string GetUniqueFileScopeIdentifier(IDescriptor descriptor) {
- return "static_" + descriptor.FullName.Replace(".", "_");
- }
-
- internal void GenerateStaticVariables(TextGenerator writer) {
- // Because descriptor.proto (Google.ProtocolBuffers.DescriptorProtos) is
- // used in the construction of descriptors, we have a tricky bootstrapping
- // problem. To help control static initialization order, we make sure all
- // descriptors and other static data that depends on them are members of
- // the proto-descriptor class. This way, they will be initialized in
- // a deterministic order.
-
- string identifier = GetUniqueFileScopeIdentifier(Descriptor);
-
- // The descriptor for this type.
- string access = Descriptor.File.Options.GetExtension(CSharpOptions.CSharpNestClasses) ? "private" : "internal";
- writer.WriteLine("{0} static readonly pbd::MessageDescriptor internal__{1}__Descriptor", access, identifier);
- if (Descriptor.ContainingType == null) {
- writer.WriteLine(" = Descriptor.MessageTypes[{0}];", Descriptor.Index);
- } else {
- writer.WriteLine(" = internal__{0}__Descriptor.NestedTypes[{1}];", GetUniqueFileScopeIdentifier(Descriptor.ContainingType), Descriptor.Index);
- }
- writer.WriteLine("{0} static pb::FieldAccess.FieldAccessorTable<{1}, {1}.Builder> internal__{2}__FieldAccessorTable",
- access, FullClassName, identifier);
- writer.WriteLine(" = new pb::FieldAccess.FieldAccessorTable<{0}, {0}.Builder>(internal__{1}__Descriptor,",
- FullClassName, identifier);
- writer.Print(" new string[] { ");
- foreach (FieldDescriptor field in Descriptor.Fields) {
- writer.Write("\"{0}\", ", Helpers.UnderscoresToPascalCase(DescriptorUtil.GetFieldName(field)));
- }
- writer.WriteLine("});");
-
- // Generate static members for all nested types.
- foreach (MessageDescriptor nestedMessage in Descriptor.NestedTypes) {
- new MessageGenerator(nestedMessage).GenerateStaticVariables(writer);
- }
- }
-
- public void Generate(TextGenerator writer) {
- writer.WriteLine("{0} sealed partial class {1} : pb::{2}Message<{1}, {1}.Builder> {{",
- ClassAccessLevel, ClassName, Descriptor.Proto.ExtensionRangeCount > 0 ? "Extendable" : "Generated");
- 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);
- writer.WriteLine("public static {0} DefaultInstance {{", ClassName);
- writer.WriteLine(" get { return defaultInstance; }");
- writer.WriteLine("}");
- writer.WriteLine();
- writer.WriteLine("public override {0} DefaultInstanceForType {{", ClassName);
- writer.WriteLine(" get { return defaultInstance; }");
- writer.WriteLine("}");
- writer.WriteLine();
- writer.WriteLine("protected override {0} ThisMessage {{", ClassName);
- writer.WriteLine(" get { return this; }");
- writer.WriteLine("}");
- writer.WriteLine();
- writer.WriteLine("public static pbd::MessageDescriptor Descriptor {");
- writer.WriteLine(" get {{ return {0}.internal__{1}__Descriptor; }}", DescriptorUtil.GetFullUmbrellaClassName(Descriptor.File),
- GetUniqueFileScopeIdentifier(Descriptor));
- writer.WriteLine("}");
- writer.WriteLine();
- writer.WriteLine("protected override pb::FieldAccess.FieldAccessorTable<{0}, {0}.Builder> InternalFieldAccessors {{", ClassName);
- writer.WriteLine(" get {{ return {0}.internal__{1}__FieldAccessorTable; }}", DescriptorUtil.GetFullUmbrellaClassName(Descriptor.File),
- GetUniqueFileScopeIdentifier(Descriptor));
- writer.WriteLine("}");
- writer.WriteLine();
-
- // Extensions don't need to go in an extra nested type
- WriteChildren(writer, null, Descriptor.Extensions);
-
- if (Descriptor.EnumTypes.Count + Descriptor.NestedTypes.Count > 0) {
- writer.WriteLine("#region Nested types");
- writer.WriteLine("public static class Types {");
- writer.Indent();
- WriteChildren(writer, null, Descriptor.EnumTypes);
- WriteChildren(writer, null, Descriptor.NestedTypes);
- writer.Outdent();
- writer.WriteLine("}");
- writer.WriteLine("#endregion");
- writer.WriteLine();
- }
-
- foreach(FieldDescriptor fieldDescriptor in Descriptor.Fields) {
- // Rats: we lose the debug comment here :(
- SourceGenerators.CreateFieldGenerator(fieldDescriptor).GenerateMembers(writer);
- writer.WriteLine();
- }
-
- if (Descriptor.File.Options.OptimizeFor == FileOptions.Types.OptimizeMode.SPEED) {
- GenerateIsInitialized(writer);
- GenerateMessageSerializationMethods(writer);
- }
-
- GenerateParseFromMethods(writer);
- GenerateBuilder(writer);
- }
-
- private void GenerateMessageSerializationMethods(TextGenerator writer) {
- List<FieldDescriptor> sortedFields = new List<FieldDescriptor>(Descriptor.Fields);
- sortedFields.Sort((f1, f2) => f1.FieldNumber.CompareTo(f2.FieldNumber));
-
- List<ExtensionRange> sortedExtensions = new List<ExtensionRange>(Descriptor.Proto.ExtensionRangeList);
- sortedExtensions.Sort((r1, r2) => (r1.Start.CompareTo(r2.Start)));
-
- writer.WriteLine("public override void WriteTo(pb::CodedOutputStream output) {");
- writer.Indent();
- if (Descriptor.Proto.ExtensionRangeList.Count > 0) {
- writer.WriteLine("pb::ExtendableMessage<{0}, {0}.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);",
- ClassName);
- }
-
- // Merge the fields and the extension ranges, both sorted by field number.
- for (int i = 0, j = 0; i < Descriptor.Fields.Count || j < sortedExtensions.Count; ) {
- if (i == Descriptor.Fields.Count) {
- GenerateSerializeOneExtensionRange(writer, sortedExtensions[j++]);
- } else if (j == sortedExtensions.Count) {
- GenerateSerializeOneField(writer, sortedFields[i++]);
- } else if (sortedFields[i].FieldNumber < sortedExtensions[j].Start) {
- GenerateSerializeOneField(writer, sortedFields[i++]);
- } else {
- GenerateSerializeOneExtensionRange(writer, sortedExtensions[j++]);
- }
- }
-
- if (Descriptor.Proto.Options.MessageSetWireFormat) {
- writer.WriteLine("UnknownFields.WriteAsMessageSetTo(output);");
- } else {
- writer.WriteLine("UnknownFields.WriteTo(output);");
- }
-
- writer.Outdent();
- writer.WriteLine("}");
- writer.WriteLine();
- writer.WriteLine("private int memoizedSerializedSize = -1;");
- writer.WriteLine("public override int SerializedSize {");
- writer.Indent();
- writer.WriteLine("get {");
- writer.Indent();
- writer.WriteLine("int size = memoizedSerializedSize;");
- writer.WriteLine("if (size != -1) return size;");
- writer.WriteLine();
- writer.WriteLine("size = 0;");
- foreach (FieldDescriptor field in Descriptor.Fields) {
- SourceGenerators.CreateFieldGenerator(field).GenerateSerializedSizeCode(writer);
- }
- if (Descriptor.Proto.ExtensionRangeCount > 0) {
- writer.WriteLine("size += ExtensionsSerializedSize;");
- }
-
- if (Descriptor.Options.MessageSetWireFormat) {
- writer.WriteLine("size += UnknownFields.SerializedSizeAsMessageSet;");
- } else {
- writer.WriteLine("size += UnknownFields.SerializedSize;");
- }
- writer.WriteLine("memoizedSerializedSize = size;");
- writer.WriteLine("return size;");
- writer.Outdent();
- writer.WriteLine("}");
- writer.Outdent();
- writer.WriteLine("}");
- writer.WriteLine();
- }
-
- private static void GenerateSerializeOneField(TextGenerator writer, FieldDescriptor fieldDescriptor) {
- SourceGenerators.CreateFieldGenerator(fieldDescriptor).GenerateSerializationCode(writer);
- }
-
- private static void GenerateSerializeOneExtensionRange(TextGenerator writer, ExtensionRange extensionRange) {
- writer.WriteLine("extensionWriter.WriteUntil({0}, output);", extensionRange.End);
- }
-
- private void GenerateParseFromMethods(TextGenerator writer) {
- // Note: These are separate from GenerateMessageSerializationMethods()
- // because they need to be generated even for messages that are optimized
- // for code size.
-
- writer.WriteLine("public static {0} ParseFrom(pb::ByteString data) {{", ClassName);
- writer.WriteLine(" return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();");
- writer.WriteLine("}");
- writer.WriteLine("public static {0} ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {{", ClassName);
- writer.WriteLine(" return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();");
- writer.WriteLine("}");
- writer.WriteLine("public static {0} ParseFrom(byte[] data) {{", ClassName);
- writer.WriteLine(" return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();");
- writer.WriteLine("}");
- writer.WriteLine("public static {0} ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {{", ClassName);
- writer.WriteLine(" return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();");
- writer.WriteLine("}");
- writer.WriteLine("public static {0} ParseFrom(global::System.IO.Stream input) {{", ClassName);
- writer.WriteLine(" return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();");
- writer.WriteLine("}");
- writer.WriteLine("public static {0} ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {{", ClassName);
- writer.WriteLine(" return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();");
- writer.WriteLine("}");
- writer.WriteLine("public static {0} ParseFrom(pb::CodedInputStream input) {{", ClassName);
- writer.WriteLine(" return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();");
- writer.WriteLine("}");
- writer.WriteLine("public static {0} ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {{", ClassName);
- writer.WriteLine(" return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();");
- writer.WriteLine("}");
- }
-
- /// <summary>
- /// Returns whether or not the specified message type has any required fields.
- /// If it doesn't, calls to check for initialization can be optimised.
- /// TODO(jonskeet): Move this into MessageDescriptor?
- /// </summary>
- private static bool HasRequiredFields(MessageDescriptor descriptor, Dictionary<MessageDescriptor,object> alreadySeen) {
- if (alreadySeen.ContainsKey(descriptor)) {
- // The type is already in cache. This means that either:
- // a. The type has no required fields.
- // b. We are in the midst of checking if the type has required fields,
- // somewhere up the stack. In this case, we know that if the type
- // has any required fields, they'll be found when we return to it,
- // and the whole call to HasRequiredFields() will return true.
- // Therefore, we don't have to check if this type has required fields
- // here.
- return false;
- }
- alreadySeen[descriptor] = descriptor; // Value is irrelevant
-
- // If the type has extensions, an extension with message type could contain
- // required fields, so we have to be conservative and assume such an
- // extension exists.
- if (descriptor.Extensions.Count > 0) {
- return true;
- }
-
- foreach (FieldDescriptor field in descriptor.Fields) {
- if (field.IsRequired) {
- return true;
- }
- // Message or group
- if (field.MappedType == MappedType.Message) {
- if (HasRequiredFields(field.MessageType, alreadySeen)) {
- return true;
- }
- }
- }
- return false;
- }
-
- private void GenerateBuilder(TextGenerator writer) {
- writer.WriteLine("public static Builder CreateBuilder() { return new Builder(); }");
- writer.WriteLine("public override Builder CreateBuilderForType() { return new Builder(); }");
- writer.WriteLine("public static Builder CreateBuilder({0} prototype) {{", ClassName);
- writer.WriteLine(" return (Builder) new Builder().MergeFrom(prototype);");
- writer.WriteLine("}");
- writer.WriteLine();
- writer.WriteLine("{0} sealed partial class Builder : pb::{2}Builder<{1}, Builder> {{",
- ClassAccessLevel, ClassName, Descriptor.Proto.ExtensionRangeCount > 0 ? "Extendable" : "Generated");
- writer.Indent();
- writer.WriteLine("protected override Builder ThisBuilder {");
- writer.WriteLine(" get { return this; }");
- writer.WriteLine("}");
- GenerateCommonBuilderMethods(writer);
- if (Descriptor.File.Options.OptimizeFor == FileOptions.Types.OptimizeMode.SPEED) {
- GenerateBuilderParsingMethods(writer);
- }
- foreach (FieldDescriptor field in Descriptor.Fields) {
- writer.WriteLine();
- // No field comment :(
- SourceGenerators.CreateFieldGenerator(field).GenerateBuilderMembers(writer);
- }
- writer.Outdent();
- writer.WriteLine("}");
- writer.Outdent();
- writer.WriteLine("}");
- writer.WriteLine();
- }
-
- private void GenerateCommonBuilderMethods(TextGenerator writer) {
- writer.WriteLine("{0} Builder() {{}}", ClassAccessLevel);
- writer.WriteLine();
- writer.WriteLine("{0} result = new {0}();", ClassName);
- writer.WriteLine();
- writer.WriteLine("protected override {0} MessageBeingBuilt {{", ClassName);
- writer.WriteLine(" get { return result; }");
- writer.WriteLine("}");
- writer.WriteLine();
- writer.WriteLine("public override Builder Clear() {");
- writer.WriteLine(" result = new {0}();", ClassName);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- writer.WriteLine();
- writer.WriteLine("public override Builder Clone() {");
- writer.WriteLine(" return new Builder().MergeFrom(result);");
- writer.WriteLine("}");
- writer.WriteLine();
- writer.WriteLine("public override pbd::MessageDescriptor DescriptorForType {");
- writer.WriteLine(" get {{ return {0}.Descriptor; }}", ClassName);
- writer.WriteLine("}");
- writer.WriteLine();
- writer.WriteLine("public override {0} DefaultInstanceForType {{", ClassName);
- writer.WriteLine(" get {{ return {0}.DefaultInstance; }}", ClassName);
- writer.WriteLine("}");
- writer.WriteLine();
-
- writer.WriteLine("public override {0} BuildPartial() {{", ClassName);
- writer.Indent();
- foreach (FieldDescriptor field in Descriptor.Fields) {
- SourceGenerators.CreateFieldGenerator(field).GenerateBuildingCode(writer);
- }
- writer.WriteLine("{0} returnMe = result;", ClassName);
- writer.WriteLine("result = null;");
- writer.WriteLine("return returnMe;");
- writer.Outdent();
- writer.WriteLine("}");
- writer.WriteLine();
-
- if (Descriptor.File.Options.OptimizeFor == FileOptions.Types.OptimizeMode.SPEED) {
- writer.WriteLine("public override Builder MergeFrom(pb::IMessage other) {");
- writer.WriteLine(" if (other is {0}) {{", ClassName);
- writer.WriteLine(" return MergeFrom(({0}) other);", ClassName);
- writer.WriteLine(" } else {");
- writer.WriteLine(" base.MergeFrom(other);");
- writer.WriteLine(" return this;");
- writer.WriteLine(" }");
- writer.WriteLine("}");
- writer.WriteLine();
- writer.WriteLine("public override Builder MergeFrom({0} other) {{", ClassName);
- // Optimization: If other is the default instance, we know none of its
- // fields are set so we can skip the merge.
- writer.Indent();
- writer.WriteLine("if (other == {0}.DefaultInstance) return this;", ClassName);
- foreach (FieldDescriptor field in Descriptor.Fields) {
- SourceGenerators.CreateFieldGenerator(field).GenerateMergingCode(writer);
- }
- writer.WriteLine("this.MergeUnknownFields(other.UnknownFields);");
- writer.WriteLine("return this;");
- writer.Outdent();
- writer.WriteLine("}");
- writer.WriteLine();
- }
- }
-
- private void GenerateBuilderParsingMethods(TextGenerator writer) {
- List<FieldDescriptor> sortedFields = new List<FieldDescriptor>(Descriptor.Fields);
- sortedFields.Sort((f1, f2) => f1.FieldNumber.CompareTo(f2.FieldNumber));
-
- writer.WriteLine("public override Builder MergeFrom(pb::CodedInputStream input) {");
- writer.WriteLine(" return MergeFrom(input, pb::ExtensionRegistry.Empty);");
- writer.WriteLine("}");
- writer.WriteLine();
- writer.WriteLine("public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {");
- writer.Indent();
- writer.WriteLine("pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);");
- writer.WriteLine("while (true) {");
- writer.Indent();
- writer.WriteLine("uint tag = input.ReadTag();");
- writer.WriteLine("switch (tag) {");
- writer.Indent();
- writer.WriteLine("case 0: {"); // 0 signals EOF / limit reached
- writer.WriteLine(" this.UnknownFields = unknownFields.Build();");
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- writer.WriteLine("default: {");
- writer.WriteLine(" if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {");
- writer.WriteLine(" this.UnknownFields = unknownFields.Build();");
- writer.WriteLine(" return this;"); // it's an endgroup tag
- writer.WriteLine(" }");
- writer.WriteLine(" break;");
- writer.WriteLine("}");
- foreach (FieldDescriptor field in sortedFields) {
- uint tag = WireFormat.MakeTag(field.FieldNumber, WireFormat.GetWireType(field.FieldType));
- writer.WriteLine("case {0}: {{", tag);
- writer.Indent();
- SourceGenerators.CreateFieldGenerator(field).GenerateParsingCode(writer);
- writer.WriteLine("break;");
- writer.Outdent();
- writer.WriteLine("}");
- }
- writer.Outdent();
- writer.WriteLine("}");
- writer.Outdent();
- writer.WriteLine("}");
- writer.Outdent();
- writer.WriteLine("}");
- writer.WriteLine();
- }
-
- private void GenerateIsInitialized(TextGenerator writer) {
- writer.WriteLine("public override bool IsInitialized {");
- writer.Indent();
- writer.WriteLine("get {");
- writer.Indent();
-
- // Check that all required fields in this message are set.
- // TODO(kenton): We can optimize this when we switch to putting all the
- // "has" fields into a single bitfield.
- foreach (FieldDescriptor field in Descriptor.Fields) {
- if (field.IsRequired) {
- writer.WriteLine("if (!has{0}) return false;", Helpers.UnderscoresToPascalCase(field.Name));
- }
- }
-
- // Now check that all embedded messages are initialized.
- foreach (FieldDescriptor field in Descriptor.Fields) {
- if (field.FieldType != FieldType.Message ||
- !HasRequiredFields(field.MessageType, new Dictionary<MessageDescriptor, object>())) {
- continue;
- }
- string propertyName = Helpers.UnderscoresToPascalCase(DescriptorUtil.GetFieldName(field));
- if (field.IsRepeated) {
- writer.WriteLine("foreach ({0} element in {1}List) {{", DescriptorUtil.GetClassName(field.MessageType), propertyName);
- writer.WriteLine(" if (!element.IsInitialized) return false;");
- writer.WriteLine("}");
- } else if (field.IsOptional) {
- writer.WriteLine("if (Has{0}) {{", propertyName);
- writer.WriteLine(" if (!{0}.IsInitialized) return false;", propertyName);
- writer.WriteLine("}");
- } else {
- writer.WriteLine("if (!{0}.IsInitialized) return false;", propertyName);
- }
- }
-
- if (Descriptor.Extensions.Count > 0) {
- writer.WriteLine("if (!ExtensionsAreInitialized) return false;");
- }
- writer.WriteLine("return true;");
- writer.Outdent();
- writer.WriteLine("}");
- writer.Outdent();
- writer.WriteLine("}");
- writer.WriteLine();
- }
- }
-}
diff --git a/csharp/ProtoGen/PrimitiveFieldGenerator.cs b/csharp/ProtoGen/PrimitiveFieldGenerator.cs
deleted file mode 100644
index 9107def9..00000000
--- a/csharp/ProtoGen/PrimitiveFieldGenerator.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-using System;
-using Google.ProtocolBuffers.Descriptors;
-
-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) {
- }
-
- public void GenerateMembers(TextGenerator writer) {
- writer.WriteLine("private bool has{0};", CapitalizedName);
- writer.WriteLine("private {0} {1}_ = {2};", TypeName, Name, DefaultValue);
- writer.WriteLine("public bool Has{0} {{", CapitalizedName);
- writer.WriteLine(" get {{ return has{0}; }}", CapitalizedName);
- writer.WriteLine("}");
- writer.WriteLine("public {0} {1} {{", TypeName, PropertyName);
- writer.WriteLine(" get {{ return {0}_; }}", Name);
- writer.WriteLine("}");
- }
-
- public void GenerateBuilderMembers(TextGenerator writer) {
- writer.WriteLine("public bool Has{0} {{", CapitalizedName);
- writer.WriteLine(" get {{ return result.Has{0}; }}", CapitalizedName);
- writer.WriteLine("}");
- writer.WriteLine("public {0} {1} {{", TypeName, PropertyName);
- writer.WriteLine(" get {{ return result.{0}; }}", PropertyName);
- writer.WriteLine(" set {{ Set{0}(value); }}", CapitalizedName);
- writer.WriteLine("}");
- writer.WriteLine("public Builder Set{0}({1} value) {{", CapitalizedName, TypeName);
- writer.WriteLine(" result.has{0} = true;", CapitalizedName);
- writer.WriteLine(" result.{0}_ = value;", Name);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- writer.WriteLine("public Builder Clear{0}() {{", CapitalizedName);
- writer.WriteLine(" result.has{0} = false;", CapitalizedName);
- writer.WriteLine(" result.{0}_ = {1};", Name, DefaultValue);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- }
-
- public void GenerateMergingCode(TextGenerator writer) {
- writer.WriteLine("if (other.Has{0}) {{", CapitalizedName);
- writer.WriteLine(" {0} = other.{0};", PropertyName);
- writer.WriteLine("}");
- }
-
- public void GenerateBuildingCode(TextGenerator writer) {
- // Nothing to do here for primitive types
- }
-
- public void GenerateParsingCode(TextGenerator writer) {
- writer.WriteLine("{0} = input.Read{1}();", PropertyName, CapitalizedTypeName);
- }
-
- public void GenerateSerializationCode(TextGenerator writer) {
- writer.WriteLine("if (Has{0}) {{", CapitalizedName);
- writer.WriteLine(" output.Write{0}({1}, {2});", CapitalizedTypeName, Number, PropertyName);
- writer.WriteLine("}");
- }
-
- public void GenerateSerializedSizeCode(TextGenerator writer) {
- writer.WriteLine("if (Has{0}) {{", CapitalizedName);
- writer.WriteLine(" size += pb::CodedOutputStream.Compute{0}Size({1}, {2});",
- CapitalizedTypeName, Number, PropertyName);
- writer.WriteLine("}");
- }
- }
-}
diff --git a/csharp/ProtoGen/Program.cs b/csharp/ProtoGen/Program.cs
deleted file mode 100644
index 08cad358..00000000
--- a/csharp/ProtoGen/Program.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-using System;
-using System.Collections.Generic;
-using Google.ProtocolBuffers.DescriptorProtos;
-
-namespace Google.ProtocolBuffers.ProtoGen {
- /// <summary>
- /// Entry point for the Protocol Buffers generator.
- /// </summary>
- class Program {
- static int Main(string[] args) {
- try {
- // Hack to make sure everything's initialized
- DescriptorProtoFile.Descriptor.ToString();
- GeneratorOptions options = ParseCommandLineArguments(args);
-
- IList<string> validationFailures;
- if (!options.TryValidate(out validationFailures)) {
- // We've already got the message-building logic in the exception...
- InvalidOptionsException exception = new InvalidOptionsException(validationFailures);
- Console.WriteLine(exception.Message);
- return 1;
- }
-
- Generator generator = Generator.CreateGenerator(options);
- generator.Generate();
-
-
- return 0;
- } catch (Exception e) {
- Console.Error.WriteLine("Error: {0}", e.Message);
- Console.Error.WriteLine();
- Console.Error.WriteLine("Detailed exception information: {0}", e);
- return 1;
- }
- }
-
- private static GeneratorOptions ParseCommandLineArguments(string[] args) {
- GeneratorOptions options = new GeneratorOptions();
- //string baseDir = "c:\\Users\\Jon\\Documents\\Visual Studio 2008\\Projects\\ProtocolBuffers";
- //options.OutputDirectory = baseDir + "\\tmp";
- //options.InputFiles = new[] { baseDir + "\\protos\\nwind-solo.protobin" };
- options.OutputDirectory = ".";
- options.InputFiles = args;
- return options;
- }
- }
-} \ No newline at end of file
diff --git a/csharp/ProtoGen/Properties/AssemblyInfo.cs b/csharp/ProtoGen/Properties/AssemblyInfo.cs
deleted file mode 100644
index 24f5d781..00000000
--- a/csharp/ProtoGen/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("ProtoGen")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("ProtoGen")]
-[assembly: AssemblyCopyright("Copyright © 2008")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("7101763b-7a38-41be-87f5-7ede4c554509")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
-[assembly: InternalsVisibleTo("Google.ProtocolBuffers.ProtoGen.Test,PublicKey=" +
-"0024000004800000940000000602000000240000525341310004000001000100cf43741ffc3e65" +
-"c85707245e144e90f1bb82f20d1b1555846008d4d5d5c9270a980350dcb1ddd40fcdde13c2780c" +
-"75c9057123daa5613cb6551e2b8bd2254e8f84b3893369869e5119b752442aef7156c4defc489b" +
-"96c44ff801fe8d94199e048f8ff414813c9c811a029bcd697040700dc66982539e9b368cb5e725" +
-"feed60f2")]
diff --git a/csharp/ProtoGen/Properties/Google.ProtocolBuffers.ProtoGen.snk b/csharp/ProtoGen/Properties/Google.ProtocolBuffers.ProtoGen.snk
deleted file mode 100644
index 8e4d98a5..00000000
--- a/csharp/ProtoGen/Properties/Google.ProtocolBuffers.ProtoGen.snk
+++ /dev/null
Binary files differ
diff --git a/csharp/ProtoGen/ProtoGen.csproj b/csharp/ProtoGen/ProtoGen.csproj
deleted file mode 100644
index f48df42c..00000000
--- a/csharp/ProtoGen/ProtoGen.csproj
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <PropertyGroup>
- <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
- <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
- <ProductVersion>9.0.30729</ProductVersion>
- <SchemaVersion>2.0</SchemaVersion>
- <ProjectGuid>{250ADE34-82FD-4BAE-86D5-985FBE589C4A}</ProjectGuid>
- <OutputType>Exe</OutputType>
- <AppDesignerFolder>Properties</AppDesignerFolder>
- <RootNamespace>Google.ProtocolBuffers.ProtoGen</RootNamespace>
- <AssemblyName>ProtoGen</AssemblyName>
- <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
- <FileAlignment>512</FileAlignment>
- <TargetFrameworkSubset>
- </TargetFrameworkSubset>
- <SignAssembly>true</SignAssembly>
- <AssemblyOriginatorKeyFile>Properties\Google.ProtocolBuffers.ProtoGen.snk</AssemblyOriginatorKeyFile>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
- <DebugSymbols>true</DebugSymbols>
- <DebugType>full</DebugType>
- <Optimize>false</Optimize>
- <OutputPath>bin\Debug\</OutputPath>
- <DefineConstants>DEBUG;TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
- <DebugType>pdbonly</DebugType>
- <Optimize>true</Optimize>
- <OutputPath>bin\Release\</OutputPath>
- <DefineConstants>TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
- <ItemGroup>
- <Reference Include="System" />
- </ItemGroup>
- <ItemGroup>
- <Compile Include="DescriptorUtil.cs" />
- <Compile Include="EnumFieldGenerator.cs" />
- <Compile Include="EnumGenerator.cs" />
- <Compile Include="ExtensionGenerator.cs" />
- <Compile Include="FieldGeneratorBase.cs" />
- <Compile Include="IFieldSourceGenerator.cs" />
- <Compile Include="ISourceGenerator.cs" />
- <Compile Include="MessageFieldGenerator.cs" />
- <Compile Include="MessageGenerator.cs" />
- <Compile Include="PrimitiveFieldGenerator.cs" />
- <Compile Include="RepeatedEnumFieldGenerator.cs" />
- <Compile Include="RepeatedMessageFieldGenerator.cs" />
- <Compile Include="RepeatedPrimitiveFieldGenerator.cs" />
- <Compile Include="ServiceGenerator.cs" />
- <Compile Include="SourceFileGenerator.cs" />
- <Compile Include="DependencyResolutionException.cs" />
- <Compile Include="Generator.cs" />
- <Compile Include="GeneratorOptions.cs" />
- <Compile Include="Helpers.cs" />
- <Compile Include="InvalidOptionsException.cs" />
- <Compile Include="Program.cs" />
- <Compile Include="Properties\AssemblyInfo.cs" />
- <Compile Include="SourceGeneratorBase.cs" />
- <Compile Include="SourceGenerators.cs" />
- <Compile Include="UmbrellaClassGenerator.cs" />
- </ItemGroup>
- <ItemGroup>
- <None Include="app.config" />
- <None Include="Properties\Google.ProtocolBuffers.ProtoGen.snk" />
- </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.
- <Target Name="BeforeBuild">
- </Target>
- <Target Name="AfterBuild">
- </Target>
- -->
-</Project> \ No newline at end of file
diff --git a/csharp/ProtoGen/ProtoGen.csproj.user b/csharp/ProtoGen/ProtoGen.csproj.user
deleted file mode 100644
index ae26d4a2..00000000
--- a/csharp/ProtoGen/ProtoGen.csproj.user
+++ /dev/null
@@ -1,6 +0,0 @@
-<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
- <StartWorkingDirectory>c:\Users\Jon\Documents\Visual Studio 2008\Projects\ProtocolBuffers\csharp\testprotos</StartWorkingDirectory>
- <StartArguments>unittest.protobin</StartArguments>
- </PropertyGroup>
-</Project> \ No newline at end of file
diff --git a/csharp/ProtoGen/RepeatedEnumFieldGenerator.cs b/csharp/ProtoGen/RepeatedEnumFieldGenerator.cs
deleted file mode 100644
index 088045f7..00000000
--- a/csharp/ProtoGen/RepeatedEnumFieldGenerator.cs
+++ /dev/null
@@ -1,90 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using Google.ProtocolBuffers.Descriptors;
-
-namespace Google.ProtocolBuffers.ProtoGen {
- internal class RepeatedEnumFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator {
-
- internal RepeatedEnumFieldGenerator(FieldDescriptor descriptor)
- : base(descriptor) {
- }
-
- public void GenerateMembers(TextGenerator writer) {
- writer.WriteLine("private pbc::PopsicleList<{0}> {1}_ = new pbc::PopsicleList<{0}>();", TypeName, Name);
- writer.WriteLine("public scg::IList<{0}> {1}List {{", TypeName, CapitalizedName);
- writer.WriteLine(" get {{ return pbc::Lists.AsReadOnly({0}_); }}", Name);
- writer.WriteLine("}");
-
- // TODO(jonskeet): Redundant API calls? Possibly - include for portability though. Maybe create an option.
- writer.WriteLine("public int {0}Count {{", CapitalizedName);
- writer.WriteLine(" get {{ return {0}_.Count; }}", Name);
- writer.WriteLine("}");
-
- writer.WriteLine("public {0} Get{1}(int index) {{", TypeName, CapitalizedName);
- writer.WriteLine(" return {0}_[index];", Name);
- writer.WriteLine("}");
- }
-
- public void GenerateBuilderMembers(TextGenerator writer) {
- // Note: We can return the original list here, because we make it unmodifiable when we build
- writer.WriteLine("public scg::IList<{0}> {1}List {{", TypeName, CapitalizedName);
- writer.WriteLine(" get {{ return result.{0}_; }}", Name);
- writer.WriteLine("}");
- writer.WriteLine("public int {0}Count {{", CapitalizedName);
- writer.WriteLine(" get {{ return result.{0}Count; }}", CapitalizedName);
- writer.WriteLine("}");
- writer.WriteLine("public {0} Get{1}(int index) {{", TypeName, CapitalizedName);
- writer.WriteLine(" return result.Get{0}(index);", CapitalizedName);
- writer.WriteLine("}");
- writer.WriteLine("public Builder Set{0}(int index, {1} value) {{", CapitalizedName, TypeName);
- writer.WriteLine(" result.{0}_[index] = value;", Name);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- writer.WriteLine("public Builder Add{0}({1} value) {{", CapitalizedName, TypeName);
- writer.WriteLine(" result.{0}_.Add(value);", Name, TypeName);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- writer.WriteLine("public Builder AddRange{0}(scg::IEnumerable<{1}> values) {{", CapitalizedName, TypeName);
- writer.WriteLine(" base.AddRange(values, result.{0}_);", Name);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- writer.WriteLine("public Builder Clear{0}() {{", CapitalizedName);
- writer.WriteLine(" result.{0}_.Clear();", Name);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- }
-
- public void GenerateMergingCode(TextGenerator writer) {
- writer.WriteLine("if (other.{0}_.Count != 0) {{", Name);
- writer.WriteLine(" base.AddRange(other.{0}_, result.{0}_);", Name);
- writer.WriteLine("}");
- }
-
- public void GenerateBuildingCode(TextGenerator writer) {
- writer.WriteLine("result.{0}_.MakeReadOnly();", Name);
- }
-
- public void GenerateParsingCode(TextGenerator writer) {
- // TODO(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);
- writer.WriteLine(" unknownFields.MergeVarintField({0}, (ulong) rawValue);", Number);
- writer.WriteLine("} else {");
- writer.WriteLine(" Add{0}({1} rawValue);", CapitalizedName, TypeName);
- writer.WriteLine("}");
- }
-
- public void GenerateSerializationCode(TextGenerator writer) {
- writer.WriteLine("foreach ({0} element in {1}List) {{", TypeName, CapitalizedName);
- writer.WriteLine(" output.WriteEnum({0}, (int) element);", Number);
- writer.WriteLine("}");
- }
-
- public void GenerateSerializedSizeCode(TextGenerator writer) {
- writer.WriteLine("foreach ({0} element in {1}List) {{", TypeName, CapitalizedName);
- writer.WriteLine(" size += pb::CodedOutputStream.ComputeEnumSize({0}, (int) element);", Number);
- writer.WriteLine("}");
- }
- }
-}
diff --git a/csharp/ProtoGen/RepeatedMessageFieldGenerator.cs b/csharp/ProtoGen/RepeatedMessageFieldGenerator.cs
deleted file mode 100644
index 08d574a9..00000000
--- a/csharp/ProtoGen/RepeatedMessageFieldGenerator.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using Google.ProtocolBuffers.Descriptors;
-
-namespace Google.ProtocolBuffers.ProtoGen {
- internal class RepeatedMessageFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator {
-
- internal RepeatedMessageFieldGenerator(FieldDescriptor descriptor)
- : base(descriptor) {
- }
-
- public void GenerateMembers(TextGenerator writer) {
- writer.WriteLine("private pbc::PopsicleList<{0}> {1}_ = new pbc::PopsicleList<{0}>();", TypeName, Name);
- writer.WriteLine("public scg::IList<{0}> {1}List {{", TypeName, CapitalizedName);
- writer.WriteLine(" get {{ return {0}_; }}", Name);
- writer.WriteLine("}");
-
- // TODO(jonskeet): Redundant API calls? Possibly - include for portability though. Maybe create an option.
- writer.WriteLine("public int {0}Count {{", CapitalizedName);
- writer.WriteLine(" get {{ return {0}_.Count; }}", Name);
- writer.WriteLine("}");
-
- writer.WriteLine("public {0} Get{1}(int index) {{", TypeName, CapitalizedName);
- writer.WriteLine(" return {0}_[index];", Name);
- writer.WriteLine("}");
- }
-
- public void GenerateBuilderMembers(TextGenerator writer) {
- // Note: We can return the original list here, because we make it unmodifiable when we build
- writer.WriteLine("public scg::IList<{0}> {1}List {{", TypeName, CapitalizedName);
- writer.WriteLine(" get {{ return result.{0}_; }}", Name);
- writer.WriteLine("}");
- writer.WriteLine("public int {0}Count {{", CapitalizedName);
- writer.WriteLine(" get {{ return result.{0}Count; }}", CapitalizedName);
- writer.WriteLine("}");
- writer.WriteLine("public {0} Get{1}(int index) {{", TypeName, CapitalizedName);
- writer.WriteLine(" return result.Get{0}(index);", CapitalizedName);
- writer.WriteLine("}");
- writer.WriteLine("public Builder Set{0}(int index, {1} value) {{", CapitalizedName, TypeName);
- writer.WriteLine(" result.{0}_[index] = value;", Name);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- // Extra overload for builder (just on messages)
- writer.WriteLine("public Builder Set{0}(int index, {1}.Builder builderForValue) {{", CapitalizedName, TypeName);
- writer.WriteLine(" result.{0}_[index] = builderForValue.Build();", Name);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- writer.WriteLine("public Builder Add{0}({1} value) {{", CapitalizedName, TypeName);
- writer.WriteLine(" result.{0}_.Add(value);", Name, TypeName);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- // Extra overload for builder (just on messages)
- writer.WriteLine("public Builder Add{0}({1}.Builder builderForValue) {{", CapitalizedName, TypeName);
- writer.WriteLine(" result.{0}_.Add(builderForValue.Build());", Name);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- writer.WriteLine("public Builder AddRange{0}(scg::IEnumerable<{1}> values) {{", CapitalizedName, TypeName);
- writer.WriteLine(" base.AddRange(values, result.{0}_);", Name);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- writer.WriteLine("public Builder Clear{0}() {{", CapitalizedName);
- writer.WriteLine(" result.{0}_.Clear();", Name);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- }
-
- public void GenerateMergingCode(TextGenerator writer) {
- writer.WriteLine("if (other.{0}_.Count != 0) {{", Name);
- writer.WriteLine(" base.AddRange(other.{0}_, result.{0}_);", Name);
- writer.WriteLine("}");
- }
-
- public void GenerateBuildingCode(TextGenerator writer) {
- writer.WriteLine("result.{0}_.MakeReadOnly();", Name);
- }
-
- public void GenerateParsingCode(TextGenerator writer) {
- 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());", CapitalizedName);
- }
-
- public void GenerateSerializationCode(TextGenerator writer) {
- writer.WriteLine("foreach ({0} element in {1}List) {{", TypeName, CapitalizedName);
- writer.WriteLine(" output.Write{0}({1}, element);", MessageOrGroup, Number);
- writer.WriteLine("}");
- }
-
- public void GenerateSerializedSizeCode(TextGenerator writer) {
- writer.WriteLine("foreach ({0} element in {1}List) {{", TypeName, CapitalizedName);
- writer.WriteLine(" size += pb::CodedOutputStream.Compute{0}Size({1}, element);", MessageOrGroup, Number);
- writer.WriteLine("}");
- }
- }
-}
diff --git a/csharp/ProtoGen/RepeatedPrimitiveFieldGenerator.cs b/csharp/ProtoGen/RepeatedPrimitiveFieldGenerator.cs
deleted file mode 100644
index cdb7cd6f..00000000
--- a/csharp/ProtoGen/RepeatedPrimitiveFieldGenerator.cs
+++ /dev/null
@@ -1,84 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using Google.ProtocolBuffers.Descriptors;
-
-namespace Google.ProtocolBuffers.ProtoGen {
- internal class RepeatedPrimitiveFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator {
-
- internal RepeatedPrimitiveFieldGenerator(FieldDescriptor descriptor)
- : base(descriptor) {
- }
-
- public void GenerateMembers(TextGenerator writer) {
- writer.WriteLine("private pbc::PopsicleList<{0}> {1}_ = new pbc::PopsicleList<{0}>();", TypeName, Name);
- writer.WriteLine("public scg::IList<{0}> {1}List {{", TypeName, CapitalizedName);
- writer.WriteLine(" get {{ return pbc::Lists.AsReadOnly({0}_); }}", Name);
- writer.WriteLine("}");
-
- // TODO(jonskeet): Redundant API calls? Possibly - include for portability though. Maybe create an option.
- writer.WriteLine("public int {0}Count {{", CapitalizedName);
- writer.WriteLine(" get {{ return {0}_.Count; }}", Name);
- writer.WriteLine("}");
-
- writer.WriteLine("public {0} Get{1}(int index) {{", TypeName, CapitalizedName);
- writer.WriteLine(" return {0}_[index];", Name);
- writer.WriteLine("}");
- }
-
- public void GenerateBuilderMembers(TextGenerator writer) {
- // Note: We can return the original list here, because we make it unmodifiable when we build
- writer.WriteLine("public scg::IList<{0}> {1}List {{", TypeName, CapitalizedName);
- writer.WriteLine(" get {{ return result.{0}_; }}", Name);
- writer.WriteLine("}");
- writer.WriteLine("public int {0}Count {{", CapitalizedName);
- writer.WriteLine(" get {{ return result.{0}Count; }}", CapitalizedName);
- writer.WriteLine("}");
- writer.WriteLine("public {0} Get{1}(int index) {{", TypeName, CapitalizedName);
- writer.WriteLine(" return result.Get{0}(index);", CapitalizedName);
- writer.WriteLine("}");
- writer.WriteLine("public Builder Set{0}(int index, {1} value) {{", CapitalizedName, TypeName);
- writer.WriteLine(" result.{0}_[index] = value;", Name);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- writer.WriteLine("public Builder Add{0}({1} value) {{", CapitalizedName, TypeName);
- writer.WriteLine(" result.{0}_.Add(value);", Name, TypeName);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- writer.WriteLine("public Builder AddRange{0}(scg::IEnumerable<{1}> values) {{", CapitalizedName, TypeName);
- writer.WriteLine(" base.AddRange(values, result.{0}_);", Name);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- writer.WriteLine("public Builder Clear{0}() {{", CapitalizedName);
- writer.WriteLine(" result.{0}_.Clear();", Name);
- writer.WriteLine(" return this;");
- writer.WriteLine("}");
- }
-
- public void GenerateMergingCode(TextGenerator writer) {
- writer.WriteLine("if (other.{0}_.Count != 0) {{", Name);
- writer.WriteLine(" base.AddRange(other.{0}_, result.{0}_);", Name);
- writer.WriteLine("}");
- }
-
- public void GenerateBuildingCode(TextGenerator writer) {
- writer.WriteLine("result.{0}_.MakeReadOnly();", Name);
- }
-
- public void GenerateParsingCode(TextGenerator writer) {
- writer.WriteLine("Add{0}(input.Read{1}());", CapitalizedName, CapitalizedTypeName);
- }
-
- public void GenerateSerializationCode(TextGenerator writer) {
- writer.WriteLine("foreach ({0} element in {1}List) {{", TypeName, CapitalizedName);
- writer.WriteLine(" output.Write{0}({1}, element);", CapitalizedTypeName, Number);
- writer.WriteLine("}");
- }
-
- public void GenerateSerializedSizeCode(TextGenerator writer) {
- writer.WriteLine("foreach ({0} element in {1}List) {{", TypeName, CapitalizedName);
- writer.WriteLine(" size += pb::CodedOutputStream.Compute{0}Size({1}, element);", CapitalizedTypeName, Number);
- writer.WriteLine("}");
- }
- }
-}
diff --git a/csharp/ProtoGen/ServiceGenerator.cs b/csharp/ProtoGen/ServiceGenerator.cs
deleted file mode 100644
index 9b642b74..00000000
--- a/csharp/ProtoGen/ServiceGenerator.cs
+++ /dev/null
@@ -1,138 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using Google.ProtocolBuffers.Descriptors;
-
-namespace Google.ProtocolBuffers.ProtoGen {
- internal class ServiceGenerator : SourceGeneratorBase<ServiceDescriptor>, ISourceGenerator {
-
- private enum RequestOrResponse {
- Request,
- Response
- }
-
- internal ServiceGenerator(ServiceDescriptor descriptor)
- : base(descriptor) {
- }
-
- public void Generate(TextGenerator writer) {
- writer.WriteLine("{0} abstract class {1} : pb::IService {{", ClassAccessLevel, Descriptor.Name);
- writer.Indent();
-
- foreach (MethodDescriptor method in Descriptor.Methods) {
- writer.WriteLine("{0} abstract void {1}(", ClassAccessLevel, Helpers.UnderscoresToPascalCase(method.Name));
- writer.WriteLine(" pb::IRpcController controller,");
- writer.WriteLine(" {0} request,", DescriptorUtil.GetClassName(method.InputType));
- writer.WriteLine(" global::System.Action<{0}> done);", DescriptorUtil.GetClassName(method.OutputType));
- }
-
- // Generate Descriptor and DescriptorForType.
- writer.WriteLine();
- writer.WriteLine("{0} static pbd::ServiceDescriptor Descriptor {{", ClassAccessLevel);
- writer.WriteLine(" get {{ return {0}.Descriptor.Services[{1}]; }}",
- DescriptorUtil.GetUmbrellaClassName(Descriptor.File), Descriptor.Index);
- writer.WriteLine("}");
- writer.WriteLine("{0} pbd::ServiceDescriptor DescriptorForType {{", ClassAccessLevel);
- writer.WriteLine(" get { return Descriptor; }");
- writer.WriteLine("}");
-
- GenerateCallMethod(writer);
- GenerateGetPrototype(RequestOrResponse.Request, writer);
- GenerateGetPrototype(RequestOrResponse.Response, writer);
- GenerateStub(writer);
-
- writer.Outdent();
- writer.WriteLine("}");
- }
-
- private void GenerateCallMethod(TextGenerator writer) {
- writer.WriteLine();
- writer.WriteLine("public void CallMethod(", ClassAccessLevel);
- writer.WriteLine(" pbd::MethodDescriptor method,");
- writer.WriteLine(" pb::IRpcController controller,");
- writer.WriteLine(" pb::IMessage request,");
- writer.WriteLine(" global::System.Action<pb::IMessage> done) {");
- writer.Indent();
- writer.WriteLine("if (method.Service != Descriptor) {");
- writer.WriteLine(" throw new global::System.ArgumentException(");
- writer.WriteLine(" \"Service.CallMethod() given method descriptor for wrong service type.\");");
- writer.WriteLine("}");
- writer.WriteLine("switch(method.Index) {");
- writer.Indent();
- foreach (MethodDescriptor method in Descriptor.Methods) {
- writer.WriteLine("case {0}:", method.Index);
- writer.WriteLine(" this.{0}(controller, ({0}) request,",
- Helpers.UnderscoresToPascalCase(method.Name), DescriptorUtil.GetClassName(method.InputType));
- writer.WriteLine(" pb::RpcUtil.SpecializeCallback<{0}>(", DescriptorUtil.GetClassName(method.OutputType));
- writer.WriteLine(" done));");
- writer.WriteLine(" return;");
- }
- writer.WriteLine("default:");
- writer.WriteLine(" throw new global::System.InvalidOperationException(\"Can't get here.\");");
- writer.Outdent();
- writer.WriteLine("}");
- writer.Outdent();
- writer.WriteLine("}");
- writer.WriteLine();
- }
-
- private void GenerateGetPrototype(RequestOrResponse which, TextGenerator writer) {
- writer.WriteLine("public pb::IMessage Get{0}Prototype(pbd::MethodDescriptor method) {{", which);
- writer.Indent();
- writer.WriteLine("if (method.Service != Descriptor) {");
- writer.WriteLine(" throw new global::System.ArgumentException(");
- writer.WriteLine(" \"Service.Get{0}Prototype() given method descriptor for wrong service type.\");", which);
- writer.WriteLine("}");
- writer.WriteLine("switch(method.Index) {");
- writer.Indent();
-
- foreach (MethodDescriptor method in Descriptor.Methods) {
- writer.WriteLine("case {0}:", method.Index);
- writer.WriteLine(" return {0}.DefaultInstance;",
- DescriptorUtil.GetClassName(which == RequestOrResponse.Request ? method.InputType : method.OutputType));
- }
- writer.WriteLine("default:");
- writer.WriteLine(" throw new global::System.InvalidOperationException(\"Can't get here.\");");
- writer.Outdent();
- writer.WriteLine("}");
- writer.Outdent();
- writer.WriteLine("}");
- writer.WriteLine();
- }
-
- private void GenerateStub(TextGenerator writer) {
- writer.WriteLine("public static Stub CreateStub(pb::IRpcChannel channel) {");
- writer.WriteLine(" return new Stub(channel);");
- writer.WriteLine("}");
- writer.WriteLine();
- writer.WriteLine("{0} class Stub : {1} {{", ClassAccessLevel, DescriptorUtil.GetClassName(Descriptor));
- writer.Indent();
- writer.WriteLine("internal Stub(pb::IRpcChannel channel) {");
- writer.WriteLine(" this.channel = channel;");
- writer.WriteLine("}");
- writer.WriteLine();
- writer.WriteLine("private readonly pb::IRpcChannel channel;");
- writer.WriteLine();
- writer.WriteLine("public pb::IRpcChannel Channel {");
- writer.WriteLine(" get { return channel; }");
- writer.WriteLine("}");
-
- foreach (MethodDescriptor method in Descriptor.Methods) {
- writer.WriteLine();
- writer.WriteLine("public override void {0}(", Helpers.UnderscoresToPascalCase(method.Name));
- writer.WriteLine(" pb::IRpcController controller,");
- writer.WriteLine(" {0} request,", DescriptorUtil.GetClassName(method.InputType));
- writer.WriteLine(" global::System.Action<{0}> done) {{", DescriptorUtil.GetClassName(method.OutputType));
- writer.Indent();
- writer.WriteLine("channel.CallMethod(Descriptor.Methods[{0}],", method.Index);
- writer.WriteLine(" controller, request, {0}.DefaultInstance,", DescriptorUtil.GetClassName(method.OutputType));
- writer.WriteLine(" pb::RpcUtil.GeneralizeCallback<{0}, {0}.Builder>(done, {0}.DefaultInstance));",
- DescriptorUtil.GetClassName(method.OutputType));
- writer.Outdent();
- writer.WriteLine("}");
- }
- writer.Outdent();
- writer.WriteLine("}");
- }
- }
-}
diff --git a/csharp/ProtoGen/SourceFileGenerator.cs b/csharp/ProtoGen/SourceFileGenerator.cs
deleted file mode 100644
index 1984d297..00000000
--- a/csharp/ProtoGen/SourceFileGenerator.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Text;
-using Google.ProtocolBuffers.Descriptors;
-
-namespace Google.ProtocolBuffers.ProtoGen {
- /// <summary>
- /// Generator to hold a TextGenerator, generate namespace aliases etc.
- /// Each source file created uses one of these, and it can be used to create
- /// multiple classes within the same file.
- /// </summary>
- internal class SourceFileGenerator {
-
- private readonly TextGenerator output;
-
- private SourceFileGenerator(TextWriter writer) {
- output = new TextGenerator(writer);
- }
-
- /// <summary>
- /// Creates a ClassFileGenerator for the given writer, which will be closed
- /// when the instance is disposed. The specified namespace is created, if it's non-null.
- /// </summary>
- internal static SourceFileGenerator ForWriter(TextWriter writer) {
- return new SourceFileGenerator(writer);
- }
- }
-}
diff --git a/csharp/ProtoGen/SourceGeneratorBase.cs b/csharp/ProtoGen/SourceGeneratorBase.cs
deleted file mode 100644
index 563c64a1..00000000
--- a/csharp/ProtoGen/SourceGeneratorBase.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-using System.Collections.Generic;
-using Google.ProtocolBuffers.DescriptorProtos;
-using Google.ProtocolBuffers.Descriptors;
-
-namespace Google.ProtocolBuffers.ProtoGen {
- internal abstract class SourceGeneratorBase<T> where T : IDescriptor {
-
- private readonly T descriptor;
-
- protected SourceGeneratorBase(T descriptor) {
- this.descriptor = descriptor;
- }
-
- protected T Descriptor {
- get { return descriptor; }
- }
-
- protected string ClassAccessLevel {
- get {
- // Default to public
- return !descriptor.File.Options.HasExtension(CSharpOptions.CSharpPublicClasses)
- || descriptor.File.Options.GetExtension(CSharpOptions.CSharpPublicClasses) ? "public" : "internal";
- }
- }
-
- public bool MultipleFiles {
- get { return descriptor.File.Options.GetExtension(CSharpOptions.CSharpMultipleFiles); }
- }
-
- protected static void WriteChildren<TChild>(TextGenerator writer, string region, IEnumerable<TChild> children)
- where TChild : IDescriptor {
- // Copy the set of children; makes access easier
- List<TChild> copy = new List<TChild>(children);
- if (copy.Count == 0) {
- return;
- }
-
- if (region != null) {
- writer.WriteLine("#region {0}", region);
- }
- foreach (TChild child in children) {
- SourceGenerators.CreateGenerator(child).Generate(writer);
- }
- if (region != null) {
- writer.WriteLine("#endregion");
- writer.WriteLine();
- }
- }
- }
-}
diff --git a/csharp/ProtoGen/SourceGenerators.cs b/csharp/ProtoGen/SourceGenerators.cs
deleted file mode 100644
index c775e419..00000000
--- a/csharp/ProtoGen/SourceGenerators.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-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);
- }
- }
-}
diff --git a/csharp/ProtoGen/UmbrellaClassGenerator.cs b/csharp/ProtoGen/UmbrellaClassGenerator.cs
deleted file mode 100644
index 7db5c46c..00000000
--- a/csharp/ProtoGen/UmbrellaClassGenerator.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-using System;
-using Google.ProtocolBuffers.DescriptorProtos;
-using Google.ProtocolBuffers.Descriptors;
-
-namespace Google.ProtocolBuffers.ProtoGen {
- /// <summary>
- /// Generator for the class describing the .proto file in general,
- /// containing things like the message descriptor.
- /// </summary>
- internal sealed class UmbrellaClassGenerator : SourceGeneratorBase<FileDescriptor>, ISourceGenerator {
-
- internal UmbrellaClassGenerator(FileDescriptor descriptor)
- : base(descriptor) {
- }
-
- public void Generate(TextGenerator writer) {
- WriteIntroduction(writer);
- WriteDescriptor(writer);
- WriteChildren(writer, "Extensions", Descriptor.Extensions);
- writer.WriteLine("#region Static variables");
- foreach (MessageDescriptor message in Descriptor.MessageTypes) {
- new MessageGenerator(message).GenerateStaticVariables(writer);
- }
- writer.WriteLine("#endregion");
- // The class declaration either gets closed before or after the children are written.
- if (!DescriptorUtil.NestClasses(Descriptor)) {
- writer.Outdent();
- writer.WriteLine("}");
- }
- WriteChildren(writer, "Enums", Descriptor.EnumTypes);
- WriteChildren(writer, "Messages", Descriptor.MessageTypes);
- WriteChildren(writer, "Services", Descriptor.Services);
- if (DescriptorUtil.NestClasses(Descriptor)) {
- writer.Outdent();
- writer.WriteLine("}");
- }
- if (DescriptorUtil.GetNamespace(Descriptor) != "") {
- writer.Outdent();
- writer.WriteLine("}");
- }
- }
-
- private void WriteIntroduction(TextGenerator writer) {
- writer.WriteLine("// Generated by the protocol buffer compiler. DO NOT EDIT!");
- writer.WriteLine();
- Helpers.WriteNamespaces(writer);
-
- if (DescriptorUtil.GetNamespace(Descriptor) != "") {
- writer.WriteLine("namespace {0} {{", DescriptorUtil.GetNamespace(Descriptor));
- writer.Indent();
- writer.WriteLine();
- }
-
- writer.WriteLine("{0} static partial class {1} {{", ClassAccessLevel, DescriptorUtil.GetUmbrellaClassName(Descriptor));
- writer.WriteLine();
- writer.Indent();
- }
-
- private void WriteDescriptor(TextGenerator writer) {
- writer.WriteLine("#region Descriptor");
-
- writer.WriteLine("public static pbd::FileDescriptor Descriptor {");
- writer.WriteLine(" get { return descriptor; }");
- writer.WriteLine("}");
- writer.WriteLine("private static readonly pbd::FileDescriptor descriptor = pbd::FileDescriptor.InternalBuildGeneratedFileFrom(");
- writer.WriteLine(" global::System.Convert.FromBase64String(");
- writer.Indent();
- writer.Indent();
-
- // TODO(jonskeet): Consider a C#-escaping format here instead of just Base64.
- byte[] bytes = Descriptor.Proto.ToByteArray();
- string base64 = Convert.ToBase64String(bytes);
-
- while (base64.Length > 60) {
- writer.WriteLine("\"{0}\" + ", base64.Substring(0, 60));
- base64 = base64.Substring(60);
- }
- writer.WriteLine("\"{0}\"),", base64);
-
- writer.WriteLine("new pbd::FileDescriptor[] {");
- foreach (FileDescriptor dependency in Descriptor.Dependencies) {
- // TODO(jonskeet): The normal code won't work for the bootstrapping descriptor, because we don't get unknown fields :(
- if (dependency.Package == "google.protobuf" && dependency.Name.EndsWith("descriptor.proto")) {
- writer.WriteLine(" global::" + typeof(DescriptorProtoFile).FullName + ".Descriptor, ");
- continue;
- }
- writer.WriteLine(" {0}.Descriptor, ", DescriptorUtil.GetFullUmbrellaClassName(dependency));
- }
- writer.WriteLine("});");
- writer.Outdent();
- writer.Outdent();
- writer.WriteLine("#endregion");
- writer.WriteLine();
- }
- }
-}
diff --git a/csharp/ProtoGen/app.config b/csharp/ProtoGen/app.config
deleted file mode 100644
index df20690a..00000000
--- a/csharp/ProtoGen/app.config
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0"?>
-<configuration>
-<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>