diff options
author | Jon Skeet <skeet@pobox.com> | 2011-01-27 20:47:23 +0000 |
---|---|---|
committer | Jon Skeet <skeet@pobox.com> | 2011-01-27 20:47:23 +0000 |
commit | f31e34b17e24733bf98d84536ffa0c936719db9d (patch) | |
tree | 07f49c5e46418579324a18cc9dc4fb6c024f4d4a /src | |
parent | 12f0460a7121851832ded0f9b00ae9df720ea833 (diff) | |
download | protobuf-f31e34b17e24733bf98d84536ffa0c936719db9d.tar.gz protobuf-f31e34b17e24733bf98d84536ffa0c936719db9d.tar.bz2 protobuf-f31e34b17e24733bf98d84536ffa0c936719db9d.zip |
Default to Environment.NewLine for line breaks in ProtoGen, but allow it to be configured.
Diffstat (limited to 'src')
-rw-r--r-- | src/ProtoGen/Generator.cs | 7 | ||||
-rw-r--r-- | src/ProtoGen/GeneratorOptions.cs | 29 | ||||
-rw-r--r-- | src/ProtoGen/ProgramPreprocess.cs | 2 | ||||
-rw-r--r-- | src/ProtocolBuffers/TextFormat.cs | 7 | ||||
-rw-r--r-- | src/ProtocolBuffers/TextGenerator.cs | 15 |
5 files changed, 44 insertions, 16 deletions
diff --git a/src/ProtoGen/Generator.cs b/src/ProtoGen/Generator.cs index f588c141..fd73591f 100644 --- a/src/ProtoGen/Generator.cs +++ b/src/ProtoGen/Generator.cs @@ -45,7 +45,7 @@ namespace Google.ProtocolBuffers.ProtoGen { /// </summary> public sealed class Generator { - readonly GeneratorOptions options; + private readonly GeneratorOptions options; private Generator(GeneratorOptions options) { options.Validate(); @@ -59,8 +59,7 @@ namespace Google.ProtocolBuffers.ProtoGen { return new Generator(options); } - public void Generate() { - + public void Generate() { List<FileDescriptorSet> descriptorProtos = new List<FileDescriptorSet>(); foreach (string inputFile in options.InputFiles) { ExtensionRegistry extensionRegistry = ExtensionRegistry.CreateInstance(); @@ -94,7 +93,7 @@ namespace Google.ProtocolBuffers.ProtoGen { private void Generate(FileDescriptor descriptor) { UmbrellaClassGenerator ucg = new UmbrellaClassGenerator(descriptor); using (TextWriter textWriter = File.CreateText(GetOutputFile(descriptor))) { - TextGenerator writer = new TextGenerator(textWriter); + TextGenerator writer = new TextGenerator(textWriter, options.LineBreak); ucg.Generate(writer); } } diff --git a/src/ProtoGen/GeneratorOptions.cs b/src/ProtoGen/GeneratorOptions.cs index 8781c5ec..8b3d6c5b 100644 --- a/src/ProtoGen/GeneratorOptions.cs +++ b/src/ProtoGen/GeneratorOptions.cs @@ -49,9 +49,20 @@ namespace Google.ProtocolBuffers.ProtoGen { /// the generator. /// </summary> public sealed class GeneratorOptions { + + private static Dictionary<string, string> LineBreaks = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase) { + { "Windows", "\r\n" }, + { "Unix", "\n" }, + { "Default", Environment.NewLine } + }; + public IList<string> InputFiles { get; set; } - /// <summary> + public GeneratorOptions() { + LineBreak = Environment.NewLine; + } + + /// <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. @@ -128,6 +139,8 @@ namespace Google.ProtocolBuffers.ProtoGen { set { fileOptions = value; } } + public string LineBreak { get; set; } + private void ParseArguments(IList<string> tmpReasons) { bool doHelp = Arguments.Count == 0; @@ -159,12 +172,17 @@ namespace Google.ProtocolBuffers.ProtoGen { if (TryCoerceType(value, fld, out obj, tmpReasons)) { builder[fld] = obj; } - } - else if (!File.Exists(argument)) { + } else if (name == "lineBreak") { + string tmp; + if (LineBreaks.TryGetValue(value, out tmp)) { + LineBreak = tmp; + } else { + tmpReasons.Add("Invalid value for 'lineBreak': " + value + "."); + } + } else if (!File.Exists(argument)) { doHelp = true; tmpReasons.Add("Unknown argument '" + name + "'."); - } - else { + } else { InputFiles.Add(argument); } } @@ -178,6 +196,7 @@ namespace Google.ProtocolBuffers.ProtoGen { foreach (KeyValuePair<string, FieldDescriptor> field in fields) { tmpReasons.Add(String.Format("-{0}=[{1}]", field.Key, field.Value.FieldType)); } + tmpReasons.Add("-lineBreak=[" + string.Join("|", new List<string>(LineBreaks.Keys).ToArray()) + "]"); tmpReasons.Add("followed by one or more file paths."); } else { diff --git a/src/ProtoGen/ProgramPreprocess.cs b/src/ProtoGen/ProgramPreprocess.cs index f6032a54..e35eb830 100644 --- a/src/ProtoGen/ProgramPreprocess.cs +++ b/src/ProtoGen/ProgramPreprocess.cs @@ -55,7 +55,7 @@ namespace Google.ProtocolBuffers.ProtoGen { } Console.WriteLine(); Console.WriteLine(); - Console.WriteLine("PRTOGEN.exe: The following options are used to specify defaults for code generation."); + Console.WriteLine("PROTOGEN.exe: The following options are used to specify defaults for code generation."); Console.WriteLine(); Program.Main(new string[0]); return 0; diff --git a/src/ProtocolBuffers/TextFormat.cs b/src/ProtocolBuffers/TextFormat.cs index 81b3447c..27bef8f4 100644 --- a/src/ProtocolBuffers/TextFormat.cs +++ b/src/ProtocolBuffers/TextFormat.cs @@ -43,7 +43,8 @@ using System.Collections; namespace Google.ProtocolBuffers { /// <summary> /// Provides ASCII text formatting support for messages. - /// TODO(jonskeet): Parsing support. + /// TODO(jonskeet): Support for alternative line endings. + /// (Easy to print, via TextGenerator. Not sure about parsing.) /// </summary> public static class TextFormat { @@ -52,7 +53,7 @@ namespace Google.ProtocolBuffers { /// the parameter output. /// </summary> public static void Print(IMessage message, TextWriter output) { - TextGenerator generator = new TextGenerator(output); + TextGenerator generator = new TextGenerator(output, "\n"); Print(message, generator); } @@ -60,7 +61,7 @@ namespace Google.ProtocolBuffers { /// Outputs a textual representation of <paramref name="fields" /> to <paramref name="output"/>. /// </summary> public static void Print(UnknownFieldSet fields, TextWriter output) { - TextGenerator generator = new TextGenerator(output); + TextGenerator generator = new TextGenerator(output, "\n"); PrintUnknownFields(fields, generator); } diff --git a/src/ProtocolBuffers/TextGenerator.cs b/src/ProtocolBuffers/TextGenerator.cs index 544fd86e..6b8fa048 100644 --- a/src/ProtocolBuffers/TextGenerator.cs +++ b/src/ProtocolBuffers/TextGenerator.cs @@ -44,6 +44,13 @@ namespace Google.ProtocolBuffers { public sealed class TextGenerator { /// <summary> + /// The string to use at the end of each line. We assume that "Print" is only called using \n + /// to indicate a line break; that's what we use to detect when we need to indent etc, and + /// *just* the \n is replaced with the contents of lineBreak. + /// </summary> + private readonly string lineBreak; + + /// <summary> /// Writer to write formatted text to. /// </summary> private readonly TextWriter writer; @@ -62,8 +69,9 @@ namespace Google.ProtocolBuffers { /// Creates a generator writing to the given writer. The writer /// is not closed by this class. /// </summary> - public TextGenerator(TextWriter writer) { + public TextGenerator(TextWriter writer, string lineBreak) { this.writer = writer; + this.lineBreak = lineBreak; } /// <summary> @@ -107,8 +115,9 @@ namespace Google.ProtocolBuffers { for (int i = 0; i < text.Length; i++) { if (text[i] == '\n') { - // TODO(jonskeet): Use Environment.NewLine? - Write(text.Substring(pos, i - pos + 1)); + // Strip off the \n from what we write + Write(text.Substring(pos, i - pos)); + Write(lineBreak); pos = i + 1; atStartOfLine = true; } |