code: static private void processHeredocStrings(SimpleNode node,
              List<StringProperty> strings) {
  
          // If there are any children, then process them in post-traversal order.
          int count = node.jjtGetNumChildren();
          if (count > 0) {
              for (int i = 0; i < count; i++) {
                  SimpleNode n = (SimpleNode) node.jjtGetChild(i);
  
                  // If this is a heredoc literal, then actually update the node
                  // with the string.
                  if (n instanceof ASTOperation) {
                      ASTOperation astop = (ASTOperation) n;
                      if (astop.getOperationType() == OperationType.HEREDOC) {
  
                          Operation op = astop.getOperation();
                          if (op instanceof LongProperty) {
                              LongProperty lprop = (LongProperty) op;
                              int index = lprop.getValue().intValue();
                              StringProperty sprop = strings.get(index);
                              astop.setOperationType(OperationType.LITERAL);
                              astop.setOperation(sprop);
                          } else {
                              throw new RuntimeException(
                                      "HEREDOC operation doesn't contain LongProperty");
                          }
                      }
                  }
  
                  // Alway process any children.
                  processHeredocStrings(n, strings);
              }
          }
      }
docs: Descend through the AST and replace individual ASTOperation (HEREDOC)
  nodes with the associated strings.
  
  @param node
  @param strings