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