/* Ċ Ġ* Ġ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 . backend . common . lower Ċ Ċ import Ġorg . jetbrains . kotlin . backend . common . Backend Context Ċ import Ġorg . jetbrains . kotlin . backend . common . Class Lower ing Pass Ċ import Ġorg . jetbrains . kotlin . backend . common . File Lower ing Pass Ċ import Ġorg . jetbrains . kotlin . backend . common . descriptors . Wrapped Simple Function Descriptor Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . copy To Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . copy Type Parameters From Ċ import Ġorg . jetbrains . kotlin . descriptors . Modal ity Ċ import Ġorg . jetbrains . kotlin . ir . Ir Statement Ċ import Ġorg . jetbrains . kotlin . ir . builders .* Ċ 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 . symbols . Ir Function Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Simple Function Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . impl . Ir Simple Function Symbol Impl Ċ import Ġorg . jetbrains . kotlin . ir . types . to Kotlin Type Ċ import Ġorg . jetbrains . kotlin . ir . util .* Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . Ir Element Transformer Void Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . transform Children Void Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ Ċ private Ġconst Ġval ĠINLINE _ CLASS _ IMPL _ SUFFIX Ġ= Ġ"- impl " Ċ Ċ // ĠTODO : ĠSupport Ġincremental Ġcompilation Ċ class ĠInline Class Lower ing ( val Ġcontext : ĠBackend Context ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtransformed Function Ġ= Ġmutable Map Of < Ir Function Symbol , ĠIr Simple Function Symbol >() ĊĊĠĠĠ Ġval Ġinline Class Declaration Lower ing Ġ= Ġobject Ġ: ĠClass Lower ing Pass Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġlower ( ir Class : ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ir Class . is Inline ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . transform Declarations Flat Ġ{ Ġdeclaration Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Constructor Ġ-> ĠlistOf ( transform Constructor ( declaration )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Simple Function Ġ-> Ġtransform Method Flat ( declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Property Ġ-> ĠlistOf ( declaration ) Ġ Ġ// ĠGet ters Ġand Ġset ters Ġshould Ġbe Ġflatten ed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Field Ġ-> ĠlistOf ( declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Class Ġ-> ĠlistOf ( declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unexpected Ġdeclaration : Ġ$ declaration ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġtransform Constructor ( ir Constructor : ĠIr Constructor ): ĠIr Declaration Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ir Constructor . is Primary ) Ġreturn Ġir Constructor ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSecondary Ġconstructors Ġare Ġlower ed Ġinto Ġstatic Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtransformed Function . get Or Put ( ir Constructor . symbol ) Ġ{ Ġcreate Static B od ile ss Method ( ir Constructor ). symbol Ġ}. owner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Class Ġ= Ġir Constructor . parent As Class ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCop ied Ġand Ġadapted Ġfrom ĠKotlin / Native ĠInline Class Transformer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . body Ġ= Ġcontext . create Ir Builder ( result . symbol ). ir Block Body ( result ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSecondary Ġct ors Ġof Ġinline Ġclass Ġmust Ġdelegate Ġto Ġsome Ġother Ġconstructors . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUse Ġthese Ġdeleg ating Ġcall Ġlater Ġto Ġinitialize Ġthis Ġvariable . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġthis Var : ĠIr Variable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Mapping Ġ= Ġresult . value Parameters . associate By Ġ{ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Constructor . value Parameters [ it . index ]. symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( ir Constructor . body Ġas ĠIr Block Body ). statements . forEach Ġ{ Ġstatement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ statement . transform ( object Ġ: ĠIr Element Transformer Void () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Delegating Constructor Call ( expression : ĠIr Delegating Constructor Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . transform Children Void () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġir Block ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Var Ġ= Ġir Temporary ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Hint Ġ= Ġir Class . default Type . to Kotlin Type (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Type Ġ= Ġir Class . default Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Var . parent Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit GetValue ( expression : ĠIr GetValue ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . transform Children Void () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . symbol Ġ== Ġir Class . this Receiver ?. symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġir Get ( this Var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Mapping [ expression . symbol ]?. let Ġ{ Ġreturn Ġir Get ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Declaration ( declaration : ĠIr Declaration ): ĠIr Statement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . transform Children Void ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( declaration . parent Ġ== Ġir Constructor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . parent Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdeclaration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Return ( expression : ĠIr Return ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . transform Children Void () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . return Target Symbol Ġ== Ġir Constructor . symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġir Return ( ir Block ( expression . start Offset , Ġexpression . end Offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ expression . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Get ( this Var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Return ( ir Get ( this Var )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġtransform Method Flat ( function : ĠIr Simple Function ): ĠList < Ir Declaration > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠSupport Ġfake - over ridden Ġmethods Ġwithout Ġbox ing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function . is Static Method Of Class Ġ|| Ġ! function . is Real ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( function ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatic Method Ġ= Ġcreate Static B od ile ss Method ( function ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransformed Function [ function . symbol ] Ġ= Ġstatic Method . symbol ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMove Ġfunction Ġbody Ġto Ġstatic Ġmethod , Ġtransform ing Ġvalue Ġparameters Ġand Ġnested Ġdeclarations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . body !!. transform Children Void ( object Ġ: ĠIr Element Transformer Void () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Declaration ( declaration : ĠIr Declaration ): ĠIr Statement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . transform Children Void ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( declaration . parent Ġ== Ġfunction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . parent Ġ= Ġstatic Method ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdeclaration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit GetValue ( expression : ĠIr GetValue ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Declaration Ġ= Ġexpression . symbol . owner Ġas ? ĠIr Value Parameter Ġ?: Ġreturn Ġsuper . visit GetValue ( expression ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontext . create Ir Builder ( static Method . symbol ). ir Get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( value Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . dispatch Receiver Parameter , Ġfunction . parent As Class . this Receiver Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Method . value Parameters [ 0 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . extension Receiver Parameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Method . extension Receiver Parameter !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġfunction . value Parameters Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Method . value Parameters [ value Declaration . index Ġ+ Ġ 1 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Method . body Ġ= Ġfunction . body ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function . over ridden Symbols . isEmpty ()) Ġ Ġ// ĠFunction Ġis Ġused Ġonly Ġin Ġun boxed Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( static Method ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelegate Ġoriginal Ġfunction Ġto Ġstatic Ġimplementation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . body Ġ= Ġcontext . create Ir Builder ( function . symbol ). ir Block Body Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Return ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Call ( static Method ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( function . dispatch Receiver Parameter !! ) Ġ+ Ġfunction . value Parameters ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġvalue Parameter ) Ġin Ġparameters . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( index , Ġir Get ( value Parameter )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextension Receiver Ġ= Ġfunction . extension Receiver Parameter ?. let Ġ{ Ġir Get ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( function , Ġstatic Method ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġinline Class Usage Lower ing Ġ= Ġobject Ġ: ĠFile Lower ing Pass Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġlower ( ir File : ĠIr File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir File . transform Children Void ( object Ġ: ĠIr Element Transformer Void () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Call ( call : ĠIr Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . transform Children Void ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= Ġcall . symbol . owner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function . parent Ġ! is ĠIr Class Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . is Static Method Of Class Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! function . parent As Class . is Inline Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( function Ġis ĠIr Simple Function Ġ&& Ġ! function . is Real ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( function Ġis ĠIr Constructor Ġ&& Ġfunction . is Primary ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcall ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġir Call ( call , Ġget OrCreate Static Method ( function ), Ġdispatch Receiver As First Argument Ġ= Ġ( function Ġis ĠIr Simple Function )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Delegating Constructor Call ( call : ĠIr Delegating Constructor Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . transform Children Void ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= Ġcall . symbol . owner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġklass Ġ= Ġfunction . parent As Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! klass . is Inline Ġ-> Ġcall ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . is Primary Ġ-> Ġir Call ( call , Ġfunction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġir Call ( call , Ġget OrCreate Static Method ( function )). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġcall . value Arguments Count ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( it , Ġcall . getValue Argument ( it ) !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget OrCreate Static Method ( function : ĠIr Function ): ĠIr Simple Function Symbol Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformed Function . get Or Put ( function . symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Static B od ile ss Method ( function ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . parent As Class . declarations . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠName . to Inline Class Implementation Name () Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġis Special Ġ-> ĠName . special ( asString () Ġ+ ĠINLINE _ CLASS _ IMPL _ SUFFIX ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠName . identifier ( asString () Ġ+ ĠINLINE _ CLASS _ IMPL _ SUFFIX ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Static B od ile ss Method ( function : ĠIr Function ): ĠIr Simple Function Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= ĠWr apped Simple Function Descriptor () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠIr Function Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . origin , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Simple Function Symbol Impl ( descriptor ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . name . to Inline Class Implementation Name (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . visibility , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMod ality . FINAL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . returnType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . is Inline , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . is External , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( function Ġis ĠIr Simple Function Ġ&& Ġfunction . is Tail rec ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( function Ġis ĠIr Simple Function Ġ&& Ġfunction . is Suspend ) ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . bind ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Type Parameters From ( function ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotations Ġ+= Ġfunction . annotations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Parameter Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextension Receiver Parameter Ġ= Ġfunction . extension Receiver Parameter ?. copy To ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function Ġis ĠIr Simple Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters . add ( function . dispatch Receiver Parameter !!. let Ġ{ Ġp Ġ-> Ġp . copy To ( this , Ġindex Ġ= Ġp . index Ġ+ Ġ 1 ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters Ġ+= Ġfunction . value Parameters . map Ġ{ Ġp Ġ-> Ġp . copy To ( this , Ġindex Ġ= Ġp . index Ġ+ Ġ 1 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters Ġ+= Ġfunction . value Parameters . map Ġ{ Ġp Ġ-> Ġp . copy To ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġfunction . parent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( is Static Method Of Class ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ