public static T intern()

in og/shared/src/main/java/com/google/idea/blaze/common/proto/ProtoStringInterner.java [39:87]


  public static <T extends Message> T intern(T message) {
    Interner<String> stringInterner = Interners.STRING;
    if (message == null) {
      return null;
    }
    Message.Builder builder = null;
    for (FieldDescriptor field : message.getDescriptorForType().getFields()) {
      Object original = message.getField(field);
      Object interned = original;
      switch (field.getType()) {
        case STRING:
          if (field.isRepeated()) {
            List<String> repeated = (List<String>) message.getField(field);
            if (!repeated.isEmpty()) {
              interned = repeated.stream().map(stringInterner::intern).collect(toImmutableList());
            }
          } else if (message.hasField(field)) {
            interned = stringInterner.intern((String) message.getField(field));
          }
          break;
        case MESSAGE:
        case GROUP:
          if (field.isRepeated()) {
            List<Message> originalList = (List<Message>) original;
            List<Message> internedList =
                originalList.stream().map(ProtoStringInterner::intern).collect(toImmutableList());
            if (!IntStream.range(0, internedList.size())
                .allMatch(i -> internedList.get(i) == originalList.get(i))) {
              interned = internedList;
            }
          } else if (message.hasField(field)) {
            interned = intern((Message) original);
          }
          break;
        default:
          // Nothing needs doing.
      }
      if (original != interned) {
        if (builder == null) {
          builder = message.toBuilder();
        }
        builder.setField(field, interned);
      }
    }
    if (builder == null) {
      return message;
    }
    return (T) builder.build();
  }