/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠS me . UP ĠS . p . A . Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 . s me up . r pg parser . interpreter Ċ Ċ import Ġcom . s me up . r pg parser . Abstract Test Ċ import Ġcom . s me up . r pg parser . execution . Configuration Ċ import Ġcom . s me up . r pg parser . execution . Error Event Ċ import Ġcom . s me up . r pg parser . execution . Jar iko Callback Ċ import Ġcom . s me up . r pg parser . execution . Options Ċ import Ġcom . s me up . r pg parser . jv min ter op . Java System Interface Ċ import Ġcom . s me up . r pg parser . parsing . facade . Copy Ċ import Ġcom . s me up . r pg parser . parsing . facade . Copy Id Ċ import Ġcom . s me up . r pg parser . parsing . facade . Source Reference Ċ import Ġcom . s me up . r pg parser . parsing . facade . Source Reference Type Ċ import Ġorg . junit . Assert Ċ import Ġkotlin . test . Test Ċ Ċ /** Ċ Ġ* ĠTest Ġsuite Ġto Ġtest ĠJar iko Ġcallback Ġfeatures Ċ Ġ* Ġ*/ Ċ class ĠJar iko Callback Test Ġ: ĠAbstract Test () Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġon Enter Statement () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsystem Interface Ġ= ĠJava System Interface (). apply Ġ{ Ġon Display Ġ= Ġ{ Ġ_, Ġ_ Ġ-> Ġrun Ġ{} Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġentered Times Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġexecute P gm ( system Interface Ġ= Ġsystem Interface , Ġprogram Name Ġ= Ġ" HEL LO ", Ġconfiguration Ġ= ĠConfiguration (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar iko Callback . on Enter Statement Ġ= Ġ{ Ġ_: ĠInt , Ġ_: ĠSource Reference Ġ-> Ġentered Times ++ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions Ġ= ĠOptions (). apply Ġ{ Ġdebugging Information Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 3 , Ġentered Times ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġon Enter Statement With Call () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpected Entered Times Ġ= Ġmap Of (" CAL 0 1 " Ġto Ġ 5 , Ġ" CAL 0 2 " Ġto Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġval Ġactual Entered Times Ġ= Ġmutable Map Of (" CAL 0 1 " Ġto Ġ 0 , Ġ" CAL 0 2 " Ġto Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġsystem Interface Ġ= ĠJava System Interface (). apply Ġ{ Ġon Display Ġ= Ġ{ Ġ_, Ġ_ Ġ-> Ġrun Ġ{} Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġexecute P gm ( system Interface Ġ= Ġsystem Interface , Ġprogram Name Ġ= Ġ" CAL 0 1 ", Ġconfiguration Ġ= ĠConfiguration (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar iko Callback . on Enter Statement Ġ= Ġ{ Ġ_: ĠInt , Ġsource Reference : ĠSource Reference Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( source Reference ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Entered Times [ source Reference . source Id ] Ġ= Ġactual Entered Times [ source Reference . source Id ] !! Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions Ġ= ĠOptions (). apply Ġ{ Ġdebugging Information Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( expected Entered Times , Ġactual Entered Times ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġprogram Life Cycle () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentered Times Ġ= Ġmutable Map Of (" CAL 0 4 " Ġto Ġ 0 , Ġ" CAL 0 2 " Ġto Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġexited Times Ġ= Ġmutable Map Of (" CAL 0 4 " Ġto Ġ 0 , Ġ" CAL 0 2 " Ġto Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġsystem Interface Ġ= ĠJava System Interface (). apply Ġ{ Ġon Display Ġ= Ġ{ Ġ_, Ġ_ Ġ-> Ġrun Ġ{} Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġexecute P gm ( system Interface Ġ= Ġsystem Interface , Ġprogram Name Ġ= Ġ" CAL 0 4 ", Ġconfiguration Ġ= ĠConfiguration (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar iko Callback . on Enter P gm Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogram Name : ĠString , Ġsymbol Table : ĠIS ymbol Table Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" on Enter P gm Ġ- Ġprogram Name : Ġ$ program Name , Ġsymbol Table : Ġ$ symbol Table ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentered Times [ program Name ] Ġ= Ġentered Times [ program Name ] !! Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar iko Callback . on Exit P gm Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogram Name : ĠString , Ġsymbol Table : ĠIS ymbol Table , Ġ_: ĠThrowable ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" on Exit P gm Ġ- Ġprogram Name : Ġ$ program Name , Ġsymbol Table : Ġ$ symbol Table ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexited Times [ program Name ] Ġ= Ġexited Times [ program Name ] !! Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġentered Times [" CAL 0 4 "]) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġexited Times [" CAL 0 4 "]) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 5 , Ġentered Times [" CAL 0 2 "]) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 5 , Ġexited Times [" CAL 0 2 "]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġon Enter Statement With Copy Block () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġcopy Definitions : ĠMap < Copy Id , ĠString > ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġpg m : ĠString ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġpost Processed : ĠString ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= ĠConfiguration (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions Ġ= ĠOptions (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebugging Information Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdump Source On Execution Error Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar iko Callback Ġ= ĠJar iko Callback (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Ast Creation Ġ= Ġ{ Ġast Ġ-> Ġpost Processed Ġ= Ġast . source !! Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Enter Statement Ġ= Ġ{ ĠlineNumber : ĠInt , Ġsource Reference : ĠSource Reference Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source Reference . source Reference Type Ġ== ĠSource Reference Type . Copy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Copy Ġ- Ġcopy Id : Ġ${ source Reference . source Id }, Ġrelative LineNumber : Ġ${ source Reference . relative Line }, ĠlineNumber : Ġ$ line Number ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Program Ġ- Ġrelative LineNumber : Ġ${ source Reference . relative Line }, ĠlineNumber : Ġ$ line Number ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġwhen Ġ( source Reference . source Reference Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSource Reference Type . Copy Ġ-> Ġcopy Definitions [ Copy Id ( member Ġ= Ġsource Reference . source Id )] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSource Reference Type . Program Ġ-> Ġpg m ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( src Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelative Statement Ġ= Ġsrc . lines ()[ source Reference . relative Line Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" relative Statement : Ġ$ relative Statement ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġabsolute Statement Ġ= Ġpost Processed . lines ()[ line Number Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" absolute Statement : Ġ$ absolute Statement ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( absolute Statement , Ġrelative Statement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexecute Inline P gm Containing Copy ( configuration Ġ= Ġconfiguration , Ġconsume Sources Ġ= Ġ{ Ġmy P gm , Ġmy Copy Definitions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpg m Ġ= Ġmy P gm ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Definitions Ġ= Ġmy Copy Definitions ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcopy Life Cycle With Inline P gm () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcopies Will Enter Ġ= Ġmutable Set Of < Copy Id >() ĊĠĠĠĠĠĠĠ Ġval Ġcopies Did Enter Ġ= Ġmutable Set Of < Copy Id >() ĊĠĠĠĠĠĠĠ Ġval Ġcopies Will Exit Ġ= Ġmutable Set Of < Copy Id >() ĊĠĠĠĠĠĠĠ Ġval Ġcopies Did Exit Ġ= Ġmutable Set Of < Copy Id >() ĊĠĠĠĠĠĠĠ Ġval Ġenter Sequence Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġexit Sequence Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= ĠConfiguration (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions Ġ= ĠOptions (). apply Ġ{ Ġdebugging Information Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar iko Callback Ġ= ĠJar iko Callback (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Enter Copy Ġ= Ġ{ Ġcopy Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" enter ing Ġ$ copy Id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenter Sequence . add ( copy Id . member ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopies Did Enter . add ( copy Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Exit Copy Ġ= Ġ{ Ġcopy Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" exit ing Ġ$ copy Id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Sequence . add ( copy Id . member ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopies Did Exit . add ( copy Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexpected Enter Sequence Ġ= ĠlistOf (" COPY 1 ", Ġ" COPY 2 ", Ġ" COPY 2 1 ", Ġ" COPY 2 2 ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Exit Sequence Ġ= ĠlistOf (" COPY 1 ", Ġ" COPY 2 1 ", Ġ" COPY 2 2 ", Ġ" COPY 2 ") ĊĠĠĠĠĠĠĠ Ġexecute Inline P gm Containing Copy ( configuration , Ġconsume Sources Ġ= Ġ{ Ġ_, Ġcopy Definitions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Definitions . keys . forEach Ġ{ Ġcopy Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopies Will Enter . add ( copy Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopies Will Exit . add ( copy Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( copies Will Enter , Ġcopies Did Enter ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( copies Will Exit , Ġcopies Did Exit ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( expected Enter Sequence , Ġenter Sequence ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( expected Exit Sequence , Ġexit Sequence ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcopy Life Cycle () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġentered Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġexited Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= ĠConfiguration (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions Ġ= ĠOptions (). apply Ġ{ Ġdebugging Information Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar iko Callback Ġ= ĠJar iko Callback (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Enter Copy Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Enter ing Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentered ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Exit Copy Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Exit ing Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexited ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexecute P gm ( program Name Ġ= Ġ" T ST CP Y 0 1 ", Ġconfiguration Ġ= Ġconfiguration ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 2 , Ġentered ) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 2 , Ġexited ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Inline P gm Containing Copy ( ĊĠĠĠĠĠĠĠ Ġconfiguration : ĠConfiguration , ĊĠĠĠĠĠĠĠ Ġconsume Sources : Ġ( pg m : ĠString , Ġcopy Definitions : ĠMap < Copy Id , ĠString >) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpg m Ġ= Ġ""" Ċ 2 ĠĠĠ ĠD ĠMsg ĠĠĠĠĠĠĠĠĠĠĠĠ ĠS ĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 0 ĠĠĠĠĠĠ Ċ 3 ĠĠĠ ĠC ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE VAL ĠĠĠĠĠ ĠMsg Ġ= Ġ' Include ĠCOPY 1 ' Ċ 4 ĠĠĠ ĠC ĠĠĠĠĠ ĠMsg ĠĠĠĠĠĠĠĠĠ ĠD SP LY Ċ 5 ĠĠĠ ĠI / COPY ĠCOPY 1 Ċ 6 ĠĠĠ ĠC ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE VAL ĠĠĠĠĠ ĠMsg Ġ= Ġ' Include ĠCOPY 2 ' Ċ 7 ĠĠĠ ĠC ĠĠĠĠĠ ĠMsg ĠĠĠĠĠĠĠĠĠ ĠD SP LY Ċ 8 ĠĠĠ ĠI / COPY ĠCOPY 2 ĠĠĠĠĠ Ċ 9 ĠĠĠ ĠC ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE VAL ĠĠĠĠĠ ĠMsg Ġ= Ġ' Exit Ġfrom ĠCOPY 2 ' Ċ 1 0 ĠĠ ĠC ĠĠĠĠĠ ĠMsg ĠĠĠĠĠĠĠĠĠ ĠD SP LY ĊĠĠĠĠĠĠĠ Ġ""" . trim End () ĊĠĠĠĠĠĠĠ Ġval Ġcopy 1 Ġ= Ġ""" Ċ 2 ĠĠĠ ĠD ĠMsg 1 ĠĠĠĠĠĠĠĠĠĠĠ ĠS ĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 0 Ċ 3 ĠĠĠ ĠC ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE VAL ĠĠĠĠĠ ĠMsg 1 Ġ= Ġ' I ĠAM ĠCOPY 1 ' Ċ 4 ĠĠĠ ĠC ĠĠĠĠĠ ĠMsg 1 ĠĠĠĠĠĠĠĠ ĠD SP LY ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġval Ġcopy 2 Ġ= Ġ""" Ċ 2 ĠĠĠ ĠD ĠMsg 2 ĠĠĠĠĠĠĠĠĠĠĠ ĠS ĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 0 Ċ 3 ĠĠĠ ĠC ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE VAL ĠĠĠĠĠ ĠMsg 2 Ġ= Ġ' I ĠAM ĠCOPY 2 ' Ċ 4 ĠĠĠ ĠC ĠĠĠĠĠ ĠMsg 2 ĠĠĠĠĠĠĠĠ ĠD SP LY Ċ 5 ĠĠĠ ĠC ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE VAL ĠĠĠĠĠ ĠMsg 2 Ġ= Ġ' Include ĠCOPY 2 1 ' Ċ 6 ĠĠĠ ĠC ĠĠĠĠĠ ĠMsg 2 ĠĠĠĠĠĠĠĠ ĠD SP LY Ċ 7 ĠĠĠĠ Ġ/ COPY ĠCOPY 2 1 ĠĠĠĠĠ Ċ 8 ĠĠĠ ĠC ĠĠĠĠĠ ĠMsg 2 ĠĠĠĠĠĠĠĠ ĠE VAL ĠĠĠĠĠ ĠMsg 2 Ġ= Ġ' After ĠCOPY 2 1 ' Ċ 9 ĠĠĠ ĠC ĠĠĠĠĠ ĠMsg 2 ĠĠĠĠĠĠĠĠ ĠD SP LY Ċ 1 0 ĠĠ ĠC ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE VAL ĠĠĠĠĠ ĠMsg 2 Ġ= Ġ' Include ĠCOPY 2 2 ' Ċ 1 1 ĠĠ ĠC ĠĠĠĠĠ ĠMsg 2 ĠĠĠĠĠĠĠĠ ĠD SP LY Ċ 1 2 ĠĠĠ Ġ/ COPY ĠCOPY 2 2 ĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġval Ġcopy 2 1 Ġ= Ġ""" Ċ 2 ĠĠĠ ĠD ĠMsg 2 1 ĠĠĠĠĠĠĠĠĠĠ ĠS ĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 0 Ċ 3 ĠĠĠ ĠC ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE VAL ĠĠĠĠĠ ĠMsg 2 1 Ġ= Ġ' I ĠAM ĠCOPY 2 1 ' Ċ 4 ĠĠĠ ĠC ĠĠĠĠĠ ĠMsg 2 1 ĠĠĠĠĠĠĠ ĠD SP LY ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġval Ġcopy 2 2 Ġ= Ġ""" Ċ 2 ĠĠĠ ĠD ĠMsg 2 2 ĠĠĠĠĠĠĠĠĠĠ ĠS ĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 0 Ċ 3 ĠĠĠ ĠC ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE VAL ĠĠĠĠĠ ĠMsg 2 1 Ġ= Ġ' I ĠAM ĠCOPY 2 2 ' Ċ 4 ĠĠĠ ĠC ĠĠĠĠĠ ĠMsg 2 2 ĠĠĠĠĠĠĠ ĠD SP LY ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġval Ġcopy Definitions Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCopy Id ( member Ġ= Ġ" COPY 1 ") Ġto Ġcopy 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCopy Id ( member Ġ= Ġ" COPY 2 ") Ġto Ġcopy 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCopy Id ( member Ġ= Ġ" COPY 2 1 ") Ġto Ġcopy 2 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCopy Id ( member Ġ= Ġ" COPY 2 2 ") Ġto Ġcopy 2 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġconsume Sources . invoke ( pg m , Ġcopy Definitions ) ĊĠĠĠĠĠĠĠ Ġval Ġsystem Interface Ġ= Ġobject Ġ: ĠJava System Interface () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfind Copy ( copy Id : ĠCopy Id ): ĠCopy ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcopy Definitions [ copy Id ]?. let Ġ{ ĠCopy . from InputStream ( it . byte InputStream ( charset (" UTF - 8 "))) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdisplay ( value : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprintln ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexecute P gm ( program Name Ġ= Ġpg m , Ġsystem Interface Ġ= Ġsystem Interface , Ġconfiguration Ġ= Ġconfiguration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġprocedure 1 CallBack Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsystem Interface Ġ= ĠJava System Interface (). apply Ġ{ Ġon Display Ġ= Ġ{ Ġ_, Ġ_ Ġ-> Ġrun Ġ{} Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġentered Times Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġexited Times Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġfunction Params Ġ= Ġmutable ListOf < Function Value >() ĊĠĠĠĠĠĠĠ Ġexecute P gm ( system Interface Ġ= Ġsystem Interface , Ġprogram Name Ġ= Ġ" PROC EDURE 1 ", Ġconfiguration Ġ= ĠConfiguration (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar iko Callback . on Enter Function Ġ= Ġ{ Ġfunction Name : ĠString , Ġparams : ĠList < Function Value >, Ġ_: ĠIS ymbol Table Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentered Times ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Params . addAll ( params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals (" CALL 1 ", Ġfunction Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 1 , Ġparams [ 0 ]. value . as Int (). value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 2 2 , Ġparams [ 1 ]. value . as Int (). value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( Zero Value , Ġparams [ 2 ]. value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar iko Callback . on Exit Function Ġ= Ġ{ Ġfunction Name : ĠString , Ġ_: ĠValue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexited Times ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals (" CALL 1 ", Ġfunction Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 3 3 , Ġfunction Params [ 2 ]. value . as Int (). value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( enter ed Times , Ġexited Times ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġprocedure 2 CallBack Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsystem Interface Ġ= ĠJava System Interface (). apply Ġ{ Ġon Display Ġ= Ġ{ Ġ_, Ġ_ Ġ-> Ġrun Ġ{} Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġentered Times Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġexited Times Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġfunction Params Ġ= Ġmutable ListOf < Function Value >() ĊĠĠĠĠĠĠĠ Ġexecute P gm ( system Interface Ġ= Ġsystem Interface , Ġprogram Name Ġ= Ġ" PROC EDURE 2 ", Ġconfiguration Ġ= ĠConfiguration (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar iko Callback . on Enter Function Ġ= Ġ{ Ġfunction Name : ĠString , Ġparams : ĠList < Function Value >, Ġ_: ĠIS ymbol Table Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentered Times ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Params . addAll ( params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals (" CALL 1 ", Ġfunction Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 1 , Ġparams [ 0 ]. value . as Int (). value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 2 2 , Ġparams [ 1 ]. value . as Int (). value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjar iko Callback . on Exit Function Ġ= Ġ{ Ġfunction Name : ĠString , ĠreturnValue : ĠValue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexited Times ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals (" CALL 1 ", Ġfunction Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 3 3 , ĠreturnValue . as Int (). value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( enter ed Times , Ġexited Times ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġexecute ERROR 0 1 CallBack Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRuntime Ġerror Ġin Ġprogram ĊĠĠĠĠĠĠĠ Ġexecute P gm CallBack Test (" ERROR 0 1 ", ĠSource Reference Type . Program , Ġ" ERROR 0 1 ", ĠlistOf ( 4 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġexecute ERROR 0 2 CallBack Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSyntax Ġerror Ġin Ġprogram ĊĠĠĠĠĠĠĠ Ġexecute P gm CallBack Test (" ERROR 0 2 ", ĠSource Reference Type . Program , Ġ" ERROR 0 2 ", ĠlistOf ( 6 , Ġ 7 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġexecute ERROR 0 3 CallBack Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInvalid Ġopcode Ġin Ġc py ĊĠĠĠĠĠĠĠ Ġexecute P gm CallBack Test (" ERROR 0 3 ", ĠSource Reference Type . Copy , Ġ" Q ILE GEN , CP ERR 0 1 ", ĠlistOf ( 7 , Ġ 5 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġexecute ERROR 0 4 CallBack Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSyntax Ġerror Ġin Ġc py ĊĠĠĠĠĠĠĠ Ġexecute P gm CallBack Test (" ERROR 0 4 ", ĠSource Reference Type . Copy , Ġ" Q ILE GEN , CP ERR 0 2 ", ĠlistOf ( 5 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġexecute ERROR 0 5 CallBack Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠValid ating ĠAST Ġin Ġcopy ĊĠĠĠĠĠĠĠ Ġexecute P gm CallBack Test (" ERROR 0 5 ", ĠSource Reference Type . Copy , Ġ" Q ILE GEN , CP ERR 0 3 ", ĠlistOf ( 5 , Ġ 6 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġexecute ERROR 0 6 CallBack Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMore Ġthan Ġone Ġerror Ġin Ġdata Ġdefinitions ĊĠĠĠĠĠĠĠ Ġexecute P gm CallBack Test (" ERROR 0 6 ", ĠSource Reference Type . Program , Ġ" ERROR 0 6 ", ĠlistOf ( 7 , Ġ 8 , Ġ 1 1 , Ġ 1 2 , Ġ 1 3 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġexecute ERROR 0 7 CallBack Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRe peated Ġnot Ġsupported Ġoperation Ġcode ĊĠĠĠĠĠĠĠ Ġexecute P gm CallBack Test (" ERROR 0 7 ", ĠSource Reference Type . Program , Ġ" ERROR 0 7 ", ĠlistOf ( 6 , Ġ 9 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġexecute ERROR 0 8 CallBack Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠErrors Ġin Ġblock Ġstatements ĊĠĠĠĠĠĠĠ Ġexecute P gm CallBack Test (" ERROR 0 8 ", ĠSource Reference Type . Program , Ġ" ERROR 0 8 ", ĠlistOf ( 1 4 , Ġ 1 5 , Ġ 8 , Ġ 9 , Ġ 1 3 , Ġ 7 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġexecute ERROR 0 9 CallBack Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġexecute P gm CallBack Test (" ERROR 0 9 ", ĠSource Reference Type . Program , Ġ" ERROR 0 9 ", ĠlistOf ( 6 , Ġ 7 , Ġ 7 , Ġ 8 , Ġ 8 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute P gm CallBack Test ( pg m : ĠString , Ġsource Reference Type : ĠSource Reference Type , Ġsource Id : ĠString , Ġlines : ĠList < Int >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Events Ġ= Ġmutable ListOf < Error Event >() ĊĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= ĠConfiguration (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjar iko Callback . onError Ġ= Ġ{ Ġerror Event Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( error Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Events . add ( error Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions Ġ= ĠOptions ( debugging Information Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute P gm ( pg m , Ġconfiguration Ġ= Ġconfiguration ) ĊĠĠĠĠĠĠĠ Ġ}. on Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . fail (" Program Ġmust Ġexit Ġwith Ġerror ") ĊĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( it . stack Trace ToString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( source Reference Type , Ġerror Events [ 0 ]. source Reference !!. source Reference Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( source Id , Ġerror Events [ 0 ]. source Reference !!. source Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals ( lines , Ġerror Events . map Ġ{ Ġerror Event Ġ-> Ġerror Event . source Reference !!. relative Line Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }