Example #1
0
 protected function setupFullNameForMessage(DescriptorProto $message, $package_name = "")
 {
     $new_package_name = $package_name . "." . $message->getName();
     foreach ($message->getEnumType() as $enum) {
         $this->setupFullNameForEnum($enum, $new_package_name);
     }
     foreach ($message->getNestedType() as $m) {
         $this->setupFullNameForMessage($m, $new_package_name);
     }
     $message->full_name = $package_name . "." . $message->getName();
     $message->package_name = $package_name;
     MessagePool::register($message->full_name, $message);
     if (MyHelper::IsPackageNameOverriden($this->file)) {
         foreach ($message->getField() as $field) {
             /** @var $field FieldDescriptorProto */
             if ($field->getType() == \ProtocolBuffers::TYPE_MESSAGE || $field->getType() == \ProtocolBuffers::TYPE_ENUM) {
                 $name = $field->getTypeName();
                 $package = $this->file->getPackage();
                 if ($package) {
                     $name = str_replace($package, MyHelper::getPackageName($this->file), $name);
                 } else {
                     $name = MyHelper::getPackageName($this->file) . $name;
                 }
                 $name = preg_replace("/^\\.+/", ".", $name);
                 $field->setTypeName($name);
             }
         }
     }
 }
 public function generate(Printer $printer)
 {
     foreach ($this->descriptor->getEnumType() as $enum) {
         $generator = new EnumGenerator($this->context, $enum, $this->file_list);
         if ($this->descriptor->file()->getOptions()->GetExtension("php")->getMultipleFiles()) {
             $child_name = $generator->fileName();
             $this->file_list[] = $child_name;
             $child_printer = new Printer($this->context->open($child_name), "`");
             $generator->generate($child_printer);
         }
     }
     foreach ($this->descriptor->getNestedType() as $message) {
         $generator = new MessageGenerator($this->context, $message, $this->file_list);
         if ($this->descriptor->file()->getOptions()->GetExtension("php")->getMultipleFiles()) {
             $child_name = $generator->fileName();
             $this->file_list[] = $child_name;
             $child_printer = new Printer($this->context->open($child_name), "`");
             $generator->generate($child_printer);
         }
     }
     if ($this->descriptor->file()->getOptions()->getExtension("php")->getMultipleFiles()) {
         $printer->put("<?php\n");
     }
     $this->printUseNameSpaceIfNeeded($printer);
     $printer->put("/**\n" . " * Generated by the protocol buffer compiler.  DO NOT EDIT!\n" . " * source: `filename`\n" . " *\n", "filename", $this->descriptor->file()->getName());
     if ($dict = SourceInfoDictionary::get($this->descriptor->file()->getName(), $this->descriptor->getName(), "message")) {
         /* @var $dict \google\protobuf\SourceCodeInfo\Location */
         if ($dict->getLeadingComments()) {
             $lines = preg_split("/\r?\n/", trim($dict->getLeadingComments()));
             foreach ($lines as $line) {
                 if ($line[0] == " ") {
                     $line = substr($line, 1);
                 }
                 $printer->put(" * `comment`\n", "comment", $line);
             }
             $printer->put(" *\n");
         }
     }
     $this->printMagicMethod($printer);
     $printer->put(" */\n");
     $printer->put("class `name` extends `base`\n{\n", "name", Helper::getClassName($this->descriptor, false), "base", Helper::getBaseClassName($this->descriptor));
     $printer->indent();
     $this->printTraitsInsertionPoint($printer);
     $this->printProperties($printer);
     $printer->put("// @@protoc_insertion_point(class_scope:`name`)\n\n", "name", $this->descriptor->full_name);
     $this->printGetDescriptor($printer);
     $printer->outdent();
     $printer->put("}\n");
     if ($this->enclose_namespace_) {
         $printer->outdent();
         $printer->put("}\n\n");
     }
     $this->printExtensions();
     PragmaticInserter::execute($this->descriptor, $this->context);
 }
Example #3
0
 private function collectMessage($package, DescriptorProto $message, $path)
 {
     $messagePackage = $package . "." . $message->getName();
     $className = $this->convertPackageToNamespace($messagePackage);
     $this->messages[$className] = $message;
     $this->setPath($className, $path);
     foreach ((array) $message->getNestedType() as $i => $nestedMessage) {
         $this->collectMessage($messagePackage, $nestedMessage, array_merge($path, array(DescriptorProtoMeta::NESTED_TYPE_PROTOBUF_FIELD, $i)));
     }
     foreach ((array) $message->getEnumType() as $i => $nestedEnum) {
         $this->collectEnum($messagePackage, $nestedEnum, array_merge($path, array(DescriptorProtoMeta::ENUM_TYPE_PROTOBUF_FIELD, $i)));
     }
 }
 protected function compileMessage(proto\DescriptorProto $msg, $ns)
 {
     $s = array();
     $s[] = "namespace " . $this->normalizeNS($ns) . " {";
     $s[] = "";
     $s[] = "  // @@protoc_insertion_point(scope_namespace)";
     $s[] = "  // @@protoc_insertion_point(namespace_{$ns})";
     $s[] = "";
     $cmt = $this->compiler->getComment($ns . '.' . $msg->getName(), '   * ');
     if ($cmt) {
         $s[] = "  /**";
         $s[] = $cmt;
         $s[] = "   */";
     }
     // Compute a new namespace with the message name as suffix
     $ns .= '.' . $msg->getName();
     $s[] = '  class ' . $msg->getName() . ' extends \\DrSlump\\Protobuf\\Message {';
     $s[] = '';
     foreach ($msg->getField() as $field) {
         $s[] = $this->generatePublicField($field, $ns, "    ");
     }
     $s[] = '';
     $s[] = '    /** @var \\Closure[] */';
     $s[] = '    protected static $__extensions = array();';
     $s[] = '';
     $s[] = '    public static function descriptor()';
     $s[] = '    {';
     $s[] = '      $descriptor = new \\DrSlump\\Protobuf\\Descriptor(__CLASS__, \'' . $ns . '\');';
     $s[] = '';
     foreach ($msg->getField() as $field) {
         $s[] = $this->compileField($field, $ns, "      ");
         $s[] = '      $descriptor->addField($f);';
         $s[] = '';
     }
     $s[] = '      foreach (self::$__extensions as $cb) {';
     $s[] = '        $descriptor->addField($cb(), true);';
     $s[] = '      }';
     $s[] = '';
     $s[] = '      // @@protoc_insertion_point(scope_descriptor)';
     $s[] = '      // @@protoc_insertion_point(descriptor_' . $ns . ')';
     $s[] = '';
     $s[] = '      return $descriptor;';
     $s[] = '    }';
     $s[] = '';
     //$s[]= "    protected static \$__exts = array(";
     //foreach ($msg->getExtensionRange() as $range):
     //$s[]= '      array(' . $range->getStart() . ', ' . ($range->getEnd()-1) . '),';
     //endforeach;
     //$s[]= "    );";
     //$s[]= "";
     foreach ($msg->getField() as $field) {
         $s[] = $this->generateAccessors($field, $ns, "    ");
     }
     $s[] = "";
     $s[] = "    // @@protoc_insertion_point(scope_class)";
     $s[] = '    // @@protoc_insertion_point(class_' . $ns . ')';
     $s[] = "  }";
     $s[] = "}";
     $s[] = "";
     // Generate Enums
     if ($msg->hasEnumType()) {
         foreach ($msg->getEnumType() as $enum) {
             $src = $this->compileEnum($enum, $ns);
             $this->addComponent($ns, $enum->getName(), $src);
         }
     }
     // Generate nested messages
     if ($msg->hasNestedType()) {
         foreach ($msg->getNestedType() as $msg) {
             $src = $this->compileMessage($msg, $ns);
             $this->addComponent($ns, $msg->getName(), $src);
         }
     }
     // Collect extensions
     if ($msg->hasExtension()) {
         foreach ($msg->getExtensionList() as $field) {
             $this->extensions[$field->getExtendee()][] = array($ns, $field);
         }
     }
     return implode(PHP_EOL, $s) . PHP_EOL;
 }
 public function compileMessage(proto\DescriptorProto $msg, $namespace)
 {
     $s[] = "/**";
     $s[] = " * @constructor";
     $s[] = " * @augments {ProtoJson.Message}";
     $s[] = " * @extends ProtoJson.Message";
     $s[] = " * @memberOf {$namespace}";
     $s[] = " * @param {object} data - Optional, provide initial data to parse";
     $s[] = " */";
     $s[] = "{$namespace}.{$msg->name} = ProtoJson.create({";
     $s[] = "  fields: {";
     $lines = array();
     foreach ($msg->getFieldList() as $field) {
         $lines[] = "    {$field->number}: " . $this->generateField($field);
     }
     $s[] = implode(",\n", $lines);
     $s[] = "  },";
     $s[] = "  ranges: [";
     // @todo dump extension ranges
     $s[] = "  ]";
     $s[] = "});";
     $s[] = "";
     // Compute a new namespace with the message name as suffix
     $namespace .= "." . $msg->getName();
     // Generate getters/setters
     foreach ($msg->getFieldList() as $field) {
         $s[] = $this->generateAccessors($field, $namespace);
     }
     // Generate Enums
     foreach ($msg->getEnumTypeList() as $enum) {
         $s[] = $this->compileEnum($enum, $namespace);
     }
     // Generate nested messages
     foreach ($msg->getNestedTypeList() as $msg) {
         $s[] = $this->compileMessage($msg, $namespace);
     }
     // Collect extensions
     foreach ($msg->getExtensionList() as $field) {
         $this->extensions[$field->getExtendee()][] = array($namespace, $field);
     }
     return implode("\n", $s);
 }
 /**
  * @param \google\protobuf\FileDescriptorProto $fileDescriptor
  * @param \google\protobuf\DescriptorProto     $messageDescriptor
  * @param string                               $parent
  *
  * @return \Protobuf\Compiler\Entity
  */
 protected function generateMessage(FileDescriptorProto $fileDescriptor, DescriptorProto $messageDescriptor, $parent = null)
 {
     $type = Entity::TYPE_MESSAGE;
     $name = $messageDescriptor->getName();
     $entity = new Entity($type, $name, $messageDescriptor, $fileDescriptor, $parent);
     if ($messageDescriptor->hasExtensionList() && $this->containsProtobufExtension($messageDescriptor->getExtensionList())) {
         $entity->setProtobufExtension(true);
     }
     return $entity;
 }