/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 3 Ġ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 . k 2 js . translate . call Translator Ċ Ċ import Ġcom . google . dart . compiler . backend . js . ast . Js Expression Ċ import Ġcom . google . dart . compiler . backend . js . ast . Js Name Ref Ċ import Ġcom . google . dart . compiler . backend . js . ast . Js Invocation Ċ import Ġjava . util . Collections Ċ import Ġjava . util . ArrayList Ċ import Ġorg . jetbrains . k 2 js . translate . context . N amer Ċ import Ġorg . jetbrains . jet . lang . descriptors . Callable Descriptor Ċ import Ġcom . google . dart . compiler . backend . js . ast . Js New Ċ import Ġorg . jetbrains . jet . lang . descriptors . Constructor Descriptor Ċ import Ġorg . jetbrains . jet . lang . types . lang . Kotlin Built Ins Ċ import Ġorg . jetbrains . k 2 js . translate . general . Translation Ċ import Ġcom . google . dart . compiler . backend . js . ast . Js Literal Ċ import Ġcom . google . dart . compiler . backend . js . ast . Js Name Ċ import Ġorg . jetbrains . k 2 js . translate . context . Translation Context Ċ import Ġorg . jetbrains . k 2 js . translate . reference . Call Argument Translator Ċ import Ġorg . jetbrains . jet . lang . descriptors . Callable Member Descriptor Ċ import Ġorg . jetbrains . jet . lang . descriptors . Vis ibilities Ċ import Ġorg . jetbrains . jet . lang . psi . Call . Call Type Ċ Ċ public Ġfun Ġadd Receiver To Args ( receiver : ĠJs Expression , Ġarguments : ĠList < Js Expression >): ĠList < Js Expression > Ġ{ ĊĠĠĠ Ġif Ġ( arguments . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġreturn ĠCollections . singletonList ( receiver ) ĊĊĠĠĠ Ġval Ġargument List Ġ= ĠArrayList < Js Expression >( 1 Ġ+ Ġarguments . size ()) ĊĠĠĠ Ġargument List . add ( receiver ) ĊĠĠĠ Ġargument List . addAll ( arguments ) ĊĠĠĠ Ġreturn Ġargument List Ċ } ĊĊ Ċ // Ġcall Ġmay Ġbe Ġnative Ġand | or Ġwith Ġspread Operator Ċ object ĠDefault Function Call Case Ġ: ĠFunction Call Case Ġ{ ĊĠĠĠ Ġ// ĠTODO : Ġrefactor Ġafter Ġfix ĠArguments Info Ġ- Ġduplicate Ġcode ĊĠĠĠ Ġprivate Ġfun Ġnative Spread Fun With This Object Or Receiver ( arguments Info : ĠCall Argument Translator . Arguments Info , Ġfunction Name : ĠJs Name ): ĠJs Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcached Receiver Ġ= Ġarguments Info . get Cached Receiver () !! ĊĠĠĠĠĠĠĠ Ġval Ġfunction Call Ref Ġ= ĠN amer . get Function Apply Ref ( Js Name Ref ( function Name , Ġcached Receiver . assignment Expression ())) ĊĠĠĠĠĠĠĠ Ġreturn ĠJs Invocation ( function Call Ref , Ġarguments Info . get Translate Arguments ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Default Call With This Object ( arguments Info : ĠCall Argument Translator . Arguments Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Object : ĠJs Expression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Name : ĠJs Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Native : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Spread Operator : ĠBoolean ): ĠJs Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Native Ġ&& Ġhas Spread Operator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnative Spread Fun With This Object Or Receiver ( arguments Info , Ġfunction Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfunction Ref Ġ= ĠJs Name Ref ( function Name , Ġthis Object ) ĊĠĠĠĠĠĠĠ Ġreturn ĠJs Invocation ( function Ref , Ġarguments Info . get Translate Arguments ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Default Call Without Receiver ( context : ĠTranslation Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Info : ĠCall Argument Translator . Arguments Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallable Descriptor : ĠCallable Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Name : ĠJs Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Native : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Spread Operator : ĠBoolean ): ĠJs Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Native Ġ&& Ġhas Spread Operator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Call Ref Ġ= ĠN amer . get Function Apply Ref ( Js Name Ref ( function Name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJs Invocation ( function Call Ref , Ġarguments Info . get Translate Arguments ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is Native ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJs Invocation ( Js Name Ref ( function Name ), Ġarguments Info . get Translate Arguments ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfunction Ref Ġ= Ġcontext . alias Or Value ( callable Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqualifier For Function Ġ= Ġcontext . get Qualifier For Descriptor ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJs Name Ref ( function Name , Ġqualifier For Function ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠJs Invocation ( function Ref , Ġarguments Info . get Translate Arguments ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠFunction Call Info . no Re ceiv ers (): ĠJs Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Default Call Without Receiver ( context , Ġarguments Info , Ġcallable Descriptor , Ġfunction Name , Ġis Native (), Ġhas Spread Operator ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠFunction Call Info . this Object (): ĠJs Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Default Call With This Object ( arguments Info , Ġthis Object !! , Ġfunction Name , Ġis Native (), Ġhas Spread Operator ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠFunction Call Info . receiver Argument (): ĠJs Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Native () Ġ&& Ġhas Spread Operator ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnative Spread Fun With This Object Or Receiver ( arguments Info , Ġfunction Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is Native ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJs Invocation ( Js Name Ref ( function Name , Ġreceiver Object ), Ġarguments Info . get Translate Arguments ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfunction Ref Ġ= Ġcontext . alias Or Value ( callable Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqualifier For Function Ġ= Ġcontext . get Qualifier For Descriptor ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJs Name Ref ( function Name , Ġqualifier For Function ) Ġ// ĠTODO : Ġre make Ġto Ġcall ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġreference To Call Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callable Descriptor . get Visibility () Ġ== ĠVis ibilities . LOCAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN amer . get Function Call Ref ( function Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Ref ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠJs Invocation ( reference To Call , Ġadd Receiver To Args ( receiver Object !! , Ġarguments Info . get Translate Arguments ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠFunction Call Info . both Re ceiv ers (): ĠJs Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġthink Ġabout Ġcr azy Ġcase : Ġspread Operator Ġ+ Ġnative ĊĠĠĠĠĠĠĠ Ġval Ġfunction Ref Ġ= ĠJs Name Ref ( function Name , Ġthis Object !! ) ĊĠĠĠĠĠĠĠ Ġreturn ĠJs Invocation ( function Ref , Ġadd Receiver To Args ( receiver Object !! , Ġarguments Info . get Translate Arguments ())) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ object ĠDelegate Function Intr insic Ġ: ĠDelegate Intr insic < Function Call Info > Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠFunction Call Info . get Args (): ĠList < Js Expression > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġarguments Info . get Translate Arguments () ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun ĠFunction Call Info . get Descriptor (): ĠCallable Descriptor Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcallable Descriptor ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠInvoke Intr insic Ġ: ĠFunction Call Case Ġ{ ĊĠĠĠ Ġfun Ġcan Apply ( call Info : ĠFunction Call Info ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! call Info . callable Descriptor . getName (). asString (). equals (" invoke ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġparameter Count Ġ= Ġcall Info . callable Descriptor . getValue Parameters (). size () ĊĠĠĠĠĠĠĠ Ġval Ġfun Declaration Ġ= Ġcall Info . callable Descriptor . get Containing Declaration () ĊĠĠĠĠĠĠĠ Ġreturn Ġfun Declaration Ġ== Ġ(( if Ġ( call Info . callable Descriptor . get Receiver Parameter () Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Built Ins . getInstance (). get Function ( parameter Count ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Built Ins . getInstance (). getExtension Function ( parameter Count ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠFunction Call Info . this Object (): ĠJs Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠJs Invocation ( this Object , Ġarguments Info . get Translate Arguments ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun ĠFunction Call Info . both Re ceiv ers (): ĠJs Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠJs Invocation ( N amer . get Function Call Ref ( this Object !! ), Ġadd Receiver To Args ( receiver Object !! , Ġarguments Info . get Translate Arguments ())) ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠConstructor Call Case Ġ: ĠFunction Call Case Ġ{ ĊĠĠĠ Ġfun Ġcan Apply ( call Info : ĠFunction Call Info ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcall Info . callable Descriptor Ġis ĠConstructor Descriptor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠFunction Call Info . no Re ceiv ers (): ĠJs Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Native ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJs New ( Js Name Ref ( function Name ), Ġarguments Info . get Translate Arguments ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfunction Ref Ġ= Ġcontext . alias Or Value ( callable Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . get Qualified Reference ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠJs New ( function Ref , Ġarguments Info . get Translate Arguments ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠSuper Call Case Ġ: ĠFunction Call Case Ġ{ ĊĠĠĠ Ġfun Ġcan Apply ( call Info : ĠFunction Call Info ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcall Info . is Super Invocation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠFunction Call Info . this Object (): ĠJs Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġspread Ġoperator ĊĠĠĠĠĠĠĠ Ġval Ġprototype Class Ġ= ĠJs Name Ref ( N amer . get Prototype Name (), Ġthis Object !! ) ĊĠĠĠĠĠĠĠ Ġval Ġfunction Ref Ġ= ĠN amer . get Function Call Ref ( Js Name Ref ( function Name , Ġprototype Class )) ĊĠĠĠĠĠĠĠ Ġreturn ĠJs Invocation ( function Ref , Ġadd Receiver To Args ( Js Literal . THIS , Ġarguments Info . get Translate Arguments ())) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠFunction Call Info . translate Function Call (): ĠJs Expression Ġ{ ĊĠĠĠ Ġval Ġintr insic Ġ= ĠDelegate Function Intr insic . intrinsic ( this ) ĊĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġintr insic Ġ!= Ġnull Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintr insic ĊĠĠĠĠĠĠĠ ĠInvoke Intr insic . can Apply ( this ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInvoke Intr insic . translate ( this ) ĊĠĠĠĠĠĠĠ ĠConstructor Call Case . can Apply ( this ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConstructor Call Case . translate ( this ) ĊĠĠĠĠĠĠĠ ĠSuper Call Case . can Apply ( this ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSuper Call Case . translate ( this ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDefault Function Call Case . translate ( this ) ĊĠĠĠ Ġ} Ċ }