package Ġnl . ut w ente . ast diff . src ml Ċ Ċ import Ġnl . ut w ente . ast diff . ast .* Ċ import Ġnl . ut w ente . ast diff . clang . skip Qualifier Ċ import Ġorg . apache . commons . text . String Escape Utils Ċ import Ġorg . w 3 c . dom . Element Ċ import Ġorg . w 3 c . dom . Node Ċ import Ġjava . io . File Ċ import Ġjava . lang . IllegalArgumentException Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . BigInteger Ċ Ċ class ĠSrc ML Parser ( private Ġval Ġoffset : ĠInt ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠSKIP PED _ TAGS Ġ= ĠlistOf (" comment ", Ġ" cpp : empty ", Ġ" cpp : pragma ") ĊĊĠĠĠĠĠĠĠ Ġfun Ġparse Src ML ( input : ĠString ): ĠTreeNode Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPre serve Ġfirst Ġtwo Ġlines Ġ( coming Ġfrom Ġheaders ) Ġand Ġeverything Ġincluded Ġby Ġbottom Ġpart ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġinput . lines () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintended File Input Ġ= Ġlines . take Last While Ġ{ Ġ! Regex ("< cpp : empty ># Ġ\\ d + Ġ\\ S + Ġ 2 .* "). matches ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Ġ= Ġlines . take ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġxml To Process Ġ= Ġif Ġ( int ended File Input . size Ġ< Ġlines . size ) Ġ( header Ġ+ Ġintended File Input ) Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintended File Input ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġxml Str Ġ= Ġxml To Process . join ToString ("\ n ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠFile (" pp _ src ml . xml "). write Text ( xml Str ) Ġ// ĠUncomment Ġfor Ġdebugging Ġpurposes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġxml Ġ= ĠXml Dom . read XML ( xml Str . byte InputStream ()) Ċ // ĠĠĠĠĠĠĠ Ġval Ġxml Ġ= ĠXml Dom . read XML ( input . byte InputStream ()) Ġ// ĠUncomment Ġin Ġcase Ġof Ġtesting Ġfull Ġfile Ġinstead ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠSrc ML Parser ( 1 ) Ġ// ĠResult Ġfrom ĠXML Ġparser Ġalready Ġhas Ġpre processed Ġparts Ġcut Ġout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġparser . element To TreeNode ( xml . documentElement ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĊĠĠĠ Ġprivate Ġfun Ġelement To TreeNode ( e : ĠElement ): ĠTreeNode Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtool Ġ= ĠSrc ML Tree ( e , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( e . tagName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" unit " Ġ-> ĠTranslation Unit ( e . child Tags (). map Ġ{ Ġelement To TreeNode ( it ) Ġ}, Ġtool ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠClasses ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" class ", Ġ" class _ decl ", Ġ" struct ", Ġ" struct _ decl ", Ġ" union ", Ġ" union _ decl " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠRecord Type . valueOf ( e . tagName . take While Ġ{ Ġit . is Letter () Ġ}. toUpperCase ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbases Ġ= Ġe . get OrNull (" super _ list ") ?. let Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . child Tags (). map Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġchild [" name "]. textContent . skip Qualifier () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Virtual Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSpec ifiers Ġcontains Ġboth Ġaccess Ġtags Ġand Ġpossibly Ġthe Ġvirtual - tag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspec ifiers Ġ= Ġchild . child Tags (). filter Ġ{ Ġit . tagName Ġ== Ġ" specifier " Ġ}. map NotNull Ġ{ Ġspec ifier Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġspec ifier . textContent . trim (). toUpperCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text Ġ== Ġ" VIRTUAL ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Virtual Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAccess Specifier . valueOf ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInherit ance Base Ref ( name , Ġspec ifiers . first OrNull (), Ġis Virtual ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTake Ġout Ġ" default "- specified Ġblocks Ġin Ġpublic / private / protected - tags Ġsince Ġthose Ġare Ġimplicit Ġin Ġsource Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= Ġe . get OrNull (" block ") ?. child Tags ()?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . getAttribute (" type ") Ġ== Ġ" default ") Ġit . child Tags () Ġelse ĠlistOf ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. flatten () Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= ĠRecord Decl ( type , Ġe . get OrNull (" name ") ?. textContent ?. skip Qualifier (), Ġbases , Ġchildren . map Ġ{ Ġelement To TreeNode ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= Ġe . get OrNull (" template ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( template Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextract Template ( template , Ġrecord ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" friend " Ġ-> ĠFriend Decl ( element To TreeNode ( e . child Tags (). first ()), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" public ", Ġ" private ", Ġ" protected " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspec ifier Ġ= ĠAccess Specifier . valueOf ( e . tagName . toUpperCase ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSpec ified Access ( specifier , Ġe . child Tags (). map Ġ{ Ġelement To TreeNode ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" using " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnamespace Ġ= Ġe . get OrNull (" namespace ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġif Ġ( namespace Ġ== Ġnull ) Ġe [" name "]. textContent . skip Qualifier () Ġelse Ġnamespace [" name "]. textContent . skip Qualifier () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUsing Decl ( name , Ġnamespace Ġ!= Ġnull , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" typedef " Ġ-> ĠO mitted Node ( tool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" extern " Ġ-> ĠIn comp arable Node ( tool , Ġ" EXTERN ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" macro " Ġ-> ĠIn comp arable Node ( tool , Ġ" MACRO ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" namespace " Ġ-> ĠNamespace Decl ( e . get OrNull (" name ") ?. textContent , Ġe [" block "]. child Tags (). map Ġ{ Ġelement To TreeNode ( it ) Ġ}, Ġtool ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠState ments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" asm " Ġ-> ĠA sm Stmt ( tool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" block " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . getAttribute (" type ") Ġ== Ġ" pseudo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement To TreeNode ( e [" block _ content "]. firstChild Tag ()) Ġ// ĠOnly Ġsingle Ġstatement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlock Stmt ( e [" block _ content "]. child Tags (). map Ġ{ Ġelement To TreeNode ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" break " Ġ-> ĠBreak Stmt ( tool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" case " Ġ-> ĠCase Stmt ( element To TreeNode ( e [" expr "]), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" catch " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecl Elem Ġ= Ġe [" parameter _ list "][" parameter "][" decl "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecl Node Ġ= Ġif Ġ( decl Elem . textContent . contains (" ... ")) ĠEmpty Node ( Src ML Tree ( decl Elem , Ġoffset )) Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement To TreeNode ( decl Elem ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCatch Stmt ( decl Node , Ġelement To TreeNode ( e [" block "]), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" condition " Ġ-> Ġe . get OrNull (" expr ") ?. let Ġ{ Ġelement To TreeNode ( it ) Ġ} Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . child Tags (). first OrNull ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("( src ML ) ĠCondition Ġdoes Ġnot Ġcontain Ġexpression . ĠAt tempting Ġstatement Ġinstead .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement To TreeNode ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠEmpty Node ( tool ) Ġ// ĠSkip Ġ" condition " Ġand Ġonly Ġparse Ġif Ġit 's Ġthere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" continue " Ġ-> ĠContinue Stmt ( tool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" default " Ġ-> ĠDefault Stmt ( tool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" do " Ġ-> ĠDo While Stmt ( element To TreeNode ( e [" block "]), Ġelement To TreeNode ( e [" condition "]), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" empty _ stmt " Ġ-> ĠEmpty Stmt ( tool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" for " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontrol Ġ= Ġe [" control "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinit Ġ= Ġcontrol [" init "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcondition Ġ= Ġcontrol . get OrNull (" condition ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġincr Ġ= Ġcontrol . get OrNull (" incr ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġelement To TreeNode ( e [" block "]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( condition Ġ== Ġnull Ġ|| Ġincr Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Expr Ġ= Ġinit [" decl "][" range "][" expr "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFor Range Stmt ( element To TreeNode ( collection Expr ), Ġbody , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinit Node Ġ= ĠFlat ten ed Node ( init . child Tags (). map Ġ{ Ġelement To TreeNode ( it ) Ġ}, ĠSrc ML Tree ( control , Ġoffset )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġincr Node Ġ= ĠFlat ten ed Node ( incr . child Tags (). map Ġ{ Ġelement To TreeNode ( it ) Ġ}, ĠSrc ML Tree ( incr , Ġoffset )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFor Stmt ( init Node , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement To TreeNode ( condition ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincr Node , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" goto " Ġ-> ĠG oto Stmt ( tool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" if _ stmt " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠD ropped Ġelement Ġis Ġif - tag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelse Nodes Ġ= Ġe . child Tags (). drop ( 1 ). map Ġ{ Ġelement To TreeNode ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġart ificial Ġnesting Ġof Ġelse - if Ġstatements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindices Ġ= Ġelse Nodes . indices . reversed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġelse Node : ĠTreeNode ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġindices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġelse Nodes [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Ġis ĠIf Part ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Node Ġ= ĠIf Stmt ( node , Ġelse Node , Ġnode . tool Tree ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġindices . first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġelse - block Ġallowed Ġas Ġalternative , Ġand Ġonly Ġat Ġlast Ġplace Ġof Ġstatement . ĠPrint Ġwarning ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" src ML : ĠRe cognized Ġnon -< if > Ġelement Ġinside Ġif - statement ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Node Ġ= Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIf Stmt ( element To TreeNode ( e [" if "]), Ġelse Node , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" if " Ġ-> ĠIf Part ( element To TreeNode ( e [" condition "]), Ġelement To TreeNode ( e [" block "]), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" label " Ġ-> ĠLabel Stmt ( e [" name "]. textContent , Ġelement To TreeNode ( e . child Tags (). last ()), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" return " Ġ-> ĠReturn Stmt ( e . get OrNull (" expr ") ?. let Ġ{ Ġelement To TreeNode ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" switch " Ġ-> ĠSwitch Stmt ( element To TreeNode ( e [" condition "]), Ġelement To TreeNode ( e [" block "]), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" throw " Ġ-> ĠThrow Expr ( e . child Tags (). first OrNull ()?. let Ġ{ Ġelement To TreeNode ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" try " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstmt Ġ= Ġelement To TreeNode ( e [" block "]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclauses Ġ= Ġe . child Tags (). drop ( 1 ). map Ġ{ Ġelement To TreeNode ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTry Stmt ( stmt , Ġclauses , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" while " Ġ-> ĠWhile Stmt ( element To TreeNode ( e [" condition "]), Ġelement To TreeNode ( e [" block "]), Ġtool ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDecl arations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" function ", Ġ" function _ decl ", Ġ" constructor ", Ġ" constructor _ decl ", Ġ" de structor ", Ġ" de structor _ decl " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġtake Ġf Ġof Ġfunction Ġname ĠA :: B :: f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ( e [" name "]. child Tags (). last OrNull Ġ{ Ġit . tagName Ġ== Ġ" name " Ġ} ?. textContent Ġ?: Ġe [" name "]. textContent ). remove Prefix (" operator ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġparameters Ġ= Ġe [" parameter _ list "]. child Tags () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprops Ġ= Ġmutable Set Of < Function Props >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parameters . any Ġ{ Ġit . textContent . contains (" ...") Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= Ġparameters . filter Ġ{ Ġ! it . textContent . contains (" ...") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprops . add ( Function Props . VARI AD IC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( e . tagName . take While Ġ{ Ġit . is Letter () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" constructor " Ġ-> Ġprops . add ( Function Props . CON STRUCTOR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" de structor " Ġ-> Ġprops . add ( Function Props . DE STRUCTOR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġif Ġ( e . tagName . contains (" function ")) Ġextract Type ( e [" type "]) Ġelse Ġextract Type ( e , Ġ" void ") Ġ// Ġvoid Ġtype Ġfor Ġconstructor , Ġdestructor , Ġetc . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmember Init List Elem Ġ= Ġe . get OrNull (" member _ init _ list ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmember In its Ġ= Ġif Ġ( e . tagName Ġ!= Ġ" constructor " Ġ|| Ġmember Init List Elem Ġ== Ġnull ) Ġempty List < TreeNode >() Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmember Init List Elem . child Tags (). map Ġ{ Ġmember Init Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmember Tool Ġ= ĠSrc ML Tree ( member Init , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( member Init . tagName Ġ!= Ġ" call ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ("( src ML ) ĠUn recognized Ġtag Ġ'${ member Init . tagName }' Ġused Ġinside Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ctor Ġmember Ġinitializer Ġlist Ġat Ġline Ġ${ member Tool . original Start Line }. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield ClassName Ġ= Ġmember Init [" name "]. textContent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Class Arg Ġ= Ġif Ġ( field ClassName . first (). is UpperCase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠClass Ġinstantiation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr To TreeNode ( member Init ) Ġ// ĠConvert ed Ġto ĠCall Expr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWay Ġof Ġabove Ġwould Ġturn Ġinto Ġcall Ġto Ġthe Ġname Ġof Ġthe Ġfield , Ġwhich Ġwe Ġdon 't Ġwant ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTwo Ġpossible Ġinitial izations : Ġusing Ġround Ġor Ġcur ly Ġparent hesis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg List Ġ= Ġmember Init [" argument _ list "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arg List . textContent . startsWith ("{ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr To TreeNode ( arg List ) Ġ// ĠWill Ġbe Ġrecognized Ġas ĠInit List Expr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarg List . get OrNull (" argument ") ?. let Ġ{ Ġexpr To TreeNode ( it ) Ġ} Ġ?: ĠO mitted Node ( member Tool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC tor Member Initializer ( field ClassName , Ġfield Class Arg , Ġmember Tool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= ĠFunc Decl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype , Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . map Ġ{ Ġelement To TreeNode ( it ) Ġ}, Ġprops , Ġe . get OrNull (" block ") ?. let Ġ{ Ġelement To TreeNode ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtool , Ġmember In its Ġ= Ġmember In its ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= Ġe . get OrNull (" template ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( template Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextract Template ( template , Ġfunction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" parameter " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecl Ġ= Ġe . get OrNull (" decl ") Ġ?: Ġe [" function _ decl "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġextract Type ( decl [" type "]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġdecl . get OrNull (" name ") ?. textContent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFunc Decl Param ( type , Ġname , ĠSrc ML Tree ( decl , Ġoffset )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" decl " Ġ-> Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfullName Ġ= Ġe . get OrNull (" name ") Ġ// ĠOf Ġform Ġa :: b :: c [ 2 ] Ġat Ġworst : Ġ" c " Ġis Ġvariable Ġname , Ġmissing Ġin Ġcase Ġof Ġimplicit Ġnames Ġ( e . g . Ġcatch - clauses ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvar Name Ġ= ĠfullName ?. child Tags ()?. last OrNull Ġ{ Ġit . tagName Ġ== Ġ" name " Ġ} ?. textContent Ġ?: ĠfullName ?. textContent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġextract Type ( e [" type "]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinitialization Ġprovided Ġeither Ġby Ġ" T Ġa Ġ= Ġ... "- syntax Ġor Ġusing Ġ" T Ġa (... )" Ġ( ctor - call ) Ġor Ġusing Ġ" T Ġa { ... }" Ġ( init - list ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinit Ġ= Ġe . get OrNull (" init ") ?. let Ġ{ Ġexpr To TreeNode ( it . firstChild Tag ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġe . get OrNull (" argument _ list ") ?. let Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Tool Tree Ġ= ĠSrc ML Tree ( list , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list . textContent . startsWith ("{ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInit List Expr ( list . child Tags (). map Ġ{ Ġelement To TreeNode ( it [" expr "]) Ġ}, Ġlist Tool Tree ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Expr ( Ref Expr ( type . un qualified TypeName , ĠSrc ML Tree ( list , Ġoffset )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . child Tags (). map Ġ{ Ġexpr To TreeNode ( it ) Ġ}, Ġlist Tool Tree ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fullName Ġ!= Ġnull Ġ&& ĠfullName . textContent . contains (" [" )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠArray Ġdeclaration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray Decl ( type , Ġvar Name !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtool ) Ġ// Ġinit Ġis Ġblock Ġof Ġexpressions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVar Decl ( type , Ġvar Name , Ġinit , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" decl _ stmt " Ġ-> ĠDecl Stmt ( e . child Tags (). map Ġ{ Ġelement To TreeNode ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" enum ", Ġ" enum _ decl " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġe . get OrNull (" name ") ?. textContent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġe . get OrNull (" type ") ?. textContent ?. skip Qualifier () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmembers Ġ= Ġe . get OrNull (" block ") ?. let Ġ{ Ġblock Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecl s Ġ= Ġblock . child Tags () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecl s . map Ġ{ Ġdecl Ġ-> ĠEnum Constant ( decl [" name "]. textContent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecl . get OrNull (" init ") ?. let Ġ{ Ġexpr To TreeNode ( it [" expr "]) Ġ}, ĠSrc ML Tree ( decl , Ġoffset )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEnum Decl ( name , Ġtype , Ġmembers , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ" Skipped " Ġnodes , Ġleave Ġout Ġintermediate Ġnode Ġand Ġgo Ġdirectly Ġto Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" expr _ stmt ", Ġ" then ", Ġ" else " Ġ-> Ġelement To TreeNode ( e . firstChild Tag ()) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExpress ions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOperators Ġsometimes Ġoccur Ġoutside Ġof Ġexpr - tags , Ġunfortunately ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" expr ", Ġ" operator " Ġ-> Ġexpr To TreeNode ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Skipped Ġ${ e . tagName }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġe . childNodes . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġe . childNodes . item ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . nodeType Ġ== ĠNode . ELEMENT _ NODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelement To TreeNode ( child Ġas ĠElement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" Skipped Ġterminal Ġnode ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpr To TreeNode ( e : ĠElement ): ĠTreeNode Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( e . tagName Ġ== Ġ" expr ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= Ġe . child Tags () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( children . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġexpr - node Ġwith Ġmultiple Ġchildren . ĠFlat ten Ġand Ġhandle Ġseparately ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconverted Ġ= Ġchildren . map Ġ{ Ġexpr To TreeNode ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFlat ten ed Node ( converted , ĠSrc ML Tree ( e , Ġoffset )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġexpr - node Ġwith Ġonly Ġone Ġchild . ĠT reat Ġas Ġif Ġexpr - node Ġwasn 't Ġthere Ġin Ġfirst Ġplace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsingle Expr To TreeNode ( e . firstChild Tag ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsingle Expr To TreeNode ( e ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsingle Expr To TreeNode ( e : ĠElement ): ĠTreeNode Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtool Ġ= ĠSrc ML Tree ( e , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( e . tagName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" argument " Ġ-> Ġelement To TreeNode ( e [" expr "]) Ġ// Ġ" skip " Ġargument , Ġonly Ġcare Ġabout Ġinner Ġexpr ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" argument _ list ", Ġ" block " Ġ-> ĠInit List Expr ( e . child Tags () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . tagName Ġ== Ġ" expr " Ġ}. map Ġ{ Ġelement To TreeNode ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" call " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Element Ġ= Ġe [" argument _ list "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġif Ġ( args Element . textContent . startsWith ("{ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( single Expr To TreeNode ( args Element )) Ġ// ĠWill Ġbe Ġparsed Ġas ĠInit List Expr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs Element . child Tags (). map Ġ{ Ġexpr To TreeNode ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Expr ( expr To TreeNode ( e . firstChild Tag ()), Ġargs , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" cast " Ġ-> ĠCast Expr ( Cast Kind . valueOf ( e . getAttribute (" type "). toUpperCase ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTake Ġsecond Ġ( th us Ġlast ) Ġargument _ list Ġelem , Ġand Ġtake Ġonly Ġ( th us Ġfirst ) Ġinner Ġargument Ġelem , Ġconvert Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr To TreeNode ( e . child Tags (). last (). child Tags (). first ()), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" index " Ġ-> ĠArray Access Expr ( expr To TreeNode ( e . firstChild Tag ()), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" lambda " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclosure Ġ= Ġe [" capture "]. child Tags (). map Ġ{ Ġexpr To TreeNode ( it . firstChild Tag ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġe [" parameter _ list "]. child Tags (). map Ġ{ Ġelement To TreeNode ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġelement To TreeNode ( e [" block "]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLambda Expr ( closure , Ġargs , Ġbody , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" literal " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Number Ġ= Ġe . getAttribute (" type ") Ġ== Ġ" number " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Hex Ġ= Ġe . textContent . startsWith (" 0 x ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Ġ= Ġif Ġ( isNumber ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFilter Ġout Ġlong / float Ġmodifiers Ġat Ġback Ġof Ġnumber , Ġbut Ġdo Ġnot Ġfilter Ġf Ġif Ġit 's Ġhexadecimal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . textContent . toLowerCase (). drop Last While Ġ{ Ġit Ġin ĠlistOf NotNull (' u ', Ġ' l ', Ġif Ġ( is Hex ) Ġnull Ġelse Ġ' f ') Ġ} Ġelse Ġe . textContent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġwhen Ġ{ Ġ// Ġ 0 x 6 A 0 9 E 6 6 7 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Number Ġ&& Ġis Hex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigInteger ( raw . drop ( 2 ), Ġ 1 6 ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Number Ġ&& Ġ( listOf (".", Ġ" e "). any Ġ{ Ġraw . contains ( it , Ġignore Case Ġ= Ġtrue ) Ġ}) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat NumberFormat . format ( BigDecimal ( raw )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġraw ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLiteral Expr ( text , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" operator " Ġ-> ĠOperator ( String Escape Utils . un escape Html 4 ( e . textContent ), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= Ġe . child Tags () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Nodes Ġ= Ġmutable ListOf < TreeNode >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġchildren . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġchildren [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . tagName Ġ== Ġ" argument _ list " Ġ&& Ġchild . getAttribute (" type ") Ġ== Ġ" generic ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUncomment Ġbelow Ġand Ġremove Ġcontinue - statement Ġto Ġre - include Ġtemplate Ġarguments Ġwithin Ġtarget Ġname Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Expr Ġ= Ġchild Nodes . remove Last () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Expr Ġ! is ĠRef Expr ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ("( Src ML ) ĠArgument Ġlist Ġfor Ġvariable Ġwithout ĠRef Expr Ġin Ġfront ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Nodes . add ( Ref Expr (( old Expr . target Ġ+ Ġchild . textContent ). filter Ġ{ Ġ! it . is Whitespace () Ġ}, Ġold Expr . tool Tree )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Nodes . add ( expr To TreeNode ( child )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( children . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRef Expr ( e . textContent , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFlat ten ed Node ( childNodes , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" sizeof " Ġ-> ĠSize Of Expr ( Flatten ed Node . parent hes ised ( e [" argument _ list "]. child Tags (). map Ġ{ Ġelement To TreeNode ( it [" expr "]) Ġ}, Ġtool ), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" tern ary " Ġ-> ĠT ernary Expr ( element To TreeNode ( e [" condition "]), Ġelement To TreeNode ( e [" then "]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement To TreeNode ( e [" else "]), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" typeid " Ġ-> ĠType Id Expr ( expr To TreeNode ( e [" argument _ list "][" argument "]), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("( src ML ) ĠUn recognized Ġterminal Ġexpression Ġ${ e . tagName } Ġat Ġline Ġ${ tool . original Start Line }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIn comp arable Node ( tool , Ġ" UN US ABLE ĠTAG Ġ(${ e . tagName }) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Type ( e : ĠElement , Ġfixed Name : ĠString ? Ġ= Ġnull ): ĠType Info Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= Ġe . child Tags () ĊĠĠĠĠĠĠĠ Ġval Ġspec ifiers Ġ= Ġ( children . filter Ġ{ Ġit . tagName Ġ== Ġ" specifier " Ġ}. map Ġ{ Ġit . textContent Ġ}. filter Ġ{ Ġit Ġ!= Ġ" explicit " Ġ} Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . filter Ġ{ Ġit . tagName Ġ== Ġ" name " Ġ&& Ġit . textContent Ġin ĠType Info . LEG AL _ SPECI FI ERS Ġ}. map Ġ{ Ġit . textContent Ġ}). to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġfixed Name Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Elem Ġ= Ġchildren . last OrNull Ġ{ Ġit . tagName Ġ== Ġ" name " Ġ} Ġ// ĠMight Ġbe Ġnull Ġwhen Ġ" auto " Ġspec ifier Ġused ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Children Ġ= Ġname Elem ?. child Tags () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Children Ġ== Ġnull Ġ&& Ġspec ifiers . contains (" auto ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspec ifiers . remove (" auto ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" auto " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Children Ġ== Ġnull Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" No Ġname Ġfor Ġtype Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Children . isEmpty () Ġ-> Ġname Elem . textContent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġname Children . last Ġ{ Ġit . tagName Ġ== Ġ" name " Ġ}. textContent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠType Info ( name , Ġspec ifiers , ĠSrc ML Tree ( e , Ġoffset )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Template ( e : ĠElement , Ġinner Entity : ĠTreeNode ): ĠTreeNode Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( e . tagName Ġ!= Ġ" template ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Expected Ġelement Ġwith Ġtag Ġ' template ', Ġbut Ġgot Ġ'${ e . tagName }' ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġe [" parameter _ list "]. child Tags (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTemplate Parameter ( extract Type ( it [" type "]), Ġit . get OrNull (" name ") ?. textContent , ĠSrc ML Tree ( it , Ġoffset )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( parameters . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinner Entity ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTemp lated Decl ( parameters , Ġinner Entity , Ġinner Entity . tool Tree ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }