/**
  * @param integer $number
  * @param string  $name
  * @param integer $type
  * @param integer $label
  * @param string  $typeName
  * @param array   $values
  *
  * @return \google\protobuf\FieldDescriptorProto
  */
 protected function createFieldDescriptorProto($number, $name, $type, $label, $typeName = null, array $values = [])
 {
     $field = new FieldDescriptorProto();
     $options = isset($values['options']) ? $values['options'] : null;
     $field->setName($name);
     $field->setNumber($number);
     $field->setTypeName($typeName);
     $field->setType(FieldDescriptorProto\Type::valueOf($type));
     $field->setLabel(FieldDescriptorProto\Label::valueOf($label));
     if (isset($values['default'])) {
         $field->setDefaultValue($values['default']);
     }
     if ($options !== null) {
         $fieldOptions = new FieldOptions();
         if (isset($options['packed'])) {
             $fieldOptions->setPacked($options['packed']);
         }
         $field->setOptions($fieldOptions);
     }
     return $field;
 }
 protected function compileExtension(proto\FieldDescriptorProto $field, $ns, $indent)
 {
     $extendee = $this->normalizeNS($field->getExtendee());
     $name = $this->normalizeNS($ns . '.' . $field->getName());
     $field->setName($name);
     $s[] = "\\{$extendee}::extension(function(){";
     $s[] = $this->compileField($field, $ns, $indent . '  ');
     $s[] = '  // @@protoc_insertion_point(scope_extension)';
     $s[] = '  // @@protoc_insertion_point(extension_' . $ns . ':' . $field->getName() . ')';
     $s[] = '  return $f;';
     $s[] = "});";
     return $indent . implode(PHP_EOL . $indent, $s);
 }
 public function compileExtension(proto\FieldDescriptorProto $field, $ns, $indent)
 {
     $extendee = $this->normalizeReference($field->getExtendee());
     $name = $field->getName();
     if ($ns) {
         $name = $ns . '.' . $name;
     }
     $field->setName($name);
     $s[] = "ProtoJson.extend({$extendee}, {";
     $s[] = "  {$field->number}: " . $this->generateField($field);
     $s[] = "});";
     $s[] = '';
     return $indent . implode("\n{$indent}", $s);
 }