Source

ocaml-indent / tokenstr.ml

open Pos
open Reader
module Parser = Xparser
open Parser

type 'a desc = 
  | Cons of 'a * 'a t * in_channel option ref
  | Null of in_channel option ref

and 'a t = 'a desc lazy_t

type 'a info = {
  token : 'a;
  region : Region.t;
  substr : string;
  space : Region.t * string;
}

let close = function
  | lazy (Null icoptref | Cons (_, _, icoptref)) ->
      match !icoptref with
      | None -> ()
      | Some ic -> icoptref := None; close_in ic 

let of_channel ic = 
  let icoptref = ref (Some ic) in
  try
    let reader = LexReader.create_from_channel ic in
    let rec loop last_region = 
      let token = 
        try
          LexReader.lex reader Lexer.token 
        with
        | Lexer.Error (e, _loc) ->
            Format.eprintf "%a@." Lexer.report_error e;
            assert false
      in
      let region = LexReader.region reader in
      (* token's string *)
      let substr = LexReader.current_substring reader in

      let space_between = 
        let last_end = (snd last_region).Position.pos_cnum in
        LexReader.substring 
          reader last_end ((fst region).Position.pos_cnum - last_end)
      in
      let space_between_region = (snd last_region, fst region) in

      Cons ({ token; region; substr; space = space_between_region, space_between },
            begin match token with
            | EOF -> 
                let null = Lazy.lazy_from_val (Null icoptref) in
                close null;
                null
            | _ -> lazy (loop region)
            end,
            icoptref)
    in
    lazy (loop Region.zero)
  with
  | e -> raise e

let of_path path =
  let ic = open_in path in
  of_channel ic

let destr = function
  | lazy Null _ -> None
  | lazy (Cons (car, cdr, _)) -> Some (car, cdr)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.