123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418(*
* SPDX-FileCopyrightText: 2024 The Forester Project Contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*)openForester_preludeopenForester_coreopenState.SyntaxmoduleUnit_map=URI.MapopenstructmoduleR=ResolvermoduleSc=R.ScopeendmoduleBuiltins=structmoduleTransclude=structletexpanded_sym=Symbol.named["transclude";"expanded"]letshow_heading_sym=Symbol.named["transclude";"heading"]lettoc_sym=Symbol.named["transclude";"toc"]letnumbered_sym=Symbol.named["transclude";"numbered"]letshow_metadata_sym=Symbol.named["transclude";"metadata"]endendletrecexpand_method_calls(base:Syn.t):Code.t->Syn.t*Code.t=function|{value=Hash_identx;loc}::rest->letbase=[Range.{value=Syn.Call(base,x);loc}]inexpand_method_callsbaserest|rest->base,resttype'aEffect.t+=Entered_range:Range.toption->unitEffect.tletentered_range(loc:Range.toption):unit=Effect.perform@@Entered_rangelocletrecexpand_eff~(forest:State.t):Code.t->Syn.t=function|[]->[]|node::rest->entered_rangenode.loc;matchnode.valuewith|Hash_identx|Textx->{nodewithvalue=Textx}::expand_eff~forestrest|Verbatimx->{nodewithvalue=Verbatimx}::expand_eff~forestrest|Namespace(path,body)->letresult=let@()=Sc.sectionpathinexpand_eff~forestbodyinresult@expand_eff~forestrest|Openpath->Sc.modify_visible@@R.Lang.union[R.Lang.all;R.Lang.renamingpath[]];expand_eff~forestrest|Group(Squares,x)->beginmatchxwith|[{value=Group(Squares,y);loc=yloc}]->entered_rangeyloc;lety=expand_eff~forestyin{nodewithvalue=Link{dest=y;title=None}}::expand_eff~forestrest|_->letx=expand_eff~forestxinbeginmatchrestwith|{value=Group(Parens,y);loc=yloc}::rest->entered_rangeyloc;lety=expand_eff~forestyin(* TODO: merge the ranges *){nodewithvalue=Link{dest=y;title=Somex}}::expand_eff~forestrest|_->{nodewithvalue=Group(Squares,x)}::expand_eff~forestrestendend|Group(d,x)->letx=expand_eff~forestxin{nodewithvalue=Group(d,x)}::expand_eff~forestrest|Subtree(addr,nodes)->letnodes=let@()=Sc.section[]inexpand_eff~forestnodesin{nodewithvalue=Syn.Subtree(addr,nodes)}::expand_eff~forestrest|Math(m,x)->letx=expand_eff~forestxin{nodewithvalue=Math(m,x)}::expand_eff~forestrest|Identpath->letout,rest=expand_method_calls(expand_identnode.locpath)restinout@expand_eff~forestrest|Xml_ident(prefix,uname)->letqname=expand_xml_identnode.loc(prefix,uname)inletattrs,rest=get_xml_attrs~forest[]restinletarg_opt,rest=get_arg_opt~forestrestin{nodewithvalue=Xml_tag(qname,attrs,Option.value~default:[]arg_opt)}::expand_eff~forestrest|Scopebody->letbody=let@()=Sc.section[]inexpand_eff~forestbodyinbody@expand_eff~forestrest|Allocx->letsymbol=Symbol.namedxinSc.include_singletonx@@(Term[Range.locate_optnode.loc(Syn.Symsymbol)],node.loc);expand_eff~forestrest|Put(k,v)->letk=expand_identnode.lockinletv=expand_eff~forestvin(* TODO: merge locations! the resulting location is narrowed to the 'put' node, and therefore breaks the nesting of locations. That could lead to trouble in the future. *)[{nodewithvalue=Put(k,v,expand_eff~forestrest)}]|Default(k,v)->letk=expand_identnode.lockinletv=expand_eff~forestvin(* TODO: merge locations! the resulting location is narrowed to the 'put' node, and therefore breaks the nesting of locations. That could lead to trouble in the future. *)[{nodewithvalue=Default(k,v,expand_eff~forestrest)}]|Getk->letk=expand_identnode.lockin{nodewithvalue=Getk}::expand_eff~forestrest|Dx_varname->{nodewithvalue=Dx_varname}::expand_eff~forestrest|Dx_const_contentx->letx=expand_eff~forestxin{nodewithvalue=Dx_const(`Content,x)}::expand_eff~forestrest|Dx_const_urix->letx=expand_eff~forestxin{nodewithvalue=Dx_const(`Uri,x)}::expand_eff~forestrest|Dx_prop(rel,args)->letrel=expand_eff~forestrelinletargs=List.map(expand_eff~forest)argsin{nodewithvalue=Dx_prop(rel,args)}::expand_eff~forestrest|Dx_query(var,pos,neg)->letpos=List.map(expand_eff~forest)posinletneg=List.map(expand_eff~forest)negin{nodewithvalue=Dx_query(var,pos,neg)}::expand_eff~forestrest|Dx_sequent(concl,prems)->letconcl=expand_eff~forestconclinletprems=List.map(expand_eff~forest)premsin{nodewithvalue=Dx_sequent(concl,prems)}::expand_eff~forestrest|Fun(xs,body)->letlam=expand_lambda~forestnode.loc(xs,body)inlam::expand_eff~forestrest|Let(x,ys,def)->letlam=expand_lambda~forestnode.loc(ys,def)inlet@()=Sc.section[]inSc.import_singletonx@@(Term[lam],node.loc);expand_eff~forestrest|Def(x,ys,def)->letlam=expand_lambda~forestnode.loc(ys,def)inSc.include_singletonx@@(Term[lam],node.loc);expand_eff~forestrest|Decl_xmlns(prefix,xmlns)->letpath=["xmlns";prefix]inSc.include_singletonpath@@(Xmlns{prefix;xmlns},node.loc);expand_eff~forestrest|Object{self;methods}->letmethods=let@()=Sc.section[]inbeginlet@self=Option.iter@~selfinletvar=Range.{value=Syn.Varself;loc=node.loc}in(* TODO: correct the location *)Sc.import_singleton[self]@@(Term[var],node.loc)(* TODO: correct the location*)end;List.map(expand_method~forest)methodsin{nodewithvalue=Object{self;methods}}::expand_eff~forestrest|Patch{obj;self;super;methods}->letobj=expand_eff~forestobjinletmethods=let@()=Sc.section[]inbeginlet@self=Option.iter@~selfinletself_var=Range.locate_optNone@@Syn.VarselfinSc.import_singleton[self]@@(Term[self_var],node.loc);let@super=Option.iter@~superinletsuper_var=Range.locate_optNone@@Syn.VarsuperinSc.import_singleton[super]@@(Term[super_var],node.loc)end;List.map(expand_method~forest)methodsinletpatched=Syn.Patch{obj;self;super;methods}in{nodewithvalue=patched}::expand_eff~forestrest|Call(obj,meth)->letobj=expand_eff~forestobjin{nodewithvalue=Call(obj,meth)}::expand_eff~forestrest|Import(vis,dep)->letdep_uri=URI_scheme.named_uri~base:forest.config.urldepinbeginmatchforest./{dep_uri}with|None->Reporter.emit?loc:node.loc(Import_not_founddep_uri)|Sometree->beginmatchviswith|Public->Sc.include_subtree[]tree|Private->Sc.import_subtree[]treeendend;expand_eff~forestrest|Comment_|Error_->ignore@@assertfalse;expand_eff~forestrestandget_xml_attrs~forestacc=function|{value=Group(Squares,[{value=Textkey;loc=loc1}]);_}::{value=Group(Braces,value);loc=loc2}::rest->entered_rangeloc1;entered_rangeloc2;letqname=expand_xml_identloc1@@Forester_xml_names.split_xml_qnamekeyinletvalue=expand_eff~forestvalueinget_xml_attrs~forest(acc@[qname,value])rest|rest->acc,restandget_arg_opt~forest:Code.t->_=function|{value=Group(Braces,arg);loc}::rest->entered_rangeloc;Some(expand_eff~forestarg),rest|rest->None,restandexpand_identlocpath=matchSc.resolvepathwith|None->letvisible=Sc.get_visible()in[Range.{value=Syn.Unresolved_ident(visible,path);loc}]|Some(Termx,_)->letrelocateRange.{value;_}=Range.{value;loc}inList.maprelocatex|Some(Xmlns{xmlns;prefix},_)->letvisible=Sc.get_visible()inReporter.fatal?loc~extra_remarks:[Asai.Diagnostic.loctextf"path %a resolved to xmlns:%s=\"%s\" instead of term"Sc.pp_pathpathxmlnsprefix](Unresolved_identifier(visible,path))(* TODO: This should be perhaps a different error *)andexpand_xml_identloc(prefix,uname):Types.xml_qname=matchprefixwith|None->{xmlns=None;prefix="";uname}|Someprefix->matchSc.resolve["xmlns";prefix]with|Some(Xmlns{xmlns;prefix},_)->{xmlns=Somexmlns;prefix=prefix;uname}|_->Reporter.fatal?loc(Unresolved_xmlnsprefix)~extra_remarks:[Asai.Diagnostic.loctextf"expected path `%s` to resolve to xmlns"prefix;Asai.Diagnostic.loctextf"You may fix this by defining an XML namespace:@. \\xmlns:%s{...}"prefix;]andexpand_method~forest(key,body)=key,expand_eff~forestbodyandexpand_lambda~forestloc(xs,body)=let@()=Sc.section[]inletxs=let@strategy,x=List.map@~xsinletvar=Range.locate_optNone@@Syn.VarxinSc.import_singleton[x]@@(Term[var],loc);strategy,xinRange.{value=Syn.Fun(xs,expand_eff~forestbody);loc}letignore_entered_rangefx=letopenEffect.Deepintry_withfx{effc=fun(typea)(eff:aEffect.t)->matcheffwith|Entered_range_->Option.some@@fun(k:(a,_)continuation)->continuek()|_->None}letexpand~forest(xs:Code.t):Syn.t=ignore_entered_range(expand_eff~forest)xs(* Feel free to extend this *)lettex_builtin_words=List.to_seq["left";"right";"big";"bigr";"Big";"Bigr";"bigg";"biggr";"Bigg";"Biggr";"bigl";"Bigl";"biggl";"Biggl";"mathrlap";"mathllap";"mathclap";"rlap";"llap";"ulap";"dlap";"infty";"infinity";"lbrace";"rbrace";"llbracket";"rrbracket";"lvert";"lVert";"rvert";"rVert";"vert";"Vert";"setminus";"backslash";"smallsetminus";"sslash";"lfloor";"lceil";"lmoustache";"lang";"langle";"llangle";"rfloor";"rceil";"rmoustache";"rang";"rangle";"rrangle";"uparrow";"downarrow";"updownarrow";"prime";"alpha";"beta";"gamma";"delta";"zeta";"eta";"theta";"iota";"kappa";"lambda";"mu";"nu";"xi";"pi";"rho";"sigma";"tau";"upsilon";"chi";"psi";"omega";"backepsilon";"varkappa";"varpi";"varrho";"varsigma";"vartheta";"varepsilon";"phi";"varphi";"arccos";"arcsin";"arctan";"arg";"cos";"cosh";"cot";"coth";"csc";"deg";"dim";"exp";"hom";"ker";"lg";"ln";"log";"sec";"sin";"sinh";"tan";"tanh";"det";"gcd";"inf";"lim";"liminf";"limsup";"max";"min";"Pr";"sup";"omicron";"epsilon";"cdot";"Alpha";"Beta";"Delta";"Gamma";"digamma";"Lambda";"Pi";"Phi";"Psi";"Sigma";"Theta";"Xi";"Zeta";"Eta";"Iota";"Kappa";"Mu";"Nu";"Rho";"Tau";"mho";"Omega";"Upsilon";"Upsi";"iff";"Longleftrightarrow";"Leftrightarrow";"impliedby";"Leftarrow";"implies";"Rightarrow";"hookleftarrow";"embedsin";"hookrightarrow";"longleftarrow";"longrightarrow";"leftarrow";"to";"rightarrow";"leftrightarrow";"mapsto";"map";"nearrow";"nearr";"nwarrow";"nwarr";"searrow";"searr";"swarrow";"swarr";"neArrow";"neArr";"nwArrow";"nwArr";"seArrow";"seArr";"swArrow";"swArr";"darr";"Downarrow";"uparr";"Uparrow";"downuparrow";"duparr";"updarr";"Updownarrow";"leftsquigarrow";"rightsquigarrow";"dashleftarrow";"dashrightarrow";"curvearrowbotright";"righttoleftarrow";"lefttorightarrow";"leftrightsquigarrow";"upuparrows";"rightleftarrows";"rightrightarrows";"curvearrowleft";"curvearrowright";"downdownarrows";"leftarrowtail";"rightarrowtail";"leftleftarrows";"leftrightarrows";"Lleftarrow";"Rrightarrow";"looparrowleft";"looparrowright";"Lsh";"Rsh";"circlearrowleft";"circlearrowright";"twoheadleftarrow";"twoheadrightarrow";"nLeftarrow";"nleftarrow";"nLeftrightarrow";"nleftrightarrow";"nRightarrow";"nrightarrow";"rightharpoonup";"rightharpoondown";"leftharpoonup";"leftharpoondown";"downharpoonleft";"downharpoonright";"leftrightharpoons";"rightleftharpoons";"upharpoonleft";"upharpoonright";"xrightarrow";"xleftarrow";"xleftrightarrow";"xLeftarrow";"xRightarrow";"xLeftrightarrow";"xleftrightharpoons";"xrightleftharpoons";"xhookleftarrow";"xhookrightarrow";"xmapsto";"dots";"ldots";"cdots";"ddots";"udots";"vdots";"colon";"cup";"union";"bigcup";"Union";"⋃";"cap";"intersection";"bigcap";"Intersection";"in";"coloneqq";"Coloneqq";"coloneq";"Coloneq";"eqqcolon";"Eqqcolon";"eqcolon";"Eqcolon";"colonapprox";"Colonapprox";"colonsim";"Colonsim";"dblcolon";"ast";"Cap";"Cup";"circledast";"circledcirc";"curlyvee";"curlywedge";"divideontimes";"dotplus";"leftthreetimes";"rightthreetimes";"veebar";"gt";"lt";"approxeq";"backsim";"backsimeq";"barwedge";"doublebarwedge";"subset";"subseteq";"subseteqq";"subsetneq";"subsetneqq";"varsubsetneq";"varsubsetneqq";"prec";"parallel";"nparallel";"shortparallel";"nshortparallel";"perp";"eqslantgtr";"eqslantless";"gg";"ggg";"geq";"geqq";"geqslant";"gneq";"gneqq";"gnapprox";"gnsim";"gtrapprox";"ge";"le";"leq";"leqq";"leqslant";"lessapprox";"lessdot";"lesseqgtr";"lesseqqgtr";"lessgtr";"lneq";"lneqq";"lnsim";"lvertneqq";"gtrsim";"gtrdot";"gtreqless";"gtreqqless";"gtrless";"gvertneqq";"lesssim";"lnapprox";"nsubset";"nsubseteq";"nsubseteqq";"notin";"ni";"notni";"nmid";"nshortmid";"preceq";"npreceq";"ll";"ngeq";"ngeqq";"ngeqslant";"nleq";"nleqq";"nleqslant";"nless";"supset";"supseteq";"supseteqq";"supsetneq";"supsetneqq";"varsupsetneq";"varsupsetneqq";"approx";"asymp";"bowtie";"dashv";"Vdash";"vDash";"VDash";"vdash";"Vvdash";"models";"sim";"simeq";"nsim";"smile";"triangle";"triangledown";"triangleleft";"cong";"succ";"nsucc";"ngtr";"nsupset";"nsupseteq";"propto";"equiv";"nequiv";"frown";"triangleright";"ncong";"succeq";"succapprox";"succnapprox";"succcurlyeq";"succsim";"succnsim";"nsucceq";"nvDash";"nvdash";"nVDash";"amalg";"pm";"mp";"bigcirc";"wr";"odot";"uplus";"clubsuit";"spadesuit";"Diamond";"diamond";"sqcup";"sqcap";"sqsubset";"sqsubseteq";"sqsupset";"sqsupseteq";"Subset";"Supset";"ltimes";"div";"rtimes";"bot";"therefore";"thickapprox";"thicksim";"varpropto";"varnothing";"flat";"vee";"because";"between";"Bumpeq";"bumpeq";"circeq";"curlyeqprec";"curlyeqsucc";"doteq";"doteqdot";"eqcirc";"fallingdotseq";"multimap";"pitchfork";"precapprox";"precnapprox";"preccurlyeq";"precsim";"precnsim";"risingdotseq";"sharp";"bullet";"nexists";"dagger";"ddagger";"not";"top";"natural";"angle";"measuredangle";"backprime";"bigstar";"blacklozenge";"lozenge";"blacksquare";"blacktriangle";"blacktriangleleft";"blacktriangleright";"blacktriangledown";"ntriangleleft";"ntriangleright";"ntrianglelefteq";"ntrianglerighteq";"trianglelefteq";"trianglerighteq";"triangleq";"vartriangleleft";"vartriangleright";"forall";"bigtriangleup";"bigtriangledown";"nprec";"aleph";"beth";"eth";"ell";"hbar";"Im";"imath";"jmath";"wp";"Re";"Perp";"Vbar";"boxdot";"Box";"square";"emptyset";"empty";"exists";"circ";"rhd";"lhd";"lll";"unrhd";"unlhd";"Del";"nabla";"sphericalangle";"heartsuit";"diamondsuit";"partial";"qed";"mod";"pmod";"bottom";"neg";"neq";"ne";"shortmid";"mid";"int";"integral";"iint";"doubleintegral";"iiint";"tripleintegral";"iiiint";"quadrupleintegral";"oint";"conint";"contourintegral";"times";"star";"circleddash";"odash";"intercal";"smallfrown";"smallsmile";"boxminus";"minusb";"boxplus";"plusb";"boxtimes";"timesb";"sum";"prod";"product";"coprod";"coproduct";"otimes";"Otimes";"bigotimes";"ominus";"oslash";"oplus";"Oplus";"bigoplus";"bigodot";"bigsqcup";"bigsqcap";"biginterleave";"biguplus";"wedge";"Wedge";"bigwedge";"Vee";"bigvee";"invamp";"parr";"frac";"tfrac";"binom";"tbinom";"tensor";"multiscripts";"overbrace";"underbrace";"underline";"bar";"overline";"closure";"widebar";"vec";"widevec";"overrightarrow";"overleftarrow";"overleftrightarrow";"underrightarrow";"underleftarrow";"underleftrightarrow";"dot";"ddot";"dddot";"ddddot";"tilde";"widetilde";"check";"widecheck";"hat";"widehat";"underset";"stackrel";"overset";"over";"atop";"underoverset";"sqrt";"root";"space";"text";"statusline";"tooltip";"toggle";"begintoggle";"endtoggle";"mathraisebox";"fghilight";"fghighlight";"bghilight";"bghighlight";"color";"bgcolor";"displaystyle";"textstyle";"textsize";"scriptsize";"scriptscriptsize";"mathit";"mathsf";"mathtt";"boldsymbol";"mathbf";"mathrm";"mathbb";"mathfrak";"mathfr";"slash";"boxed";"mathcal";"mathscr";"begin";"end";"substack";"array";"arrayopts";"colalign";"collayout";"rowalign";"align";"equalrows";"equalcols";"rowlines";"collines";"frame";"padding";"rowopts";"cellopts";"rowspan";"colspan";"thinspace";"medspace";"thickspace";"quad";"qquad";"negspace";"negthinspace";"negmedspace";"negthickspace";"phantom";"operatorname";"mathop";"mathbin";"mathrel";"includegraphics";"lparen";"rparen";"land";"lor";"middle";"mathpunct";"mathord"]|>Seq.map@@funword->letpath=[word]inletnode=Syn.TeX_cs(TeX_cs.Wordword)inpath,(Syn.Term[Range.locate_optNonenode],None)(* Feel free to extend this *)lettex_builtin_symbols=List.to_seq['_';',';';']|>Seq.map@@func->letpath=[String_util.implode[c]]inletnode=Syn.TeX_cs(TeX_cs.Symbolc)inpath,(Syn.Term[Range.locate_optNonenode],None)letbuiltin_xml_namespaces=List.to_seq["html","http://www.w3.org/1999/xhtml";"mml","http://www.w3.org/1998/Math/MathML"]|>Seq.map@@fun(prefix,xmlns)->["xmlns";prefix],(Syn.Xmlns{prefix;xmlns},None)letbuiltins=Seq.concat@@List.to_seq[builtin_xml_namespaces;tex_builtin_words;tex_builtin_symbols;beginletopenBuiltins.TranscludeinList.to_seq[expanded_sym;show_heading_sym;toc_sym;numbered_sym;show_metadata_sym]|>Seq.map@@funsym->Symbol.namesym,(Syn.Term[Range.locate_optNone(Syn.Symsym)],None)end;beginList.to_seq[["p"],Syn.Prim`P;["em"],Syn.Prim`Em;["strong"],Syn.Prim`Strong;["li"],Syn.Prim`Li;["ol"],Syn.Prim`Ol;["ul"],Syn.Prim`Ul;["code"],Syn.Prim`Code;["blockquote"],Syn.Prim`Blockquote;["pre"],Syn.Prim`Pre;["figure"],Syn.Prim`Figure;["figcaption"],Syn.Prim`Figcaption;["transclude"],Syn.Transclude;["tex"],Syn.Embed_tex;["ref"],Syn.Ref;["title"],Syn.Title;["taxon"],Syn.Taxon;["date"],Syn.Date;["meta"],Syn.Meta;["author"],Syn.Attribution(Author,`Uri);["author";"literal"],Syn.Attribution(Author,`Content);["contributor"],Syn.Attribution(Contributor,`Uri);["contributor";"literal"],Syn.Attribution(Contributor,`Content);["parent"],Syn.Parent;["number"],Syn.Number;["tag"],Syn.Tag`Content;["query"],Syn.Results_of_query;["rel";"has-tag"],Syn.TextBuiltin_relation.has_tag;["rel";"has-taxon"],Syn.TextBuiltin_relation.has_taxon;["rel";"has-author"],Syn.TextBuiltin_relation.has_author;["rel";"has-direct-contributor"],Syn.TextBuiltin_relation.has_direct_contributor;["rel";"transcludes"],Syn.TextBuiltin_relation.transcludes;["rel";"transcludes";"transitive-closure"],Syn.TextBuiltin_relation.transcludes_tc;["rel";"transcludes";"reflexive-transitive-closure"],Syn.TextBuiltin_relation.transcludes_rtc;["rel";"links-to"],Syn.TextBuiltin_relation.links_to;["rel";"is-reference"],Syn.TextBuiltin_relation.is_reference;["rel";"is-person"],Syn.TextBuiltin_relation.is_person;["rel";"is-node"],Syn.TextBuiltin_relation.is_node;["rel";"is-article"],Syn.TextBuiltin_relation.is_article;["rel";"is-asset"],Syn.TextBuiltin_relation.is_asset;["rel";"in-host"],Syn.TextBuiltin_relation.in_host;["execute"],Syn.Dx_execute;["route-asset"],Syn.Route_asset;["syndicate-query-as-json-blob"],Syn.Syndicate_query_as_json_blob;["syndicate-current-tree-as-atom-feed"],Syn.Syndicate_current_tree_as_atom_feed;["current-tree"],Syn.Current_tree;]|>Seq.map@@fun(path,node)->path,(Syn.Term[Range.locate_optNonenode],None)end]letinitial_visible_trie:(Syn.resolver_data,Range.toption)Trie.t=Yuujinchou.Trie.of_seqbuiltinsletexpand_tree_inner~forest(code:Tree.code):Tree.syn=lettracek=matchidentity_to_uricode.identitywith|None->k()|Someuri->let@()=Reporter.tracef"when expanding tree %s"(URI.to_stringuri)ink()inlet@()=traceinlet@()=Sc.section[]inletnodes=expand_eff~forestcode.nodesinletexports=Sc.get_export()inTree.{nodes;identity=code.identity;code;units=exports}letexpand_tree~(forest:State.t)(code:Tree.code):Tree.syn*Reporter.Message.tAsai.Diagnostic.tlist=letdiagnostics=ref[]inletemitd=diagnostics:=d::!diagnosticsinletfatald=emitd;Tree.{nodes=[];identity=code.identity;code=code;units=Trie.empty;},!diagnosticsinReporter.run~emit~fatal@@fun()->Sc.run~init_visible:initial_visible_trie@@fun()->letexpanded_tree=ignore_entered_range(expand_tree_inner~forest)codeinexpanded_tree,!diagnostics