/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . android . tools . build . jet ifier . processor . transform . byte code Ċ Ċ import Ġcom . android . tools . build . jet ifier . core . config . Config Ċ import Ġcom . android . tools . build . jet ifier . core . config . ConfigParser Ċ import Ġcom . android . tools . build . jet ifier . core . rule . Rewrite Rule Ċ import Ġcom . android . tools . build . jet ifier . core . rule . Rewrite Rules Map Ċ import Ġcom . android . tools . build . jet ifier . core . type . Java Type Ċ import Ġcom . android . tools . build . jet ifier . core . type . Types Map Ċ import Ġcom . android . tools . build . jet ifier . processor . archive . Archive File Ċ import Ġcom . android . tools . build . jet ifier . processor . transform . Transformation Context Ċ import Ġcom . google . common . truth . Truth Ċ import Ġorg . junit . Test Ċ import Ġorg . object web . asm . Class Reader Ċ import Ġorg . object web . asm . util . Text ifier Ċ import Ġorg . object web . asm . util . Trace Class Visitor Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . File Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . nio . file . Paths Ċ Ċ /** Ċ Ġ* ĠTests Ġthat Ġindividual Ġreferences Ġin Ġthe Ġclass Ġfile Ġwere Ġcorrectly Ġre written . Ċ Ġ*/ Ċ class ĠClass Rewrite Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Class Rewrite _ re places All References () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfig . from Optional ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestrict To Package Prefixes Ġ= Ġset Of (" android / support "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreversed Restrict To Packages Prefixes Ġ= Ġset Of (" android x "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtypes Map Ġ= ĠTypes Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" android / support / v 4 / app / Fragment " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġ" android x / fragment / app / Fragment " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). map Ġ{ ĠJava Type ( it . key ) Ġto ĠJava Type ( it . value ) Ġ}. toMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinput Class Path Ġ= Ġ"/ class Rewrite Test / Fragment Kt . class " ĊĠĠĠĠĠĠĠ Ġval Ġinput File Ġ= ĠFile ( java Class . getResource ( input Class Path ). file ) ĊĠĠĠĠĠĠĠ Ġval Ġarchive File Ġ= ĠArchive File ( Paths . get ("/", Ġ" Fragment Kt . class "), Ġinput File . read Bytes ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠTransformation Context ( config Ġ= Ġconfig ) ĊĠĠĠĠĠĠĠ Ġval Ġtransformer Ġ= ĠByteCode Transformer ( context ) ĊĊĠĠĠĠĠĠĠ Ġtransformer . run Transform ( archive File ) ĊĊĠĠĠĠĠĠĠ Ġval Ġde compiled Result Ġ= Ġde compile Class File ToString ( archive File . data ) ĊĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( de compiled Result ). does Not Contain (" android x . fragment . app . Fragment ") ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( de compiled Result ). contains (" android x / fragment / app / Fragment ") ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( de compiled Result ). contains (" L android x / fragment / app / Fragment ; ") ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( de compiled Result ). does Not Contain (" LL ") ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( de compiled Result ). does Not Contain (" ;; ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Class Rewrite _ re places All References 2 () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfig . from Optional ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestrict To Package Prefixes Ġ= Ġset Of (" android / support "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreversed Restrict To Packages Prefixes Ġ= Ġset Of (" android x "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtypes Map Ġ= ĠTypes Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" android / support / design / widget / Snackbar " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġ" com / google / android / material / sn ackbar / Snackbar " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). map Ġ{ ĠJava Type ( it . key ) Ġto ĠJava Type ( it . value ) Ġ}. toMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrules Map Ġ= ĠRewrite Rules Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRewrite Rule ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġ= Ġ" android / support / annotation /( .* )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġ= Ġ" android x / annotation / ()" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinput Class Path Ġ= Ġ"/ class Rewrite Test / Rx Snackbar Kt . class " ĊĠĠĠĠĠĠĠ Ġval Ġinput File Ġ= ĠFile ( java Class . getResource ( input Class Path ). file ) ĊĠĠĠĠĠĠĠ Ġval Ġarchive File Ġ= ĠArchive File ( Paths . get ("/", Ġ" Rx Snackbar Kt . class "), Ġinput File . read Bytes ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠTransformation Context ( config Ġ= Ġconfig ) ĊĠĠĠĠĠĠĠ Ġval Ġtransformer Ġ= ĠByteCode Transformer ( context ) ĊĊĠĠĠĠĠĠĠ Ġtransformer . run Transform ( archive File ) ĊĊĠĠĠĠĠĠĠ Ġval Ġde compiled Result Ġ= Ġde compile Class File ToString ( archive File . data ) ĊĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( de compiled Result ). contains (" com / google / android / material / sn ackbar / Snackbar ") ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( de compiled Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. does Not Contain (" L com . google . android . material . sn ackbar . Snackbar ") ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( de compiled Result ). does Not Contain (" android / support / design / widget / Snackbar ") ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( de compiled Result ). does Not Contain (" android . support . design . widget . Snackbar ") ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected FileContent Ġ= ĠFile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class . getResource ("/ class Rewrite Test / Rx Snackbar Kt - expected - de compiled . txt "). file ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. read Bytes () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString ( Charset . default Charset ()) ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( de compiled Result ). isEqualTo ( expected FileContent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Class Rewrite _ bundle Strings Pre served () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠConfig Parser . load Default Config () !! ĊĊĠĠĠĠĠĠĠ Ġval Ġinput Class Path Ġ= Ġ"/ class Rewrite Test / Share Compat . class " ĊĠĠĠĠĠĠĠ Ġval Ġinput File Ġ= ĠFile ( java Class . getResource ( input Class Path ). file ) ĊĠĠĠĠĠĠĠ Ġval Ġarchive File Ġ= ĠArchive File ( Paths . get ("/", Ġ" Share Compat . class "), Ġinput File . read Bytes ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠTransformation Context ( config Ġ= Ġconfig ) ĊĠĠĠĠĠĠĠ Ġval Ġtransformer Ġ= ĠByteCode Transformer ( context ) ĊĊĠĠĠĠĠĠĠ Ġtransformer . run Transform ( archive File ) ĊĊĠĠĠĠĠĠĠ Ġval Ġde compiled Result Ġ= Ġde compile Class File ToString ( archive File . data ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠBoth Ġconstants Ġneed Ġto Ġbe Ġpresent ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( de compiled Result ). contains ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" EXTRA _ CALL ING _ PACKAGE Ġ= Ġ\" android x . core . app . EXTRA _ CALL ING _ PACKAGE \"" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( de compiled Result ). contains ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" EXTRA _ CALL ING _ PACKAGE _ INTER OP Ġ= Ġ\" android . support . v 4 . app . EXTRA _ CALL ING _ PACKAGE \"" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġde compile Class File ToString ( data : ĠByteArray ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠClass Reader ( data ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtext ifier Ġ= ĠText ifier () ĊĠĠĠĠĠĠĠ Ġval Ġstream Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġval Ġtrace Visitor Ġ= ĠTrace Class Visitor ( null , Ġtext ifier , ĠPrintWriter ( stream )) ĊĊĠĠĠĠĠĠĠ Ġreader . accept ( trace Visitor , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠString ( stream . toByteArray ()) ĊĠĠĠ Ġ} Ċ }