aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJon Skeet <skeet@pobox.com>2011-01-27 20:47:23 +0000
committerJon Skeet <skeet@pobox.com>2011-01-27 20:47:23 +0000
commitf31e34b17e24733bf98d84536ffa0c936719db9d (patch)
tree07f49c5e46418579324a18cc9dc4fb6c024f4d4a /src
parent12f0460a7121851832ded0f9b00ae9df720ea833 (diff)
downloadprotobuf-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.cs7
-rw-r--r--src/ProtoGen/GeneratorOptions.cs29
-rw-r--r--src/ProtoGen/ProgramPreprocess.cs2
-rw-r--r--src/ProtocolBuffers/TextFormat.cs7
-rw-r--r--src/ProtocolBuffers/TextGenerator.cs15
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;
}