|
@@ -481,18 +481,21 @@ namespace Google.Protobuf.Reflection
|
|
/// dependencies must come before the descriptor which depends on them. (If A depends on B, and B
|
|
/// dependencies must come before the descriptor which depends on them. (If A depends on B, and B
|
|
/// depends on C, then the descriptors must be presented in the order C, B, A.) This is compatible
|
|
/// depends on C, then the descriptors must be presented in the order C, B, A.) This is compatible
|
|
/// with the order in which protoc provides descriptors to plugins.</param>
|
|
/// with the order in which protoc provides descriptors to plugins.</param>
|
|
|
|
+ /// <param name="registry">The extension registry to use when parsing, or null if no extensions are required.</param>
|
|
/// <returns>The file descriptors corresponding to <paramref name="descriptorData"/>.</returns>
|
|
/// <returns>The file descriptors corresponding to <paramref name="descriptorData"/>.</returns>
|
|
- public static IReadOnlyList<FileDescriptor> BuildFromByteStrings(IEnumerable<ByteString> descriptorData)
|
|
|
|
|
|
+ public static IReadOnlyList<FileDescriptor> BuildFromByteStrings(IEnumerable<ByteString> descriptorData, ExtensionRegistry registry)
|
|
{
|
|
{
|
|
ProtoPreconditions.CheckNotNull(descriptorData, nameof(descriptorData));
|
|
ProtoPreconditions.CheckNotNull(descriptorData, nameof(descriptorData));
|
|
|
|
|
|
|
|
+ var parser = FileDescriptorProto.Parser.WithExtensionRegistry(registry);
|
|
|
|
+
|
|
// TODO: See if we can build a single DescriptorPool instead of building lots of them.
|
|
// TODO: See if we can build a single DescriptorPool instead of building lots of them.
|
|
// This will all behave correctly, but it's less efficient than we'd like.
|
|
// This will all behave correctly, but it's less efficient than we'd like.
|
|
var descriptors = new List<FileDescriptor>();
|
|
var descriptors = new List<FileDescriptor>();
|
|
var descriptorsByName = new Dictionary<string, FileDescriptor>();
|
|
var descriptorsByName = new Dictionary<string, FileDescriptor>();
|
|
foreach (var data in descriptorData)
|
|
foreach (var data in descriptorData)
|
|
{
|
|
{
|
|
- var proto = FileDescriptorProto.Parser.ParseFrom(data);
|
|
|
|
|
|
+ var proto = parser.ParseFrom(data);
|
|
var dependencies = new List<FileDescriptor>();
|
|
var dependencies = new List<FileDescriptor>();
|
|
foreach (var dependencyName in proto.Dependency)
|
|
foreach (var dependencyName in proto.Dependency)
|
|
{
|
|
{
|
|
@@ -518,6 +521,18 @@ namespace Google.Protobuf.Reflection
|
|
return new ReadOnlyCollection<FileDescriptor>(descriptors);
|
|
return new ReadOnlyCollection<FileDescriptor>(descriptors);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// Converts the given descriptor binary data into FileDescriptor objects.
|
|
|
|
+ /// Note: reflection using the returned FileDescriptors is not currently supported.
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <param name="descriptorData">The binary file descriptor proto data. Must not be null, and any
|
|
|
|
+ /// dependencies must come before the descriptor which depends on them. (If A depends on B, and B
|
|
|
|
+ /// depends on C, then the descriptors must be presented in the order C, B, A.) This is compatible
|
|
|
|
+ /// with the order in which protoc provides descriptors to plugins.</param>
|
|
|
|
+ /// <returns>The file descriptors corresponding to <paramref name="descriptorData"/>.</returns>
|
|
|
|
+ public static IReadOnlyList<FileDescriptor> BuildFromByteStrings(IEnumerable<ByteString> descriptorData) =>
|
|
|
|
+ BuildFromByteStrings(descriptorData, null);
|
|
|
|
+
|
|
/// <summary>
|
|
/// <summary>
|
|
/// Returns a <see cref="System.String" /> that represents this instance.
|
|
/// Returns a <see cref="System.String" /> that represents this instance.
|
|
/// </summary>
|
|
/// </summary>
|