/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 5 Ġ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 . js . inline . util Ċ Ċ import Ġcom . google . dart . compiler . backend . js . ast .* Ċ import Ġcom . google . dart . compiler . backend . js . ast . metadata . static Ref Ċ Ċ import Ġorg . jetbrains . kotlin . js . inline . util . collect ors . Instance Collector Ċ import Ġorg . jetbrains . kotlin . js . inline . util . collect ors . Property Collector Ċ import Ġorg . jetbrains . kotlin . js . translate . expression .* Ċ import Ġjava . util .* Ċ Ċ fun Ġcollect Function References Inside ( scope : ĠJs Node ): ĠList < Js Name > Ġ= ĊĠĠĠĠĠĠĠ Ġcollect Referenced Names ( scope ). filter Ġ{ Ġit . static Ref Ġis ĠJs Function Ġ} Ċ Ċ private Ġfun Ġcollect Referenced Names ( scope : ĠJs Node ): ĠSet < Js Name > Ġ{ ĊĠĠĠ Ġval Ġreferences Ġ= ĠIdentity Set < Js Name >() ĊĊĠĠĠ Ġobject Ġ: ĠRecursive Js Visitor () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Break ( x : ĠJs Break ) Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Continue ( x : ĠJs Continue ) Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( x : ĠJs Vars . Js Var ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitializer Ġ= Ġx . init Expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( initializer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccept ( initializer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Name Ref ( name Ref : ĠJs Name Ref ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Name Ref ( name Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġname Ref . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreferences Ġ+= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. accept ( scope ) ĊĊĠĠĠ Ġreturn Ġreferences Ċ } Ċ Ċ fun Ġcollect Used Names ( scope : ĠJs Node ): ĠSet < Js Name > Ġ{ ĊĠĠĠ Ġval Ġreferences Ġ= ĠIdentity Set < Js Name >() ĊĊĠĠĠ Ġobject Ġ: ĠRecursive Js Visitor () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Break ( x : ĠJs Break ) Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Continue ( x : ĠJs Continue ) Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( x : ĠJs Vars . Js Var ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitializer Ġ= Ġx . init Expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( initializer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccept ( initializer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Name Ref ( name Ref : ĠJs Name Ref ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Name Ref ( name Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġname Ref . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġnull Ġ&& Ġname Ref . qual ifier Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreferences . add ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Function ( x : ĠJs Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreferences Ġ+= Ġx . collect Free Variables () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. accept ( scope ) ĊĊĠĠĠ Ġreturn Ġreferences Ċ } Ċ Ċ fun Ġcollect Defined Names ( scope : ĠJs Node ): ĠSet < Js Name > Ġ{ ĊĠĠĠ Ġval Ġnames : ĠMutable Map < String , ĠJs Name > Ġ= ĠHashMap () ĊĊĠĠĠ Ġobject Ġ: ĠRecursive Js Visitor () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( x : ĠJs Vars . Js Var ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitializer Ġ= Ġx . init Expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( initializer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccept ( initializer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Name IfNeeded ( x . name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Expression Statement ( x : ĠJs Expression Statement ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression Ġ= Ġx . expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression Ġis ĠJs Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġexpression . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Name IfNeeded ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Expression Statement ( x ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSkip Ġfunction Ġexpression , Ġsince Ġit Ġdoes Ġnot Ġintroduce Ġname Ġin Ġscope Ġof Ġcontaining Ġfunction . ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġonly Ġexception Ġis Ġfunction Ġstatement , Ġthat Ġis Ġhandled Ġwith Ġthe Ġcode Ġabove . ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Function ( x : ĠJs Function ) Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġadd Name IfNeeded ( name : ĠJs Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġident Ġ= Ġname . ident ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Collected Ġ= Ġnames [ ident ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( name Collected Ġ== Ġnull Ġ|| Ġname Collected Ġ=== Ġname ) Ġ{ Ġ" amb iguous Ġidentifier Ġ$ name " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnames [ ident ] Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. accept ( scope ) ĊĊĠĠĠ Ġreturn Ġnames . values . toSet () Ċ } Ċ Ċ fun ĠJs Function . collect Free Variables () Ġ= Ġcollect Used Names ( body ) Ġ- Ġcollect Defined Names ( body ) Ġ- Ġparameters . map Ġ{ Ġit . name Ġ} Ċ Ċ fun Ġcollect Js Properties ( scope : ĠJs Node ): ĠIdentity HashMap < Js Name , ĠJs Expression > Ġ{ ĊĠĠĠ Ġval Ġcollector Ġ= ĠProperty Collector () ĊĠĠĠ Ġcollector . accept ( scope ) ĊĠĠĠ Ġreturn Ġcollector . properties Ċ } Ċ Ċ fun Ġcollect Named Functions ( scope : ĠJs Node ): ĠIdentity HashMap < Js Name , ĠJs Function > Ġ{ ĊĠĠĠ Ġval Ġnamed Functions Ġ= ĠIdentity HashMap < Js Name , ĠJs Function >() ĊĊĠĠĠ Ġfor Ġ(( name , Ġvalue ) Ġin Ġcollect Js Properties ( scope )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfunction : ĠJs Function ? Ġ= Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJs Function Ġ-> Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠInline Metadata . de compose ( value )?. function ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( function Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnamed Functions [ name ] Ġ= Ġfunction ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġnamed Functions Ċ } Ċ Ċ fun Ġ< T Ġ: ĠJs Node > Ġcollect Instances ( klass : ĠClass < T >, Ġscope : ĠJs Node ): ĠList < T > Ġ{ ĊĠĠĠ Ġreturn Ġwith ( Instance Collector ( klass , Ġvisit Nested Declarations Ġ= Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠ Ġaccept ( scope ) ĊĠĠĠĠĠĠĠ Ġcollected ĊĠĠĠ Ġ} Ċ } Ċ