package Ġnl . ut w ente . ast diff . clang Ċ Ċ import Ġcom . fasterxml . jackson . databind . Mapper Feature Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . Kotlin Module Ċ import Ġnl . ut w ente . ast diff . ast .* Ċ import Ġorg . apache . commons . text . String Escape Utils Ċ import Ġjava . lang . IllegalStateException Ċ import Ġjava . math . BigDecimal Ċ Ċ class ĠC lang Parser ( private Ġval Ġoffset : ĠInt ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠO MIT TED _ NODES Ġ= ĠlistOf (" Implicit Value Init Expr ", Ġ" CXX Default Arg Expr ", Ġ" Definition Data ", Ġ" Template Argument ", Ġ" CXX Default Init Expr ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠO MIT TED _ INTER MEDI ATE _ NODES Ġ= ĠlistOf (" Constant Expr ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠO MIT TED _ TERMIN AL _ NODES Ġ= ĠlistOf (" CXX Construct Expr ", Ġ" Paren List Expr ", Ġ" Pr agma Comment Decl ", Ġ" Unused Attr ", Ġ" Visibility Attr ") ĊĊĠĠĠĠĠĠĠ Ġfun Ġparse C lang ( input : ĠString ): ĠTreeNode Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmapper Ġ= ĠObjectMapper (). register Module ( Kotlin Module ()). enable ( Mapper Feature . ACCEPT _ CASE _ INS ENS ITIVE _ ENUM S ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġmapper . readValue ( input , ĠC lang Node :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiltered Inner Ġ= Ġmutable ListOf < C lang Node >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġroot . inner . list Iterator ( root . inner . size ) Ġ// ĠStart Ġiterator Ġafter Ġlast Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . has Previous ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġiterator . previous () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . range ?. begin ?. included From Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLast Ġnode Ġto Ġinclude ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Inner . add ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiltered Root Ġ= Ġroot . copy ( inner Ġ= Ġfiltered Inner . reversed ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠC lang Parser ( filtered Root . first Known Line Num () Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġparser . json To Tree ( filtered Root ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġjson To Tree ( node : ĠC lang Node ): ĠTreeNode Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtool Ġ= ĠC lang Tool Tree ( node , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġif Ġ( node . is Implicit Ġ|| Ġnode . kind Ġin ĠO MIT TED _ NODES Ġ|| Ġ( node . inner . isEmpty () Ġ&& Ġnode . kind Ġin ĠO MIT TED _ TERMIN AL _ NODES )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠO mitted Node ( tool ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( node . kind Ġin ĠO MIT TED _ INTER MEDI ATE _ NODES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġnode . inner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconverted Ġ= Ġjson To Tree ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( converted Ġ! is ĠO mitted Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconverted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠO mitted Node ( tool ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( node . kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Translation Unit Decl " Ġ-> ĠTranslation Unit ( node . inner . filter Ġ{ Ġ! it . is Implicit Ġ}. map Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠClasses , Ġnamespaces Ġand Ġlikes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Class Template Decl ", Ġ" Function Template Decl " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconverted Ġ= Ġnode . inner . map Ġ{ Ġjson To Tree ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġconverted . take While Ġ{ Ġit Ġis ĠTemplate Parameter Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġtemp lated Ġentity , Ġtake Ġnode Ġafter Ġthe Ġparameters : Ġnodes Ġafter Ġthat Ġone Ġcontain Ġinstanti ations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTemp lated Decl ( parameters , Ġconverted [ parameters . size ], Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Non Type Template Parm Decl " Ġ-> ĠTemplate Parameter ( node . extract Type ( offset ), Ġnode . name , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Template Type Parm Decl " Ġ-> ĠTemplate Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Info ( node . record Type . toString (). toLowerCase (), Ġempty List (), Ġtool ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtool ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Record Decl ", Ġ" Class Template Special ization Decl " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . record Type Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠO mitted Node ( tool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbases Ġ= Ġnode . bases . map Ġ{ Ġbase Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccess Ġ= Ġif Ġ( base . written Access Ġ== Ġ" none ") Ġnull Ġelse Ġbase . access ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInherit ance Base Ref ( base . type . getValue (" qual Type ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take While Ġ{ Ġit Ġ!= Ġ'< ' Ġ}. skip Qualifier (), Ġ// ĠDon 't Ġinclude Ġgeneric Ġarguments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccess , Ġis Virtual Ġ= Ġbase . is Virtual ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecord Decl ( node . record Type , Ġnode . name ?. skip Qualifier (), Ġbases , Ġnode . inner . map Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Enum Decl " Ġ-> ĠEnum Decl ( node . name , Ġnode . fixed Under lying Type [" qual Type "] ?. skip Qualifier (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . inner . map Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Enum Constant Decl " Ġ-> ĠEnum Constant ( node . name !! , Ġnode . inner . first OrNull ()?. let Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Friend Decl " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Ġ= Ġif Ġ( node . inner . isNotEmpty ()) Ġjson To Tree ( node . inner . first ()) Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReferences Ġclass / struct / etc : Ġdoes Ġnot Ġhave Ġinner Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtag Ġ= Ġnode . type . getValue (" qual Type "). split (" Ġ"). first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġnode . type . getValue (" des ug ared Qual Type "). skip Qualifier () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecord Decl ( Record Type . valueOf ( tag . toUpperCase ()), Ġname , Ġempty List (), Ġempty List (), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFriend Decl ( inner , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Namespace Decl " Ġ-> ĠNamespace Decl ( node . name , Ġnode . inner . map Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Using Decl " Ġ-> ĠUsing Decl ( node . name !!. skip Qualifier (), Ġfalse , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Using Directive Decl " Ġ-> ĠUsing Decl ( node . nom inated Namespace . getValue (" name "). skip Qualifier (), Ġtrue , Ġtool ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDecl arations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Access Spec Decl " Ġ-> ĠSpec ified Access ( node . access !! , Ġnode . inner . map Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Empty Decl " Ġ-> ĠEmpty Stmt ( tool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Method Decl ", Ġ" Function Decl ", Ġ" CXX Constructor Decl ", Ġ" CXX Dest ructor Decl " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprops Ġ= Ġmutable Set Of < Function Props >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFilter Ġout Ġ" operator " Ġprefix , Ġstuff Ġbetween Ġtemplate Ġbrackets Ġand Ġpossible Ġextra Ġwhitespace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Match Ġ= ĠRegex (" ([ A - Za - z ]* \\ s + )? ([^ \\ s < ]+ )( < .* >) ? "). find ( node . name !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . vari adic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprops . add ( Function Props . VARI AD IC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( node . kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Constructor Decl " Ġ-> Ġprops . add ( Function Props . CON STRUCTOR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Dest ructor Decl " Ġ-> Ġprops . add ( Function Props . DE STRUCTOR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFunc Decl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . extract Type ( offset ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Match !!. group Values [ 2 ]. remove Prefix (" operator "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . kind Children (" Parm Var Decl "). map Ġ{ Ġjson To Tree ( it ) Ġ}, Ġprops , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . kind Child OrNull (" Compound Stmt ") ?. let Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmember In its Ġ= Ġnode . kind Children (" CXX Ctor Initializer "). map Ġ{ Ġjson To Tree ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Parm Var Decl " Ġ-> ĠFunc Decl Param ( node . extract Type ( offset ), Ġnode . name , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Type def Decl " Ġ-> ĠO mitted Node ( tool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Ctor Initializer " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġif Ġ( node . base Init . isEmpty ()) Ġnode . any Init . getValue (" name "). toString () Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . base Init . getValue (" qual Type "). skip Qualifier () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Ġ= Ġjson To Tree ( node . inner . first ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthis Ġnode Ġis Ġan Ġinitializer Ġfor Ġa Ġfield Ġwith Ġdefault Ġconstructor , Ġit 's Ġlikely Ġnot Ġexplicitly Ġin Ġthe Ġsource Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠO mit Ġsuch Ġnodes Ġfrom Ġtree , Ġdespite ĠC lang Ġnot Ġmarking Ġthem Ġas Ġimplicit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inner Ġis ĠO mitted Node ) ĠO mitted Node ( tool ) Ġelse ĠC tor Member Initializer ( name , Ġinner , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Var Decl ", Ġ" Field Decl " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= Ġnode . extract Type ( offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . type . getValue (" qual Type "). endsWith (" ] ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠArray Ġdeclaration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinit Ġ= Ġnode . inner . first OrNull ()?. let Ġ{ Ġjson To Tree ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray Decl ( type Info , Ġnode . name !! , Ġinit , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVariable Ġdeclaration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVar Decl ( type Info , Ġnode . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . inner . first OrNull ()?. let Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSwitch - case ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Switch Stmt " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbody Ġ= Ġjson To Tree ( node . inner [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTemporary St mts Ġneed Ġto Ġbe Ġremoved , Ġstill ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( body Ġis ĠBlock Stmt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ" Post - process " Ġthe ĠTemporary Case St mts Ġinto Ġproper / split ĠCase St mts Ġand Ġbody - Stmt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġflatten Case ( stmt : ĠTreeNode ): ĠList < TreeNode > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( stmt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 3 Ġtypes Ġof Ġstm ts Ġpossible : Ġcase , Ġdefault Ġor Ġa Ġlabel Ġpreceding Ġcase / default ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLabel Stmt Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Ġ= Ġflatten Case ( stmt . inner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Label Stmt ( stmt . label , Ġinner . first (), Ġstmt . tool Tree )) Ġ+ Ġinner . drop ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTemporary Case Stmt Ġ-> ĠlistOf NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Case Stmt ( stmt . expr , Ġstmt . tool Tree )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstmt . stmt ?. let Ġ{ Ġflatten Case ( it ) Ġ}). flatten () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTemporary Default Stmt Ġ-> ĠlistOf NotNull ( Default Stmt ( stmt . tool Tree ), Ġstmt . stmt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠlistOf ( stmt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= ĠBlock Stmt ( body . stm ts . map Ġ{ Ġflatten Case ( it ) Ġ}. flatten (), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSwitch Stmt ( json To Tree ( node . inner [ 0 ]), Ġbody , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Case Stmt " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġif Ġ( node . inner . size Ġ> Ġ 1 ) Ġnode . inner [ 1 ] Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTemporary Case Stmt ( json To Tree ( node . inner [ 0 ]), Ġbody ?. let Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Default Stmt " Ġ-> ĠTemporary Default Stmt ( node . inner . first OrNull ()?. let Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOther Ġstatements ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Break Stmt " Ġ-> ĠBreak Stmt ( tool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Compound Stmt " Ġ-> ĠBlock Stmt ( node . inner . map Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Continue Stmt " Ġ-> ĠContinue Stmt ( tool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Decl Stmt " Ġ-> ĠDecl Stmt ( node . inner . map Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Do Stmt " Ġ-> ĠDo While Stmt ( json To Tree ( node . inner [ 0 ]), Ġjson To Tree ( node . inner [ 1 ]), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" For Stmt " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFor Stmt ( json To Tree ( node . inner [ 0 ]), Ġjson To Tree ( node . inner [ 2 ]), Ġjson To Tree ( node . inner [ 3 ]), Ġjson To Tree ( node . inner [ 4 ]), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" G oto Stmt " Ġ-> ĠG oto Stmt ( tool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX For Range Stmt " Ġ-> ĠFor Range Stmt ( json To Tree ( node . depth First Child (" Decl Ref Expr ", Ġ" Member Expr ") !! ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson To Tree ( node . inner . last ()), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" If Stmt " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠChild Ġstructure ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- ĠCondition Ġ( possibly Ġa Ġdeclaration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- ĠExpression Ġused Ġfor Ġcondition Ġ( if Ġcondition Ġis Ġa Ġstatement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- ĠIf - block ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- ĠElse - block Ġ( if Ġpresent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelse Node Ġ= Ġif Ġ( node . inner . size Ġ> Ġ 2 ) Ġjson To Tree ( node . inner . last ()) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf - part Ġis Ġlast Ġnode Ġif Ġelse Ġis Ġnot Ġthere , Ġbut Ġsecond - last Ġif Ġelse - stmt Ġis Ġthere . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġif Body Ġ= Ġif Ġ( else Node Ġ== Ġnull ) Ġnode . inner . last () Ġelse Ġnode . inner [ node . inner . size Ġ- Ġ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIf Stmt ( If Part ( json To Tree ( node . inner [ 0 ]), Ġjson To Tree ( if Body ), Ġtool ), Ġelse Node , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Return Stmt " Ġ-> ĠReturn Stmt ( node . inner . first OrNull ()?. let Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Null Stmt " Ġ-> ĠEmpty Stmt ( tool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" While Stmt " Ġ-> ĠWhile Stmt ( json To Tree ( node . inner . first ()), Ġjson To Tree ( node . inner . last ()), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC lang Node . NULL _ KIND Ġ-> ĠEmpty Node ( tool ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExpress ions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Array Sub script Expr " Ġ-> ĠFlat ten ed Node ( listOf ( json To Tree ( node . inner [ 0 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray Access Expr ( json To Tree ( node . inner [ 1 ]), Ġtool )), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Call Expr ", Ġ" CXX Member Call Expr " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst Ġpart Ġof Ġinner Ġis Ġreferenced Ġfunction , Ġlater Ġparts Ġare Ġcall Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Json Ġ= Ġnode . inner . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Json Ġ= Ġnode . inner . drop ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Expr ( json To Tree ( function Json ), Ġargs Json . map Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Conditional Operator " Ġ-> ĠT ernary Expr ( json To Tree ( node . inner [ 0 ]), Ġjson To Tree ( node . inner [ 1 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson To Tree ( node . inner [ 2 ]), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" C Style Cast Expr " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRe cognized Ġas Ġcollection Ġof Ġparent hesis , Ġnames Ġand Ġoperators Ġin Ġsrc ML ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFlat ten ed Node ( listOf ( Operator (" (", Ġtool ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit TypeName ( node . type . getValue (" qual Type "). skip Qualifier (), Ġtool ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOperator (" )", Ġtool ), Ġjson To Tree ( node . inner . first ())), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Catch Stmt " Ġ-> ĠCatch Stmt ( json To Tree ( node . inner . first ()), Ġjson To Tree ( node . inner . last ()), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Construct Expr " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġnode . type . getValue (" qual Type "). skip Qualifier () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip Ġcopy - construct ors Ġ( i . e . Ġonly Ġone Ġargument Ġof Ġsame Ġtype ) Ġand Ġel id able Ġconstructors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . el id able Ġ|| Ġnode . extract Type ( offset ). un qualified TypeName Ġ== Ġnode . inner . first (). extract Type ( offset ). un qualified TypeName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġjson To Tree ( node . inner . first ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġarguments Ġ= Ġnode . inner . map Ġ{ Ġjson To Tree ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġinit - list Ġwas Ġused , Ġ" unpack " Ġarguments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arguments . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargument Ġ= Ġarguments . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( argument Ġis ĠInit List Expr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= Ġargument . expr s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Expr ( Ref Expr ( type , Ġtool ), Ġarguments , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Functional Cast Expr ", Ġ" CXX Temporary Object Expr " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . cast Kind Ġin ĠlistOf (" Constructor Conversion ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ" Skip " Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson To Tree ( node . inner . first ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAct Ġas Ġif Ġit 's Ġcall Ġwith Ġtype Ġas Ġfunction Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Info Ġ= Ġnode . extract Type ( offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Expr ( Ref Expr ( type Info . un qualified TypeName , Ġtool ), Ġnode . inner . map Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX New Expr " Ġ-> ĠFlat ten ed Node ( listOf ( Operator (" new ", Ġtool ), Ġjson To Tree ( node . inner . first ())), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Delete Expr " Ġ-> Ġ ĠFlat ten ed Node ( listOf ( Operator (" delete ", Ġtool ), Ġjson To Tree ( node . inner . first ())), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX This Expr " Ġ-> ĠRef Expr (" this ", Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Try Stmt " Ġ-> ĠTry Stmt ( json To Tree ( node . inner . first ()), Ġnode . inner . drop ( 1 ). map Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Type id Expr " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Ġ= Ġif Ġ( node . inner . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType Ġinside ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRef Expr ( node . type Arg . getValue (" qual Type "). skip Qualifier (), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson To Tree ( node . inner . first ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Id Expr ( inner , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Decl Ref Expr " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġnode . referenced Decl !!. getValue (" name ") Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name . contains (" operator ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOperator ( name . remove Prefix (" operator "), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRef Expr ( name , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Binary Operator ", Ġ" Compound Assign Operator " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFlat ten ed Node ( listOf ( json To Tree ( node . inner [ 0 ]), Ġjson To Tree ( node . inner [ 1 ]), ĠOperator ( node . opcode !! , Ġtool )), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unary Operator " Ġ-> ĠFlat ten ed Node ( listOf ( json To Tree ( node . inner [ 0 ]), ĠOperator ( node . opcode !! , Ġtool )), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Integer Literal " Ġ-> ĠLiteral Expr ( node . value !! , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Init List Expr " Ġ-> ĠInit List Expr ( node . inner . map Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Character Literal " Ġ-> ĠLiteral Expr ("' ${ node . value !!. toInt (). to Char () }' ", Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Bool Literal Expr " Ġ-> ĠLiteral Expr ( node . value !! , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Null Ptr Literal Expr ", Ġ" GN UN ull Expr " Ġ-> ĠLiteral Expr (" nullptr ", Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Operator Call Expr " Ġ-> ĠFlat ten ed Node ( node . inner . map Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Static Cast Expr ", Ġ" CXX Const Cast Expr ", Ġ" CXX Dynamic Cast Expr ", Ġ" CXX Re interpret Cast Expr " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkind Ġ= Ġwhen Ġ( node . kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Static Cast Expr " Ġ-> ĠCast Kind . STATIC ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Const Cast Expr " Ġ-> ĠCast Kind . CONST ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Dynamic Cast Expr " Ġ-> ĠCast Kind . DYNAMIC ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Re interpret Cast Expr " Ġ-> ĠCast Kind . RE INTER PRE T ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Unsupported Ġcast Ġkind ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCast Expr ( kind , Ġjson To Tree ( node . inner . first ()), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Throw Expr " Ġ-> ĠThrow Expr ( node . inner . first OrNull ()?. let Ġ{ Ġjson To Tree ( it ) Ġ}, Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Floating Literal " Ġ-> ĠLiteral Expr ( float NumberFormat . format ( BigDecimal ( node . value !! )), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" GCC Asm Stmt " Ġ-> ĠA sm Stmt ( tool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" StringLiteral " Ġ-> ĠLiteral Expr ( String Escape Utils . un escape Java ( node . value !! ), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Label Stmt " Ġ-> ĠLabel Stmt ( node . name !! , Ġjson To Tree ( node . inner . first ()), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Lambda Expr " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġnode . inner . first Ġ{ Ġit . kind Ġ== Ġ" CXX Record Decl " Ġ}. inner . first Ġ{ Ġit . kind Ġ== Ġ" CXX Method Decl " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġmethod . inner . drop Last ( 1 ). map Ġ{ Ġjson To Tree ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclosure Ġ= Ġnode . inner . drop ( 1 ). drop Last ( 1 ). map Ġ{ Ġjson To Tree ( it ) Ġ} Ġ// ĠEverything Ġbut Ġblock Ġand Ġimplicit Ġclass Ġinfo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġjson To Tree ( node . inner . last ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLambda Expr ( closure , Ġargs , Ġbody , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Member Expr ", Ġ" CXX Dependent Scope Member Expr " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠL HS Ġis Ġthe Ġtarget Ġof Ġthe Ġmember Ġexpr Ġ( in Ġinner - field ), ĠRHS Ġis Ġthe Ġname Ġ( always Ġa Ġstring ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbol Ġ= Ġif Ġ( node . is Arrow !! ) Ġ" ->" Ġelse Ġ"." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtarget Ġ= Ġnode . inner . first OrNull ()?. let Ġ{ Ġjson To Tree ( it ) Ġ} Ġ// ĠTarget Ġnull Ġif Ġstatic Ġreference Ġvia Ġ:: - notation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRemove Ġ" ->" Ġif Ġit 's Ġfirst Ġchild , Ġwhich Ġmeans Ġthat Ġ-> Ġwas Ġover loaded Ġoperator Ġ( and Ġwould Ġcause Ġduplicate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Ġis ĠFlat ten ed Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Child Ġ= Ġtarget . children . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( firstChild Ġis ĠOperator Ġ&& Ġfirst Child . symbol Ġ== Ġ" -> ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Ġ= ĠFlat ten ed Node ( target . children . drop ( 1 ), Ġtarget . tool Tree ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Expr Ġ= ĠRef Expr ( node . name !! , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Ġ== Ġnull Ġ|| Ġtarget Ġis ĠO mitted Node ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTarget Ġwas Ġimplicit Ġor Ġnon - existent , Ġso Ġno Ġoperator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref Expr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFlat ten ed Node ( listOf ( target , ĠOperator ( symbol , Ġtool ), Ġref Expr ), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Paren Expr " Ġ-> ĠFlat ten ed Node ( listOf ( Operator (" (", Ġtool ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson To Tree ( node . inner . first ()), ĠOperator (" )", Ġtool )), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unary Expr Or Type Trait Expr " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . name !! Ġ!= Ġ" sizeof ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("( C lang ) ĠDet ected Ġunknown ĠUnary Expr Or Type Trait Expr Ġwith Ġname Ġ'${ node . name }' ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEmpty Stmt ( tool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . inner . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSize Of Expr ( Flatten ed Node . parent hes ised ( Ref Expr ( node . arg Type . getValue (" qual Type "). skip Qualifier (), Ġtool ), Ġtool ), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSize Of Expr ( json To Tree ( node . inner . first ()), Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSk ipped Ġparts , Ġonly Ġtaking Ġchildren ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Implicit Cast Expr " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġnode . inner . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . cast Kind Ġ! in ĠlistOf (" User Defined Conversion ", Ġ" User Defined Conversion ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġjson To Tree ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠImp licit Cast Ġfor Ġwhich Ġwe Ġassume / sus pect Ġdirect Ġchild Ġis Ġreference Ġto Ġtarget Ġof Ġimplicit Ġ( conversion ) Ġcall . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFilter Ġout Ġthis Ġtarget Ġand Ġonly Ġpresent Ġits Ġargument Ġto Ġparent , Ġwhich Ġwas Ġelement Ġactually Ġfound Ġin Ġsource Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson To Tree ( when Ġ( child . kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Construct Expr " Ġ-> Ġchild . inner . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" CXX Member Call Expr " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExpect Ġto Ġfind ĠMember Expr Ġinside Ġwhich Ġrefs Ġthe Ġcall Ġtarget , Ġand Ġwhat Ġwe Ġneed Ġis Ġgiven Ġas Ġargument Ġto Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Target Ġ= Ġchild . inner . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Target . kind Ġ!= Ġ" Member Expr ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("( C lang ) ĠSk ipping Ġnode Ġwith Ġtag Ġ${ call Target . kind } Ġdue Ġto Ġbeing Ġhidden Ġinside ĠImp licit Cast ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Target . inner . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expr With Clean ups ", Ġ" Material ize Temporary Expr ", Ġ" Constant Expr ", Ġ" Link age Spec Decl ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Subst Non Type Template Parm Expr ", Ġ" CXX Bind Temporary Expr " Ġ-> Ġjson To Tree ( node . inner . first ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Un resolved Using Value Decl ", Ġ" Un resolved Lookup Expr ", Ġ" Un resolved Member Expr ", Ġ" Opaque Value Expr ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Dependent Scope Decl Ref Expr ", Ġ" CXX Un resolved Construct Expr " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> ĠIn comp arable Node ( tool , Ġ" TAG :${ node . kind }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Skipping Ġ${ node . kind } Ġ( C lang )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . inner . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġjson To Tree ( node . inner . first ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" Un processed Ġterminal Ġnode Ġ${ node . kind }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsplit TypeName ( name : ĠString , Ġtool : ĠTool Tree ): ĠTreeNode Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatches Ġ= ĠRegex (" ([ A - Za - z 0 - 9 _ ]+ |[ *& ]) \\ s * "). findAll ( name ) ĊĠĠĠĠĠĠĠ Ġval Ġnodes Ġ= Ġmatches . map Ġ{ Ġmatch Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġvalue Ġ= Ġmatch . group Values [ 1 ]) Ġ{ Ġ// ĠPart Ġwithout Ġwhitespace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"*", Ġ"& " Ġ-> ĠOperator ( value , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠRef Expr ( value , Ġtool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠĠĠĠĠ Ġreturn ĠFlat ten ed Node ( nodes , Ġtool ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /* Ċ TODO Ġlist : Ċ x - Ġdo - while Ġloops Ċ x - Ġtry / catch / exceptions Ċ - Ġassert - statements Ċ x - Ġfriend Ġdeclaration Ċ x - Ġlabels / goto Ċ x - ĠAdd Ġmarker Ġfor Ġfunction Ġbeing Ġconstructor / de structor Ġor Ġnot Ċ x - ĠT ernary Ġexpressions Ċ x - Ġcontinue - stmt Ċ x - ĠCast Expr Ċ - ĠLambda Ġfunctions ? Ċ x - ĠTesting Ġon Ġfiles Ġwith Ġimports Ċ Ġ*/