/** Ċ Ġ* ĠĠĠĠĠ Ġfire fly - compiler Ġ- ĠFire fly ĠLanguage Ġparser Ġand Ġcompiler . Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠ ĠThe ĠMIT ĠLicense Ġ( MIT ) Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠCopyright Ġ( c ) ĠJon athan xD Ġ< https :// github . com / Jon athan xD /> Ċ Ġ* ĠĠĠĠĠ ĠCopyright Ġ( c ) Ġcontributors Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* ĠĠĠĠĠ Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* ĠĠĠĠĠ Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* ĠĠĠĠĠ Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* ĠĠĠĠĠ Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* ĠĠĠĠĠ Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* ĠĠĠĠĠ Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠĠĠĠĠ ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠĠĠĠĠ ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠĠĠĠĠ ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠĠĠĠĠ ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠĠĠĠĠ ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠĠĠĠĠ ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġio . github . fire fly lang . compiler . test . parse Ċ Ċ import Ġcom . github . jon athan xd . k ores . byte code . class loader . Code ClassLoader Ċ import Ġcom . github . jon athan xd . k ores . byte code . util . save Ċ import Ġio . github . fire fly lang . compiler . Fire fly Compilation Gun Ċ import Ġio . github . fire fly lang . compiler . Fire fly Compiled Unit Ċ import Ġio . github . fire fly lang . compiler . Fire fly Unit Ċ import Ġio . github . fire fly lang . compiler . errors . Error Report Ċ import Ġio . github . fire fly lang . compiler . parser . Parse Context Ċ import Ġio . github . fire fly lang . compiler . parser . parse Ċ import Ġio . github . fire fly lang . compiler . test . snippets .* Ċ import Ġio . kot est . core . spec . style . Fun Spec Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . channels . Closed Receive Channel Exception Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ import Ġjava . util . concurrent . Copy On Write ArrayList Ċ Ċ class ĠFire fly Invoke Test Ġ: ĠFun Spec ({ ĊĠĠĠ Ġtest (" simple Ġinvocation ") Ġ{ ĊĠĠĠĠĠĠĠ Ġparse ( simple Invocation , ĠChannel ( 1 0 ), ĠParse Context ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġtest (" simple Ġplus Ġinvocation ") Ġ{ ĊĠĠĠĠĠĠĠ Ġparse ( simple Plus Invocation , ĠChannel ( 1 0 ), ĠParse Context ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġtest (" simple Ġprintln Ġinvocation ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcompile Ġ= ĠFire fly Compilation Gun () ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile . compile Single Unit ( simple Println Invocation ) ĊĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġval Ġloader Ġ= ĠCode ClassLoader () ĊĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġloader . define ( result . compilation Result ) ĊĠĠĠĠĠĠĠ Ġprintln ( clazz ) ĊĠĠĠĠĠĠĠ Ġprintln ( clazz . declared Methods . content ToString ()) ĊĠĠĠĠĠĠĠ Ġval Ġep Ġ= Ġclazz . getDeclared Method (" entrypoint ", ĠArray < String >:: class . java ) ĊĠĠĠĠĠĠĠ Ġep . invoke ( null , ĠarrayOf < String >()) ĊĠĠĠĠĠĠĠ Ġprintln (" Compilation Ġtook Ġ${ Duration . between ( start , Ġend )} ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtest (" simple Ġprintln Ġhello Ġworld Ġinvocation ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcompile Ġ= ĠFire fly Compilation Gun () ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile . compile Single Unit ( simple Println HelloWorld Invocation ) ĊĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġval Ġloader Ġ= ĠCode ClassLoader () ĊĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġloader . define ( result . compilation Result ) ĊĠĠĠĠĠĠĠ Ġprintln ( clazz ) ĊĠĠĠĠĠĠĠ Ġprintln ( clazz . declared Methods . content ToString ()) ĊĠĠĠĠĠĠĠ Ġval Ġep Ġ= Ġclazz . getDeclared Method (" entrypoint ", ĠArray < String >:: class . java ) ĊĠĠĠĠĠĠĠ Ġep . invoke ( null , ĠarrayOf < String >()) ĊĠĠĠĠĠĠĠ Ġprintln (" Compilation Ġtook Ġ${ Duration . between ( start , Ġend )} ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtest (" simple Ġprintln Ġhello Ġworld Ġerror Ġinvocation ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcompile Ġ= ĠFire fly Compilation Gun () ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile . compile Single Unit ( simple E Println HelloWorld Invocation ) ĊĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġval Ġloader Ġ= ĠCode ClassLoader () ĊĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġloader . define ( result . compilation Result ) ĊĠĠĠĠĠĠĠ Ġprintln ( clazz ) ĊĠĠĠĠĠĠĠ Ġprintln ( clazz . declared Methods . content ToString ()) ĊĠĠĠĠĠĠĠ Ġval Ġep Ġ= Ġclazz . getDeclared Method (" entrypoint ", ĠArray < String >:: class . java ) ĊĠĠĠĠĠĠĠ Ġep . invoke ( null , ĠarrayOf < String >()) ĊĠĠĠĠĠĠĠ Ġprintln (" Compilation Ġtook Ġ${ Duration . between ( start , Ġend )} ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtest (" simple Ġprintln Ġhello Ġworld Ġerror Ġ 2 x Ġinvocation ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcompile Ġ= ĠFire fly Compilation Gun () ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile . compile Single Unit ( simple E Println HelloWorld 2 x Invocation ) ĊĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġval Ġloader Ġ= ĠCode ClassLoader () ĊĠĠĠĠĠĠĠ Ġval Ġgenerated Classes Ġ= ĠPaths . get (" generated - classes ") ĊĠĠĠĠĠĠĠ ĠFiles . create Directories ( generated Classes ) ĊĠĠĠĠĠĠĠ Ġresult . compilation Result . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . save ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerated Classes , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġloader . define ( result . compilation Result ) ĊĠĠĠĠĠĠĠ Ġprintln ( clazz ) ĊĠĠĠĠĠĠĠ Ġprintln ( clazz . declared Methods . content ToString ()) ĊĠĠĠĠĠĠĠ Ġval Ġep Ġ= Ġclazz . getDeclared Method (" entrypoint ", ĠArray < String >:: class . java ) ĊĠĠĠĠĠĠĠ Ġep . invoke ( null , ĠarrayOf < String >()) ĊĠĠĠĠĠĠĠ Ġprintln (" Compilation Ġtook Ġ${ Duration . between ( start , Ġend )} ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtest (" simple Ġnull Ġargument ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcompile Ġ= ĠFire fly Compilation Gun () ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile . compile Single Unit ( simple Null Arg Invocation ) ĊĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġval Ġloader Ġ= ĠCode ClassLoader () ĊĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġloader . define ( result . compilation Result ) ĊĠĠĠĠĠĠĠ Ġprintln ( clazz ) ĊĠĠĠĠĠĠĠ Ġprintln ( clazz . declared Methods . content ToString ()) ĊĠĠĠĠĠĠĠ Ġval Ġep Ġ= Ġclazz . getDeclared Method (" entrypoint ", ĠArray < String >:: class . java ) ĊĠĠĠĠĠĠĠ Ġep . invoke ( null , ĠarrayOf < String >()) ĊĠĠĠĠĠĠĠ Ġprintln (" Compilation Ġtook Ġ${ Duration . between ( start , Ġend )} ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtest (" simple Ġprintln Ġinvocation Ġtim ings ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcompile Ġ= ĠFire fly Compilation Gun () ĊĠĠĠĠĠĠĠ Ġval Ġsamples Total Ġ= Ġ 1 0 0 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġsamples Ġ= ĠArrayList < Duration >( samples Total ) ĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= ĠArrayList < Fire fly Compiled Unit >( samples Total ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. samples Total ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcompile . compile Single Unit ( simple Println Invocation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults . add ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsamples . add ( Duration . between ( start , Ġend )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmax Ġ= Ġsamples . max Of Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmin Ġ= Ġsamples . min Of Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsum Ġ= Ġsamples . reduce Ġ{ Ġacc , Ġduration Ġ-> Ġacc . plus ( duration ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġn ine th Ġ= ĠDuration . of Nan os (( sum . to Nan os (). toDouble () Ġ* Ġ( 9 9 . 0 Ġ/ Ġ 1 0 0 . 0 )). to Long ()); ĊĠĠĠĠĠĠĠ Ġval Ġn five th Ġ= ĠDuration . of Nan os (( sum . to Nan os (). toDouble () Ġ* Ġ( 9 5 . 0 Ġ/ Ġ 1 0 0 . 0 )). to Long ()); ĊĠĠĠĠĠĠĠ Ġval Ġfive th Ġ= ĠDuration . of Nan os (( sum . to Nan os (). toDouble () Ġ* Ġ( 5 0 . 0 Ġ/ Ġ 1 0 0 . 0 )). to Long ()); ĊĠĠĠĠĠĠĠ Ġval Ġavg Ġ= Ġsum . div ided By ( samples Total . to Long ()) ĊĊĠĠĠĠĠĠĠ Ġprintln (" Comp il ations Ġtook Ġavg Ġof Ġ$ avg . ĠMax : Ġ$ max . ĠMin : Ġ$ min . Ġ 9 9 th : Ġ$ n ine th . Ġ 9 5 th : Ġ$ nf ive th . Ġ 5 0 th : Ġ$ five th .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtest (" simple Ġprintln Ġinvocation Ġtim ings Ġgun ned ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcompile Ġ= ĠFire fly Compilation Gun () ĊĠĠĠĠĠĠĠ Ġval Ġsamples Total Ġ= Ġ 1 0 0 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġsamples Ġ= ĠArrayList < Duration >( samples Total ) ĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= ĠArrayList < Fire fly Compiled Unit >( samples Total ) ĊĠĠĠĠĠĠĠ Ġval Ġjobs Ġ= ĠArrayList < Job >( samples Total ) ĊĊĠĠĠĠĠĠĠ Ġval Ġunits Ġ= ĠChannel < Fire fly Unit >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. samples Total ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjobs . add ( Coroutine Scope ( Dispatch ers . IO ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunits . send ( simple Println Invocation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠChannel Ġcloser ĊĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Completed Ġ= Ġjobs . all Ġ{ Ġit . is Completed Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! all Completed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunits . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Channel Ġ= Ġcompile . compile ( units ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecv Ġ= Ġresult Channel . receive () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults . add ( recv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsamples . add ( Duration . between ( start , Ġend )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠClosed Receive Channel Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmax Ġ= Ġsamples . max Of Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmin Ġ= Ġsamples . min Of Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsum Ġ= Ġsamples . reduce Ġ{ Ġacc , Ġduration Ġ-> Ġacc . plus ( duration ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġn ine th Ġ= ĠDuration . of Nan os (( sum . to Nan os (). toDouble () Ġ* Ġ( 9 9 . 0 Ġ/ Ġ 1 0 0 . 0 )). to Long ()); ĊĠĠĠĠĠĠĠ Ġval Ġn five th Ġ= ĠDuration . of Nan os (( sum . to Nan os (). toDouble () Ġ* Ġ( 9 5 . 0 Ġ/ Ġ 1 0 0 . 0 )). to Long ()); ĊĠĠĠĠĠĠĠ Ġval Ġfive th Ġ= ĠDuration . of Nan os (( sum . to Nan os (). toDouble () Ġ* Ġ( 5 0 . 0 Ġ/ Ġ 1 0 0 . 0 )). to Long ()); ĊĠĠĠĠĠĠĠ Ġval Ġavg Ġ= Ġsum . div ided By ( samples Total . to Long ()) ĊĊĠĠĠĠĠĠĠ Ġprintln (" Comp il ations Ġtook Ġavg Ġof Ġ$ avg . ĠMax : Ġ$ max . ĠMin : Ġ$ min . Ġ 9 9 th : Ġ$ n ine th . Ġ 9 5 th : Ġ$ nf ive th . Ġ 5 0 th : Ġ$ five th .") ĊĠĠĠ Ġ} Ċ })