package Ġdev . bin club . bin sc ure . processors . debug Ċ Ċ import Ġdev . bin club . bin sc ure . IC lass Processor Ċ import Ġdev . bin club . bin sc ure . api . Transformer Configuration Ċ import Ġdev . bin club . bin sc ure . api . transformers . Kotlin Metadata Type Ċ import Ġdev . bin club . bin sc ure . classpath . Class Sources Ċ import Ġdev . bin club . bin sc ure . configuration . Configuration Manager . root Config Ċ import Ġdev . bin club . bin sc ure . for Class Ċ import Ġdev . bin club . bin sc ure . for Method Ċ import Ġdev . bin club . bin sc ure . utils . Instruction Modifier Ċ import Ġdev . bin club . bin sc ure . utils . insn Builder Ċ import Ġorg . object web . asm . Op codes . POP Ċ import Ġorg . object web . asm . tree .* Ċ Ċ /** Ċ Ġ* ĠThis Ġtransformer Ġremoves Ġmetadata Ġemitted Ġby Ġthe Ġkotlin Ġcompiler Ċ Ġ* Ċ Ġ* Ġ@ author Ġcook ied rag on 2 3 4 Ġ 2 2 / Jan / 2 0 2 0 Ċ Ġ*/ Ċ class ĠKotlin Metadata Strip per ( source : ĠClass Sources ): ĠI Class Processor ( source ) Ġ{ Ċ ĉ override Ġval Ġprogress Description : ĠString Ċĉ ĉ get () Ġ= Ġ" Stri pping Ġkotlin Ġmetadata " Ċ ĉ override Ġval Ġconfig : ĠTransformer Configuration Ċĉ ĉ get () Ġ= Ġroot Config . kotlin Metadata ĊĉĊ ĉ override Ġfun Ġprocess ( Ċĉ ĉ source : ĠClass Sources , Ċĉ ĉ classes : ĠMutable Collection < Class Node >, Ċĉ ĉ pass Through : ĠMutable Map < String , ĠByteArray > Ċ ĉ ) Ġ{ Ċĉ ĉ if Ġ(! config . enabled ) Ċĉĉ ĉ return ĊĉĉĊĉ ĉ val Ġremove Ġ= Ġroot Config . kotlin Metadata . type Ġ== ĠKotlin Metadata Type . REMOVE ĊĉĉĊĉĉĊĉ ĉ for Class ( classes ) Ġ{ Ġclass Node Ġ-> Ċĉĉ ĉ class Node . visible Annotations ?. list Iterator ()?. also Ġ{ Ġit Ġ-> Ċĉĉĉ ĉ it . forEach Ġ{ Ġannotation Ġ-> Ċĉĉĉĉ ĉ if Ġ( annotation . desc Ġ== Ġ" L kotlin / Metadata ;" Ġ|| Ġannotation . desc Ġ== Ġ" L kotlin / coroutines / jvm / internal / Debug Metadata ; ") Ġ{ Ċĉĉĉĉĉ ĉ it . remove () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ for Method ( class Node ) Ġ{ Ġmethod Ġ-> Ċĉĉĉ ĉ val Ġmodifier Ġ= ĠInstruction Modifier () Ċĉĉĉ ĉ for Ġ( insn Ġin Ġmethod . instructions ) Ġ{ Ċĉĉĉĉ ĉ if Ġ( insn Ġis ĠMethod Insn Node Ġ&& Ġinsn . owner Ġ== Ġ" kotlin / jvm / internal / Intr insics ") Ġ{ Ċĉĉĉĉĉ ĉ if Ġ( insn . name Ġ== Ġ" check Parameter IsNotNull ") Ġ{ Ċĉĉĉĉĉĉ ĉ if Ġ( insn . desc Ġ== Ġ"( Ljava / lang / Object ; Ljava / lang / String ;) V ") Ġ{ Ċĉĉĉĉĉĉĉ ĉ val Ġprev Ġ= Ġinsn . previous Ċĉĉĉĉĉĉĉ ĉ if Ġ( prev Ġis ĠL dc Insn Node ) Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ if Ġ( remove ) Ġ{ Ċĉĉĉĉĉĉĉĉĉ ĉ modifier . remove ( prev ) Ċĉĉĉĉĉĉĉĉĉ ĉ modifier . replace ( insn , ĠIn sn Node ( POP )) Ċĉĉĉĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉĉĉĉ ĉ prev . cst Ġ= Ġ"." Ċĉĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ ĉ } Ġelse Ġif Ġ( remove ) Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ modifier . replace ( insn , Ġinsn Builder Ġ{ Ċĉĉĉĉĉĉĉĉĉ ĉ pop () Ċĉĉĉĉĉĉĉĉĉ ĉ pop () Ċĉĉĉĉĉĉĉĉ ĉ }) Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ġelse Ġif Ġ( remove ) Ġ{ Ċĉĉĉĉĉĉĉ ĉ modifier . replace ( insn , Ġinsn Builder Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ pop () Ċĉĉĉĉĉĉĉ ĉ }) Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ġelse Ġif Ġ( insn . name Ġ== Ġ" check Expression Value IsNotNull ") Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġprev Ġ= Ġinsn . previous Ċĉĉĉĉĉĉ ĉ if Ġ( prev Ġis ĠL dc Insn Node ) Ġ{ Ċĉĉĉĉĉĉĉ ĉ if Ġ( remove ) Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ modifier . remove ( prev ) Ċĉĉĉĉĉĉĉĉ ĉ modifier . replace ( insn , ĠIn sn Node ( POP )) Ċĉĉĉĉĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ prev . cst Ġ= Ġ"." Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ modifier . apply ( method ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ @ Suppress (" UN CHECK ED _ CAST ") Ċ ĉ private Ġfun Ġlist ToInt Array ( list : ĠAny ): ĠInt Array Ġ{ Ċĉ ĉ return Ġ( list Ġas ĠList < Int >). stream (). map ToInt Ġ{ Ġit Ġ}. toArray () Ċ ĉ } Ċ ĉ @ Suppress (" UN CHECK ED _ CAST ") Ċ ĉ private Ġfun Ġlist ToString Array ( list : ĠAny ): ĠArray < String > Ġ{ Ċĉ ĉ return Ġ( list Ġas ĠList < String >). to Typed Array () Ċ ĉ } Ċ } Ċ