コード例 #1
0
 /**
  * @return \Protobuf\Extension\ExtensionFieldMap
  */
 protected function getFileOptionsExtensions()
 {
     if (!$this->fileDescriptor->hasOptions()) {
         return null;
     }
     return $this->fileDescriptor->getOptions()->extensions();
 }
コード例 #2
0
ファイル: FileGenerator.php プロジェクト: melanc/devel
 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 */
     }
 }
コード例 #3
0
ファイル: ProtocGenPhp.php プロジェクト: jakubkulhan/meta
 private function setPath($className, $path)
 {
     $this->paths[$className] = $path;
     $this->sourceCodeInfo[$className] = $this->file->getSourceCodeInfo();
 }
コード例 #4
0
 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;
 }
コード例 #5
0
 /**
  * @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;
 }
コード例 #6
0
 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;
 }
コード例 #7
0
 public function getNamespace(proto\FileDescriptorProto $proto = NULL)
 {
     return NULL === $proto ? $this->proto->getPackage() : $proto->getPackage();
 }
コード例 #8
0
 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);
 }
コード例 #9
0
 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());
 }
コード例 #10
0
ファイル: Helper.php プロジェクト: melanc/devel
 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;
 }
コード例 #11
0
 /**
  * @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;
 }