123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138moduleBackend=structmoduletypeS=sigvalprint_user_message:User_message.t->unitvalset_status_line:User_message.Style.tPp.toption->unitvalreset:unit->unitendtypet=(moduleS)moduleDumb_no_flush:S=structletprint_user_messagemsg=Option.itermsg.User_message.loc~f:(funloc->Loc.renderFormat.err_formatter(Loc.pploc));User_message.prerr{msgwithloc=None}letset_status_line_=()letreset()=prerr_string"\x1bc"endmoduleDumb:S=structincludeDumb_no_flushletprint_user_messagemsg=print_user_messagemsg;flushstderrletreset()=reset();flushstderrendmoduleProgress:S=structletstatus_line=refPp.nopletstatus_line_len=ref0lethide_status_line()=if!status_line_len>0thenPrintf.eprintf"\r%*s\r"!status_line_len""letshow_status_line()=if!status_line_len>0thenAnsi_color.prerr!status_lineletset_status_line=function|None->hide_status_line();status_line:=Pp.nop;status_line_len:=0;flushstderr|Someline->letline=Pp.map_tagsline~f:User_message.Print_config.defaultinletline_len=String.length(Format.asprintf"%a"Pp.render_ignore_tagsline)inhide_status_line();status_line:=line;status_line_len:=line_len;show_status_line();flushstderrletprint_user_messagemsg=hide_status_line();Dumb_no_flush.print_user_messagemsg;show_status_line();flushstderrletreset()=Dumb.reset()endletdumb=(moduleDumb:S)letprogress=(moduleProgress:S)letmain=refdumbletsett=main:=tletcompose(moduleA:S)(moduleB:S)=(modulestructletprint_user_messagemsg=A.print_user_messagemsg;B.print_user_messagemsgletset_status_linex=A.set_status_linex;B.set_status_linexletreset()=A.reset();B.reset()end:S)endletprint_user_messagemsg=let(moduleM:Backend.S)=!Backend.maininM.print_user_messagemsgletprintparagraphs=print_user_message(User_message.makeparagraphs)letset_status_lineline=let(moduleM:Backend.S)=!Backend.maininM.set_status_linelineletreset()=let(moduleM:Backend.S)=!Backend.maininM.reset()moduleStatus_line=structtypet=unit->User_message.Style.tPp.toptionletstatus_line=ref(Fun.constNone)letrefresh()=match!status_line()with|None->set_status_lineNone|Somepp->(* Always put the status line inside a horizontal to force the [Format]
module to prefer a single line. In particular, it seems that
[Format.pp_print_text] split sthe line before the last word, unless it
is succeeded by a space. This seems like a bug in [Format] and putting
the whole thing into a [hbox] works around this bug.
See https://github.com/ocaml/dune/issues/2779 *)set_status_line(Some(Pp.hboxpp))letsetx=status_line:=x;refresh()letset_temporarilyxf=letold=!status_lineinsetx;Exn.protect~finally:(fun()->setold)~fendlet()=User_warning.set_reporterprint_user_message