/** * 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()); } }
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); }
public static function execute($descriptor, GeneratorContext $context) { foreach (self::$data as $block) { $regex = sprintf("/%s/", $block['match']); if (preg_match($regex, $descriptor->getName(), $match)) { $file_name = $block['file']; $insertion_point = $block['insertion_point']; $count = count($match); for ($i = 0; $i < $count; $i++) { $file_name = str_replace("\${$i}", $match[0], $file_name); $insertion_point = str_replace("\${$i}", $match[0], $insertion_point); } if ($context->hasOpened($file_name)) { $printer = new Printer($context->openForInsert($file_name, $insertion_point), "`"); $lines = preg_split("/\r?\n/", $block['insertion']); foreach ($lines as $line) { $printer->put($line . PHP_EOL); } } } } }
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 */ } }