aboutsummaryrefslogtreecommitdiff
path: root/src/ProtocolBuffers
diff options
context:
space:
mode:
authorJon Skeet <skeet@pobox.com>2008-11-12 23:39:44 +0000
committerJon Skeet <skeet@pobox.com>2008-11-12 23:39:44 +0000
commitd6343be707cb6a067fe2b5ccc2efd7848072d17c (patch)
treeea4821795bcd032c0bc82461b699c5cef86c42ab /src/ProtocolBuffers
parent60c059b8f0b2b01fba14c537e370b56445437510 (diff)
downloadprotobuf-d6343be707cb6a067fe2b5ccc2efd7848072d17c.tar.gz
protobuf-d6343be707cb6a067fe2b5ccc2efd7848072d17c.tar.bz2
protobuf-d6343be707cb6a067fe2b5ccc2efd7848072d17c.zip
Refactored options
Diffstat (limited to 'src/ProtocolBuffers')
-rw-r--r--src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs392
-rw-r--r--src/ProtocolBuffers/Descriptors/FileDescriptor.cs58
-rw-r--r--src/ProtocolBuffers/NameHelpers.cs78
-rw-r--r--src/ProtocolBuffers/ProtocolBuffers.csproj1
4 files changed, 505 insertions, 24 deletions
diff --git a/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs b/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs
index 14d6bb64..55a30030 100644
--- a/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs
+++ b/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs
@@ -15,35 +15,381 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
private static readonly pbd::FileDescriptor descriptor = pbd::FileDescriptor.InternalBuildGeneratedFileFrom(
global::System.Convert.FromBase64String(
"CiRnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8SD2dvb2ds" +
- "ZS5wcm90b2J1ZhogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG86" +
- "NwoPQ1NoYXJwTmFtZXNwYWNlEhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRp" +
- "b25zGKCcASABKAk6PwoXQ1NoYXJwVW1icmVsbGFDbGFzc25hbWUSHC5nb29n" +
- "bGUucHJvdG9idWYuRmlsZU9wdGlvbnMYoZwBIAEoCTo7ChNDU2hhcnBNdWx0" +
- "aXBsZUZpbGVzEhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGKKcASAB" +
- "KAg6OQoRQ1NoYXJwTmVzdENsYXNzZXMSHC5nb29nbGUucHJvdG9idWYuRmls" +
- "ZU9wdGlvbnMYo5wBIAEoCDo7ChNDU2hhcnBQdWJsaWNDbGFzc2VzEhwuZ29v" +
- "Z2xlLnByb3RvYnVmLkZpbGVPcHRpb25zGKScASABKAhCPILiCSdHb29nbGUu" +
- "UHJvdG9jb2xCdWZmZXJzLkRlc2NyaXB0b3JQcm90b3OK4gkNQ1NoYXJwT3B0" +
- "aW9ucw=="),
+ "ZS5wcm90b2J1ZhogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8i" +
+ "4wEKEUNTaGFycEZpbGVPcHRpb25zEhEKCW5hbWVzcGFjZRgBIAEoCRIaChJ1" +
+ "bWJyZWxsYV9jbGFzc25hbWUYAiABKAkSFgoOcHVibGljX2NsYXNzZXMYAyAB" +
+ "KAgSFgoObXVsdGlwbGVfZmlsZXMYBCABKAgSFAoMbmVzdF9jbGFzc2VzGAUg" +
+ "ASgIMlkKDmNzaGFycF9vcHRpb25zEhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVP" +
+ "cHRpb25zGOgHIAEoCzIiLmdvb2dsZS5wcm90b2J1Zi5DU2hhcnBGaWxlT3B0" +
+ "aW9ucyKIAQoSQ1NoYXJwRmllbGRPcHRpb25zEhUKDXByb3BlcnR5X25hbWUY" +
+ "ASABKAkyWwoOY3NoYXJwX29wdGlvbnMSHS5nb29nbGUucHJvdG9idWYuRmll" +
+ "bGRPcHRpb25zGOgHIAEoCzIjLmdvb2dsZS5wcm90b2J1Zi5DU2hhcnBGaWVs" +
+ "ZE9wdGlvbnM="),
new pbd::FileDescriptor[] {
global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.Descriptor,
});
#endregion
- #region Extensions
- public static readonly pb::GeneratedExtensionBase<string> CSharpNamespace =
- pb::GeneratedSingleExtension<string>.CreateInstance(Descriptor.Extensions[0]);
- public static readonly pb::GeneratedExtensionBase<string> CSharpUmbrellaClassname =
- pb::GeneratedSingleExtension<string>.CreateInstance(Descriptor.Extensions[1]);
- public static readonly pb::GeneratedExtensionBase<bool> CSharpMultipleFiles =
- pb::GeneratedSingleExtension<bool>.CreateInstance(Descriptor.Extensions[2]);
- public static readonly pb::GeneratedExtensionBase<bool> CSharpNestClasses =
- pb::GeneratedSingleExtension<bool>.CreateInstance(Descriptor.Extensions[3]);
- public static readonly pb::GeneratedExtensionBase<bool> CSharpPublicClasses =
- pb::GeneratedSingleExtension<bool>.CreateInstance(Descriptor.Extensions[4]);
- #endregion
-
#region Static variables
+ internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_CSharpFileOptions__Descriptor
+ = Descriptor.MessageTypes[0];
+ internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.CSharpFileOptions, global::Google.ProtocolBuffers.DescriptorProtos.CSharpFileOptions.Builder> internal__static_google_protobuf_CSharpFileOptions__FieldAccessorTable
+ = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.CSharpFileOptions, global::Google.ProtocolBuffers.DescriptorProtos.CSharpFileOptions.Builder>(internal__static_google_protobuf_CSharpFileOptions__Descriptor,
+ new string[] { "Namespace", "UmbrellaClassname", "PublicClasses", "MultipleFiles", "NestClasses", });
+ internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_CSharpFieldOptions__Descriptor
+ = Descriptor.MessageTypes[1];
+ internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.CSharpFieldOptions, global::Google.ProtocolBuffers.DescriptorProtos.CSharpFieldOptions.Builder> internal__static_google_protobuf_CSharpFieldOptions__FieldAccessorTable
+ = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.CSharpFieldOptions, global::Google.ProtocolBuffers.DescriptorProtos.CSharpFieldOptions.Builder>(internal__static_google_protobuf_CSharpFieldOptions__Descriptor,
+ new string[] { "PropertyName", });
#endregion
}
+ #region Messages
+ public sealed partial class CSharpFileOptions : pb::GeneratedMessage<CSharpFileOptions, CSharpFileOptions.Builder> {
+ private static readonly CSharpFileOptions defaultInstance = new Builder().BuildPartial();
+ public static CSharpFileOptions DefaultInstance {
+ get { return defaultInstance; }
+ }
+
+ public override CSharpFileOptions DefaultInstanceForType {
+ get { return defaultInstance; }
+ }
+
+ protected override CSharpFileOptions ThisMessage {
+ get { return this; }
+ }
+
+ public static pbd::MessageDescriptor Descriptor {
+ get { return global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.internal__static_google_protobuf_CSharpFileOptions__Descriptor; }
+ }
+
+ protected override pb::FieldAccess.FieldAccessorTable<CSharpFileOptions, CSharpFileOptions.Builder> InternalFieldAccessors {
+ get { return global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.internal__static_google_protobuf_CSharpFileOptions__FieldAccessorTable; }
+ }
+
+ public static readonly pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.DescriptorProtos.CSharpFileOptions> CSharpOptions =
+ pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.DescriptorProtos.CSharpFileOptions>.CreateInstance(Descriptor.Extensions[0]);
+ private bool hasNamespace;
+ private string namespace_ = "";
+ public bool HasNamespace {
+ get { return hasNamespace; }
+ }
+ public string Namespace {
+ get { return namespace_; }
+ }
+
+ private bool hasUmbrellaClassname;
+ private string umbrellaClassname_ = "";
+ public bool HasUmbrellaClassname {
+ get { return hasUmbrellaClassname; }
+ }
+ public string UmbrellaClassname {
+ get { return umbrellaClassname_; }
+ }
+
+ private bool hasPublicClasses;
+ private bool publicClasses_ = false;
+ public bool HasPublicClasses {
+ get { return hasPublicClasses; }
+ }
+ public bool PublicClasses {
+ get { return publicClasses_; }
+ }
+
+ private bool hasMultipleFiles;
+ private bool multipleFiles_ = false;
+ public bool HasMultipleFiles {
+ get { return hasMultipleFiles; }
+ }
+ public bool MultipleFiles {
+ get { return multipleFiles_; }
+ }
+
+ private bool hasNestClasses;
+ private bool nestClasses_ = false;
+ public bool HasNestClasses {
+ get { return hasNestClasses; }
+ }
+ public bool NestClasses {
+ get { return nestClasses_; }
+ }
+
+ public static CSharpFileOptions ParseFrom(pb::ByteString data) {
+ return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+ }
+ public static CSharpFileOptions ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+ return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+ }
+ public static CSharpFileOptions ParseFrom(byte[] data) {
+ return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+ }
+ public static CSharpFileOptions ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+ return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+ }
+ public static CSharpFileOptions ParseFrom(global::System.IO.Stream input) {
+ return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+ }
+ public static CSharpFileOptions ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+ return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+ }
+ public static CSharpFileOptions ParseFrom(pb::CodedInputStream input) {
+ return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+ }
+ public static CSharpFileOptions ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+ return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+ }
+ public static Builder CreateBuilder() { return new Builder(); }
+ public override Builder CreateBuilderForType() { return new Builder(); }
+ public static Builder CreateBuilder(CSharpFileOptions prototype) {
+ return (Builder) new Builder().MergeFrom(prototype);
+ }
+
+ public sealed partial class Builder : pb::GeneratedBuilder<CSharpFileOptions, Builder> {
+ protected override Builder ThisBuilder {
+ get { return this; }
+ }
+ public Builder() {}
+
+ CSharpFileOptions result = new CSharpFileOptions();
+
+ protected override CSharpFileOptions MessageBeingBuilt {
+ get { return result; }
+ }
+
+ public override Builder Clear() {
+ result = new CSharpFileOptions();
+ return this;
+ }
+
+ public override Builder Clone() {
+ return new Builder().MergeFrom(result);
+ }
+
+ public override pbd::MessageDescriptor DescriptorForType {
+ get { return CSharpFileOptions.Descriptor; }
+ }
+
+ public override CSharpFileOptions DefaultInstanceForType {
+ get { return CSharpFileOptions.DefaultInstance; }
+ }
+
+ public override CSharpFileOptions BuildPartial() {
+ CSharpFileOptions returnMe = result;
+ result = null;
+ return returnMe;
+ }
+
+
+ public bool HasNamespace {
+ get { return result.HasNamespace; }
+ }
+ public string Namespace {
+ get { return result.Namespace; }
+ set { SetNamespace(value); }
+ }
+ public Builder SetNamespace(string value) {
+ result.hasNamespace = true;
+ result.namespace_ = value;
+ return this;
+ }
+ public Builder ClearNamespace() {
+ result.hasNamespace = false;
+ result.namespace_ = "";
+ return this;
+ }
+
+ public bool HasUmbrellaClassname {
+ get { return result.HasUmbrellaClassname; }
+ }
+ public string UmbrellaClassname {
+ get { return result.UmbrellaClassname; }
+ set { SetUmbrellaClassname(value); }
+ }
+ public Builder SetUmbrellaClassname(string value) {
+ result.hasUmbrellaClassname = true;
+ result.umbrellaClassname_ = value;
+ return this;
+ }
+ public Builder ClearUmbrellaClassname() {
+ result.hasUmbrellaClassname = false;
+ result.umbrellaClassname_ = "";
+ return this;
+ }
+
+ public bool HasPublicClasses {
+ get { return result.HasPublicClasses; }
+ }
+ public bool PublicClasses {
+ get { return result.PublicClasses; }
+ set { SetPublicClasses(value); }
+ }
+ public Builder SetPublicClasses(bool value) {
+ result.hasPublicClasses = true;
+ result.publicClasses_ = value;
+ return this;
+ }
+ public Builder ClearPublicClasses() {
+ result.hasPublicClasses = false;
+ result.publicClasses_ = false;
+ return this;
+ }
+
+ public bool HasMultipleFiles {
+ get { return result.HasMultipleFiles; }
+ }
+ public bool MultipleFiles {
+ get { return result.MultipleFiles; }
+ set { SetMultipleFiles(value); }
+ }
+ public Builder SetMultipleFiles(bool value) {
+ result.hasMultipleFiles = true;
+ result.multipleFiles_ = value;
+ return this;
+ }
+ public Builder ClearMultipleFiles() {
+ result.hasMultipleFiles = false;
+ result.multipleFiles_ = false;
+ return this;
+ }
+
+ public bool HasNestClasses {
+ get { return result.HasNestClasses; }
+ }
+ public bool NestClasses {
+ get { return result.NestClasses; }
+ set { SetNestClasses(value); }
+ }
+ public Builder SetNestClasses(bool value) {
+ result.hasNestClasses = true;
+ result.nestClasses_ = value;
+ return this;
+ }
+ public Builder ClearNestClasses() {
+ result.hasNestClasses = false;
+ result.nestClasses_ = false;
+ return this;
+ }
+ }
+ }
+
+ public sealed partial class CSharpFieldOptions : pb::GeneratedMessage<CSharpFieldOptions, CSharpFieldOptions.Builder> {
+ private static readonly CSharpFieldOptions defaultInstance = new Builder().BuildPartial();
+ public static CSharpFieldOptions DefaultInstance {
+ get { return defaultInstance; }
+ }
+
+ public override CSharpFieldOptions DefaultInstanceForType {
+ get { return defaultInstance; }
+ }
+
+ protected override CSharpFieldOptions ThisMessage {
+ get { return this; }
+ }
+
+ public static pbd::MessageDescriptor Descriptor {
+ get { return global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.internal__static_google_protobuf_CSharpFieldOptions__Descriptor; }
+ }
+
+ protected override pb::FieldAccess.FieldAccessorTable<CSharpFieldOptions, CSharpFieldOptions.Builder> InternalFieldAccessors {
+ get { return global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.internal__static_google_protobuf_CSharpFieldOptions__FieldAccessorTable; }
+ }
+
+ public static readonly pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.DescriptorProtos.CSharpFieldOptions> CSharpOptions =
+ pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.DescriptorProtos.CSharpFieldOptions>.CreateInstance(Descriptor.Extensions[0]);
+ private bool hasPropertyName;
+ private string propertyName_ = "";
+ public bool HasPropertyName {
+ get { return hasPropertyName; }
+ }
+ public string PropertyName {
+ get { return propertyName_; }
+ }
+
+ public static CSharpFieldOptions ParseFrom(pb::ByteString data) {
+ return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+ }
+ public static CSharpFieldOptions ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+ return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+ }
+ public static CSharpFieldOptions ParseFrom(byte[] data) {
+ return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+ }
+ public static CSharpFieldOptions ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+ return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+ }
+ public static CSharpFieldOptions ParseFrom(global::System.IO.Stream input) {
+ return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+ }
+ public static CSharpFieldOptions ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+ return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+ }
+ public static CSharpFieldOptions ParseFrom(pb::CodedInputStream input) {
+ return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+ }
+ public static CSharpFieldOptions ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+ return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+ }
+ public static Builder CreateBuilder() { return new Builder(); }
+ public override Builder CreateBuilderForType() { return new Builder(); }
+ public static Builder CreateBuilder(CSharpFieldOptions prototype) {
+ return (Builder) new Builder().MergeFrom(prototype);
+ }
+
+ public sealed partial class Builder : pb::GeneratedBuilder<CSharpFieldOptions, Builder> {
+ protected override Builder ThisBuilder {
+ get { return this; }
+ }
+ public Builder() {}
+
+ CSharpFieldOptions result = new CSharpFieldOptions();
+
+ protected override CSharpFieldOptions MessageBeingBuilt {
+ get { return result; }
+ }
+
+ public override Builder Clear() {
+ result = new CSharpFieldOptions();
+ return this;
+ }
+
+ public override Builder Clone() {
+ return new Builder().MergeFrom(result);
+ }
+
+ public override pbd::MessageDescriptor DescriptorForType {
+ get { return CSharpFieldOptions.Descriptor; }
+ }
+
+ public override CSharpFieldOptions DefaultInstanceForType {
+ get { return CSharpFieldOptions.DefaultInstance; }
+ }
+
+ public override CSharpFieldOptions BuildPartial() {
+ CSharpFieldOptions returnMe = result;
+ result = null;
+ return returnMe;
+ }
+
+
+ public bool HasPropertyName {
+ get { return result.HasPropertyName; }
+ }
+ public string PropertyName {
+ get { return result.PropertyName; }
+ set { SetPropertyName(value); }
+ }
+ public Builder SetPropertyName(string value) {
+ result.hasPropertyName = true;
+ result.propertyName_ = value;
+ return this;
+ }
+ public Builder ClearPropertyName() {
+ result.hasPropertyName = false;
+ result.propertyName_ = "";
+ return this;
+ }
+ }
+ }
+
+ #endregion
+
}
diff --git a/src/ProtocolBuffers/Descriptors/FileDescriptor.cs b/src/ProtocolBuffers/Descriptors/FileDescriptor.cs
index ebb6b159..79e034a1 100644
--- a/src/ProtocolBuffers/Descriptors/FileDescriptor.cs
+++ b/src/ProtocolBuffers/Descriptors/FileDescriptor.cs
@@ -50,6 +50,8 @@ namespace Google.ProtocolBuffers.Descriptors {
private readonly IList<FieldDescriptor> extensions;
private readonly IList<FileDescriptor> dependencies;
private readonly DescriptorPool pool;
+ private CSharpFileOptions csharpFileOptions;
+ private readonly object optionsLock = new object();
private FileDescriptor(FileDescriptorProto proto, FileDescriptor[] dependencies, DescriptorPool pool) {
this.pool = pool;
@@ -71,6 +73,44 @@ namespace Google.ProtocolBuffers.Descriptors {
(field, index) => new FieldDescriptor(field, this, null, index, true));
}
+ private CSharpFileOptions BuildOrFakeCSharpOptions() {
+ // TODO(jonskeet): Check if we could use FileDescriptorProto.Descriptor.Name - interesting bootstrap issues
+ if (proto.Name == "google/protobuf/descriptor.proto") {
+ return new CSharpFileOptions.Builder {
+ Namespace = "Google.ProtocolBuffers.DescriptorProtos",
+ UmbrellaClassname = "DescriptorProtoFile", NestClasses = false, MultipleFiles = false, PublicClasses = true
+ }.Build();
+ }
+ if (proto.Name == "google/protobuf/csharp_options.proto") {
+ return new CSharpFileOptions.Builder {
+ Namespace = "Google.ProtocolBuffers.DescriptorProtos",
+ UmbrellaClassname = "CSharpOptions", NestClasses = false, MultipleFiles = false, PublicClasses = true
+ }.Build();
+ }
+ CSharpFileOptions.Builder builder = CSharpFileOptions.CreateBuilder();
+ if (proto.Options.HasExtension(CSharpFileOptions.CSharpOptions)) {
+ builder.MergeFrom(proto.Options.GetExtension(CSharpFileOptions.CSharpOptions));
+ }
+ if (!builder.HasNamespace) {
+ builder.Namespace = Package;
+ }
+ if (!builder.HasMultipleFiles) {
+ builder.MultipleFiles = false;
+ }
+ if (!builder.HasNestClasses) {
+ builder.NestClasses = false;
+ }
+ if (!builder.HasPublicClasses) {
+ builder.PublicClasses = true;
+ }
+ if (!builder.HasUmbrellaClassname) {
+ int lastSlash = Name.LastIndexOf('/');
+ string baseName = Name.Substring(lastSlash + 1);
+ builder.UmbrellaClassname = NameHelpers.UnderscoresToPascalCase(NameHelpers.StripProto(baseName));
+ }
+ return builder.Build();
+ }
+
/// <value>
/// The descriptor in its protocol message representation.
/// </value>
@@ -85,6 +125,22 @@ namespace Google.ProtocolBuffers.Descriptors {
get { return proto.Options; }
}
+ /// <summary>
+ /// Returns the C#-specific options for this file descriptor. This will always be
+ /// completely filled in.
+ /// FIXME: This isn't thread-safe. Can't do it at construction time due to bootstrapping issues.
+ /// </summary>
+ public CSharpFileOptions CSharpOptions {
+ get {
+ lock (optionsLock) {
+ if (csharpFileOptions == null) {
+ csharpFileOptions = BuildOrFakeCSharpOptions();
+ }
+ }
+ return csharpFileOptions;
+ }
+ }
+
/// <value>
/// The file name.
/// </value>
@@ -250,7 +306,7 @@ namespace Google.ProtocolBuffers.Descriptors {
/// <summary>
/// This method is to be called by generated code only. It is equivalent
- /// to BuilderFrom except that the FileDescriptorProto is encoded in
+ /// to BuildFrom except that the FileDescriptorProto is encoded in
/// protocol buffer wire format.
/// </summary>
public static FileDescriptor InternalBuildGeneratedFileFrom(byte[] descriptorData,
diff --git a/src/ProtocolBuffers/NameHelpers.cs b/src/ProtocolBuffers/NameHelpers.cs
new file mode 100644
index 00000000..8b297f95
--- /dev/null
+++ b/src/ProtocolBuffers/NameHelpers.cs
@@ -0,0 +1,78 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Google.ProtocolBuffers {
+ /// <summary>
+ /// Helpers for converting names to pascal case etc.
+ /// </summary>
+ internal class NameHelpers {
+
+ internal static string UnderscoresToPascalCase(string input) {
+ return UnderscoresToPascalOrCamelCase(input, true);
+ }
+
+ internal static string UnderscoresToCamelCase(string input) {
+ return UnderscoresToPascalOrCamelCase(input, false);
+ }
+
+ /// <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();
+ }
+
+ internal static string StripProto(string text) {
+ if (!StripSuffix(ref text, ".protodevel")) {
+ StripSuffix(ref text, ".proto");
+ }
+ return text;
+ }
+
+ /// <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/src/ProtocolBuffers/ProtocolBuffers.csproj b/src/ProtocolBuffers/ProtocolBuffers.csproj
index 3f76aa7f..6a746cc9 100644
--- a/src/ProtocolBuffers/ProtocolBuffers.csproj
+++ b/src/ProtocolBuffers/ProtocolBuffers.csproj
@@ -97,6 +97,7 @@
<Compile Include="IService.cs" />
<Compile Include="MessageStreamIterator.cs" />
<Compile Include="MessageStreamWriter.cs" />
+ <Compile Include="NameHelpers.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RpcUtil.cs" />
<Compile Include="TextFormat.cs" />