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