/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 ĠCent ury Link , ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 . cent ury link . md w . kotlin Ċ Ċ import Ġorg . jetbrains . kotlin . cli . common . repl . Invoke Wrapper Ċ import Ġorg . jetbrains . kotlin . cli . common . repl . Repl Eval Result Ċ import Ġorg . jetbrains . kotlin . cli . common . repl . Script Args With Types Ċ import Ġorg . jetbrains . kotlin . cli . common . repl . render Repl StackTrace Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . Jvm ClassName Ċ import Ġjava . io . File Ċ import Ġjava . lang . reflect . Invocation TargetException Ċ import Ġjava . net . URL ClassLoader Ċ import Ġjavax . script . Bindings Ċ Ċ open Ġclass ĠScript Evaluator ( ĊĠĠĠĠĠĠĠ Ġval Ġbase Classpath : ĠIterable < File >, ĊĠĠĠĠĠĠĠ Ġval Ġbase Class loader : ĠClassLoader ? Ġ= ĠThread . currentThread (). context ClassLoader , ĊĠĠĠĠĠĠĠ Ġprotected Ġval Ġfallback Script Args : ĠScript Args With Types ? Ġ= Ġnull Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġeval ( compile Result : ĠScript Compile Result . Compiled Classes , ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġscript Args : ĠScript Args With Types ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke Wrapper : ĠInvoke Wrapper ?): ĠRe pl Eval Result Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġ( class Loader , Ġscript Class ) Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Classes ( compile Result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () Ġ// ĠTODO ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ eval ĠRe pl Eval Result . Error . Runtime ( e . message Ġ?: Ġ" unknown ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Script Args Ġ= Ġscript Args Ġ?: Ġfallback Script Args ĊĠĠĠĠĠĠĠ Ġval Ġuse Script Args Ġ= Ġcurrent Script Args ?. script Args ĊĠĠĠĠĠĠĠ Ġval Ġuse Script Args Types Ġ= Ġcurrent Script Args ?. script Args Types ?. map Ġ{ Ġit . java Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġconstructor Params : ĠArray < Class <* >> Ġ= Ġempty Array < Class <* >>() Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( use Script Args ?. map Indexed Ġ{ Ġi , Ġit Ġ-> Ġuse Script Args Types ?. get OrNull ( i ) Ġ?: Ġit ?. java Class Ġ?: ĠAny :: class . java Ġ} Ġ?: Ġempty List ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġconstructor Args : ĠArray < out ĠAny ?> Ġ= Ġuse Script Args . or Empty () ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġtry / catch Ġ? ĊĠĠĠĠĠĠĠ Ġval Ġscript Instance Constructor Ġ= Ġscript Class . get Constructor (* constructor Params ) ĊĊĠĠĠĠĠĠĠ Ġval Ġscript Instance Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( invoke Wrapper Ġ!= Ġnull ) Ġinvoke Wrapper . invoke Ġ{ Ġscript Instance Constructor . newInstance (* constructor Args ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġscript Instance Constructor . newInstance (* constructor Args ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠInvocation TargetException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore Ġeverything Ġin Ġthe Ġstack Ġtrace Ġuntil Ġthis Ġconstructor Ġcall ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ eval ĠRe pl Eval Result . Error . Runtime ( render Repl StackTrace ( e . cause !! , Ġstart From MethodName Ġ= Ġ"${ script Class . name }. < init > "), Ġe . target Exception Ġas ? ĠException ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore Ġeverything Ġin Ġthe Ġstack Ġtrace Ġuntil Ġthis Ġconstructor Ġcall ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ eval ĠRe pl Eval Result . Error . Runtime ( render Repl StackTrace ( e . cause !! , Ġstart From MethodName Ġ= Ġ"${ script Class . name }. < init > "), Ġe Ġas ? ĠException ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġresult Field Ġ= Ġscript Class . getDeclared Field ( SCRIPT _ RESULT _ FIELD _ NAME ). apply Ġ{ Ġis Accessible Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult Value : ĠAny ? Ġ= Ġresult Field . get ( script Instance ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Script Args Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbindings Ġ= Ġcurrent Script Args . script Args [ 0 ] Ġas ĠBind ings ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvars Ġ= Ġcurrent Script Args . script Args [ 1 ] Ġas ĠMap < String , Any ?> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġvars ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbindings [ key ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( compile Result . has Result ) ĠRe pl Eval Result . Value Result ( result Value , Ġcompile Result . type ) ĊĠĠĠĠĠĠĠ Ġelse ĠRe pl Eval Result . Unit Result () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠS CRIPT _ RESULT _ FIELD _ NAME Ġ= Ġ"\ $\ $ result " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Classes ( compile Result : ĠScript Compile Result . Compiled Classes ĊĠĠĠ Ġ): ĠPair < ClassLoader , ĠClass < out ĠAny >> Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmain Line ClassName : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġclass Loader Ġ= Ġmake Script ClassLoader ( base Class loader , Ġcompile Result . classpath Add endum ) ĊĠĠĠĠĠĠĠ Ġfun ĠclassName From Path ( path : ĠString ) Ġ= ĠJ vm ClassName . by Internal Name ( path . remove Suffix (". class ")) ĊĠĠĠĠĠĠĠ Ġfun Ġcompiled Classes Names () Ġ= Ġcompile Result . classes . map Ġ{ ĠclassName From Path ( it . path ). internal Name . replace ('/', Ġ'.') Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexpected ClassName Ġ= Ġcompile Result . main ClassName ĊĠĠĠĠĠĠĠ Ġcompile Result . classes . filter Ġ{ Ġit . path . endsWith (". class ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= ĠclassName From Path ( it . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( className . internal Name Ġ== Ġexpected ClassName Ġ|| ĠclassName . internal Name . endsWith ("/ $ expected ClassName ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Line ClassName Ġ= ĠclassName . internal Name . replace ('/', Ġ'.') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Loader . addClass ( className , Ġit . bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġscript Class Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Loader . load Class ( main Line ClassName !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Error Ġloading Ġclass Ġ$ main Line ClassName : Ġknown Ġclasses : Ġ${ compiled Classes Names () }", Ġt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( class Loader , Ġscript Class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmake Script ClassLoader ( base Class loader : ĠClassLoader ?, Ġbase Classpath : ĠIterable < File >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScript ClassLoader ( URL ClassLoader ( base Classpath . map Ġ{ Ġit . to URI (). to URL () Ġ}. to Typed Array (), Ġbase Class loader )) Ċ Ċ }