Beispiel #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);
 }
Beispiel #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;
 }