package Ġde . tb oll me ier . grammar ous Ċ Ċ class ĠAst Json Formatter Ġ: ĠAst Visitor Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġjson Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġoffset Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġtab Size Ġ= Ġ 2 ĊĠĠĠ Ġprivate Ġvar Ġfirst Child Info Ġ= Ġmutable ListOf < Boolean >() ĊĊĠĠĠ Ġfun ĠtoJson ( ast : ĠAst , Ġtab Size : ĠInt Ġ= Ġ 2 ) Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġjson Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġthis . tab Size Ġ= Ġtab Size ĊĠĠĠĠĠĠĠ Ġast . accept ( this ) ĊĠĠĠĠĠĠĠ Ġreturn Ġjson ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġenter ( ast : ĠAst ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis First Child Ġ= Ġfirst Child Info . isEmpty () Ġ|| Ġfirst Child Info . last () ĊĠĠĠĠĠĠĠ Ġif Ġ( is First Child ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( firstChild Info . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Child Info . set ( firstChild Info . size Ġ- Ġ 1 , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Line ("{ ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Line (", { ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoffset Ġ+= Ġtab Size ĊĠĠĠĠĠĠĠ Ġwrite Line ("\" name \": Ġ\" ${ ast . name }\ ", ") ĊĠĠĠĠĠĠĠ Ġwrite Line ("\" value \": Ġ\" ${ ast . value }\ ", ") ĊĠĠĠĠĠĠĠ Ġwrite Line ("\" id \": Ġ\" ${ ast . id }\ ", ") ĊĠĠĠĠĠĠĠ Ġfor Ġ(( name , Ġvalue ) Ġin Ġast . attrs . entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Line ("\" $ name \": Ġ\"$ value \", ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwrite Line ("\" children \": Ġ[ ") ĊĠĠĠĠĠĠĠ Ġfirst Child Info . add ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexit ( ast : ĠAst ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Line (" ]") ĊĠĠĠĠĠĠĠ Ġoffset Ġ-= Ġtab Size ĊĠĠĠĠĠĠĠ Ġfirst Child Info . remove At ( firstChild Info . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġwrite Line (" }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Line ( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġline Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Ġ+= Ġ" Ġ" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġline Ġ+= Ġtext Ġ+ Ġ"\ n " ĊĠĠĠĠĠĠĠ Ġjson Ġ+= Ġline ĊĠĠĠ Ġ} Ċ Ċ }