package Ġcom . github . kh ud . ks hell . repl Ċ Ċ import Ġorg . jetbrains . kotlin . cli . common . repl .* Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . Jvm ClassName Ċ import Ġjava . io . File Ċ import Ġjava . net . URL ClassLoader Ċ import Ġkotlin . concurrent . write Ċ Ċ open Ġclass ĠRe pl Evaluator ( ĊĠĠĠĠĠĠĠ Ġval Ġbase Classpath : ĠIterable < File >, ĊĠĠĠĠĠĠĠ Ġval Ġbase Class loader : ĠClassLoader ? Ġ= ĠThread . currentThread (). context ClassLoader ) Ġ{ ĊĊĠĠĠ Ġval Ġtop ClassLoader : ĠRe pl ClassLoader Ġ= Ġmake Repl ClassLoader ( base Class loader , Ġbase Classpath ) ĊĊĠĠĠ Ġfun Ġeval ( state : ĠRe pl State , Ġdata : ĠCompilation Data , ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke Wrapper : ĠInvoke Wrapper ?): ĠResult < Eval Result , ĠEval Error > Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . lock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscript Class Ġ= Ġprocess Classes ( data . classes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscript Instance Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscript Instance Ġ= Ġif Ġ( invoke Wrapper Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke Wrapper . invoke Ġ{ Ġscript Class . getDeclared Field (" INSTANCE "). get ( null ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscript Class . getDeclared Field (" INSTANCE "). get ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscript Instance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . Error ( Eval Error . RuntimeError ( e . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġe . cause ?. message Ġ?: Ġe . java Class . canonical Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . cause Ġas ? ĠException Ġ?: Ġe Ġas ? ĠException )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommit Snippets ( state , Ġdata . snippets ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Field Ġ= Ġscript Class . getDeclared Field ( Repl Compiler . RESULT _ FIELD _ NAME ). apply Ġ{ Ġis Accessible Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Value : ĠAny ? Ġ= Ġresult Field . get ( script Instance ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( data . classes . has Result ) ĠResult . Success ( Eval Result . Value Result ( data . classes . value Result Variable !! , Ġresult Value , Ġdata . classes . type !! )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠResult . Success ( Eval Result . Unit Result ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcommit Snippets ( state : ĠRe pl State , Ġsnippets : ĠList < Snippet >) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . history . shadow ( snippets ) ĊĠĠĠĠĠĠĠ Ġstate . history . addAll ( snippets ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Classes ( compile Result : ĠComp iled Classes ): ĠClass < out ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmain Line ClassName : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ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 ('/', Ġ'.') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop ClassLoader . addClass ( className , Ġit . bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop ClassLoader . load Class ( main Line ClassName !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Error Ġloading Ġclass Ġ$ main Line ClassName : Ġknown Ġclasses : Ġ${ compiled Classes Names () }", Ġt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmake Repl ClassLoader ( base Class loader : ĠClassLoader ?, Ġbase Classpath : ĠIterable < File >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRe pl ClassLoader ( URL ClassLoader ( base Classpath . map Ġ{ Ġit . to URI (). to URL () Ġ}. to Typed Array (), Ġbase Class loader )) Ċ Ċ }