Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file loc.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167includeLoc0moduleO=Comparable.Make(structtypenonrect=tletcompare=Poly.compareletto_dyn=to_dynend)includeOletin_filep=letpos=none_pos(Path.to_stringp)in{start=pos;stop=pos}letin_dir=in_fileletdrop_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}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_lnumletto_dyn_humt:Dyn.t=String(to_file_colon_linet)letpp_file_colon_linet=Pp.verbatim(to_file_colon_linet)letpp_left_padns=letneeded_spaces=n-String.lengthsinPp.verbatim(ifneeded_spaces>0thenString.makeneeded_spaces' '^selses)letpp_linepadding_width(lnum,l)=letopenPp.Oinpp_left_padpadding_widthlnum++Pp.verbatim" | "++Pp.verbatiml++Pp.newlinetypetag=Locletpp_file_excerpt~context_lines~max_lines_to_print_in_full{start;stop}:tagPp.t=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.lengthlinethenletlen=stop_c-start_cinletopenPp.OinOk(pp_linepadding_width(line_num_str,line)++pp_left_pad(stop_c+padding_width+3)(String.makelen'^')++Pp.newline)elseletget_paddinglines=letlnum,_=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)'.'inPp.verbatimlineinletprint_lineslinespadding_width=Pp.concat_maplines~f:(pp_linepadding_width)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_lnuminletpadding_width=get_paddinglast_shown_linesinletopenPp.Oinprint_linesfirst_shown_linespadding_width++print_ellipsispadding_width++print_lineslast_shown_linespadding_widthinletwhole_file=start_c=0&&stop_c=0inifwhole_filethenPp.nopelsematchletopenResult.Oinlet*exists=Result.try_with(fun()->Sys.file_existsstart.pos_fname)inifexiststhenpp_file_excerpt()elseResult.OkPp.nopwith|Okpp->pp|Errorexn->letbacktrace=Printexc.get_backtrace()inFormat.eprintf"Raised when trying to print location contents of %s@.%a@."file(Exn.pp_uncaught~backtrace)exn;Pp.nopletpp({start;stop}asloc)=letstart_c=start.pos_cnum-start.pos_bolinletstop_c=stop.pos_cnum-start.pos_bolinletopenPp.OinPp.tagLoc(Pp.verbatim(Printf.sprintf"File \"%s\", line %d, characters %d-%d:"start.pos_fnamestart.pos_lnumstart_cstop_c))++Pp.newline++pp_file_excerpt~context_lines:2~max_lines_to_print_in_full:10locleton_same_lineloc1loc2=letstart1=loc1.startinletstart2=loc2.startinletsame_file=String.equalstart1.pos_fnamestart2.pos_fnameinletsame_line=Int.equalstart1.pos_lnumstart2.pos_lnuminsame_file&&same_lineletspanbegin_end_={begin_withstop=end_.stop}letrecrenderppfpp=Pp.renderppfpp~tag_handler:(funppfLocpp->Format.fprintfppf"@{<loc>%a@}"renderpp)