/// <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) { ProtoPreconditions.CheckNotNull(descriptorData, nameof(descriptorData)); // 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. var descriptors = new List <FileDescriptor>(); var descriptorsByName = new Dictionary <string, FileDescriptor>(); foreach (var data in descriptorData) { var proto = FileDescriptorProto.Parser.ParseFrom(data); var dependencies = new List <FileDescriptor>(); foreach (var dependencyName in proto.Dependency) { FileDescriptor dependency; if (!descriptorsByName.TryGetValue(dependencyName, out dependency)) { throw new ArgumentException($"Dependency missing: {dependencyName}"); } dependencies.Add(dependency); } var pool = new DescriptorPool(dependencies); FileDescriptor descriptor = new FileDescriptor( data, proto, dependencies, pool, allowUnknownDependencies: false, generatedCodeInfo: null); descriptor.CrossLink(); descriptors.Add(descriptor); if (descriptorsByName.ContainsKey(descriptor.Name)) { throw new ArgumentException($"Duplicate descriptor name: {descriptor.Name}"); } descriptorsByName.Add(descriptor.Name, descriptor); } return(new ReadOnlyCollection <FileDescriptor>(descriptors)); }
internal DescriptorBase(FileDescriptor file, string fullName, int index) { File = file; FullName = fullName; Index = index; }