if (use_extensions) {
Object map_field_by = def.mapFieldBy(field);
DescriptorProtos.FieldOptions options = field.getOptions();
if (map_field_by != null) {
ITransientMap map = (ITransientMap)OrderedMap.EMPTY.asTransient();
while (iterator.hasNext()) {
PersistentProtocolBufferMap v =
(PersistentProtocolBufferMap)fromProtoValue(field, iterator.next());
Object k = v.valAt(map_field_by);
PersistentProtocolBufferMap existing = (PersistentProtocolBufferMap)map.valAt(k);
map = map.assoc(k, def.mapValue(field, existing, v));
}
return map.persistent();
} else if (options.getExtension(Extensions.counter)) {
Object count = iterator.next();
while (iterator.hasNext()) {
count = Numbers.add(count, iterator.next());
}
return count;
} else if (options.getExtension(Extensions.succession)) {
return fromProtoValue(field, values.get(values.size() - 1));
} else if (options.getExtension(Extensions.map)) {
Descriptors.Descriptor type = field.getMessageType();
Descriptors.FieldDescriptor key_field = type.findFieldByName("key");
Descriptors.FieldDescriptor val_field = type.findFieldByName("val");
ITransientMap map = (ITransientMap)OrderedMap.EMPTY.asTransient();
while (iterator.hasNext()) {
DynamicMessage message = (DynamicMessage)iterator.next();
Object k = fromProtoValue(key_field, message.getField(key_field));
Object v = fromProtoValue(val_field, message.getField(val_field));
Object existing = map.valAt(k);
if (existing instanceof PersistentProtocolBufferMap) {
map = map.assoc(k, def.mapValue(field,
(PersistentProtocolBufferMap)existing,
(PersistentProtocolBufferMap)v));
} else if (existing instanceof IPersistentCollection) {
map = map.assoc(k, ((IPersistentCollection)existing).cons(v));
} else {
map = map.assoc(k, v);
}
}
return map.persistent();
} else if (options.getExtension(Extensions.set)) {
Descriptors.Descriptor type = field.getMessageType();
Descriptors.FieldDescriptor item_field = type.findFieldByName("item");
Descriptors.FieldDescriptor exists_field = type.findFieldByName("exists");