/** Recursively crawls the proto message while clearing each field of type {@link Source}. */ @VisibleForTesting static void stripSourceReferences(Message.Builder msg) { for (FieldDescriptor fieldDesc : msg.getAllFields().keySet()) { if (!fieldDesc.getJavaType().equals(JavaType.MESSAGE)) { continue; } if (fieldDesc.getMessageType().getFullName().equals(Source.getDescriptor().getFullName())) { msg.clearField(fieldDesc); } else { if (fieldDesc.isRepeated()) { int repeatCount = msg.getRepeatedFieldCount(fieldDesc); for (int i = 0; i < repeatCount; i++) { stripSourceReferences(msg.getRepeatedFieldBuilder(fieldDesc, i)); } } else { stripSourceReferences(msg.getFieldBuilder(fieldDesc)); } } } } }
/** Adds the scalar value to the field which must be repeated. */ public Builder addValue(FieldDescriptor field, Object value, @Nullable Location location) { int index = configBuilder.getRepeatedFieldCount(field); configBuilder.addRepeatedField(field, value); newLocations.put(new LocationKey(field, index), nonNull(location)); return this; }
/** Adds the scalar value to the field which must be repeated. */ public Builder addValue(FieldDescriptor field, Object value, @Nullable Location location) { int index = configBuilder.getRepeatedFieldCount(field); configBuilder.addRepeatedField(field, value); newLocations.put(new LocationKey(field, index), nonNull(location)); return this; }
int collectionCount = builder.getRepeatedFieldCount(field) - 1; if (collectionCount < collectionIndex) {
if (keyToMerge.elementKey != null) { int sizeBeforeMerge = configBuilder.getRepeatedFieldCount(fieldInLocationsToMerge) - messageToMergeForm.getRepeatedFieldCount(fieldInLocationsToMerge); keyToMerge =
List<Message> listValue = (List<Message>) value; int i = configBuilder.getRepeatedFieldCount(field) - listValue.size(); for (final Message elem : listValue) { withBuilderAt(
if (keyToMerge.elementKey != null) { int sizeBeforeMerge = configBuilder.getRepeatedFieldCount(fieldInLocationsToMerge) - messageToMergeForm.getRepeatedFieldCount(fieldInLocationsToMerge); keyToMerge =
List<Message> listValue = (List<Message>) value; int i = configBuilder.getRepeatedFieldCount(field) - listValue.size(); for (final Message elem : listValue) { withBuilderAt(
private void mergeField(FieldDescriptor field, JsonElement json, Message.Builder builder) throws InvalidProtocolBufferException { if (field.isRepeated()) { if (builder.getRepeatedFieldCount(field) > 0) { throw new InvalidProtocolBufferException( "Field " + field.getFullName() + " has already been set.");
private void mergeField(FieldDescriptor field, JsonElement json, Message.Builder builder) throws InvalidProtocolBufferException { if (field.isRepeated()) { if (builder.getRepeatedFieldCount(field) > 0) { throw new InvalidProtocolBufferException( "Field " + field.getFullName() + " has already been set.");
private void mergeField(FieldDescriptor field, JsonElement json, Message.Builder builder) throws InvalidProtocolBufferException { if (field.isRepeated()) { if (builder.getRepeatedFieldCount(field) > 0) { throw new InvalidProtocolBufferException( "Field " + field.getFullName() + " has already been set.");
private void mergeField(FieldDescriptor field, JsonElement json, Message.Builder builder) throws InvalidProtocolBufferException { if (field.isRepeated()) { if (builder.getRepeatedFieldCount(field) > 0) { throw new InvalidProtocolBufferException( "Field " + field.getFullName() + " has already been set.");
protected void visitRepeated(int fieldNumber) { BuilderVisitorNodeInfo parentInfo = ancestors.peek(); Message.Builder parentBuilder = (Message.Builder) parentInfo.node(); FieldDescriptor fieldDesc = parentBuilder.getDescriptorForType().findFieldByNumber(fieldNumber); if (fieldDesc == null) { throw new RuntimeException( String.format( "BuilderVisitor internal error - bad field number %d for type %s", fieldNumber, parentBuilder.getDescriptorForType().getFullName())); } int fieldCount = parentBuilder.getRepeatedFieldCount(fieldDesc); for (int i = 0; i < fieldCount; i++) { Message.Builder element = parentBuilder.getRepeatedFieldBuilder(fieldDesc, i); // If we got in here via a FileDescriptor, let it know where we are in the traversal so it // can build up its path <-> proto element mappings. if (currentFile != null) { currentFile.pushChildPath(element, fieldNumber, i); } try { visit(element); } finally { if (currentFile != null) { currentFile.popChildPath(); } } } parentInfo.processDeletedChildren(fieldDesc); }
protected void visitRepeated(int fieldNumber) { BuilderVisitorNodeInfo parentInfo = ancestors.peek(); Message.Builder parentBuilder = (Message.Builder) parentInfo.node(); FieldDescriptor fieldDesc = parentBuilder.getDescriptorForType().findFieldByNumber(fieldNumber); if (fieldDesc == null) { throw new RuntimeException( String.format( "BuilderVisitor internal error - bad field number %d for type %s", fieldNumber, parentBuilder.getDescriptorForType().getFullName())); } int fieldCount = parentBuilder.getRepeatedFieldCount(fieldDesc); for (int i = 0; i < fieldCount; i++) { Message.Builder element = parentBuilder.getRepeatedFieldBuilder(fieldDesc, i); // If we got in here via a FileDescriptor, let it know where we are in the traversal so it // can build up its path <-> proto element mappings. if (currentFile != null) { currentFile.pushChildPath(element, fieldNumber, i); } try { visit(element); } finally { if (currentFile != null) { currentFile.popChildPath(); } } } parentInfo.processDeletedChildren(fieldDesc); }
/** * Processes the deletion of children via a particular child field of the current node's * descriptor (e.g. fields within a message; nested message types within a message; etc). */ @Override public void processDeletedChildren(FieldDescriptor childFieldDesc) { Message.Builder parentBuilder = node(); if (!toBeDeleted().isEmpty()) { if (getContainingFile() != null) { getContainingFile().processDeletedChildren(toBeDeleted()); } List<Message.Builder> keepItems = new ArrayList<>(); int fieldCount = parentBuilder.getRepeatedFieldCount(childFieldDesc); for (int i = 0; i < fieldCount; i++) { Message.Builder messageBuilder = parentBuilder.getRepeatedFieldBuilder(childFieldDesc, i); if (!toBeDeleted().contains(messageBuilder)) { keepItems.add(messageBuilder); } } toBeDeleted().clear(); parentBuilder.clearField(childFieldDesc); for (Message.Builder newChild : keepItems) { parentBuilder.addRepeatedField(childFieldDesc, newChild.build()); } } }
/** * Processes the deletion of children via a particular child field of the current node's * descriptor (e.g. fields within a message; nested message types within a message; etc). */ @Override public void processDeletedChildren(FieldDescriptor childFieldDesc) { Message.Builder parentBuilder = node(); if (!toBeDeleted().isEmpty()) { if (getContainingFile() != null) { getContainingFile().processDeletedChildren(toBeDeleted()); } List<Message.Builder> keepItems = new ArrayList<>(); int fieldCount = parentBuilder.getRepeatedFieldCount(childFieldDesc); for (int i = 0; i < fieldCount; i++) { Message.Builder messageBuilder = parentBuilder.getRepeatedFieldBuilder(childFieldDesc, i); if (!toBeDeleted().contains(messageBuilder)) { keepItems.add(messageBuilder); } } toBeDeleted().clear(); parentBuilder.clearField(childFieldDesc); for (Message.Builder newChild : keepItems) { parentBuilder.addRepeatedField(childFieldDesc, newChild.build()); } } }
@Override public int size() { return parent.getRepeatedFieldCount(field); }