/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 7 Ġ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 . backend . kon an . lower Ċ Ċ import Ġorg . jetbrains . kotlin . backend . common . Common Backend Context Ċ import Ġorg . jetbrains . kotlin . backend . common . File Lower ing Pass Ċ import Ġorg . jetbrains . kotlin . backend . common . lower .* Ċ import Ġorg . jetbrains . kotlin . backend . kon an . descriptors . resolve Fake Override Ċ import Ġorg . jetbrains . kotlin . builtins . Kotlin Built Ins Ċ import Ġorg . jetbrains . kotlin . descriptors . Property Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Variable Descriptor Ċ import Ġorg . jetbrains . kotlin . incremental . components . No Lookup Location Ċ import Ġorg . jetbrains . kotlin . ir . Ir Element Ċ import Ġorg . jetbrains . kotlin . ir . Ir Statement Ċ import Ġorg . jetbrains . kotlin . ir . builders .* Ċ import Ġorg . jetbrains . kotlin . ir . declarations .* Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Call Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Expression Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir GetValue Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Property Reference Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir Const Impl Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Symbol Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . Ir Element Visitor Void Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . accept Children Void Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . accept Void Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . transform Children Void Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . serialization . de serialization . descriptors . Deserial ized Property Descriptor Ċ import Ġorg . jetbrains . kotlin . types . Type Utils Ċ Ċ internal Ġclass ĠL ate init Lower ing ( ĊĠĠĠĠĠĠĠ Ġval Ġcontext : ĠCommon Backend Context , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġgenerate ParameterName In Assertion : ĠBoolean Ġ= Ġfalse Ċ ) Ġ: ĠFile Lower ing Pass Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠK OT LIN _ FQ _ NAME ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= ĠF q Name (" kotlin ") ĊĠĠĠ Ġprivate Ġval Ġkotlin Package Scope ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġcontext . ir . ir Module . descriptor . get Package ( K OT LIN _ FQ _ NAME ). member Scope ĊĠĠĠ Ġprivate Ġval Ġis Initialized Property Descriptor Ġ= Ġkotlin Package Scope ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Cont ributed Variables ( Name . identifier (" isInitialized "), ĠNo Lookup Location . FROM _ BACKEND ). single Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . extension Receiver Parameter . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ!= Ġnull Ġ&& ĠType Utils . getClass Descriptor ( it . type ) Ġ== Ġcontext . reflection Types . k Property 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ&& Ġ! it . is Expect ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġis Initialized Getter Descriptor ĠĠ Ġ= Ġis Initialized Property Descriptor . getter !! ĊĊĠĠĠ Ġoverride Ġfun Ġlower ( ir File : ĠIr File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlateinit Property To Field Ġ= Ġmutable Map Of < Property Descriptor , ĠIr Field >() ĊĠĠĠĠĠĠĠ Ġir File . accept Void ( object Ġ: ĠIr Element Visitor Void Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠIr Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . accept Children Void ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Property ( declaration : ĠIr Property ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Property ( declaration ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( declaration . is Late init Ġ&& Ġdeclaration . descriptor . kind . is Real ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Property To Field [ declaration . descriptor ] Ġ= Ġdeclaration . back ing Field !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġir File . transform Children Void ( object Ġ: ĠIr Building Transformer ( context ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Variable ( declaration : ĠIr Variable ): ĠIr Statement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . transform Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġdeclaration . descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! descriptor . is Late Init ) Ġreturn Ġdeclaration ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( declaration . initializer Ġ== Ġnull , Ġ{ Ġ"' late init ' Ġmodifier Ġis Ġnot Ġallowed Ġfor Ġvariables Ġwith Ġinitializer " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert (! Kotlin Built Ins . is Primitive Type ( descriptor . type ), Ġ{ Ġ"' late init ' Ġmodifier Ġis Ġnot Ġallowed Ġon Ġprimitive Ġtypes " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . at ( declaration ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . initializer Ġ= Ġir Null () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdeclaration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit GetValue ( expression : ĠIr GetValue ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbol Ġ= Ġexpression . symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġsymbol . descriptor Ġas ? ĠVariable Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( descriptor Ġ== Ġnull Ġ|| Ġ! descriptor . is Late Init ) Ġreturn Ġexpression ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert (! Kotlin Built Ins . is Primitive Type ( descriptor . type ), Ġ{ Ġ"' late init ' Ġmodifier Ġis Ġnot Ġallowed Ġon Ġprimitive Ġtypes " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . at ( expression ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġir Block ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġdo Ġdata Ġflow Ġanalysis Ġto Ġcheck Ġif Ġvalue Ġis Ġpro ved Ġto Ġbe Ġnot - null . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir If Then ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Equals Null ( ir Get ( expression . type , Ġsymbol )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Un initialized Property AccessException ( symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Get ( expression . type , Ġsymbol ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Call ( expression : ĠIr Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . transform Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġexpression . descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( descriptor Ġ!= Ġis Initialized Getter Descriptor ) Ġreturn Ġexpression ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Reference Ġ= Ġexpression . extension Receiver !! Ġas ĠIr Property Reference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( property Reference . extension Receiver Ġ== Ġnull , Ġ{ Ġ"' late init ' Ġmodifier Ġis Ġnot Ġallowed Ġon Ġextension Ġproperties " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Descriptor Ġ= Ġproperty Reference . descriptor . resolve Fake Override (). original ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġproperty Descriptor . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert (! Kotlin Built Ins . is Primitive Type ( type ), Ġ{ Ġ"' late init ' Ġmodifier Ġis Ġnot Ġallowed Ġon Ġprimitive Ġtypes " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . at ( expression ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġlateinit Property To Field [ property Descriptor ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Value Ġ= Ġir GetField ( property Reference . dispatch Receiver , Ġfield ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġir Not Equals ( field Value , Ġir Null ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Property ( declaration : ĠIr Property ): ĠIr Statement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . transform Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! declaration . descriptor . is Late Init Ġ|| Ġ! declaration . descriptor . kind . is Real ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdeclaration ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbacking Field Ġ= Ġdeclaration . back ing Field !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Getter ( back ing Field , Ġdeclaration . getter !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( back ing Field . initializer Ġ== Ġnull , Ġ{ Ġ"' late init ' Ġmodifier Ġis Ġnot Ġallowed Ġfor Ġproperties Ġwith Ġinitializer " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Builder Ġ= Ġcontext . create Ir Builder ( back ing Field . symbol , Ġdeclaration . start Offset , Ġdeclaration . end Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Builder . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbacking Field . initializer Ġ= Ġir Expr Body ( ir Null ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdeclaration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġtransform Getter ( back ing Field : ĠIr Field , Ġgetter : ĠIr Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġbacking Field . descriptor . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert (! Kotlin Built Ins . is Primitive Type ( type ), Ġ{ Ġ"' late init ' Ġmodifier Ġis Ġnot Ġallowed Ġon Ġprimitive Ġtypes " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Builder Ġ= Ġcontext . create Ir Builder ( getter . symbol , Ġgetter . start Offset , Ġgetter . end Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Builder . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgetter . body Ġ= Ġir Block Body Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Var Ġ= Ġir Temporary ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir GetField ( getter . dispatch Receiver Parameter ?. let Ġ{ Ġir Get ( it ) Ġ}, Ġbacking Field ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir If Then Else ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir Built Ins . nothing Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Not Equals ( ir Get ( result Var ), Ġir Null ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Return ( ir Get ( result Var )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Un initialized Property AccessException ( back ing Field . symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIr Builder With Scope . throw Un initialized Property AccessException ( back ing Field Symbol : ĠIr Symbol ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Call ( throw Error Function , Ġcontext . ir Built Ins . nothing Type ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( generate ParameterName In Assertion ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Const Impl . string ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir Built Ins . string Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbacking Field Symbol . descriptor . name . asString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġthrow Error Function Ġ= Ġcontext . ir . symbols . Throw Un initialized Property AccessException Ċ Ċ }