Преглед на файлове

Default to Environment.NewLine for line breaks in ProtoGen, but allow it to be configured.

Jon Skeet преди 14 години
родител
ревизия
f31e34b17e
променени са 5 файла, в които са добавени 44 реда и са изтрити 16 реда
  1. 3 4
      src/ProtoGen/Generator.cs
  2. 24 5
      src/ProtoGen/GeneratorOptions.cs
  3. 1 1
      src/ProtoGen/ProgramPreprocess.cs
  4. 4 3
      src/ProtocolBuffers/TextFormat.cs
  5. 12 3
      src/ProtocolBuffers/TextGenerator.cs

+ 3 - 4
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);
       }
     }

+ 24 - 5
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 {

+ 1 - 1
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;

+ 4 - 3
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);
     }
 

+ 12 - 3
src/ProtocolBuffers/TextGenerator.cs

@@ -43,6 +43,13 @@ namespace Google.ProtocolBuffers {
   /// </summary>
   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>
@@ -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;
         }