public function openForInsert($name, $insertion_point) { $file = new \google\protobuf\compiler\CodeGeneratorResponse\File(); $stream = new StringStream(); $file->setName($name); $file->setContent($stream); $file->setInsertionPoint($insertion_point); $this->response->appendFile($file); $stream = new ZeroCopyOutputStream($stream); $this->contexts[$name] = $stream; return $stream; }
protected function buildFile(proto\FileDescriptorProto $proto, $fname, $contents) { $suffix = $this->getOption('suffix') ?: '.php'; $fname .= $suffix; $file = new \google\protobuf\compiler\CodeGeneratorResponse\File(); $file->setName($fname); $s = array(); $s[] = "<?php"; $s[] = "// DO NOT EDIT! Generated by Protobuf-PHP protoc plugin " . Protobuf::VERSION; $s[] = "// Source: " . $proto->getName(); $s[] = "// Date: " . date('Y-m-d H:i:s'); $s[] = ""; $s[] = "// @@protoc_insertion_point(scope_file)"; $s[] = ""; $contents = implode(PHP_EOL, $s) . PHP_EOL . $contents; // If we don't want insertion points remove them if (!$this->getOption('insertions')) { $contents = preg_replace('#^\\s*//\\s+@@protoc_insertion_point.*$\\n#m', '', $contents); } $file->setContent($contents); return $file; }
public function generate(proto\FileDescriptorProto $proto) { // Keep a reference to the current proto $this->proto = $proto; // Obtain the root namespace $ns = $proto->getPackage(); // Reset the extensions dictionary $this->extensions = array(); $result = array(); // Generate Enums if (!empty($proto->enum_type)) { $result += $this->generateEnums($proto->enum_type, $ns); } // Generate Messages if (!empty($proto->message_type)) { $result += $this->generateMessages($proto->message_type, $ns); } // Collect extensions if (!empty($proto->extension_)) { foreach ($proto->extension_ as $field) { $this->extensions[$field->getExtendee()][] = $field; } } // Generate all extensions found in this proto file if (count($this->extensions)) { // In multifile mode we output all the extensions in a file named after // the proto file, since it's not trivial or even possible in all cases // to include the extensions with the extended message file. $fname = pathinfo($proto->name, PATHINFO_FILENAME) . '-extensions'; $src = array(); foreach ($this->extensions as $extendee => $fields) { $src[] = $this->template('extension', $fields, $extendee); } $result[$fname] = implode("\n", $src); } // Generate services if ($this->option('generic_services') && $proto->hasService()) { foreach ($proto->getServiceList() as $service) { $src = $this->template('service', $service, $ns); $result[$namespace . '.' . $service->getName()] = $src; } } $suffix = $this->option('suffix', '.php'); $files = array(); if ($this->option('multifile', false)) { foreach ($result as $ns => $content) { if (empty($content)) { continue; } // Generate a filename from the mapped namespace $fname = str_replace($this->nsSep, DIRECTORY_SEPARATOR, $this->ns($ns)); $fname .= $suffix; $file = new proto\compiler\CodeGeneratorResponse\File(); $file->setName($fname); $src = $this->template('file', $content, $ns); $file->setContent($src); $files[] = $file; } } else { $fname = pathinfo($proto->name, PATHINFO_FILENAME) . $suffix; $file = new \google\protobuf\compiler\CodeGeneratorResponse\File(); $file->setName($fname); $src = $this->template('file', implode("\n", $result), $ns); $file->setContent($src); $files[] = $file; } return $files; }
public function compileProtoFile(proto\FileDescriptorProto $proto) { $file = new \google\protobuf\compiler\CodeGeneratorResponse\File(); $opts = $proto->getOptions(); $name = pathinfo($proto->getName(), PATHINFO_FILENAME); $name .= isset($opts['json.suffix']) ? $opts['json.suffix'] : '.js'; $file->setName($name); $namespace = $this->getNamespace($proto); $s[] = "// DO NOT EDIT! Generated by Protobuf for PHP protoc plugin " . Protobuf::VERSION; $s[] = "// Source: " . $proto->getName(); $s[] = "// Date: " . date('Y-m-d H:i:s'); $s[] = ""; $s[] = "(function(){"; $s[] = "/** @namespace */"; $s[] = "var {$namespace} = {$namespace} || {};"; $s[] = ""; $s[] = "// Make it CommonJS compatible"; $s[] = "if (typeof exports !== 'undefined') {"; $s[] = " var ProtoJson = this.ProtoJson;"; $s[] = " if (!ProtoJson && typeof require !== 'undefined')"; $s[] = " ProtoJson = require('ProtoJson');"; $s[] = " {$namespace} = exports;"; $s[] = "} else {"; $s[] = " this.{$namespace} = {$namespace};"; $s[] = "}"; $s[] = ""; // Generate Enums foreach ($proto->getEnumTypeList() as $enum) { $s[] = $this->compileEnum($enum, $namespace); } // Generate Messages foreach ($proto->getMessageTypeList() as $msg) { $s[] = $this->compileMessage($msg, $namespace); } // Collect extensions if ($proto->hasExtension()) { foreach ($proto->getExtensionList() as $field) { $this->extensions[$field->getExtendee()][] = array($namespace, $field); } } // Dump all extensions found in this proto file if (count($this->extensions)) { foreach ($this->extensions as $extendee => $fields) { foreach ($fields as $pair) { list($ns, $field) = $pair; $s[] = $this->compileExtension($field, $ns, ''); } } } $s[] = "})();"; $src = implode("\n", $s); $file->setContent($src); return array($file); }