private FileDescriptor(FileDescriptorProto proto, FileDescriptor[] dependencies, DescriptorPool pool, bool allowUnknownDependencies) { this.pool = pool; this.proto = proto; this.dependencies = new ReadOnlyCollection <FileDescriptor>((FileDescriptor[])dependencies.Clone()); publicDependencies = DeterminePublicDependencies(this, proto, dependencies, allowUnknownDependencies); pool.AddPackage(Package, this); messageTypes = DescriptorUtil.ConvertAndMakeReadOnly(proto.MessageTypeList, (message, index) => new MessageDescriptor(message, this, null, index)); enumTypes = DescriptorUtil.ConvertAndMakeReadOnly(proto.EnumTypeList, (enumType, index) => new EnumDescriptor(enumType, this, null, index)); services = DescriptorUtil.ConvertAndMakeReadOnly(proto.ServiceList, (service, index) => new ServiceDescriptor(service, this, index)); extensions = DescriptorUtil.ConvertAndMakeReadOnly(proto.ExtensionList, (field, index) => new FieldDescriptor(field, this, null, index, true)); }
/// <summary> /// Builds a FileDescriptor from its protocol buffer representation. /// </summary> /// <param name="proto">The protocol message form of the FileDescriptor.</param> /// <param name="dependencies">FileDescriptors corresponding to all of the /// 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> /// <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) { // Building descriptors involves two steps: translating and linking. // In the translation step (implemented by FileDescriptor's // constructor), we build an object tree mirroring the // FileDescriptorProto's tree and put all of the descriptors into the // DescriptorPool's lookup tables. In the linking step, we look up all // type references in the DescriptorPool, so that, for example, a // FieldDescriptor for an embedded message contains a pointer directly // to the Descriptor for that message's type. We also detect undefined // types in the linking step. if (dependencies == null) { dependencies = new FileDescriptor[0]; } DescriptorPool pool = new DescriptorPool(dependencies); FileDescriptor result = new FileDescriptor(proto, dependencies, pool, allowUnknownDependencies); // 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".) //if (dependencies.Length != proto.DependencyCount) //{ // throw new DescriptorValidationException(result, // "Dependencies passed to FileDescriptor.BuildFrom() don't match " + // "those listed in the FileDescriptorProto."); //} //for (int i = 0; i < proto.DependencyCount; i++) //{ // if (dependencies[i].Name != proto.DependencyList[i]) // { // throw new DescriptorValidationException(result, // "Dependencies passed to FileDescriptor.BuildFrom() don't match " + // "those listed in the FileDescriptorProto."); // } //} result.CrossLink(); return(result); }
/// <summary> /// Builds a FileDescriptor from its protocol buffer representation. /// </summary> /// <param name="proto">The protocol message form of the FileDescriptor.</param> /// <param name="dependencies">FileDescriptors corresponding to all of the /// 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> /// <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> public static FileDescriptor BuildFrom(FileDescriptorProto proto, FileDescriptor[] dependencies) { // Building descriptors involves two steps: translating and linking. // In the translation step (implemented by FileDescriptor's // constructor), we build an object tree mirroring the // FileDescriptorProto's tree and put all of the descriptors into the // DescriptorPool's lookup tables. In the linking step, we look up all // type references in the DescriptorPool, so that, for example, a // FieldDescriptor for an embedded message contains a pointer directly // to the Descriptor for that message's type. We also detect undefined // types in the linking step. if (dependencies == null) { dependencies = new FileDescriptor[0]; } DescriptorPool pool = new DescriptorPool(dependencies); FileDescriptor result = new FileDescriptor(proto, dependencies, pool); if (dependencies.Length != proto.DependencyCount) { throw new DescriptorValidationException(result, "Dependencies passed to FileDescriptor.BuildFrom() don't match " + "those listed in the FileDescriptorProto."); } for (int i = 0; i < proto.DependencyCount; i++) { if (dependencies[i].Name != proto.DependencyList[i]) { throw new DescriptorValidationException(result, "Dependencies passed to FileDescriptor.BuildFrom() don't match " + "those listed in the FileDescriptorProto."); } } result.CrossLink(); return(result); }