/**
  * @param \google\protobuf\DescriptorProto $descriptor
  * @param string                           $default
  *
  * @return string
  */
 protected function getUniqueFieldName(DescriptorProto $descriptor, $default)
 {
     $extensions = $descriptor->getExtensionList() ?: [];
     $fields = $descriptor->getFieldList() ?: [];
     $name = $default;
     $names = [];
     $count = 0;
     foreach ($fields as $field) {
         $names[$field->getName()] = true;
     }
     foreach ($extensions as $field) {
         $names[$field->getName()] = true;
     }
     while (isset($names[$name])) {
         $name = $default . $count++;
     }
     return $name;
 }
 public function compileMessage(proto\DescriptorProto $msg, $namespace)
 {
     $s[] = "/**";
     $s[] = " * @constructor";
     $s[] = " * @augments {ProtoJson.Message}";
     $s[] = " * @extends ProtoJson.Message";
     $s[] = " * @memberOf {$namespace}";
     $s[] = " * @param {object} data - Optional, provide initial data to parse";
     $s[] = " */";
     $s[] = "{$namespace}.{$msg->name} = ProtoJson.create({";
     $s[] = "  fields: {";
     $lines = array();
     foreach ($msg->getFieldList() as $field) {
         $lines[] = "    {$field->number}: " . $this->generateField($field);
     }
     $s[] = implode(",\n", $lines);
     $s[] = "  },";
     $s[] = "  ranges: [";
     // @todo dump extension ranges
     $s[] = "  ]";
     $s[] = "});";
     $s[] = "";
     // Compute a new namespace with the message name as suffix
     $namespace .= "." . $msg->getName();
     // Generate getters/setters
     foreach ($msg->getFieldList() as $field) {
         $s[] = $this->generateAccessors($field, $namespace);
     }
     // Generate Enums
     foreach ($msg->getEnumTypeList() as $enum) {
         $s[] = $this->compileEnum($enum, $namespace);
     }
     // Generate nested messages
     foreach ($msg->getNestedTypeList() as $msg) {
         $s[] = $this->compileMessage($msg, $namespace);
     }
     // Collect extensions
     foreach ($msg->getExtensionList() as $field) {
         $this->extensions[$field->getExtendee()][] = array($namespace, $field);
     }
     return implode("\n", $s);
 }