/* Ċ Ġ* ĠPro Guard CORE Ġ-- Ġlibrary Ġto Ġprocess ĠJava Ġbytecode . Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 0 2 - 2 0 2 1 ĠGu ards quare ĠNV Ċ Ġ* Ċ Ġ* Ġ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 Ġpro guard . class file . visitor Ċ Ċ import Ġio . kot est . core . spec . style . Free Spec Ċ import Ġio . mock k . spy k Ċ import Ġio . mock k . verify Ċ import Ġpro guard . class file . Library Class Ċ import Ġpro guard . class file . Program Class Ċ import Ġtest utils . Class Pool Builder Ċ import Ġtest utils . Kotlin Source Ċ import Ġpro guard . class file . kotlin . Kotlin Constants . dummy Class Pool Ġas Ġkotlin Dummy Class Pool Ċ Ċ class ĠRefer enced Class Visitor Test Ġ: ĠFree Spec ({ ĊĊĠĠĠ Ġ" Given ĠKotlin Ġclasses " Ġ- Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( program Class Pool , Ġlibrary Class Pool ) Ġ= ĠClass Pool Builder . from Source ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Source ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Test . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġkotlin . reflect . K Class ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Target ( Annotation Target . TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Ġclass ĠMy Type Annotation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk Class : ĠK Class <* >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenum : ĠMy Enum , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray : ĠArray < Foo >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotation : ĠFoo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx : Ġ@ My Type Annotation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk Class Ġ= ĠBar :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Ġ= ĠMy Enum . FOO , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray Ġ= ĠarrayOf ( Bar 2 (" foo "), ĠBar 3 (" bar ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Ġ= ĠFoo (" foo ")) ĠString Ġ= Ġ" foo " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġextra Ġhelpers ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Ġclass ĠMy Enum Ġ{ ĠF OO , ĠBAR Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Ġclass ĠFoo ( val Ġstring : ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġclass ĠBar ( val Ġstring : ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġclass ĠBar 2 ( val Ġstring : ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġclass ĠBar 3 ( val Ġstring : ĠString ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 0 : ĠByte Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 1 : ĠShort Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 2 : ĠInt Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 3 : ĠLong Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 4 : ĠChar Ġ= Ġ' a ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 5 : ĠFloat Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 6 : ĠDouble Ġ= Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 7 : ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġclass Visitor Ġ= Ġspy k < Class Visitor >() ĊĠĠĠĠĠĠĠ Ġprogram Class Pool . classes Accept ( Referenced Class Visitor ( true , Ġclass Visitor )) ĊĊĠĠĠĠĠĠĠ Ġ" Then Ġreferenced ĠKotlin Ġstdlib Ġclasses Ġshould Ġbe Ġvisited " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( library Class Pool ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Library Class ( getClass (" kotlin / Metadata ") Ġas ĠLibrary Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Library Class ( getClass (" kotlin / reflect / K Class ") Ġas ĠLibrary Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( kotlin Dummy Class Pool ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Program Class ( getClass (" kotlin / Any ") Ġas ĠProgram Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Program Class ( getClass (" kotlin / String ") Ġas ĠProgram Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Program Class ( getClass (" kotlin / Byte ") Ġas ĠProgram Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Program Class ( getClass (" kotlin / Short ") Ġas ĠProgram Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Program Class ( getClass (" kotlin / Int ") Ġas ĠProgram Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Program Class ( getClass (" kotlin / Long ") Ġas ĠProgram Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Program Class ( getClass (" kotlin / Char ") Ġas ĠProgram Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Program Class ( getClass (" kotlin / Float ") Ġas ĠProgram Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Program Class ( getClass (" kotlin / Double ") Ġas ĠProgram Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Program Class ( getClass (" kotlin / Boolean ") Ġas ĠProgram Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Program Class ( getClass (" kotlin / Array ") Ġas ĠProgram Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" Then Ġthe Ġfile Ġfac ade Ġclass Ġshould Ġbe Ġvisited " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( program Class Pool ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Program Class ( getClass (" Test Kt ") Ġas ĠProgram Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" Then Ġclasses Ġreferenced Ġfrom ĠKotlin Ġannotations Ġshould Ġbe Ġvisited " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( program Class Pool ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Program Class ( getClass (" My Type Annotation ") Ġas ĠProgram Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Program Class ( getClass (" Foo ") Ġas ĠProgram Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Program Class ( getClass (" My Enum ") Ġas ĠProgram Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Program Class ( getClass (" Bar ") Ġas ĠProgram Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Program Class ( getClass (" Bar 2 ") Ġas ĠProgram Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Visitor . visit Program Class ( getClass (" Bar 3 ") Ġas ĠProgram Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ