@Override
 protected String visitRow(Row node, Boolean unmangleNames) {
   return "ROW ("
       + Joiner.on(", ")
           .join(
               node.getItems()
                   .stream()
                   .map((child) -> process(child, unmangleNames))
                   .collect(Collectors.toList()))
       + ")";
 }
    @Override
    protected Type visitRow(Row node, AnalysisContext context) {
      List<Type> types =
          node.getItems()
              .stream()
              .map((child) -> process(child, context))
              .collect(toImmutableList());

      Type type = new RowType(types, Optional.empty());
      expressionTypes.put(node, type);

      return type;
    }