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