/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 6 Ġ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 . clean Ċ Ċ import Ġcom . google . dart . compiler . backend . js . ast . Js Block Ċ import Ġcom . google . dart . compiler . backend . js . ast . Js Invocation Ċ import Ġcom . google . dart . compiler . backend . js . ast . Js Name Ref Ċ import Ġcom . google . dart . compiler . backend . js . ast . Recursive Js Visitor Ċ Ċ // ĠTODO : Ġthis Ġoptimization Ġis Ġa Ġlittle Ġun fair . ĠIt Ġtries Ġto Ġrecognize Ġpattern Ġlike Ġthis Ġa . bind ( b )( args ) Ġand Ċ // Ġreplace Ġit Ġwith Ġb . a ( args ). ĠHowever , Ġwe Ġcan 't Ġbe Ġcompletely Ġsure Ġthat Ġ` a ` Ġis Ġa ĠFunction . Ċ // ĠUsing ĠJS - independent ĠAST Ġshould Ġsolve Ġthe Ġissue Ġ( as Ġwell Ġas Ġmany Ġother Ġissues ). Ċ class ĠRed undant Bind Elimin ation ( private Ġval Ġroot : ĠJs Block ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġchanged Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġapply (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġroot . accept ( object Ġ: ĠRecursive Js Visitor () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Invocation ( invocation : ĠJs Invocation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Elimin ate ( invocation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Invocation ( invocation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġtry Elimin ate ( invocation : ĠJs Invocation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqualifier Ġ= Ġinvocation . qual ifier Ġas ? ĠJs Invocation Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter Qualifier Ġ= Ġqualifier . qual ifier Ġas ? ĠJs Name Ref Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġouter Qualifier . ident ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġ" bind ") Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqualifier Replacement Ġ= Ġouter Qualifier . qual ifier Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . qual ifier Ġ= Ġqualifier Replacement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġchanged ĊĠĠĠ Ġ} Ċ } Ċ