docs: def AddDescriptor(cls, field_desc):
      """Register this descriptor with the Proto Struct."""
      if not isinstance(field_desc, ProtoType):
        raise type_info.TypeValueError(
            "%s field '%s' should be of type ProtoType" %
            (cls.__name__, field_desc.name))
  
      # Ensure the field descriptor knows the class that owns it.
      field_desc.SetOwner(cls)
  
      # If the field is late bound we do not really add it to the descriptor set
      # yet. We must wait for the LateBindingPlaceHolder() to add it later.
      if field_desc.late_bound:
        # Keep track of unbound fields.
        cls.late_bound_type_infos[field_desc.name] = field_desc
        return
  
      # Ensure this field number is unique:
      if field_desc.field_number in cls.type_infos_by_field_number:
        raise type_info.TypeValueError(
            "Field number %s for field %s is not unique in %s" %
            (field_desc.field_number, field_desc.name, cls.__name__))
  
      # We store an index of the type info by tag values to speed up parsing.
      cls.type_infos_by_field_number[field_desc.field_number] = field_desc
      cls.type_infos_by_encoded_tag[field_desc.encoded_tag] = field_desc
  
      cls.type_infos.Append(field_desc)
      cls.late_bound_type_infos.pop(field_desc.name, None)
  
      # Add direct accessors only if the class does not already have them.
      if not hasattr(cls, field_desc.name):
        # This lambda is a class method so pylint: disable=protected-access
        # This is much faster than __setattr__/__getattr__
        setattr(
            cls, field_desc.name,
            property(lambda self: self.Get(field_desc.name), lambda self, x: self.
                     _Set(x, field_desc), None, field_desc.description))