let search_in_tree kind =
let pred pos t =
t.t_pos_left <= pos && pos <= t.t_pos_right
in
let get_t pos l =
try Some (List.find (pred pos) l)
with Not_found -> None
in
let rec iter fallback pos tree =
if pred pos tree then
let fb =
match tree.t_kind with
None -> fallback
| Some (Type _ as t) when kind = `Type ->
Some (tree.t_pos_left, tree.t_pos_right, t)
| Some (Ident _ as t) when kind = `Ident ->
Some (tree.t_pos_left, tree.t_pos_right, t)
| Some ((Call _) as t) when kind = `Call ->
Some (tree.t_pos_left, tree.t_pos_right, t)
| Some _ -> fallback
in
match get_t pos tree.t_children with
None -> fb
| Some t -> iter fb pos t
else
fallback
in
iter None