code: protected final Set<String> inferThriftFieldIds()
      {
          Set<String> fieldsWithConflictingIds = new HashSet<>();
  
          // group fields by explicit name or by name extracted from field, method or property
          Multimap<String, FieldMetadata> fieldsByExplicitOrExtractedName = Multimaps.index(fields, getOrExtractThriftFieldName());
          inferThriftFieldIds(fieldsByExplicitOrExtractedName, fieldsWithConflictingIds);
  
          // group fields by name extracted from field, method or property
          // this allows thrift name to be set explicitly without having to duplicate the name on getters and setters
          // todo should this be the only way this works?
          Multimap<String, FieldMetadata> fieldsByExtractedName = Multimaps.index(fields, extractThriftFieldName());
          inferThriftFieldIds(fieldsByExtractedName, fieldsWithConflictingIds);
  
          return fieldsWithConflictingIds;
      }
docs: Assigns all fields an id if possible.  Fields are grouped by name and for each group, if there
  is a single id, all fields in the group are assigned this id.  If the group has multiple ids,
  an error is reported.