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();
}