#!/bin/zsh

set -e

PPXD="$(ocamlfind query ppx_deriving)/ppx_deriving"
VLIB="$(ocamlfind query visitors)/ppx_deriving_visitors.cma"

output="ast_visitors.ml"
rm -f $output
touch $output


for flavour in {iter,map,endo,reduce}
do
  sub_output="ast_visitors_$flavour.ml"
  rm -f $sub_output
  touch $sub_output

  tmp="ast_tmp_$flavour.ml"
  rm -f $tmp
  touch $tmp

  echo '(* @generated by hphp/hack/tools/visitors/genvisitors *)' >> $sub_output
  echo 'open Ast_visitors_ancestors' >> $sub_output
  sed -e "s/VISITORFLAVOUR/$flavour/g" ast.ml >> $tmp

  ocamlfind ppx_tools/rewriter -ppx "$PPXD $VLIB" $tmp |
    sed -e '/VISITORS.BEGIN/,/VISITORS.END/!d;//d;/inherit.*VisitorsRuntime/d;s/,/, /g;s/  / /g' |
    ocp-indent --config=JaneStreet,match_clause=4 |
    ./beautify.pl >> $sub_output

  ocamlbuild -use-ocamlfind "ast_visitors_$flavour.inferred.mli"
  sed -e 's/Ast_visitors_ancestors.Pos.t/Ast_visitors_ancestors.pos_t/g' \
      -e '/method private sum : .*/d' \
    "_build/ast_visitors_$flavour.inferred.mli" > "ast_visitors_$flavour.mli"

  echo "include Ast_visitors_$flavour" >> $output

  rm -f $tmp
done
