diff options
author | Jan Tattermusch <jtattermusch@users.noreply.github.com> | 2015-07-22 10:36:06 -0700 |
---|---|---|
committer | Jan Tattermusch <jtattermusch@users.noreply.github.com> | 2015-07-22 10:36:06 -0700 |
commit | 7b5c3967991b6534f439cb31b0d247501f4a0ef8 (patch) | |
tree | e161b4bfaa308ca173ee9a8b2ff858c5b76b618b /csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs | |
parent | 2ee4b5665520fe3245eb5e15df8bd35e0c539a07 (diff) | |
parent | 43d64b4f54c8cf9521aded37fc695faba28793ee (diff) | |
download | protobuf-7b5c3967991b6534f439cb31b0d247501f4a0ef8.tar.gz protobuf-7b5c3967991b6534f439cb31b0d247501f4a0ef8.tar.bz2 protobuf-7b5c3967991b6534f439cb31b0d247501f4a0ef8.zip |
Merge pull request #625 from jskeet/reflection-refactor
Reflection refactor
Diffstat (limited to 'csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs')
-rw-r--r-- | csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs index db393480..041d4711 100644 --- a/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs +++ b/csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs @@ -62,7 +62,7 @@ namespace Google.Protobuf.Reflection get { return proto.Syntax == "proto3" ? ProtoSyntax.Proto3 : ProtoSyntax.Proto2; } } - private FileDescriptor(FileDescriptorProto proto, FileDescriptor[] dependencies, DescriptorPool pool, bool allowUnknownDependencies) + private FileDescriptor(FileDescriptorProto proto, FileDescriptor[] dependencies, DescriptorPool pool, bool allowUnknownDependencies, GeneratedCodeInfo generatedCodeInfo) { this.pool = pool; this.proto = proto; @@ -74,11 +74,11 @@ namespace Google.Protobuf.Reflection messageTypes = DescriptorUtil.ConvertAndMakeReadOnly(proto.MessageType, (message, index) => - new MessageDescriptor(message, this, null, index)); + new MessageDescriptor(message, this, null, index, generatedCodeInfo == null ? null : generatedCodeInfo.NestedTypes[index])); enumTypes = DescriptorUtil.ConvertAndMakeReadOnly(proto.EnumType, (enumType, index) => - new EnumDescriptor(enumType, this, null, index)); + new EnumDescriptor(enumType, this, null, index, generatedCodeInfo == null ? null : generatedCodeInfo.NestedEnums[index])); services = DescriptorUtil.ConvertAndMakeReadOnly(proto.Service, (service, index) => @@ -253,7 +253,7 @@ namespace Google.Protobuf.Reflection } return null; } - + /// <summary> /// Builds a FileDescriptor from its protocol buffer representation. /// </summary> @@ -262,10 +262,11 @@ namespace Google.Protobuf.Reflection /// file's dependencies, in the exact order listed in the .proto file. May be null, /// in which case it is treated as an empty array.</param> /// <param name="allowUnknownDependencies">Whether unknown dependencies are ignored (true) or cause an exception to be thrown (false).</param> + /// <param name="generatedCodeInfo">Reflection information, if any. May be null, specifically for non-generated code.</param> /// <exception cref="DescriptorValidationException">If <paramref name="proto"/> is not /// a valid descriptor. This can occur for a number of reasons, such as a field /// having an undefined type or because two messages were defined with the same name.</exception> - private static FileDescriptor BuildFrom(FileDescriptorProto proto, FileDescriptor[] dependencies, bool allowUnknownDependencies) + private static FileDescriptor BuildFrom(FileDescriptorProto proto, FileDescriptor[] dependencies, bool allowUnknownDependencies, GeneratedCodeInfo generatedCodeInfo) { // Building descriptors involves two steps: translating and linking. // In the translation step (implemented by FileDescriptor's @@ -282,7 +283,7 @@ namespace Google.Protobuf.Reflection } DescriptorPool pool = new DescriptorPool(dependencies); - FileDescriptor result = new FileDescriptor(proto, dependencies, pool, allowUnknownDependencies); + FileDescriptor result = new FileDescriptor(proto, dependencies, pool, allowUnknownDependencies, generatedCodeInfo); // TODO(jonskeet): Reinstate these checks, or get rid of them entirely. They aren't in the Java code, // and fail for the CustomOptions test right now. (We get "descriptor.proto" vs "google/protobuf/descriptor.proto".) @@ -319,8 +320,17 @@ namespace Google.Protobuf.Reflection } } + /// <summary> + /// Creates an instance for generated code. + /// </summary> + /// <remarks> + /// The <paramref name="generatedCodeInfo"/> parameter should be null for descriptors which don't correspond to + /// generated types. Otherwise, it should be a <see cref="GeneratedCodeInfo"/> with nested types and nested + /// enums corresponding to the types and enums contained within the file descriptor. + /// </remarks> public static FileDescriptor InternalBuildGeneratedFileFrom(byte[] descriptorData, - FileDescriptor[] dependencies) + FileDescriptor[] dependencies, + GeneratedCodeInfo generatedCodeInfo) { FileDescriptorProto proto; try @@ -336,7 +346,7 @@ namespace Google.Protobuf.Reflection { // When building descriptors for generated code, we allow unknown // dependencies by default. - return BuildFrom(proto, dependencies, true); + return BuildFrom(proto, dependencies, true, generatedCodeInfo); } catch (DescriptorValidationException e) { |