let rewrite_cursor_integers file =
  (* Variables to communicate between the collecting visitor and
   * the rewriting one. *)

  let cursor_to_base = VarinfoHashtbl.create 0 in
  let assigned_vars = ref VarinfoSet.empty in
  let ignore_vars = ref VarinfoSet.empty in

  (* Collect the cursor variables and their base *)
  let visitor =
    new collectCursorIntegers
      cursor_to_base assigned_vars ignore_vars
  in
  visit_until_convergence visitor file;

  (* Normalize the information *)
  VarinfoSet.iter
    (fun v -> VarinfoHashtbl.remove cursor_to_base v) !ignore_vars;
  VarinfoHashtbl.iter
    (fun v vb -> if VarinfoSet.mem vb !ignore_vars then
      VarinfoHashtbl.remove cursor_to_base v) cursor_to_base;

  (* Rewrite cursor variables as offsets from their base variable *)
  let visitor =
    new rewriteCursorIntegers cursor_to_base !assigned_vars
  in
  visitFramacFile (visit_and_push_statements_visitor visitor) file