protected function setupFullNameForMessage(DescriptorProto $message, $package_name = "") { $new_package_name = $package_name . "." . $message->getName(); foreach ($message->getEnumType() as $enum) { $this->setupFullNameForEnum($enum, $new_package_name); } foreach ($message->getNestedType() as $m) { $this->setupFullNameForMessage($m, $new_package_name); } $message->full_name = $package_name . "." . $message->getName(); $message->package_name = $package_name; MessagePool::register($message->full_name, $message); if (MyHelper::IsPackageNameOverriden($this->file)) { foreach ($message->getField() as $field) { /** @var $field FieldDescriptorProto */ if ($field->getType() == \ProtocolBuffers::TYPE_MESSAGE || $field->getType() == \ProtocolBuffers::TYPE_ENUM) { $name = $field->getTypeName(); $package = $this->file->getPackage(); if ($package) { $name = str_replace($package, MyHelper::getPackageName($this->file), $name); } else { $name = MyHelper::getPackageName($this->file) . $name; } $name = preg_replace("/^\\.+/", ".", $name); $field->setTypeName($name); } } } }
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); }
private function collectMessage($package, DescriptorProto $message, $path) { $messagePackage = $package . "." . $message->getName(); $className = $this->convertPackageToNamespace($messagePackage); $this->messages[$className] = $message; $this->setPath($className, $path); foreach ((array) $message->getNestedType() as $i => $nestedMessage) { $this->collectMessage($messagePackage, $nestedMessage, array_merge($path, array(DescriptorProtoMeta::NESTED_TYPE_PROTOBUF_FIELD, $i))); } foreach ((array) $message->getEnumType() as $i => $nestedEnum) { $this->collectEnum($messagePackage, $nestedEnum, array_merge($path, array(DescriptorProtoMeta::ENUM_TYPE_PROTOBUF_FIELD, $i))); } }
protected function compileMessage(proto\DescriptorProto $msg, $ns) { $s = array(); $s[] = "namespace " . $this->normalizeNS($ns) . " {"; $s[] = ""; $s[] = " // @@protoc_insertion_point(scope_namespace)"; $s[] = " // @@protoc_insertion_point(namespace_{$ns})"; $s[] = ""; $cmt = $this->compiler->getComment($ns . '.' . $msg->getName(), ' * '); if ($cmt) { $s[] = " /**"; $s[] = $cmt; $s[] = " */"; } // Compute a new namespace with the message name as suffix $ns .= '.' . $msg->getName(); $s[] = ' class ' . $msg->getName() . ' extends \\DrSlump\\Protobuf\\Message {'; $s[] = ''; foreach ($msg->getField() as $field) { $s[] = $this->generatePublicField($field, $ns, " "); } $s[] = ''; $s[] = ' /** @var \\Closure[] */'; $s[] = ' protected static $__extensions = array();'; $s[] = ''; $s[] = ' public static function descriptor()'; $s[] = ' {'; $s[] = ' $descriptor = new \\DrSlump\\Protobuf\\Descriptor(__CLASS__, \'' . $ns . '\');'; $s[] = ''; foreach ($msg->getField() as $field) { $s[] = $this->compileField($field, $ns, " "); $s[] = ' $descriptor->addField($f);'; $s[] = ''; } $s[] = ' foreach (self::$__extensions as $cb) {'; $s[] = ' $descriptor->addField($cb(), true);'; $s[] = ' }'; $s[] = ''; $s[] = ' // @@protoc_insertion_point(scope_descriptor)'; $s[] = ' // @@protoc_insertion_point(descriptor_' . $ns . ')'; $s[] = ''; $s[] = ' return $descriptor;'; $s[] = ' }'; $s[] = ''; //$s[]= " protected static \$__exts = array("; //foreach ($msg->getExtensionRange() as $range): //$s[]= ' array(' . $range->getStart() . ', ' . ($range->getEnd()-1) . '),'; //endforeach; //$s[]= " );"; //$s[]= ""; foreach ($msg->getField() as $field) { $s[] = $this->generateAccessors($field, $ns, " "); } $s[] = ""; $s[] = " // @@protoc_insertion_point(scope_class)"; $s[] = ' // @@protoc_insertion_point(class_' . $ns . ')'; $s[] = " }"; $s[] = "}"; $s[] = ""; // Generate Enums if ($msg->hasEnumType()) { foreach ($msg->getEnumType() as $enum) { $src = $this->compileEnum($enum, $ns); $this->addComponent($ns, $enum->getName(), $src); } } // Generate nested messages if ($msg->hasNestedType()) { foreach ($msg->getNestedType() as $msg) { $src = $this->compileMessage($msg, $ns); $this->addComponent($ns, $msg->getName(), $src); } } // Collect extensions if ($msg->hasExtension()) { foreach ($msg->getExtensionList() as $field) { $this->extensions[$field->getExtendee()][] = array($ns, $field); } } return implode(PHP_EOL, $s) . PHP_EOL; }