Example #1
0
 public function generate(Printer $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());
     $printer->put(" */\n");
     $printer->put("class `name` extends `base`\n{\n", "name", Helper::getClassName($this->descriptor), "base", Helper::getEnumClassName($this->descriptor));
     $printer->indent();
     $printer->put("// @@protoc_insertion_point(traits:`name`)\n", "name", $this->descriptor->full_name);
     $printer->put("\n");
     foreach ($this->descriptor->getValue() as $value) {
         if ($dict = SourceInfoDictionary::get($this->descriptor->file()->getName(), $this->descriptor->getName(), $value->getName())) {
             if ($dict->getLeadingComments()) {
                 $printer->put("/**\n");
                 $lines = preg_split("/\r?\n/", trim($dict->getLeadingComments()));
                 foreach ($lines as $line) {
                     $line = Helper::cleanupComment($line);
                     $printer->put(" * `comment`\n", "comment", $line);
                 }
                 $printer->put(" */\n");
             }
         }
         $printer->put("const `name` = `number`;\n", "name", $this->getEnumValueAsString($value), "number", $value->getNumber());
     }
     $printer->put("\n");
     $printer->put("// @@protoc_insertion_point(const_scope:`name`)\n", "name", $this->descriptor->full_name);
     $printer->put("\n");
     $printer->put("// @@protoc_insertion_point(class_scope:`name`)\n", "name", $this->descriptor->full_name);
     $printer->put("\n");
     $printer->put("/**\n");
     $printer->put(" * @return \\ProtocolBuffers\\EnumDescriptor\n");
     $printer->put(" */\n");
     $printer->put("public static function getEnumDescriptor()\n");
     $printer->put("{\n");
     $printer->indent();
     $printer->put("static \$descriptor;\n");
     $printer->put("if (!\$descriptor) {\n");
     $printer->indent();
     $printer->put("\$builder = new `builder`();\n", "builder", Helper::getEnumDescriptorBuilderClassName($this->descriptor));
     foreach ($this->descriptor->getValue() as $value) {
         $printer->put("\$builder->addValue(new \\ProtocolBuffers\\EnumValueDescriptor(array(\n");
         $printer->indent();
         $printer->put("\"value\" => `value`,\n", "value", "self::" . $value->getName());
         $printer->put("\"name\"  => '`name`',\n", "name", $value->getName());
         $printer->outdent();
         $printer->put(")));\n");
     }
     $printer->put("// @@protoc_insertion_point(builder_scope:`name`)\n", "name", $this->descriptor->full_name);
     $printer->put("\$descriptor = \$builder->build();\n");
     $printer->outdent();
     $printer->put("}\n");
     $printer->put("return \$descriptor;\n");
     $printer->outdent();
     $printer->put("}\n");
     $printer->outdent();
     $printer->put("}\n");
     if ($this->enclose_namespace_) {
         $printer->outdent();
         $printer->put("}\n\n");
     }
     PragmaticInserter::execute($this->descriptor, $this->context);
 }
Example #2
0
 public function setupDictionary(CodeGeneratorRequest $req)
 {
     /* rough parsing, but works fine */
     $result = array();
     foreach ($req->getProtoFile() as $file) {
         /* @var $file FileDescriptorProto */
         $path = $file->getName();
         $lines = preg_split("/\r?\n/", file_get_contents($path));
         $info = $file->getSourceCodeInfo();
         $result[$file->getName()] = array();
         $tmp_location = null;
         $is_nested = true;
         $type = 0;
         $stack = array();
         $tmp = array();
         $prior = 0;
         $llvel = 0;
         $prior = array(0, 0, 0);
         foreach ($info->getLocation() as $location) {
             /* @var $location \google\protobuf\SourceCodeInfo\Location */
             $path = $location->getPath();
             $span = $location->getSpan();
             if (empty($path)) {
                 // whole entry
                 continue;
             }
             $level = count($path);
             if (count($path) % 2 == 0 && $path[0] == 4) {
                 if ($prior[0] >= $level) {
                     array_pop($stack);
                     $prior[0] = $level - 1;
                 }
                 // whole
                 $name = substr($lines[$span[0]], $span[1], $span[2] - $span[1]);
                 if (preg_match("/^message/i", $name)) {
                     $stack[] = array("name" => $name, "info" => $location);
                     $prior[0] = $level;
                 } else {
                     if (preg_match("/^enum/i", $name)) {
                         $stack[] = array("name" => $name, "info" => $location);
                         $prior[0] = $level;
                     } else {
                         $tmp[] = $location;
                     }
                 }
             }
             if (count($path) % 2 == 1 && $path[0] == 4 && $path[count($path) - 1] == 1) {
                 // name
                 $name = substr($lines[$span[0]], $span[1], $span[2] - $span[1]);
                 // TODO(chobie): fix warnings
                 @(list($dummy, $n, $dummy) = explode(" ", $stack[count($stack) - 1]['name']));
                 if ($name == $n) {
                     // message or enum
                     $result[$file->getName()][$n]["message"] = $stack[count($stack) - 1]['info'];
                 } else {
                     $result[$file->getName()][$n][$name] = @$tmp[count($tmp) - 1];
                     array_pop($tmp);
                 }
             }
         }
         // remove source code info
         $file->clearSourceCodeInfo();
     }
     SourceInfoDictionary::register($result);
 }
 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);
 }