/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 8 ĠJetBrains Ġs . r . o . Ġ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 . lower Ċ Ċ import Ġorg . jetbrains . kotlin . backend . common . Declaration Container Lower ing Pass Ċ import Ġorg . jetbrains . kotlin . backend . common . run On File Post fix Ċ import Ġorg . jetbrains . kotlin . descriptors . Value Parameter Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . impl . Lazy Class Receiver Parameter Descriptor Ċ import Ġorg . jetbrains . kotlin . ir . Ir Element Ċ import Ġorg . jetbrains . kotlin . ir . Ir Statement Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . Js Ir Backend Context Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . ir . Js Ir Builder Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . symbols . Js Symbol Builder Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . symbols . initialize Ċ import Ġorg . jetbrains . kotlin . ir . declarations .* Ċ import Ġorg . jetbrains . kotlin . ir . declarations . impl . Ir Function Impl Ċ import Ġorg . jetbrains . kotlin . ir . expressions .* Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir Call Impl Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir GetValue Impl Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir Return Impl Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Constructor Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Function Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Simple Function Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Value Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . impl . Ir Value Parameter Symbol Impl Ċ import Ġorg . jetbrains . kotlin . ir . types . Ir Type Ċ import Ġorg . jetbrains . kotlin . ir . util . default Type Ċ import Ġorg . jetbrains . kotlin . ir . util . transform Flat Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . Ir Element Transformer Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . Ir Element Transformer Void Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . transform Children Void Ċ Ċ class ĠSecondary Ctor Lower ing ( val Ġcontext : ĠJs Ir Backend Context ) Ġ{ ĊĊĠĠĠ Ġdata Ġclass ĠConstructor Pair ( val Ġdelegate : ĠIr Simple Function Symbol , Ġval Ġstub : ĠIr Simple Function Symbol ) ĊĊĠĠĠ Ġprivate Ġval Ġold Ctor To New Map Ġ= Ġmutable Map Of < Ir Constructor Symbol , ĠConstructor Pair >() ĊĊĠĠĠ Ġfun Ġget Constructor Processor Lower ing () Ġ= Ġobject Ġ: ĠDeclaration Container Lower ing Pass Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġlower ( ir Declaration Container : ĠIr Declaration Container ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Declaration Container . declarations . transform Flat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( it ) Ġ+ Ġlower Class ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} :: run On File Post fix ĊĊĠĠĠ Ġfun Ġget Constructor Redirect or Lower ing () Ġ= Ġobject Ġ: ĠDeclaration Container Lower ing Pass Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġlower ( ir Declaration Container : ĠIr Declaration Container ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( it Ġin Ġir Declaration Container . declarations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . accept ( Call site Red irection Transformer (), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} :: run On File Post fix ĊĊĠĠĠ Ġprivate Ġfun Ġlower Class ( ir Class : ĠIr Class ): ĠList < Ir Simple Function > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= Ġir Class . name . asString () ĊĠĠĠĠĠĠĠ Ġval Ġold Construct ors Ġ= Ġmutable ListOf < Ir Constructor >() ĊĠĠĠĠĠĠĠ Ġval Ġnew Construct ors Ġ= Ġmutable ListOf < Ir Simple Function >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( declaration Ġin Ġir Class . declarations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġis ĠIr Constructor Ġ&& Ġ! declaration . is Primary ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġdelegate Ġname Ġgeneration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Name Ġ= Ġ"${ className }_ init " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġshould Ġsplit Ġsecondary Ġconstructor Ġinto Ġtwo Ġfunctions , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ* Ġ ĠInitial izer Ġwhich Ġcontains Ġconstructor 's Ġbody Ġand Ġtakes Ġjust Ġcreated Ġobject Ġas Ġimplicit Ġparam Ġ`$ this ` ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ** ĠĠ ĠThis Ġfunction Ġis Ġalso Ġdeleg ation Ġconstructor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ* Ġ ĠCreation Ġfunction Ġwhich Ġhas Ġsame Ġsignature Ġwith Ġoriginal Ġconstructor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġcreates Ġnew Ġobject Ġvia Ġ` Object . create ` Ġbuilt In Ġand Ġpasses Ġit Ġto Ġcorresponding Ġ` Init ` Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġother Ġwords : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFoo :: constructor (...) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġbody ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ=> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFoo _ init _$ Init $( ..., Ġ$ this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġbody [ Ġthis Ġ= Ġ$ this Ġ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġreturn Ġ$ this ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFoo _ init _$ Create $( ...) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġval Ġt Ġ= ĠObject . create ( Foo . prototype ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġreturn ĠFoo _ init _$ Init $( ..., Ġt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Init Constructor Ġ= Ġcreate Init Constructor ( declaration , Ġir Class , Ġconstructor Name , Ġir Class . default Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Create Constructor Ġ= Ġcreate Create Constructor ( declaration , Ġnew Init Constructor , Ġconstructor Name , Ġir Class . default Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Ctor To New Map [ declaration . symbol ] Ġ= ĠConstructor Pair ( new Init Constructor . symbol , Ġnew Create Constructor . symbol ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Construct ors Ġ+= Ġdeclaration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Construct ors Ġ+= Ġnew Init Constructor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Construct ors Ġ+= Ġnew Create Constructor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġir Class . declarations . removeAll ( old Construct ors ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnew Construct ors ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠThis Usage Replace Transformer ( ĊĠĠĠĠĠĠĠ Ġval Ġfunction : ĠIr Function Symbol , ĊĠĠĠĠĠĠĠ Ġval Ġnew This Symbol : ĠIr Value Symbol , ĊĠĠĠĠĠĠĠ Ġval Ġold This Symbol : ĠIr Value Symbol ? ĊĠĠĠ Ġ) Ġ: ĊĠĠĠĠĠĠĠ ĠIr Element Transformer Void () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Return ( expression : ĠIr Return ): ĠIr Expression Ġ= ĠIr Return Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr GetValue Impl ( expression . start Offset , Ġexpression . end Offset , Ġnew This Symbol . owner . type , Ġnew This Symbol ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit GetValue ( expression : ĠIr GetValue ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . symbol Ġ== Ġold This Symbol ) ĠIr GetValue Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew This Symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . origin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Init Constructor ( ĊĠĠĠĠĠĠĠ Ġdeclaration : ĠIr Constructor , ĊĠĠĠĠĠĠĠ Ġklass : ĠIr Class , ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġtype : ĠIr Type ĊĠĠĠ Ġ): ĠIr Simple Function Ġ= ĊĠĠĠĠĠĠĠ ĠJs Symbol Builder . copy Function Symbol ( declaration . symbol , Ġ"${ name }_ \$ Init \$ "). let Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Symbol Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJs Symbol Builder . build Value Parameter ( it , Ġdeclaration . value Parameters . size , Ġtype , Ġ"\ $ this ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . initialize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Parameter Descriptor Ġ= Ġdeclaration . descriptor . dispatch Receiver Parameter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Parameters Ġ= Ġdeclaration . descriptor . type Parameters , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters Ġ= Ġdeclaration . descriptor . value Parameters Ġ+ Ġthis Symbol . descriptor Ġas ĠValue Parameter Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmod ality Ġ= Ġdeclaration . descriptor . modal ity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= Ġdeclaration . descriptor . visibility ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Param Ġ= ĠJs Ir Builder . build Value Parameter ( this Symbol , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold This Receiver Ġ= Ġklass . this Receiver ?. symbol ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIr Function Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . start Offset , Ġdeclaration . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . origin , Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Stmt Ġ= ĠJs Ir Builder . build Return ( it , ĠJs Ir Builder . build GetValue ( this Symbol ), Ġcontext . ir Built Ins . nothing Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatements Ġ= Ġ( declaration . body Ġas ĠIr Statement Container ). statements ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters Ġ+= Ġ( declaration . value Parameters Ġ+ Ġthis Param ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Parameters Ġ+= Ġdeclaration . type Parameters Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġdeclaration . parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= ĠJs Ir Builder . build Block Body ( statements Ġ+ Ġret Stmt ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Children Void ( This Usage Replace Transformer ( it , Ġthis Symbol , Ġold This Receiver )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġcreate Create Constructor ( ctor Orig : ĠIr Constructor , Ġctor Impl : ĠIr Simple Function , Ġname : ĠString , Ġtype : ĠIr Type ): ĠIr Simple Function Ġ= ĊĠĠĠĠĠĠĠ ĠJs Symbol Builder . copy Function Symbol ( ctor Orig . symbol , Ġ"${ name }_ \$ Create \$ "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . initialize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Parameter Descriptor Ġ= Ġctor Orig . descriptor . dispatch Receiver Parameter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Parameters Ġ= Ġctor Orig . descriptor . type Parameters , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters Ġ= Ġctor Orig . descriptor . value Parameters , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmod ality Ġ= Ġctor Orig . descriptor . modal ity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= Ġctor Orig . visibility ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIr Function Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctor Orig . start Offset , Ġctor Orig . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctor Orig . origin , Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters Ġ+= Ġctor Orig . value Parameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Parameters Ġ+= Ġctor Orig . type Parameters Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġctor Orig . parent ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcreate Function Intr insic Ġ= Ġcontext . intr insics . js Object Create ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Create Call Ġ= ĠJs Ir Builder . build Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Function Intr insic . symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( returnType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Delegate Call Ġ= ĠJs Ir Builder . build Call ( ctor Impl . symbol , Ġtype ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġvalue Parameters . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . put Value Argument ( i , ĠJs Ir Builder . build GetValue ( value Parameters [ i ]. symbol )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters . forEach Indexed Ġ{ Ġi , Ġp Ġ-> Ġit . put Value Argument ( i , ĠJs Ir Builder . build GetValue ( p . symbol )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . put Value Argument ( ctor Orig . value Parameters . size , Ġir Create Call ) Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Parameters . map Indexed Ġ{ Ġi , Ġt Ġ-> Ġctor Impl . type Parameters [ i ]. descriptor Ġ-> Ġ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Return Ġ= ĠJs Ir Builder . build Return ( it , Ġir Delegate Call , Ġcontext . ir Built Ins . nothing Type ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= ĠJs Ir Builder . build Block Body ( listOf ( ir Return )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinner Ġclass ĠCall site Red irection Transformer Ġ: ĠIr Element Transformer < Ir Function ?> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Function ( declaration : ĠIr Function , Ġdata : ĠIr Function ?): ĠIr Statement Ġ= Ġsuper . visit Function ( declaration , Ġdeclaration ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Call ( expression : ĠIr Call , Ġdata : ĠIr Function ?): ĠIr Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Call ( expression , Ġdata ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġfigure Ġout Ġthe Ġreason Ġwhy Ġsymbol Ġis Ġnot Ġbound ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . symbol . is Bound ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġexpression . symbol . owner ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Ġis ĠIr Constructor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! target . descriptor . is Primary ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġctor Ġ= Ġold Ctor To New Map [ target . symbol ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ctor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġredirect Call ( expression , Ġctor . stub ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexpression ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Delegating Constructor Call ( expression : ĠIr Delegating Constructor Call , Ġdata : ĠIr Function ?): ĠIr Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Delegating Constructor Call ( expression , Ġdata ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġexpression . symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target . owner . is Primary ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnothing Ġto Ġdo Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Primary Ġ= Ġdata !! Ġis ĠIr Constructor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġwhat Ġis Ġ` de serialized ` Ġconstructor ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġctor Ġ= Ġold Ctor To New Map [ target ] Ġ?: Ġreturn Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Call Ġ= Ġredirect Call ( expression , Ġctor . delegate ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread This Ġ= Ġif Ġ( from Primary ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr GetValue Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Value Parameter Symbol Impl ( Lazy Class Receiver Parameter Descriptor ( target . descriptor . containing Declaration )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr GetValue Impl ( expression . start Offset , Ġexpression . end Offset , Ġexpression . type , Ġdata . value Parameters . last (). symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Call . put Value Argument ( expression . value Arguments Count , Ġread This ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Call ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġredirect Call ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall : ĠIr Function Access Expression , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Target : ĠIr Simple Function Symbol ĊĠĠĠĠĠĠĠ Ġ) Ġ= ĠIr Call Impl ( call . start Offset , Ġcall . end Offset , Ġcall . type , Ġnew Target ). apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Type Arguments From ( call ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcall . value Arguments Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( i , Ġcall . getValue Argument ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } Ċ