package Ġcom . applic aster . x ray . format ters . message . ref l action formatter Ċ Ċ import Ġandroid . os . Build Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġjava . util . regex . Pattern Ċ Ċ /* Ċ ĠHigh Ġcost Ġobject Ġunpack ing Ġadapter Ċ Ġ*/ Ċ class ĠNamed Reflection Message Formatter Ġ: ĠReflection Message Formatter () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġnamed Placeholder Ġ= Ġ"% (? < idx > \\ d \\\ $ )? ([ a - z ])* \\ d *( .\\ d + )* [ bh sd ox ef gat n % ]( ?< name >(& [ a - zA - Z 0 - 9 _ ]*) ? )" ĊĠĠĠĠĠĠĠ Ġval Ġregex Ġ= ĠPattern . compile ( named Placeholder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠĠĠ Ġoverride Ġfun Ġformat ( ĊĠĠĠĠĠĠĠ Ġtemplate : ĠString , ĊĠĠĠĠĠĠĠ Ġout Parameters : ĠMutable Map < String , ĠAny ?> ?, ĊĠĠĠĠĠĠĠ Ġvar arg Ġargs : ĠAny ? ĊĠĠĠ Ġ): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġout Parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= Ġregex . matcher ( template ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnamed Args Ġ= Ġhash Map Of < String , ĠInt >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġmatcher . group (" name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġname Ġ&& Ġname . length Ġ> Ġ 1 ) Ġ{ Ġ// Ġfirst Ġsymbol Ġis Ġamp ers and ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġmatcher . group (" idx ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġidx Ġ|| Ġidx . length Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnamed Args [ name . substring ( 1 )] Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlast Ġsymbol Ġof Ġidx Ġis Ġ$ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnamed Args [ name . substring ( 1 )] Ġ= Ġidx . substring ( 0 , Ġidx . length Ġ- Ġ 1 ). toInt () Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ i ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnamed Args . forEach Ġ{ Ġout Parameters [ it . key ] Ġ= Ġargs [ it . value ] Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . format ( template , Ġout Parameters , Ġ* args ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ