/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 8 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . ir . backend . js . transformers . ir To Js Ċ Ċ import Ġorg . jetbrains . kotlin . config . Common Configuration Keys Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . Compiler Result Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . Js Ir Backend Context Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . elim inate Dead Declarations Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . export . Export Model Generator Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . export . Export Model To Js Statements Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . export . Exported Module Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . export . to TypeScript Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . lower . Static Members Lower ing Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . utils .* Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Declaration WithName Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Module Fragment Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Simple Function Ċ import Ġorg . jetbrains . kotlin . ir . declarations . path Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Class Symbol Ċ import Ġorg . jetbrains . kotlin . js . backend . ast .* Ċ import Ġorg . jetbrains . kotlin . js . config . JS Configuration Keys Ċ import Ġorg . jetbrains . kotlin . utils . DFS Ċ Ċ class ĠIr Module To Js Transformer ( ĊĠĠĠ Ġprivate Ġval Ġbackend Context : ĠJs Ir Backend Context , ĊĠĠĠ Ġprivate Ġval Ġmain Function : ĠIr Simple Function ?, ĊĠĠĠ Ġprivate Ġval Ġmain Arguments : ĠList < String > ?, ĊĠĠĠ Ġprivate Ġval Ġgenerate Script Module : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġvar Ġn amer : ĠName Tables Ġ= ĠName Tables ( emptyList ()) Ċ ) Ġ{ ĊĠĠĠ Ġval ĠmoduleName Ġ= Ġbackend Context . configuration [ Common Configuration Keys . MODULE _ NAME ] !! ĊĠĠĠ Ġprivate Ġval Ġmodule Kind Ġ= Ġbackend Context . configuration [ JS Configuration Keys . MODULE _ KIND ] !! ĊĠĠĠ Ġprivate Ġval Ġgenerate Region Comments Ġ= Ġbackend Context . configuration . getBoolean ( JS Configuration Keys . GENER ATE _ REGION _ COMMENTS ) ĊĊĠĠĠ Ġfun Ġgenerate Module ( module : ĠIr Module Fragment , Ġfull Js : ĠBoolean Ġ= Ġtrue , Ġd ce Js : ĠBoolean Ġ= Ġfalse ): ĠCompiler Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġadditional Packages Ġ= Ġwith ( backend Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexternal Package Fragment . values Ġ+ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb od ile ss Built Ins Package Fragment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintr insics . external Package Fragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ Ġpackage Level Js Modules ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġexported Module Ġ= ĠExport Model Generator ( backend Context ). generate Export ( module ) ĊĠĠĠĠĠĠĠ Ġval Ġd ts Ġ= Ġexported Module . to TypeScript () ĊĊĠĠĠĠĠĠĠ Ġmodule . files . forEach Ġ{ ĠStatic Members Lower ing ( backend Context ). lower ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġn amer . merge ( module . files , Ġadditional Packages ) ĊĊĠĠĠĠĠĠĠ Ġval Ġjs Code Ġ= Ġif Ġ( full Js ) Ġgenerate Wrapped Module Body ( module , Ġexported Module ) Ġelse Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġd ce Js Code Ġ= Ġif Ġ( dce Js ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeliminate Dead Declarations ( module , Ġbackend Context , Ġmain Function ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Wrapped Module Body ( module , Ġexported Module ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCompiler Result ( js Code , Ġd ce Js Code , Ġd ts ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Wrapped Module Body ( module : ĠIr Module Fragment , Ġexported Module : ĠExport ed Module ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprogram Ġ= ĠJs Program () ĊĊĠĠĠĠĠĠĠ Ġval Ġname Generator Ġ= ĠIr N amer Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnewName Tables Ġ= Ġn amer ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġstatic Context Ġ= ĠJs Static Context ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackend Context Ġ= Ġbackend Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir N amer Ġ= Ġname Generator ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġroot Context Ġ= ĠJs Generation Context ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Function Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Context Ġ= Ġstatic Context ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġroot Function Ġ= ĠJs Function ( program . rootScope , ĠJs Block (), Ġ" root Ġfunction ") ĊĠĠĠĠĠĠĠ Ġval Ġinternal ModuleName Ġ= ĠJs Name ("_ ") ĊĊĠĠĠĠĠĠĠ Ġval Ġ( import Statements , Ġimported Js Modules ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Import Statements ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetName For External Declaration Ġ= Ġ{ Ġroot Context . getName For Static Declaration ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclare Fresh Global Ġ= Ġ{ ĠJs Name ( sanitize Name ( it )) Ġ} Ġ// ĠTODO : ĠDeclare Ġfresh Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmodule Body Ġ= Ġgenerate Module Body ( module , Ġroot Context ) ĊĠĠĠĠĠĠĠ Ġval Ġexport Statements Ġ= ĠExport Model To Js Statements ( internal ModuleName , Ġn amer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. generate Module Export ( exported Module ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( generate Script Module ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( program . global Block ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add With Comment (" block : Ġimports ", Ġimport Statements ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements Ġ+= Ġmodule Body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add With Comment (" block : Ġexports ", Ġexport Statements ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( root Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ+= ĠJs Parameter ( internal ModuleName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ+= Ġimported Js Modules . map Ġ{ ĠJs Parameter ( it . internal Name ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( body ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add With Comment (" block : Ġimports ", Ġimport Statements ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements Ġ+= Ġmodule Body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add With Comment (" block : Ġexports ", Ġexport Statements ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements Ġ+= Ġgenerate Call To Main ( root Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements Ġ+= ĠJs Return ( internal ModuleName . make Ref ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogram . global Block . statements Ġ+= ĠModule Wrapper Translation . wrap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmoduleName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Function , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimported Js Modules , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogram , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind Ġ= Ġmodule Kind ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġprogram . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Module Body ( module : ĠIr Module Fragment , Ġcontext : ĠJs Generation Context ): ĠList < Js Statement > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatements Ġ= Ġmutable ListOf < Js Statement >(). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! generate Script Module ) Ġit Ġ+= ĠJs StringLiteral (" use Ġstrict "). make Stmt () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpre Declaration Block Ġ= ĠJs Global Block () ĊĠĠĠĠĠĠĠ Ġval Ġpost Declaration Block Ġ= ĠJs Global Block () ĊĊĠĠĠĠĠĠĠ Ġstatements . add With Comment (" block : Ġpre - declaration ", Ġpre Declaration Block ) ĊĊĠĠĠĠĠĠĠ Ġval Ġgenerate FilePath s Ġ= Ġbackend Context . configuration . getBoolean ( JS Configuration Keys . GENER ATE _ COMMENTS _ WITH _ FILE _ PATH ) ĊĠĠĠĠĠĠĠ Ġval Ġpath Prefix Map Ġ= Ġbackend Context . configuration . getMap ( JS Configuration Keys . FILE _ PATHS _ PREFIX _ MAP ) ĊĊĠĠĠĠĠĠĠ Ġmodule . files . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Statements Ġ= Ġit . accept ( Ir File To Js Transformer (), Ġcontext ). statements ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Statements . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstart Comment Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( generate Region Comments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Comment Ġ= Ġ" region Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( generate Region Comments Ġ|| Ġgenerate FilePath s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Path Ġ= Ġit . path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġpath Prefix Map . entries ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġ( k , Ġ_) Ġ-> Ġoriginal Path . startsWith ( k ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġ( k , Ġv ) Ġ-> Ġv Ġ+ Ġoriginal Path . substring ( k . length ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġoriginal Path ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Comment Ġ+= Ġ" file : Ġ$ path " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start Comment . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . add ( Js Single Line Comment ( start Comment )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . addAll ( file Statements ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . end Region () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġsort Ġmember Ġforwarding Ġcode ĊĠĠĠĠĠĠĠ Ġprocess Class Models ( context . static Context . class Models , Ġpre Declaration Block , Ġpost Declaration Block ) ĊĊĠĠĠĠĠĠĠ Ġstatements . add With Comment (" block : Ġpost - declaration ", Ġpost Declaration Block . statements ) ĊĠĠĠĠĠĠĠ Ġstatements . add With Comment (" block : Ġinit ", Ġcontext . static Context . initializer Block . statements ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( backend Context . has Tests ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . start Region (" block : Ġtests ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatements Ġ+= ĠJs Invocation ( context . getName For Static Function ( backend Context . test Container ). make Ref ()). make Stmt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatements . end Region () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstatements ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Main Arguments ( main Function : ĠIr Simple Function , Ġroot Context : ĠJs Generation Context ): ĠList < Js Expression > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmain Arguments Ġ= Ġthis . main Arguments !! ĊĠĠĠĠĠĠĠ Ġval Ġmain Arguments Array Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( main Function . value Parameters . isNotEmpty ()) ĠJs Array Literal ( main Arguments . map Ġ{ ĠJs StringLiteral ( it ) Ġ}) Ġelse Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġcontinuation Ġ= Ġif Ġ( main Function . is Suspend ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġempty Continuation Field Ġ= Ġbackend Context . coroutine Empty Continuation . owner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Context . getName For Field ( empty Continuation Field ). make Ref () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf NotNull ( main Arguments Array , Ġcontinuation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Call To Main ( root Context : ĠJs Generation Context ): ĠList < Js Statement > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( main Arguments Ġ== Ġnull ) Ġreturn Ġempty List () Ġ// Ġin Ġcase Ġ` NO _ MAIN ` Ġand Ġ` main (.. )` Ġexists ĊĠĠĠĠĠĠĠ Ġreturn Ġmain Function ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjs Name Ġ= Ġroot Context . getName For Static Function ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Js Invocation ( js Name . make Ref (), Ġgenerate Main Arguments ( it , Ġroot Context )). make Stmt ()) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Import Statements ( ĊĠĠĠĠĠĠĠ ĠgetName For External Declaration : Ġ( Ir Declaration WithName ) Ġ-> ĠJs Name , ĊĠĠĠĠĠĠĠ Ġdeclare Fresh Global : Ġ( String ) Ġ-> ĠJs Name ĊĠĠĠ Ġ): ĠPair < Mutable List < Js Statement >, ĠList < Js Imported Module >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeclaration Level Js Modules Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackend Context . declaration Level Js Modules . map Ġ{ Ġexternal Declaration Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjs Module Ġ= Ġexternal Declaration . get Js Module () !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠgetName For External Declaration ( external Declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJs Imported Module ( js Module , Ġname , Ġname . make Ref ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpackage Level Js Modules Ġ= Ġmutable ListOf < Js Imported Module >() ĊĠĠĠĠĠĠĠ Ġval Ġimport Statements Ġ= Ġmutable ListOf < Js Statement >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġbackend Context . package Level Js Modules ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjs Module Ġ= Ġfile . get Js Module () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjs Qualifier Ġ= Ġfile . get Js Qualifier () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( js Module Ġ!= Ġnull Ġ|| Ġjs Qualifier Ġ!= Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqualified Reference : ĠJs Name Ref ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( js Module Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinternal Name Ġ= Ġdeclare Fresh Global ("\ $ module \ $$ js Module ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Level Js Modules Ġ+= ĠJs Imported Module ( js Module , Ġinternal Name , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqualified Reference Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( js Qualifier Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Name . make Ref () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJs Name Ref ( js Qualifier , Ġinternal Name . make Ref ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqualified Reference Ġ= ĠJs Name Ref ( js Qualifier !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . declarations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Ir Declaration WithName >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġdeclaration Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecl Name Ġ= ĠgetName For External Declaration ( declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Statements . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJs Vars ( Js Vars . Js Var ( decl Name , ĠJs Name Ref ( decl Name , Ġqualified Reference ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġimported Js Modules Ġ= Ġ( declaration Level Js Modules Ġ+ Ġpackage Level Js Modules ). distinct By Ġ{ Ġit . key Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( import Statements , Ġimported Js Modules ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Class Models ( ĊĠĠĠĠĠĠĠ Ġclass Model Map : ĠMap < Ir Class Symbol , ĠJs Ir Class Model >, ĊĠĠĠĠĠĠĠ Ġpre Declaration Block : ĠJs Block , ĊĠĠĠĠĠĠĠ Ġpost Declaration Block : ĠJs Block ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeclaration Handler Ġ= Ġobject Ġ: ĠDFS . Abstract Node Handler < Ir Class Symbol , ĠUnit >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġresult () Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter Children ( current : ĠIr Class Symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Model Map [ current ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre Declaration Block . statements Ġ+= Ġit . pre Declaration Block . statements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Declaration Block . statements Ġ+= Ġit . post Declaration Block . statements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠDFS . dfs ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Model Map . keys , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġklass Ġ-> Ġclass Model Map [ klass ]?. super Classes Ġ?: Ġempty List () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration Handler ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠMutable List < Js Statement >. start Region ( description : ĠString Ġ= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( generate Region Comments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġ+= ĠJs Single Line Comment (" region Ġ$ description ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠMutable List < Js Statement >. end Region () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( generate Region Comments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġ+= ĠJs Single Line Comment (" endregion ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠMutable List < Js Statement >. add With Comment ( region Description : ĠString Ġ= Ġ"", Ġblock : ĠJs Block ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Region ( region Description ) ĊĠĠĠĠĠĠĠ Ġthis Ġ+= Ġblock ĊĠĠĠĠĠĠĠ Ġend Region () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠMutable List < Js Statement >. add With Comment ( region Description : ĠString Ġ= Ġ"", Ġstatements : ĠList < Js Statement >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( statements . isEmpty ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġstart Region ( region Description ) ĊĠĠĠĠĠĠĠ Ġthis Ġ+= Ġstatements ĊĠĠĠĠĠĠĠ Ġend Region () ĊĠĠĠ Ġ} Ċ }