123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144openResulttypefull_location_payload=Odoc_parser.Warning.t={location:Location_.span;message:string;}typefilename_only_payload={file:string;message:string}typet=[`With_full_locationofOdoc_parser.Warning.t|`With_filename_onlyoffilename_only_payload]letkasprintfkfmt=Format.(kfprintf(fun_->k(flush_str_formatter()))str_formatterfmt)letkmakek?suggestionformat=format|>kasprintf(funmessage->matchsuggestionwith|None->kmessage|Somesuggestion->k(message^"\nSuggestion: "^suggestion))letmake?suggestionformat=letkmessagelocation=`With_full_location{location;message}inkmakek?suggestionformatletfilename_only?suggestionformat=letkmessagefile=`With_filename_only{file;message}inkmakek?suggestionformatlet_to_string=letpp_prefixppf=function|Somep->Format.fprintfppf"%s: "p|None->()infun?prefix->function|`With_full_location{location;message}->ifString.comparelocation.file""!=0thenFormat.asprintf"%a:@\n%a%s"Location_.pplocationpp_prefixprefixmessageelseFormat.asprintf"%a%s"pp_prefixprefixmessage|`With_filename_only{file;message}->Format.asprintf"File \"%s\":@\n%a%s"filepp_prefixprefixmessageletto_stringe=_to_stringeexceptionConveyed_by_exceptionoftletraise_exceptionerror=raise(Conveyed_by_exceptionerror)letcatchf=tryOk(f())withConveyed_by_exceptionerror->Errorerrortypewarning={w:t;non_fatal:bool;(** If [true], the warning won't be made fatal in [warn_error] mode. *)}type'awith_warnings={value:'a;warnings:warninglist}letwith_refrf=letsaved=!rintryletv=f()inr:=saved;vwithe->r:=saved;raiseeletraised_warnings=ref[]letraise_warnings'warnings=raised_warnings:=List.rev_appendwarnings!raised_warningsletraise_warning?(non_fatal=false)w=raised_warnings:={w;non_fatal}::!raised_warningsletraise_warningswith_warnings=raise_warnings'with_warnings.warnings;with_warnings.valueletcatch_warningsf=with_refraised_warnings(fun()->raised_warnings:=[];letvalue=f()inletwarnings=List.rev!raised_warningsin{value;warnings})type'awith_errors_and_warnings=('a,t)Result.resultwith_warningsletraise_errors_and_warningswe=matchraise_warningswewithOkx->x|Errore->raise_exceptioneletcatch_errors_and_warningsf=catch_warnings(fun()->catchf)letprint_error?prefixt=prerr_endline(_to_string?prefixt)letprint_errors=List.iterprint_errortypewarnings_options={warn_error:bool;print_warnings:bool}letprint_warnings~warnings_optionswarnings=ifwarnings_options.print_warningsthenList.iter(funw->letprefix=ifwarnings_options.warn_error&¬w.non_fatalthen"Error"else"Warning"inprint_error~prefixw.w)warnings(* When there is warnings. *)lethandle_warn_error~warnings_optionswarningsok=print_warnings~warnings_optionswarnings;letmaybe_fatal=List.exists(funw->notw.non_fatal)warningsinifmaybe_fatal&&warnings_options.warn_errorthenError(`Msg"Warnings have been generated.")elseOkoklethandle_warnings~warnings_optionsww=handle_warn_error~warnings_optionsww.warningsww.valuelethandle_errors_and_warnings~warnings_options=function|{value=Errore;warnings}->print_warnings~warnings_optionswarnings;Error(`Msg(to_stringe))|{value=Okok;warnings}->handle_warn_error~warnings_optionswarningsokletunpack_warningsww=(ww.value,List.map(funw->w.w)ww.warnings)lett_of_parser_t:Odoc_parser.Warning.t->t=funx->(`With_full_locationx:>t)letraise_parser_warningsv=(* Parsing errors may be fatal. *)letwarnings=Odoc_parser.warningsvinletnon_fatal=falseinraise_warnings'(List.map(funp->{w=t_of_parser_tp;non_fatal})warnings);Odoc_parser.astv