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