package Ġcom . l hw dev . self Test Macro . debug Ċ Ċ import Ġjava . lang . reflect . Method ĊĊ Ċ private Ġval Ġs Trace Item Annotation Ġ= ĠTrace Item :: class . java Ċ private Ġval Ġs Trace Items Annotation Ġ= ĠTrace Items :: class . java ĊĊ Ċ /** Ċ Ġ* ĠGetting Ġinvocation Ġlocation Ġis Ġa Ġquite Ġslow Ġjob , Ġgetting Ġall Ġstack trace Ġand Ġfig uring Ġout Ġthe Ġoriginal Ġmethod . Ċ Ġ* ĠShould Ġbe Ġonly Ġused Ġin Ġerror . Ċ Ġ*/ Ċ fun Ġinvoke Location Description ( depth : ĠInt ): ĠString Ġ{ Ċ ĉ val Ġmethod Ġ= Ġinvoke Location ( depth Ġ= Ġdepth Ġ+ Ġ 1 ) ĊĉĊ ĉ return Ġif ( method Ġ== Ġnull ) Ġ{ Ċĉ ĉ " ?" Ċ ĉ } Ġelse Ġ{ Ċĉ ĉ "${ method . decl aring Class . name }.${ method . name }" Ċ ĉ } Ċ } Ċ Ċ fun Ġinvoke Location ( depth : ĠInt ): ĠMethod ? Ġ{ Ċ ĉ val Ġreal Depth Ġ= Ġdepth Ġ+ Ġ 1 Ċ ĉ val Ġtrace Ġ= ĠThrowable (). stack Trace ĊĉĊ ĉ for ( index Ġin Ġreal Depth Ġuntil Ġtrace . size ) Ġ{ Ċĉ ĉ val Ġelement Ġ= Ġtrace [ index ] Ġ?: Ġcontinue ĊĉĉĊĉ ĉ val Ġmethod Ġ= Ġmethod From StackTrace ( element , Ġcheck Annotation Ġ= Ġtrue ) Ċĉ ĉ if ( method Ġ!= Ġnull ) Ġ{ Ċĉĉ ĉ return Ġmethod Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ return Ġmethod From StackTrace ( trace [ real Depth ], Ġcheck Annotation Ġ= Ġfalse ) Ċ } Ċ Ċ private Ġfun Ġmethod From StackTrace ( element : ĠStack Trace Element , Ġcheck Annotation : ĠBoolean ): ĠMethod ? Ġ= Ġtry Ġ{ Ċ ĉ val Ġtarget Class Ġ= ĠDebug Context :: class . java . class Loader . load Class ( element . className ) ĊĉĊ ĉ if ( check Annotation ) Ġ{ Ċĉ ĉ val Ġclass Annotation Ġ= Ġtarget Class . getAnnotation ( s Trace Items Annotation ) ĊĉĉĊĉ ĉ if ( class Annotation Ġ== Ġnull ) Ġ{ Ċĉĉ ĉ target Class . declared Methods . find Ġ{ Ċĉĉĉ ĉ it . name Ġ== Ġelement . methodName Ġ&& Ċĉĉĉĉ ĉ it . is Annotation Present ( s Trace Item Annotation ) Ċĉĉ ĉ } Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ target Class . declared Methods . find Ġ{ Ċĉĉĉ ĉ it . name Ġ== Ġelement . methodName Ġ&& Ċĉĉĉĉ ĉ ( it . is Annotation Present ( s Trace Item Annotation ) Ġ|| Ġclass Annotation . matches ( it )) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ġelse Ġ{ Ċĉ ĉ target Class . declared Methods . find Ġ{ Ġit . name Ġ== Ġelement . methodName Ġ} Ċ ĉ } Ċ } Ġcatch ( th : ĠThrowable ) Ġ{ Ċ ĉ null Ċ } Ċ Ċ private Ġfun ĠTrace Items . matches ( method : ĠMethod ) Ġ= Ċ ĉ required Modifier Ġ== Ġ( required Modifier Ġand Ġmethod . modifiers ) Ċ