code: private void buildReplacementNodesFromSource(MsgNode msg) {
  
      currReplacementNodes = Lists.newArrayList();
  
      for (StandaloneNode child : msg.getChildren()) {
  
        if (child instanceof RawTextNode) {
          currReplacementNodes.add(child);
  
        } else if (child instanceof MsgPlaceholderNode) {
          for (StandaloneNode contentNode : ((MsgPlaceholderNode) child).getChildren()) {
            // If the content node is a MsgHtmlTagNode, it needs to be replaced by a number of
            // consecutive siblings. This is done by visiting the MsgHtmlTagNode. Otherwise, we
            // simply add the content node to the currReplacementNodes list being built.
            if (contentNode instanceof MsgHtmlTagNode) {
              currReplacementNodes.addAll(((MsgHtmlTagNode) contentNode).getChildren());
            } else {
              currReplacementNodes.add(contentNode);
            }
          }
  
        } else {
          throw new AssertionError();
        }
      }
    }
docs: Private helper for visitMsgFallbackGroupNode() to build the list of replacement nodes for a
  message from its source.