aboutsummaryrefslogtreecommitdiff
path: root/src/ProtocolBuffers
diff options
context:
space:
mode:
authorJon Skeet <skeet@pobox.com>2008-11-13 22:29:48 +0000
committerJon Skeet <skeet@pobox.com>2008-11-13 22:29:48 +0000
commit1d131c98f058dc0b5e0ebef73602e09dc88fe075 (patch)
treee94ff4c7383c557902ec5eb63b8889dda24e3bd7 /src/ProtocolBuffers
parentd6343be707cb6a067fe2b5ccc2efd7848072d17c (diff)
downloadprotobuf-1d131c98f058dc0b5e0ebef73602e09dc88fe075.tar.gz
protobuf-1d131c98f058dc0b5e0ebef73602e09dc88fe075.tar.bz2
protobuf-1d131c98f058dc0b5e0ebef73602e09dc88fe075.zip
New options now work fine.
Diffstat (limited to 'src/ProtocolBuffers')
-rw-r--r--src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs25
-rw-r--r--src/ProtocolBuffers/Descriptors/FieldDescriptor.cs43
-rw-r--r--src/ProtocolBuffers/Descriptors/FileDescriptor.cs5
3 files changed, 59 insertions, 14 deletions
diff --git a/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs b/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs
index 55a30030..743a0c36 100644
--- a/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs
+++ b/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs
@@ -16,20 +16,27 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
global::System.Convert.FromBase64String(
"CiRnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8SD2dvb2ds" +
"ZS5wcm90b2J1ZhogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8i" +
- "4wEKEUNTaGFycEZpbGVPcHRpb25zEhEKCW5hbWVzcGFjZRgBIAEoCRIaChJ1" +
+ "iAEKEUNTaGFycEZpbGVPcHRpb25zEhEKCW5hbWVzcGFjZRgBIAEoCRIaChJ1" +
"bWJyZWxsYV9jbGFzc25hbWUYAiABKAkSFgoOcHVibGljX2NsYXNzZXMYAyAB" +
"KAgSFgoObXVsdGlwbGVfZmlsZXMYBCABKAgSFAoMbmVzdF9jbGFzc2VzGAUg" +
- "ASgIMlkKDmNzaGFycF9vcHRpb25zEhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVP" +
- "cHRpb25zGOgHIAEoCzIiLmdvb2dsZS5wcm90b2J1Zi5DU2hhcnBGaWxlT3B0" +
- "aW9ucyKIAQoSQ1NoYXJwRmllbGRPcHRpb25zEhUKDXByb3BlcnR5X25hbWUY" +
- "ASABKAkyWwoOY3NoYXJwX29wdGlvbnMSHS5nb29nbGUucHJvdG9idWYuRmll" +
- "bGRPcHRpb25zGOgHIAEoCzIjLmdvb2dsZS5wcm90b2J1Zi5DU2hhcnBGaWVs" +
- "ZE9wdGlvbnM="),
+ "ASgIIisKEkNTaGFycEZpZWxkT3B0aW9ucxIVCg1wcm9wZXJ0eV9uYW1lGAEg" +
+ "ASgJOl4KE2NzaGFycF9maWxlX29wdGlvbnMSHC5nb29nbGUucHJvdG9idWYu" +
+ "RmlsZU9wdGlvbnMY6AcgASgLMiIuZ29vZ2xlLnByb3RvYnVmLkNTaGFycEZp" +
+ "bGVPcHRpb25zOmEKFGNzaGFycF9maWVsZF9vcHRpb25zEh0uZ29vZ2xlLnBy" +
+ "b3RvYnVmLkZpZWxkT3B0aW9ucxjoByABKAsyIy5nb29nbGUucHJvdG9idWYu" +
+ "Q1NoYXJwRmllbGRPcHRpb25z"),
new pbd::FileDescriptor[] {
global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.Descriptor,
});
#endregion
+ #region Extensions
+ public static readonly pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.DescriptorProtos.CSharpFileOptions> CSharpFileOptions =
+ pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.DescriptorProtos.CSharpFileOptions>.CreateInstance(Descriptor.Extensions[0]);
+ public static readonly pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.DescriptorProtos.CSharpFieldOptions> CSharpFieldOptions =
+ pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.DescriptorProtos.CSharpFieldOptions>.CreateInstance(Descriptor.Extensions[1]);
+ #endregion
+
#region Static variables
internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_CSharpFileOptions__Descriptor
= Descriptor.MessageTypes[0];
@@ -66,8 +73,6 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
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 {
@@ -293,8 +298,6 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
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 {
diff --git a/src/ProtocolBuffers/Descriptors/FieldDescriptor.cs b/src/ProtocolBuffers/Descriptors/FieldDescriptor.cs
index 5ff55197..0d0fad76 100644
--- a/src/ProtocolBuffers/Descriptors/FieldDescriptor.cs
+++ b/src/ProtocolBuffers/Descriptors/FieldDescriptor.cs
@@ -50,6 +50,9 @@ namespace Google.ProtocolBuffers.Descriptors {
private FieldType fieldType;
private MappedType mappedType;
+ private CSharpFieldOptions csharpFieldOptions;
+ private readonly object optionsLock = new object();
+
internal FieldDescriptor(FieldDescriptorProto proto, FileDescriptor file,
MessageDescriptor parent, int index, bool isExtension)
: base(proto, file, ComputeFullName(file, parent, proto.Name), index) {
@@ -87,6 +90,31 @@ namespace Google.ProtocolBuffers.Descriptors {
file.DescriptorPool.AddSymbol(this);
}
+ private CSharpFieldOptions BuildOrFakeCSharpOptions() {
+ // TODO(jonskeet): Check if we could use FileDescriptorProto.Descriptor.Name - interesting bootstrap issues
+ if (File.Proto.Name == "google/protobuf/csharp_options.proto") {
+ if (Name=="csharp_field_options") {
+ return new CSharpFieldOptions.Builder { PropertyName = "CSharpFieldOptions" }.Build();
+ }
+ if (Name=="csharp_file_options") {
+ return new CSharpFieldOptions.Builder { PropertyName = "CSharpFileOptions" }.Build();
+ }
+ }
+ CSharpFieldOptions.Builder builder = CSharpFieldOptions.CreateBuilder();
+ if (Proto.Options.HasExtension(DescriptorProtos.CSharpOptions.CSharpFieldOptions)) {
+ builder.MergeFrom(Proto.Options.GetExtension(DescriptorProtos.CSharpOptions.CSharpFieldOptions));
+ }
+ if (!builder.HasPropertyName) {
+ string fieldName = FieldType == FieldType.Group ? MessageType.Name : Name;
+ string propertyName = NameHelpers.UnderscoresToPascalCase(fieldName);
+ if (propertyName == ContainingType.Name) {
+ propertyName += "_";
+ }
+ builder.PropertyName = propertyName;
+ }
+ return builder.Build();
+ }
+
/// <summary>
/// Maps a field type as included in the .proto file to a FieldType.
/// </summary>
@@ -191,6 +219,21 @@ namespace Google.ProtocolBuffers.Descriptors {
public MessageDescriptor ContainingType {
get { return containingType; }
}
+
+ /// <summary>
+ /// Returns the C#-specific options for this file descriptor. This will always be
+ /// completely filled in.
+ /// </summary>
+ public CSharpFieldOptions CSharpOptions {
+ get {
+ lock (optionsLock) {
+ if (csharpFieldOptions == null) {
+ csharpFieldOptions = BuildOrFakeCSharpOptions();
+ }
+ }
+ return csharpFieldOptions;
+ }
+ }
/// <summary>
/// For extensions defined nested within message types, gets
diff --git a/src/ProtocolBuffers/Descriptors/FileDescriptor.cs b/src/ProtocolBuffers/Descriptors/FileDescriptor.cs
index 79e034a1..81c4b790 100644
--- a/src/ProtocolBuffers/Descriptors/FileDescriptor.cs
+++ b/src/ProtocolBuffers/Descriptors/FileDescriptor.cs
@@ -88,8 +88,8 @@ namespace Google.ProtocolBuffers.Descriptors {
}.Build();
}
CSharpFileOptions.Builder builder = CSharpFileOptions.CreateBuilder();
- if (proto.Options.HasExtension(CSharpFileOptions.CSharpOptions)) {
- builder.MergeFrom(proto.Options.GetExtension(CSharpFileOptions.CSharpOptions));
+ if (proto.Options.HasExtension(DescriptorProtos.CSharpOptions.CSharpFileOptions)) {
+ builder.MergeFrom(proto.Options.GetExtension(DescriptorProtos.CSharpOptions.CSharpFileOptions));
}
if (!builder.HasNamespace) {
builder.Namespace = Package;
@@ -128,7 +128,6 @@ namespace Google.ProtocolBuffers.Descriptors {
/// <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 {