/* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" Fold Initializer And If To El vis ") Ċ Ċ package Ġorg . jetbrains . kotlin . backend . kon an . lower Ċ Ċ import Ġorg . jetbrains . kotlin . backend . common . Ir Element Transformer Void WithContext Ċ import Ġorg . jetbrains . kotlin . backend . common . report Warning Ċ import Ġorg . jetbrains . kotlin . backend . kon an . Context Ċ import Ġorg . jetbrains . kotlin . backend . kon an . descriptors . resolve Fake Override Ċ import Ġorg . jetbrains . kotlin . backend . kon an . ir . Deserializer Driver Ċ import Ġorg . jetbrains . kotlin . descriptors . Function Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Value Descriptor Ċ import Ġorg . jetbrains . kotlin . ir . Ir Element Ċ import Ġorg . jetbrains . kotlin . ir . Ir Statement Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Function Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Module Fragment Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Variable Ċ import Ġorg . jetbrains . kotlin . ir . expressions .* Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl .* Ċ 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 . Fq Name Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . fq Name Safe Ċ Ċ //----------------------------------------------------------------------------- // Ċ Ċ private Ġval Ġinline Constructor Ġby Ġlazy Ġ{ ĠF q Name (" kon an . internal . Inline Constructor ") Ġ} Ċ Ċ internal Ġval ĠFunction Descriptor . is Inline Constructor Ġget () Ġ= Ġannotations . has Annotation ( inline Constructor ) Ċ Ċ internal Ġclass ĠInline Construct ors Transformation ( val Ġcontext : ĠContext ): ĠIr Element Transformer Void WithContext () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġde serializer ĠĠĠĠĠ Ġby Ġlazy Ġ{ ĠDeserial izer Driver ( context ) Ġ} ĊĠĠĠ Ġprivate Ġval Ġsubstitute Map ĠĠĠĠ Ġby Ġlazy Ġ{ Ġmutable Map Of < Value Descriptor , ĠIr Expression >() Ġ} ĊĊĠĠĠ Ġ// ------------------------------------------------------------------------- // ĊĊĠĠĠ Ġfun Ġlower ( ir Module : ĠIr Module Fragment ) Ġ= Ġir Module . accept ( this , Ġnull ) ĊĊĠĠĠ Ġ// ------------------------------------------------------------------------- // ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Call ( expression : ĠIr Call ): ĠIr Expression Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġir Call Ġ= Ġsuper . visit Call ( expression ) Ġas ĠIr Call ĊĠĠĠĠĠĠĠ Ġval Ġfunction Descriptor Ġ= Ġir Call . descriptor ĊĠĠĠĠĠĠĠ Ġif Ġ(! function Descriptor . is Inline Constructor ) Ġreturn Ġir Call ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġcall Ġdoes Ġnot Ġneed Ġin lining . ĊĊĠĠĠĠĠĠĠ Ġval Ġfunction Declaration Ġ= Ġget Function Declaration ( ir Call ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġdeclaration Ġof Ġthe Ġfunction Ġto Ġbe Ġin lined . ĊĠĠĠĠĠĠĠ Ġif Ġ( function Declaration Ġ== Ġnull ) Ġ{ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġfailed Ġto Ġget Ġthe Ġdeclaration . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ" In liner Ġfailed Ġto Ġobtain Ġfunction Ġdeclaration : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Descriptor . fq Name Safe . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . report Warning ( message , Ġcurrent File , Ġir Call ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReport Ġwarning . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġir Call ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstatements Ġ= Ġ( function Declaration . body Ġas ĠIr Block Body ). statements ĊĠĠĠĠĠĠĠ Ġreplace Delegating Constructor Call ( statements , Ġfunction Descriptor ) ĊĠĠĠĠĠĠĠ Ġfunction Declaration . transform Children Void ( Value Subst it utor ()) ĊĠĠĠĠĠĠĠ Ġcontext . ir . original Module Index . functions [ function Descriptor . original ] Ġ= Ġfunction Declaration ĊĊĠĠĠĠĠĠĠ Ġreturn Ġir Call ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ------------------------------------------------------------------------- // ĊĊĠĠĠ Ġprivate Ġfun Ġget Function Declaration ( ir Call : ĠIr Call ): ĠIr Function ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġfunction Descriptor Ġ= Ġir Call . descriptor ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Descriptor Ġ= Ġfunction Descriptor . resolve Fake Override (). original ĊĠĠĠĠĠĠĠ Ġval Ġfunction Declaration Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir . original Module Index . functions [ original Descriptor ] Ġ?: ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġfunction Ġis Ġdeclared Ġin Ġthe Ġcurrent Ġmodule . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde serializer . deserialize Inline Body ( original Descriptor ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFunction Ġis Ġdeclared Ġin Ġanother Ġmodule . ĊĠĠĠĠĠĠĠ Ġreturn Ġfunction Declaration Ġas ĠIr Function ? ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ------------------------------------------------------------------------- // ĊĊĠĠĠ Ġprivate Ġfun Ġreplace Delegating Constructor Call ( statements : ĠMutable List < Ir Statement >, Ġfunction Descriptor : ĠFunction Descriptor ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġdeleg ating Call Ġ= Ġstatements [ 0 ] ĊĠĠĠĠĠĠĠ Ġif Ġ( deleg ating Call Ġ! is ĠIr Delegating Constructor Call Impl ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġthis Variable Ġ= Ġgenerate Ir Call ( deleg ating Call ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnew This GetValue Ġ= ĠIr GetValue Impl ( ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġnew Ġexpression , Ġrepresenting Ġaccess Ġthe Ġnew Ġvariable . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset ĠĠ Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor Ġ Ġ= Ġthis Variable . descriptor ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġclass Descriptor Ġ= Ġdeleg ating Call . descriptor . construct ed Class ĊĠĠĠĠĠĠĠ Ġval Ġold This GetValue Ġ= Ġclass Descriptor . this As Receiver Parameter ĊĠĠĠĠĠĠĠ Ġsubstitute Map [ old This GetValue ] Ġ= Ġnew This GetValue ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Statements Ġ= Ġstatements . to Mutable List () ĊĠĠĠĠĠĠĠ Ġnew Statements [ 0 ] Ġ= Ġthis Variable ĊĠĠĠĠĠĠĠ Ġnew Statements Ġ+= Ġnew This GetValue ĊĊĠĠĠĠĠĠĠ Ġval Ġblock Ġ= ĠIr Block Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset ĠĠ Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĠĠĠĠĠĠĠ Ġ= Ġnew This GetValue . type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin ĠĠĠĠĠ Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatements Ġ Ġ= Ġnew Statements ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġreturn This Ġ= ĠIr Return Impl ( 0 , Ġ 0 , Ġfunction Descriptor , Ġblock ) ĊĊĠĠĠĠĠĠĠ Ġstatements . clear () ĊĠĠĠĠĠĠĠ Ġstatements Ġ+= Ġreturn This ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ------------------------------------------------------------------------- // ĊĊĠĠĠ Ġfun Ġgenerate Ir Call ( expression : ĠIr Delegating Constructor Call Impl ): ĠIr Variable Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Expression Ġ= ĠIr Call Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . descriptor . returnType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . type Arguments , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . origin ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . descriptor . value Parameters . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Argument Ġ= Ġexpression . getValue Argument ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( it . index , Ġvalue Argument ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Variable Ġ= Ġcurrent Scope !!. scope . create Temporary Variable ( ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġnew Ġvariable Ġand Ġinit Ġit Ġwith Ġconstructor Ġcall . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Expression Ġ= Ġnew Expression , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Hint ĠĠĠĠ Ġ= Ġnew Expression . descriptor . fq Name Safe . toString () Ġ+ Ġ". this ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Mutable ĠĠĠ Ġ= Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnew Variable ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ------------------------------------------------------------------------- // ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠIr Element ) Ġ= Ġelement . accept ( this , Ġnull ) ĊĊĠĠĠ Ġ// ------------------------------------------------------------------------- // ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠValue Subst it utor : ĠIr Element Transformer Void () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit GetValue ( expression : ĠIr GetValue ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Expression Ġ= Ġsuper . visit GetValue ( expression ) Ġas ĠIr GetValue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġnew Expression . descriptor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargument Ġ= Ġsubstitute Map [ descriptor ] ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġexpression Ġto Ġreplace Ġthis Ġparameter . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( argument Ġ== Ġnull ) Ġreturn Ġnew Expression ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġis Ġno Ġsuch Ġexpression Ġ- Ġdo Ġnothing . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġargument ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ---------------------------------------------------------------- ----- // ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠIr Element ) Ġ= Ġelement . accept ( this , Ġnull ) ĊĠĠĠ Ġ} Ċ }