/* Ċ Ġ* Ġ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 Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . backend . kon an . lower Ċ Ċ import Ġorg . jetbrains . kotlin . backend . common . Class Lower ing Pass Ċ import Ġorg . jetbrains . kotlin . backend . common . Ir Element Transformer Void WithContext Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . calls Super Ċ import Ġorg . jetbrains . kotlin . backend . kon an . Context Ċ import Ġorg . jetbrains . kotlin . ir . Ir Statement Ċ import Ġorg . jetbrains . kotlin . ir . declarations .* Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Block Body Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Expression Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir GetValue Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir GetField Impl Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir GetValue Impl Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir Set Field Impl Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Constructor Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Field Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Function Symbol Ċ import Ġorg . jetbrains . kotlin . ir . types . classifier OrNull Ċ import Ġorg . jetbrains . kotlin . ir . util .* Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . transform Children Void Ċ Ċ internal Ġclass ĠO uter This Lower ing ( val Ġcontext : ĠContext ) Ġ: ĠClass Lower ing Pass Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġlower ( ir Class : ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! ir Class . is Inner ) Ġreturn ĊĠĠĠĠĠĠĠ Ġir Class . transform Children Void ( Transformer ( ir Class , Ġir Class )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlower ( ir Function : ĠIr Function ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġparent Ġ= Ġir Function . parent ĊĠĠĠĠĠĠĠ Ġvar Ġir Class : ĠIr Class ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġwhile Ġ( parent Ġ! is ĠIr Package Fragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Class Ġ= Ġparent Ġas ? ĠIr Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ir Class Ġ!= Ġnull ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġ( parent Ġas ĠIr Declaration ). parent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( ir Class Ġ== Ġnull Ġ|| Ġ! ir Class . is Inner ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġir Function . body ?. transform Children Void ( Transformer ( ir Class , Ġir Function )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠTransformer ( val Ġir Class : ĠIr Class , Ġval Ġcontainer : ĠIr Declaration ) Ġ: ĠIr Element Transformer Void WithContext () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Class New ( declaration : ĠIr Class ): ĠIr Statement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip Ġnested . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdeclaration ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit GetValue ( expression : ĠIr GetValue ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . transform Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimplicit This Class Ġ= Ġ( expression . symbol . owner . parent Ġas ? ĠIr Class ) Ġ?: Ġreturn Ġexpression ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( implicit This Class Ġ== Ġir Class ) Ġreturn Ġexpression ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Scope Symbols Ġ= ĠlistOf ( container . symbol ) Ġ+ Ġall Scopes . map Ġ{ Ġit . scope . scope Owner Symbol Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfunction Symbol : ĠIr Function Symbol ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġparent Scope Symbols . size Ġ- Ġ 1 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Symbol Ġ= Ġparent Scope Symbols [ i ] Ġas ? ĠIr Function Symbol Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Symbol Ġ= Ġcurrent Symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function Symbol Ġ== Ġnull ) Ġreturn Ġexpression ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Offset Ġ= Ġexpression . start Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Offset Ġ= Ġexpression . end Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= Ġexpression . origin ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġir This : ĠIr Expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinner Class : ĠIr Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( function Symbol Ġas ? ĠIr Constructor Symbol )?. owner ?. parent As Class Ġ== Ġir Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġconstructor Ġwe Ġhave Ġouter Ġclass Ġas Ġdispatch Receiver Parameter . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Class Ġ= Ġir Class . parent Ġas ? ĠIr Class Ġ?: Ġerror (" No Ġcontaining Ġclass Ġfor Ġinner Ġclass Ġ${ ir Class . render () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Parameter Ġ= Ġfunction Symbol . owner . dispatch Receiver Parameter !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir This Ġ= ĠIr GetValue Impl ( start Offset , Ġend Offset , Ġthis Parameter . type , Ġthis Parameter . symbol , Ġorigin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Class Ġ= Ġir Class ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Function Receiver Ġ= Ġfunction Symbol . owner . dispatch Receiver Parameter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Parameter Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Function Receiver ?. type ?. classifier OrNull Ġ== Ġir Class . symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Function Receiver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . this Receiver !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir This Ġ= ĠIr GetValue Impl ( start Offset , Ġend Offset , Ġthis Parameter . type , Ġthis Parameter . symbol , Ġorigin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( inner Class Ġ!= Ġimplicit This Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! inner Class . is Inner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCapt ured Ġ' this ' Ġunrelated Ġto Ġinner Ġclasses Ġnesting Ġhierarchy , Ġleave Ġit Ġas Ġis Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġshould Ġbe Ġtransformed Ġby Ġclo s ures Ġconversion . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter This Field Ġ= Ġcontext . special Declarations Factory . get Outer This Field ( inner Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir This Ġ= ĠIr GetField Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset , Ġend Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġouter This Field . symbol , Ġouter This Field . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir This , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter Ġ= Ġinner Class . parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Class Ġ= Ġouter Ġas ? ĠIr Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠAssertionError (" Unexpected Ġcontaining Ġdeclaration Ġfor Ġinner Ġclass Ġ${ inner Class . dump ()} : Ġ$ outer ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġir This ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠInner Class Lower ing ( val Ġcontext : ĠContext ) Ġ: ĠClass Lower ing Pass Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġlower ( ir Class : ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠ ĠO uter This Lower ing ( context ). lower ( ir Class ) ĊĠĠĠĠĠĠĠ ĠInner Class Transformer ( ir Class ). lower Inner Class () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠInner Class Transformer ( val Ġir Class : ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġouter This Field Symbol : ĠIr Field Symbol ĊĊĠĠĠĠĠĠĠ Ġfun Ġlower Inner Class () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ir Class . is Inner ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Outer This Field () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlower Construct ors () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Outer This Field () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter This Field Ġ= Ġcontext . special Declarations Factory . get Outer This Field ( ir Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . declarations Ġ+= Ġouter This Field ĊĠĠĠĠĠĠĠĠĠĠĠ Ġouter This Field Symbol Ġ= Ġouter This Field . symbol ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġlower Construct ors () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . declarations . transform Flat Ġ{ Ġir Member Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ir Member Ġis ĠIr Constructor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( lower Constructor ( ir Member )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġlower Constructor ( ir Constructor : ĠIr Constructor ): ĠIr Constructor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ir Constructor . calls Super ( context . ir Built Ins )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInitial izing Ġconstructor : Ġinitialize Ġ' this . this $ 0 ' Ġwith Ġ'$ outer '. ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Body Ġ= Ġir Constructor . body Ġas ? ĠIr Block Body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠAssertionError (" Unexpected Ġconstructor Ġbody : Ġ${ ir Constructor . body }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Offset Ġ= Ġir Constructor . start Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Offset Ġ= Ġir Constructor . end Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Receiver Ġ= Ġir Class . this Receiver !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter Receiver Ġ= Ġir Constructor . dispatch Receiver Parameter !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Body . statements . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Set Field Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset , Ġend Offset , Ġouter This Field Symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr GetValue Impl ( start Offset , Ġend Offset , Ġthis Receiver . type , Ġthis Receiver . symbol ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr GetValue Impl ( start Offset , Ġend Offset , Ġouter Receiver . type , Ġouter Receiver . symbol ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir Built Ins . unit Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġir Constructor ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ