diff options
Diffstat (limited to 'src/ProtocolBuffers/Descriptors')
-rw-r--r-- | src/ProtocolBuffers/Descriptors/FieldDescriptor.cs | 43 | ||||
-rw-r--r-- | src/ProtocolBuffers/Descriptors/FileDescriptor.cs | 5 |
2 files changed, 45 insertions, 3 deletions
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 { |