mergeFromString($data); $file = FileDescriptor::buildFromProto($files->getFile()[0]); foreach ($file->getMessageType() as &$desc) { $this->addDescriptor($desc); } unset($desc); foreach ($file->getEnumType() as &$desc) { $this->addEnumDescriptor($desc); } unset($desc); foreach ($file->getMessageType() as &$desc) { $this->crossLink($desc); } unset($desc); } public function addMessage($name, $klass) { return new MessageBuilderContext($name, $klass, $this); } public function addEnum($name, $klass) { return new EnumBuilderContext($name, $klass, $this); } public function addDescriptor($descriptor) { $this->proto_to_class[$descriptor->getFullName()] = $descriptor->getClass(); $this->class_to_desc[$descriptor->getClass()] = $descriptor; foreach ($descriptor->getNestedType() as $nested_type) { $this->addDescriptor($nested_type); } foreach ($descriptor->getEnumType() as $enum_type) { $this->addEnumDescriptor($enum_type); } } public function addEnumDescriptor($descriptor) { $this->proto_to_class[$descriptor->getFullName()] = $descriptor->getClass(); $this->class_to_enum_desc[$descriptor->getClass()] = $descriptor; } public function getDescriptorByClassName($klass) { return $this->class_to_desc[$klass]; } public function getEnumDescriptorByClassName($klass) { return $this->class_to_enum_desc[$klass]; } public function getDescriptorByProtoName($proto) { $klass = $this->proto_to_class[$proto]; return $this->class_to_desc[$klass]; } public function getEnumDescriptorByProtoName($proto) { $klass = $this->proto_to_class[$proto]; return $this->class_to_enum_desc[$klass]; } private function crossLink(&$desc) { foreach ($desc->getField() as &$field) { switch ($field->getType()) { case GPBType::MESSAGE: $proto = $field->getMessageType(); $field->setMessageType( $this->getDescriptorByProtoName($proto)); break; case GPBType::ENUM: $proto = $field->getEnumType(); $field->setEnumType( $this->getEnumDescriptorByProtoName($proto)); break; default: break; } } unset($field); foreach ($desc->getNestedType() as &$nested_type) { $this->crossLink($nested_type); } unset($nested_type); } public function finish() { foreach ($this->class_to_desc as $klass => &$desc) { $this->crossLink($desc); } unset($desc); } }