code: public String newName(String suggestion, Object tag) {
      checkNotNull(suggestion, "suggestion");
      checkNotNull(tag, "tag");
  
      suggestion = toJavaIdentifier(suggestion);
  
      while (SourceVersion.isKeyword(suggestion) || !allocatedNames.add(suggestion)) {
        suggestion = suggestion + "_";
      }
  
      String replaced = tagToName.put(tag, suggestion);
      if (replaced != null) {
        tagToName.put(tag, replaced); // Put things back as they were!
        throw new IllegalArgumentException("tag " + tag + " cannot be used for both '" + replaced
            + "' and '" + suggestion + "'");
      }
  
      return suggestion;
    }
docs: Return a new name using {@code suggestion} that will not be a Java identifier or clash with
  other names. The returned value can be queried multiple times by passing {@code tag} to
  {@link #get(Object)}.