/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 7 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . jetbrains . kotlin . idea . scratch . repl Ċ Ċ import Ġcom . intellij . execution . configurations . General CommandLine Ċ import Ġcom . intellij . execution . process . OS Process Handler Ċ import Ġcom . intellij . execution . process . Process Adapter Ċ import Ġcom . intellij . execution . process . Process Event Ċ import Ġcom . intellij . execution . process . Process Output Types Ċ import Ġcom . intellij . openapi . util . Key Ċ import Ġorg . jetbrains . kotlin . cli . common . repl . repl Input As Xml Ċ import Ġorg . jetbrains . kotlin . cli . common . repl . repl Normalize Line Break s Ċ import Ġorg . jetbrains . kotlin . cli . common . repl . repl Remove Line Break s InThe End Ċ import Ġorg . jetbrains . kotlin . cli . common . repl . repl Un escape Line Break s Ċ import Ġorg . jetbrains . kotlin . console . Kotlin Console Keeper Ċ import Ġorg . jetbrains . kotlin . console . actions . log Error Ċ import Ġorg . jetbrains . kotlin . idea . scratch .* Ċ import Ġorg . jetbrains . kotlin . idea . scratch . output . Scratch Output Ċ import Ġorg . jetbrains . kotlin . idea . scratch . output . Scratch OutputType Ċ import Ġorg . w 3 c . dom . Element Ċ import Ġorg . xml . sax . Input Source Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . nio . charset . Charset Ċ import Ġjavax . xml . parsers . Document BuilderFactory Ċ Ċ class ĠK t Scratch Repl Executor ( file : ĠScr atch File ) Ġ: ĠSequential Scratch Executor ( file ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġhistory : ĠRe pl History Ġ= ĠRe pl History () ĊĠĠĠ Ġprivate Ġvar Ġos Process Handler : ĠOS Process Handler ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġstart Execution () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodule Ġ= Ġfile . getModule () ĊĠĠĠĠĠĠĠ Ġval Ġcmd Line Ġ= ĠKotlin Console Keeper . create Repl CommandLine ( file . project , Ġmodule ) ĊĊĠĠĠĠĠĠĠ ĠLOG . print Debug Message (" Execute ĠREPL : Ġ${ cmd Line . command Line String }") ĊĊĠĠĠĠĠĠĠ Ġos Process Handler Ġ= ĠRe pl OS Process Handler ( cmd Line ) ĊĠĠĠĠĠĠĠ Ġos Process Handler ?. start Notify () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstop Execution ( callback : Ġ(() Ġ-> ĠUnit )? ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġos Process Handler Ġ= Ġos Process Handler Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callback Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġos Process Handler . add Process Listener ( object Ġ: ĠProcess Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprocess Terminated ( event : ĠProcess Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Command To Process (": quit ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Occurs (" Couldn 't Ġstop ĠREPL Ġprocess ", Ġe , Ġfalse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġos Process Handler . destroy Process () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear State () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear State () Ġ{ ĊĠĠĠĠĠĠĠ Ġhistory . clear () ĊĠĠĠĠĠĠĠ Ġos Process Handler Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġhandler . on Finish ( file ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexecute Statement ( expression : ĠScr atch Expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( need Process To Start ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Execution () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġhistory . add Entry ( expression ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Command To Process ( expression . element . text ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Occurs (" Couldn 't Ġexecute Ġstatement : Ġ${ expression . element . text }", Ġe , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġneed Process To Start (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġos Process Handler Ġ== Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Command To Process ( command : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . print Debug Message (" Send Ġto ĠREPL : Ġ${ command }") ĊĊĠĠĠĠĠĠĠ Ġval Ġprocess Input OS Ġ= Ġos Process Handler ?. process Input Ġ?: Ġreturn Ġlog Error ( this :: class . java , Ġ"< p > Broken Ġexecute Ġstream </ p >") ĊĠĠĠĠĠĠĠ Ġval Ġcharset Ġ= Ġos Process Handler ?. charset Ġ?: ĠChar sets . UTF _ 8 ĊĊĠĠĠĠĠĠĠ Ġval Ġxml Res Ġ= Ġcommand . repl Input As Xml () ĊĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġ(" $ xml Res \ n "). toByteArray ( charset ) ĊĠĠĠĠĠĠĠ Ġprocess Input OS . write ( bytes ) ĊĠĠĠĠĠĠĠ Ġprocess Input OS . flush () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠRe pl History Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġentries Ġ= Ġarray ListOf < Scratch Expression >() ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġprocessed Entries Count : ĠInt Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Entry ( entry : ĠScr atch Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentries . add ( entry ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġlast Un processed Entry (): ĠScr atch Expression ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġentries . take If Ġ{ Ġprocessed Entries Count Ġ< Ġentries . size Ġ} ?. get ( processed Entries Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġlast Processed Entry (): ĠScr atch Expression ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( processed Entries Count Ġ< Ġ 1 ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Processed Entry Index Ġ= Ġprocessed Entries Count Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġentries . take If Ġ{ Ġlast Processed Entry Index Ġ< Ġentries . size Ġ} ?. get ( last Processed Entry Index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġentry Processed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessed Entries Count ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentries Ġ= Ġarray ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessed Entries Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġis All Processed () Ġ= Ġentries . size Ġ== Ġprocessed Entries Count ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠRe pl OS Process Handler ( cmd : ĠGeneral CommandLine ) Ġ: ĠOS Process Handler ( cmd ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfactory Ġ= ĠDocument BuilderFactory . newInstance () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnotify Text Available ( text : ĠString , Ġoutput Type : ĠKey <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text . startsWith (" warning : Ġclasspath Ġentry Ġpoints Ġto Ġa Ġnon - existent Ġlocation ")) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( output Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProcess Output Types . STDOUT Ġ-> Ġhandle Repl Message ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProcess Output Types . STD ERR Ġ-> Ġerror Occurs ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnotify Process Terminated ( exit Code : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . notify Process Terminated ( exit Code ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear State () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġstr To Source ( s : ĠString , Ġencoding : ĠCharset Ġ= ĠChar sets . UTF _ 8 ) Ġ= ĠInput Source ( ByteArray InputStream ( s . toByteArray ( encoding ))) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġhandle Repl Message ( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text . isBlank ()) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory . new Document Builder (). parse ( str To Source ( text )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhandler . error ( file , Ġ" Couldn 't Ġparse ĠREPL Ġoutput : Ġ$ text ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġoutput . firstChild Ġas ĠElement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Type Ġ= Ġroot . getAttribute (" type ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġroot . textContent . repl Un escape Line Break s (). repl Normalize Line Break s (). repl Remove Line Break s InThe End () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . print Debug Message (" REPL Ġoutput : Ġ$ output Type Ġ$ content ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( output Type Ġin Ġset Of (" SUCCESS ", Ġ" COMPILE _ ERROR ", Ġ" INTERNAL _ ERROR ", Ġ" RUNTIME _ ERROR ", Ġ" READ LINE _ END ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhistory . entry Processed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( history . is All Processed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . on Finish ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparse Repl Output ( content , Ġoutput Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Expression Ġ= Ġif Ġ( output Type Ġ== Ġ" USER _ OUTPUT ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsuccess Ġcommand Ġis Ġprinted Ġafter Ġuser Ġoutput ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhistory . last Un processed Entry () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhistory . last Processed Entry () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Expression Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . handle ( file , Ġlast Expression , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġparse Repl Output ( text : ĠString , Ġoutput Type : ĠString ): ĠScr atch Output ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( output Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" USER _ OUTPUT " Ġ-> ĠScr atch Output ( text , ĠScr atch OutputType . OUTPUT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" REPL _ RESULT " Ġ-> ĠScr atch Output ( text , ĠScr atch OutputType . RESULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" REPL _ IN COMPLETE ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" INTERNAL _ ERROR ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" COMPILE _ ERROR ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" RUNTIME _ ERROR " Ġ-> ĠScr atch Output ( text , ĠScr atch OutputType . ERROR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }