code: private static String processMsgPartsHelper(
        ImmutableList<SoyMsgPart> parts, Function<String, String> escaper) {
      StringBuilder rawMsgTextSb = new StringBuilder();
      for (SoyMsgPart part : parts) {
        if (part instanceof SoyMsgRawTextPart) {
          rawMsgTextSb.append(escaper.apply(((SoyMsgRawTextPart) part).getRawText()));
        }
  
        if (part instanceof SoyMsgPlaceholderPart) {
          String phName = ((SoyMsgPlaceholderPart) part).getPlaceholderName();
          rawMsgTextSb.append("{" + phName + "}");
        }
      }
      return rawMsgTextSb.toString();
    }
docs: Private helper to build valid Python string for a list of {@link SoyMsgPart}s.
  
  <p>It only processes {@link SoyMsgRawTextPart} and {@link SoyMsgPlaceholderPart} and ignores
  others, because we didn't generate a direct string for plural and select nodes.
  
  <p>For {@link SoyMsgRawTextPart}, it appends the raw text and applies necessary escaping; For
  {@link SoyMsgPlaceholderPart}, it turns the placeholder's variable name into Python replace
  format.
  
  @param parts The SoyMsgPart parts to convert.
  @param escaper A Function which provides escaping for raw text.
  @return A String representing all the {@code parts} in Python.