package Ġcom . github . had il q . track able . compiler Ċ Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġcom . tsch uch ort . compile testing . Kotlin Compilation Ċ import Ġcom . tsch uch ort . compile testing . SourceFile Ċ import Ġcom . tsch uch ort . compile testing . SourceFile . Companion . kotlin Ċ import Ġorg . jetbrains . kotlin . compiler . plugin . Component Registrar Ċ import Ġorg . jetbrains . kotlin . config . Jvm Target Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . rules . Temporary Folder Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . File Ċ import Ġjava . io . InputStream Reader Ċ Ċ class ĠTrack able Plugin Test Ġ{ ĊĊĠĠĠ Ġ@ Rule ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġtemporary Folder : ĠTemporary Folder Ġ= ĠTemporary Folder () ĊĊĠĠĠ Ġprivate Ġval Ġtrack able Ġ= Ġkotlin ( ĊĠĠĠĠĠĠĠ Ġ" Track able . kt ", ĊĠĠĠĠĠĠĠ Ġ""" | package Ġcom . github . had il q . track able . compiler . test ĊĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġkotlin . annotation . Annotation Retention . BINARY ĊĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġkotlin . annotation . Annotation Target . CLASS ĊĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠ Ġ| @ Retention ( BINARY ) ĊĠĠĠĠĠĠĠĠĠĠ Ġ| @ Target ( CLASS ) ĊĠĠĠĠĠĠĠĠĠĠ Ġ| annotation Ġclass ĠTrack able ( val Ġtrack With : ĠString Ġ= Ġ"") ĊĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin ("| ") ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġtrack able Package Ġ= Ġ" com . github . had il q . track able . compiler . test " ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` generate Ġthe Ġget Track Ġmethod `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile ( given Track able Class ()) ĊĠĠĠĠĠĠĠ ĠassertThat ( result . exit Code ). isEqualTo ( Kotlin Compilation . ExitCode . OK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` generate Ġthe Ġget Track Ġmethod Ġbytecode Ġthen Ġrun `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Test To Run () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Execution Result ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` generate Ġthe Ġget Track Ġmethod Ġbytecode Ġwith Ġannotated Ġtrack Ġthen Ġrun `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class With Annotated Track (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Test To Run () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Execution Result ( result , Ġ" Not Track able Class !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` generate Ġthe Ġget Track Ġmethod Ġbytecode Ġfor Ġextended Ġclass Ġthen Ġrun `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Extended Parent Class (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Test To Run () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Execution Result ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` generate Ġthe Ġget Track Ġmethod Ġbytecode Ġfor Ġextended Ġclass Ġwith Ġannotated Ġtrack Ġthen Ġrun `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Extended Parent Class With Annotated Track (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Test To Run () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Execution Result ( result , Ġ" Not Track able Class !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` generate Ġthe Ġget Track Ġmethod Ġbytecode Ġfor Ġdouble Ġextended Ġclass Ġthen Ġrun `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Double Extended Parent Class (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Test To Run () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Execution Result ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` generate Ġthe Ġget Track Ġmethod Ġbytecode Ġfor Ġdouble Ġextended Ġclass Ġwith Ġannotated Ġtrack Ġthen Ġrun `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Double Extended Parent Class With Annotated Track (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Test To Run () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Execution Result ( result , Ġ" Not Track able Class !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` generate Ġthe Ġget Track Ġmethod Ġbytecode Ġfor Ġextended Ġinterface Ġthen Ġrun `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Extended Parent Interface (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Test To Run () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Execution Result ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` generate Ġthe Ġget Track Ġmethod Ġbytecode Ġfor Ġextended Ġinterface Ġwith Ġannotated Ġtrack Ġthen Ġrun `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Extended Parent Interface With Annotated Track (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Test To Run () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Execution Result ( result , Ġ" Not Track able Class !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` generate Ġthe Ġget Track Ġmethod Ġbytecode Ġfor Ġdouble Ġextended Ġinterface Ġthen Ġrun `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Double Extended Parent Interface (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Test To Run () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Execution Result ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` generate Ġthe Ġget Track Ġmethod Ġbytecode Ġfor Ġdouble Ġextended Ġinterface Ġwith Ġannotated Ġtrack Ġthen Ġrun `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Double Extended Parent Interface With Annotated Track (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Test To Run () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Execution Result ( result , Ġ" Not Track able Class !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` generate Ġthe Ġget Track Ġmethod Ġbytecode Ġfor Ġdouble Ġextended Ġinterface Ġwith Ġa Ġchild Ġthen Ġrun `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Extended Parent Interface With Child (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Test To Run () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Execution Result ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` generate Ġthe Ġget Track Ġmethod Ġbytecode Ġfor Ġdouble Ġextended Ġinterface Ġwith Ġa Ġchild Ġwith Ġannotated Ġtrack Ġthen Ġrun `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Extended Parent Interface With Child With Annotated Track (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Track able Class Test To Run () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Execution Result ( result , Ġ" Not Track able Class !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` generate Ġand Ġuse Ġthe Ġget Track Ġmethod Ġthen Ġrun `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile ( given Track able Class (), Ġgiven Track able Class Test To Run ()) ĊĠĠĠĠĠĠĠ Ġassert Execution Result ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` generate Ġdata Ġclass `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Track able Data Class . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" | package Ġcom . github . had il q . track able . compiler . test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| data Ġclass ĠTrack able Data Class ( private Ġval Ġfirst Param : ĠString Ġ= Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin ("| ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( result . exit Code ). isEqualTo ( Kotlin Compilation . ExitCode . COMPI L ATION _ ERROR ) ĊĠĠĠĠĠĠĠ ĠassertThat ( result . messages ). contains (" Track able Data Class . kt : Ġ( 5 , Ġ 1 ): Ġ$ DATA _ INLINE _ CLASS _ ERROR _ MESSAGE ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` generate Ġinline Ġclass `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Track able Data Class . kt ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" | package Ġcom . github . had il q . track able . compiler . test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| inline Ġclass ĠTrack able Data Class ( private Ġval Ġfirst Param : ĠString Ġ= Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin ("| ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( result . exit Code ). isEqualTo ( Kotlin Compilation . ExitCode . COMPI L ATION _ ERROR ) ĊĠĠĠĠĠĠĠ ĠassertThat ( result . messages ). contains (" Track able Data Class . kt : Ġ( 5 , Ġ 1 ): Ġ$ DATA _ INLINE _ CLASS _ ERROR _ MESSAGE ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgiven Track able Class (): ĠSource File Ġ= Ġkotlin ( ĊĠĠĠĠĠĠĠ Ġ" Track able Class . kt ", ĊĠĠĠĠĠĠĠ Ġ""" ĠĠ Ġ| package Ġcom . github . had il q . track able . compiler . test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| class ĠTrack able Class ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin ("| ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġgiven Track able Class Extended Parent Class (): ĠSource File Ġ= Ġkotlin ( ĊĠĠĠĠĠĠĠ Ġ" Track able Class . kt ", ĊĠĠĠĠĠĠĠ Ġ""" ĠĠ Ġ| package Ġcom . github . had il q . track able . compiler . test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| open Ġclass ĠParent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| class ĠTrack able Class Ġ: ĠParent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin ("| ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġgiven Track able Class Extended Parent Class With Annotated Track (): ĠSource File Ġ= Ġkotlin ( ĊĠĠĠĠĠĠĠ Ġ" Track able Class . kt ", ĊĠĠĠĠĠĠĠ Ġ""" ĠĠ Ġ| package Ġcom . github . had il q . track able . compiler . test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| open Ġclass ĠParent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ( track With Ġ= Ġ" Not Track able Class !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| class ĠTrack able Class Ġ: ĠParent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin ("| ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġgiven Track able Class Double Extended Parent Class (): ĠSource File Ġ= Ġkotlin ( ĊĠĠĠĠĠĠĠ Ġ" Track able Class . kt ", ĊĠĠĠĠĠĠĠ Ġ""" ĠĠ Ġ| package Ġcom . github . had il q . track able . compiler . test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| open Ġclass ĠParent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| open Ġclass ĠParent Track able Class Ġ: ĠParent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| class ĠTrack able Class Ġ: ĠParent Track able Class () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin ("| ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġgiven Track able Class Double Extended Parent Class With Annotated Track (): ĠSource File Ġ= Ġkotlin ( ĊĠĠĠĠĠĠĠ Ġ" Track able Class . kt ", ĊĠĠĠĠĠĠĠ Ġ""" ĠĠ Ġ| package Ġcom . github . had il q . track able . compiler . test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| open Ġclass ĠParent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| open Ġclass ĠParent Track able Class Ġ: ĠParent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ( track With Ġ= Ġ" Not Track able Class !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| class ĠTrack able Class Ġ: ĠParent Track able Class () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin ("| ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġgiven Track able Class Extended Parent Interface (): ĠSource File Ġ= Ġkotlin ( ĊĠĠĠĠĠĠĠ Ġ" Track able Class . kt ", ĊĠĠĠĠĠĠĠ Ġ""" ĠĠ Ġ| package Ġcom . github . had il q . track able . compiler . test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| interface ĠParent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| class ĠTrack able Class Ġ: ĠParent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin ("| ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġgiven Track able Class Extended Parent Interface With Annotated Track (): ĠSource File Ġ= Ġkotlin ( ĊĠĠĠĠĠĠĠ Ġ" Track able Class . kt ", ĊĠĠĠĠĠĠĠ Ġ""" ĠĠ Ġ| package Ġcom . github . had il q . track able . compiler . test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| interface ĠParent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ( track With Ġ= Ġ" Not Track able Class !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| class ĠTrack able Class Ġ: ĠParent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin ("| ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġgiven Track able Class Double Extended Parent Interface (): ĠSource File Ġ= Ġkotlin ( ĊĠĠĠĠĠĠĠ Ġ" Track able Class . kt ", ĊĠĠĠĠĠĠĠ Ġ""" ĠĠ Ġ| package Ġcom . github . had il q . track able . compiler . test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| interface ĠParent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| open Ġclass ĠParent Track able Class Ġ: ĠParent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| class ĠTrack able Class Ġ: ĠParent Track able Class () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin ("| ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġgiven Track able Class Double Extended Parent Interface With Annotated Track (): ĠSource File Ġ= Ġkotlin ( ĊĠĠĠĠĠĠĠ Ġ" Track able Class . kt ", ĊĠĠĠĠĠĠĠ Ġ""" ĠĠ Ġ| package Ġcom . github . had il q . track able . compiler . test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| interface ĠParent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| open Ġclass ĠParent Track able Class Ġ: ĠParent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ( track With Ġ= Ġ" Not Track able Class !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| class ĠTrack able Class Ġ: ĠParent Track able Class () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin ("| ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġgiven Track able Class Extended Parent Interface With Child (): ĠSource File Ġ= Ġkotlin ( ĊĠĠĠĠĠĠĠ Ġ" Track able Class . kt ", ĊĠĠĠĠĠĠĠ Ġ""" ĠĠ Ġ| package Ġcom . github . had il q . track able . compiler . test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| interface ĠParent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| open Ġclass ĠTrack able Class Ġ: ĠParent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| class ĠChild Track able Class Ġ: ĠTrack able Class () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin ("| ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġgiven Track able Class Extended Parent Interface With Child With Annotated Track (): ĠSource File Ġ= Ġkotlin ( ĊĠĠĠĠĠĠĠ Ġ" Track able Class . kt ", ĊĠĠĠĠĠĠĠ Ġ""" ĠĠ Ġ| package Ġcom . github . had il q . track able . compiler . test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| interface ĠParent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ( track With Ġ= Ġ" Not Track able Class !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| open Ġclass ĠTrack able Class Ġ: ĠParent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| class ĠChild Track able Class Ġ: ĠTrack able Class () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin ("| ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġgiven Track able Class With Annotated Track (): ĠSource File Ġ= Ġkotlin ( ĊĠĠĠĠĠĠĠ Ġ" Track able Class . kt ", ĊĠĠĠĠĠĠĠ Ġ""" ĠĠ Ġ| package Ġcom . github . had il q . track able . compiler . test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . github . had il q . track able . compiler . test . Track able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ Track able ( track With Ġ= Ġ" Not Track able Class !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| class ĠTrack able Class ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin ("| ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġgiven Track able Class Test To Run (): ĠSource File Ġ= Ġkotlin ( ĊĠĠĠĠĠĠĠ Ġ" Track able Class Test . kt ", ĊĠĠĠĠĠĠĠ Ġ""" ĠĠ Ġ| package Ġcom . github . had il q . track able . compiler . test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| fun Ġmain ( args : ĠArray < String > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ ĠSystem . out . print ( Track able Class (). track ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| """. trim Margin ("| ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġassert Execution Result ( result : ĠKotlin Compilation . Result , Ġoutput String : ĠString Ġ= Ġ" Track able Class ") Ġ{ ĊĠĠĠĠĠĠĠ ĠassertThat ( result . exit Code ). isEqualTo ( Kotlin Compilation . ExitCode . OK ) ĊĠĠĠĠĠĠĠ Ġval Ġdirectory Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . generated Files . first Ġ{ Ġit . exists () Ġ&& Ġit . parent File . name Ġ== Ġ" META - INF " Ġ}. parent File . parent File ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġrun Files ( directory , Ġ"$ track able Package . Track able Class Test Kt ") ĊĠĠĠĠĠĠĠ ĠassertThat ( output ). isEqualTo ("$ output String \ n ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare Compilation ( var arg Ġsource Files : ĠSource File ): ĠKotlin Compilation Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠKotlin Compilation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking Dir Ġ= Ġtemporary Folder . root ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompiler Plugins Ġ= ĠlistOf < Component Registrar >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTrack able Component Registrar ("${ track able Package }. Track able ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinherit Class Path Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġsource Files . asList () Ġ+ Ġtrack able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverbose Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj vm Target Ġ= ĠJ vm Target . fromString ( System . getenv ()[" ci _ java _ version "] Ġ?: Ġ" 1 . 8 ") !!. description ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinclude Runtime Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompile ( var arg Ġsource Files : ĠSource File ): ĠKotlin Compilation . Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprepare Compilation (* source Files ). compile () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun Files ( directory : ĠFile , Ġmain Class : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġrun Command (" java Ġ- cp Ġ${ directory . absolute Path } Ġ$ main Class ") ĊĊĠĠĠ Ġprivate Ġfun Ġfile Byte code ( file : ĠFile ) Ġ= Ġrun Command (" jav ap Ġ- c ĠX Ġ$ file ") ĊĊĠĠĠ Ġprivate Ġfun Ġrun Command ( command : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp : ĠProcess Ġ= ĠRuntime . get Runtime (). exec ( command ) ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠBufferedReader ( InputStream Reader ( p . inputStream )) ĊĠĠĠĠĠĠĠ Ġvar Ġline : ĠString ? ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( run Ġ{ Ġline Ġ= Ġinput . readLine (); line Ġ} Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ln ( line ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinput . close () ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠBufferedReader ( InputStream Reader ( p . error Stream )) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( run Ġ{ Ġline Ġ= Ġerror . readLine (); line Ġ} Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Error Ġof Ġrunning : Ġ$ command Ġ-> Ġ$ line ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġerror . close () ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} Ċ } Ċ