Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file loc.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188includeLoc0letnone_posp:Lexing.position={pos_fname=p;pos_lnum=1;pos_cnum=0;pos_bol=0}letin_filep=letpos=none_pos(Path.to_stringp)in{start=pos;stop=pos}letin_dir=in_fileletnone=letpos=none_pos"<none>"in{start=pos;stop=pos}letdrop_position(t:t)=letpos=none_post.start.pos_fnamein{start=pos;stop=pos}letof_lexbuflexbuf:t={start=Lexing.lexeme_start_plexbuf;stop=Lexing.lexeme_end_plexbuf}letsexp_of_position_no_file(p:Lexing.position)=letopenSexp.Encoderinrecord["pos_lnum",intp.pos_lnum;"pos_bol",intp.pos_bol;"pos_cnum",intp.pos_cnum]letdyn_of_position_no_file(p:Lexing.position)=letopenDyninRecord["pos_lnum",Intp.pos_lnum;"pos_bol",Intp.pos_bol;"pos_cnum",Intp.pos_cnum]letto_sexpt=letopenSexp.Encoderinrecord(* TODO handle when pos_fname differs *)["pos_fname",stringt.start.pos_fname;"start",sexp_of_position_no_filet.start;"stop",sexp_of_position_no_filet.stop]letto_dynt=letopenDyninRecord["pos_fname",Stringt.start.pos_fname;"start",dyn_of_position_no_filet.start;"stop",dyn_of_position_no_filet.stop]letequal_position{Lexing.pos_fname=f_a;pos_lnum=l_a;pos_bol=b_a;pos_cnum=c_a}{Lexing.pos_fname=f_b;pos_lnum=l_b;pos_bol=b_b;pos_cnum=c_b}=f_a=f_b&&l_a=l_b&&b_a=b_b&&c_a=c_bletequal{start=start_a;stop=stop_a}{start=start_b;stop=stop_b}=equal_positionstart_astart_b&&equal_positionstop_astop_bletof_pos(fname,lnum,cnum,enum)=letpos:Lexing.position={pos_fname=fname;pos_lnum=lnum;pos_cnum=cnum;pos_bol=0}in{start=pos;stop={poswithpos_cnum=enum}}letis_none=equalnoneletto_file_colon_linet=Printf.sprintf"%s:%d"t.start.pos_fnamet.start.pos_lnumletpp_file_colon_lineppft=Format.pp_print_stringppf(to_file_colon_linet)letpp_linepadding_widthpp(lnum,l)=Format.fprintfpp"%*s | %s\n"padding_widthlnumlletpp_file_excerpt~context_lines~max_lines_to_print_in_fullpp{start;stop}=letstart_c=start.pos_cnum-start.pos_bolinletstop_c=stop.pos_cnum-start.pos_bolinletfile=start.pos_fnameinletpp_file_excerpt()=letline_num=start.pos_lnuminletline_num_str=string_of_intline_numinletpadding_width=String.lengthline_num_strinletopenResult.Oinlet*line=Result.try_with(fun()->Io.String_path.file_linefileline_num)inifstop_c<=String.lengthlinethenbeginletlen=stop_c-start_cinFormat.fprintfpp"%a%*s\n"(pp_linepadding_width)(line_num_str,line)(stop_c+padding_width+3)(String.makelen'^');Ok()endelseletget_paddinglines=let(lnum,_)=Option.value_exn(List.lastlines)inString.lengthlnuminletprint_ellipsispadding_width=(* We add 2 to the width of max line to account for the extra space
and the `|` character at the end of a line number *)letline=String.make(padding_width+2)'.'inFormat.fprintfpp"%s\n"lineinletprint_lineslinespadding_width=List.iter~f:(fun(lnum,l)->pp_linepadding_widthpp(lnum,l))lines;inletfile_lines~start~stop=Result.try_with(fun()->Io.String_path.file_linesfile~start~stop)inletnum_lines=stop.pos_lnum-start.pos_lnuminifnum_lines<=max_lines_to_print_in_fullthenlet+lines=file_lines~start:start.pos_lnum~stop:stop.pos_lnuminprint_lineslines(get_paddinglines)else(* We need to send the padding width from the last four lines so the
two blocks of lines align if they have different number of digits
in their line numbers *)let*first_shown_lines=file_lines~start:start.pos_lnum~stop:(start.pos_lnum+context_lines)inlet+last_shown_lines=file_lines~start:(stop.pos_lnum-context_lines)~stop:(stop.pos_lnum)inletpadding_width=get_paddinglast_shown_linesin(print_linesfirst_shown_linespadding_width;print_ellipsispadding_width;print_lineslast_shown_linespadding_width)inletwhole_file=start_c=0&&stop_c=0inifnotwhole_filethenbeginmatchletopenResult.Oinlet*exists=Result.try_with(fun()->Sys.file_existsstart.pos_fname)inifexiststhenpp_file_excerpt()elseResult.Ok()with|Errorexn->letbacktrace=Printexc.get_backtrace()inFormat.eprintf"Raised when trying to print location contents of %s@.%a@."file(Exn.pp_uncaught~backtrace)exn|Ok()->()endleton_same_lineloc1loc2=letstart1=loc1.startinletstart2=loc2.startinletsame_file=String.equalstart1.pos_fnamestart2.pos_fnameinletsame_line=Int.equalstart1.pos_lnumstart2.pos_lnuminsame_file&&same_line