示例#1
0
 /**
  * generate php messages
  *
  * @param \google\protobuf\FileDescriptorProto $file
  * @param array $paramter
  * @param GeneratorContext $context
  * @param StringStream $error
  */
 public function generate(\google\protobuf\FileDescriptorProto $file, $paramter = array(), GeneratorContext $context, StringStream $error)
 {
     $file_list = array();
     try {
         $file_generator = new FileGenerator($context, $file);
         if (!$context->hasOpened("autoload.php")) {
             // NOTE: generate autoloader first. it's easier to reuse for extension
             $printer = new Printer($context->open("autoload.php"), "`");
             $append_mode = false;
             $file_generator->generateAutoloader($printer, array(), $append_mode);
         }
         if (Helper::IsPackageNameOverriden($file)) {
             $package_name = Helper::getPackageName($file);
         } else {
             $package_name = Helper::phppackage($file);
         }
         $package_dir = Helper::phpPackageToDir($package_name);
         $printer = new Printer($context->open($file->getName() . ".php"), "`");
         $file_generator->generate($printer);
         $file_generator->generateSiblings($package_dir, $context, $file_list);
         $printer = new Printer($context->openForInsert("autoload.php", "autoloader_scope:classmap"), "`");
         $file_generator->generateAutoloader($printer, $file_list, true);
     } catch (\Exception $e) {
         $error->assign($e->getMessage() . "\n" . $e->getTraceAsString());
     }
 }
示例#2
0
文件: Helper.php 项目: melanc/devel
 public static function getFullQualifiedTypeName(FieldDescriptorProto $field, DescriptorProto $descriptor, FileDescriptorProto $file)
 {
     if (FieldDescriptorProto\Type::isMessage($field) || FieldDescriptorProto\Type::isEnum($field)) {
         $name = $field->getTypeName();
         if (strlen($name) < 1) {
             return null;
         }
         if ($name[0] == ".") {
             $name = Helper::getPackageName($file) . $name;
         } else {
             $name = $descriptor->package_name . $name;
         }
     } else {
         $name = $field->getTypeName();
     }
     return $name;
 }
示例#3
0
文件: Compiler.php 项目: melanc/devel
 public function setupFullName(\google\protobuf\compiler\CodeGeneratorRequest $req)
 {
     foreach ($req->getProtoFile() as $file_descriptor) {
         $this->file = $file_descriptor;
         if (MyHelper::IsPackageNameOverriden($file_descriptor)) {
             $package_name = MyHelper::getPackageName($file_descriptor);
         } else {
             $package_name = MyHelper::phppackage($file_descriptor);
         }
         /* @var $file_descriptor FileDescriptorProto */
         foreach ($file_descriptor->getEnumType() as $enum) {
             $this->setupFullNameForEnum($enum, $package_name);
         }
         foreach ($file_descriptor->getMessageType() as $message) {
             $this->setupFullNameForMessage($message, $package_name);
         }
         $file_descriptor->setPackage(MyHelper::getPackageName($file_descriptor));
     }
 }
示例#4
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);
 }
 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);
 }
示例#6
0
 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 */
     }
 }