/** * @return \Protobuf\Extension\ExtensionFieldMap */ protected function getFileOptionsExtensions() { if (!$this->fileDescriptor->hasOptions()) { return null; } return $this->fileDescriptor->getOptions()->extensions(); }
public function generateSiblings($package_name, GeneratorContext $context, &$file_list) { if ($this->file->getOptions()->getExtension("php")->getMultipleFiles()) { foreach ($this->file->getEnumType() as $enum) { $enum->full_name = Helper::getPackageName($this->file) . "." . $enum->getName(); $path = $package_name . DIRECTORY_SEPARATOR . $enum->getName() . ".php"; $output = $context->open($path); $file_list[] = $path; $printer = new Printer($output, "`"); $gen = new EnumGenerator($context, $enum, $file_list); $gen->generate($printer); } foreach ($this->file->getMessageType() as $message) { $message->full_name = Helper::getPackageName($this->file) . "." . $message->getName(); $path = $package_name . DIRECTORY_SEPARATOR . $message->getName() . ".php"; $output = $context->open($path); $file_list[] = $path; $printer = new Printer($output, "`"); $gen = new MessageGenerator($context, $message, $file_list); $gen->generate($printer); } /* TODO(chobie): add service here */ } }
private function setPath($className, $path) { $this->paths[$className] = $path; $this->sourceCodeInfo[$className] = $this->file->getSourceCodeInfo(); }
protected function buildFile(proto\FileDescriptorProto $proto, $fname, $contents) { $suffix = $this->getOption('suffix') ?: '.php'; $fname .= $suffix; $file = new \google\protobuf\compiler\CodeGeneratorResponse\File(); $file->setName($fname); $s = array(); $s[] = "<?php"; $s[] = "// DO NOT EDIT! Generated by Protobuf-PHP protoc plugin " . Protobuf::VERSION; $s[] = "// Source: " . $proto->getName(); $s[] = "// Date: " . date('Y-m-d H:i:s'); $s[] = ""; $s[] = "// @@protoc_insertion_point(scope_file)"; $s[] = ""; $contents = implode(PHP_EOL, $s) . PHP_EOL . $contents; // If we don't want insertion points remove them if (!$this->getOption('insertions')) { $contents = preg_replace('#^\\s*//\\s+@@protoc_insertion_point.*$\\n#m', '', $contents); } $file->setContent($contents); return $file; }
/** * @param string $name * @param string $package * @param array $values * * @return \google\protobuf\FileDescriptorProto */ protected function createFileDescriptorProto($name, $package, array $values = []) { $descriptor = new FileDescriptorProto(); $extensions = isset($values['extensions']) ? $values['extensions'] : []; $options = isset($values['options']) ? $values['options'] : null; $messages = isset($values['messages']) ? $values['messages'] : []; $services = isset($values['services']) ? $values['services'] : []; $enums = isset($values['enums']) ? $values['enums'] : []; $descriptor->setName($name); $descriptor->setPackage($package); foreach ($extensions as $number => $field) { if (is_array($field)) { $name = $field[0]; $type = $field[1]; $label = $field[2]; $extendee = $field[3]; $typeName = isset($field[4]) ? $field[4] : null; $field = $this->createFieldDescriptorProto($number, $name, $type, $label, $typeName); $field->setExtendee($extendee); } $descriptor->addExtension($field); } foreach ($messages as $item) { if (is_array($item)) { $name = $item['name']; $fields = isset($item['fields']) ? $item['fields'] : []; $values = isset($item['values']) ? $item['values'] : []; $item = $this->createDescriptorProto($name, $fields, $values); } $descriptor->addMessageType($item); } foreach ($enums as $item) { if (is_array($item)) { $name = $item['name']; $values = isset($item['values']) ? $item['values'] : []; $item = $this->createEnumDescriptorProto($name, $values); } $descriptor->addEnumType($item); } foreach ($services as $item) { if (is_array($item)) { $name = $item['name']; $values = isset($item['values']) ? $item['values'] : []; $item = $this->createServiceDescriptorProto($name, $values); } $descriptor->addService($item); } if ($options !== null) { $fileOptions = new FileOptions(); $optionsExt = isset($options['extensions']) ? $options['extensions'] : []; if (isset($options['packed'])) { $fileOptions->setPacked($options['packed']); } foreach ($optionsExt as $ext) { $fileOptions->extensions()->put($ext[0], $ext[1]); } $descriptor->setOptions($fileOptions); } return $descriptor; }
public function generate(proto\FileDescriptorProto $proto) { // Keep a reference to the current proto $this->proto = $proto; // Obtain the root namespace $ns = $proto->getPackage(); // Reset the extensions dictionary $this->extensions = array(); $result = array(); // Generate Enums if (!empty($proto->enum_type)) { $result += $this->generateEnums($proto->enum_type, $ns); } // Generate Messages if (!empty($proto->message_type)) { $result += $this->generateMessages($proto->message_type, $ns); } // Collect extensions if (!empty($proto->extension_)) { foreach ($proto->extension_ as $field) { $this->extensions[$field->getExtendee()][] = $field; } } // Generate all extensions found in this proto file if (count($this->extensions)) { // In multifile mode we output all the extensions in a file named after // the proto file, since it's not trivial or even possible in all cases // to include the extensions with the extended message file. $fname = pathinfo($proto->name, PATHINFO_FILENAME) . '-extensions'; $src = array(); foreach ($this->extensions as $extendee => $fields) { $src[] = $this->template('extension', $fields, $extendee); } $result[$fname] = implode("\n", $src); } // Generate services if ($this->option('generic_services') && $proto->hasService()) { foreach ($proto->getServiceList() as $service) { $src = $this->template('service', $service, $ns); $result[$namespace . '.' . $service->getName()] = $src; } } $suffix = $this->option('suffix', '.php'); $files = array(); if ($this->option('multifile', false)) { foreach ($result as $ns => $content) { if (empty($content)) { continue; } // Generate a filename from the mapped namespace $fname = str_replace($this->nsSep, DIRECTORY_SEPARATOR, $this->ns($ns)); $fname .= $suffix; $file = new proto\compiler\CodeGeneratorResponse\File(); $file->setName($fname); $src = $this->template('file', $content, $ns); $file->setContent($src); $files[] = $file; } } else { $fname = pathinfo($proto->name, PATHINFO_FILENAME) . $suffix; $file = new \google\protobuf\compiler\CodeGeneratorResponse\File(); $file->setName($fname); $src = $this->template('file', implode("\n", $result), $ns); $file->setContent($src); $files[] = $file; } return $files; }
public function getNamespace(proto\FileDescriptorProto $proto = NULL) { return NULL === $proto ? $this->proto->getPackage() : $proto->getPackage(); }
public function compileProtoFile(proto\FileDescriptorProto $proto) { $file = new \google\protobuf\compiler\CodeGeneratorResponse\File(); $opts = $proto->getOptions(); $name = pathinfo($proto->getName(), PATHINFO_FILENAME); $name .= isset($opts['json.suffix']) ? $opts['json.suffix'] : '.js'; $file->setName($name); $namespace = $this->getNamespace($proto); $s[] = "// DO NOT EDIT! Generated by Protobuf for PHP protoc plugin " . Protobuf::VERSION; $s[] = "// Source: " . $proto->getName(); $s[] = "// Date: " . date('Y-m-d H:i:s'); $s[] = ""; $s[] = "(function(){"; $s[] = "/** @namespace */"; $s[] = "var {$namespace} = {$namespace} || {};"; $s[] = ""; $s[] = "// Make it CommonJS compatible"; $s[] = "if (typeof exports !== 'undefined') {"; $s[] = " var ProtoJson = this.ProtoJson;"; $s[] = " if (!ProtoJson && typeof require !== 'undefined')"; $s[] = " ProtoJson = require('ProtoJson');"; $s[] = " {$namespace} = exports;"; $s[] = "} else {"; $s[] = " this.{$namespace} = {$namespace};"; $s[] = "}"; $s[] = ""; // Generate Enums foreach ($proto->getEnumTypeList() as $enum) { $s[] = $this->compileEnum($enum, $namespace); } // Generate Messages foreach ($proto->getMessageTypeList() as $msg) { $s[] = $this->compileMessage($msg, $namespace); } // Collect extensions if ($proto->hasExtension()) { foreach ($proto->getExtensionList() as $field) { $this->extensions[$field->getExtendee()][] = array($namespace, $field); } } // Dump all extensions found in this proto file if (count($this->extensions)) { foreach ($this->extensions as $extendee => $fields) { foreach ($fields as $pair) { list($ns, $field) = $pair; $s[] = $this->compileExtension($field, $ns, ''); } } } $s[] = "})();"; $src = implode("\n", $s); $file->setContent($src); return array($file); }
public function testGetNamespacedName() { $name = 'SimpleMessage'; $type = Entity::TYPE_MESSAGE; $descriptor = new DescriptorProto(); $fileDescriptor1 = new FileDescriptorProto(); $fileDescriptor2 = new FileDescriptorProto(); $fileDescriptor3 = new FileDescriptorProto(); $fileDescriptor2->setPackage('package'); $fileDescriptor3->setPackage('package'); $entity1 = new Entity($type, $name, $descriptor, $fileDescriptor1); $entity2 = new Entity($type, $name, $descriptor, $fileDescriptor2); $entity3 = new Entity($type, $name, $descriptor, $fileDescriptor3, 'Parent'); $this->assertEquals('\\SimpleMessage', $entity1->getNamespacedName()); $this->assertEquals('\\package\\SimpleMessage', $entity2->getNamespacedName()); $this->assertEquals('\\package\\Parent\\SimpleMessage', $entity3->getNamespacedName()); }
public static function getPackageName(FileDescriptorProto $file) { $package = getEnv("PACKAGE"); if ($package) { $result = $package; // } else if ($file->getOptions()->getJavaPackage()) { // $result = $file->getOptions()->getJavaPackage(); } else { $result = ""; if ($file->getPackage()) { if (!$result) { $result .= "."; } $result .= $file->getPackage(); } } $result = preg_replace("/^\\.+/", ".", $result); return $result; }
/** * @param \google\protobuf\FileDescriptorProto $fileDescriptor * @param string $parent * * @return \Protobuf\Compiler\Entity */ protected function generateExtension(FileDescriptorProto $fileDescriptor, $parent = null) { $name = 'Extension'; $type = Entity::TYPE_EXTENSION; $entity = new Entity($type, $name, $fileDescriptor, $fileDescriptor, $parent); if ($fileDescriptor->hasExtensionList() && $this->containsProtobufExtension($fileDescriptor->getExtensionList())) { $entity->setProtobufExtension(true); } return $entity; }