/* Ċ Ġ* Ġ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 . jvm . lower Ċ Ċ 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 Parameter Declarations From Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . is Method Of Any Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . create Ir Builder Ċ import Ġorg . jetbrains . kotlin . backend . common . ph aser . make Ir File Phase Ċ import Ġorg . jetbrains . kotlin . backend . jvm . Jvm Backend Context Ċ import Ġorg . jetbrains . kotlin . backend . jvm . Jvm Lower ed Declaration Origin Ċ import Ġorg . jetbrains . kotlin . backend . jvm . codegen . is Jvm Interface Ċ import Ġorg . jetbrains . kotlin . codegen . Owner Kind Ċ import Ġorg . jetbrains . kotlin . codegen . state . Generation State Ċ import Ġorg . jetbrains . kotlin . descriptors . Modal ity Ċ import Ġorg . jetbrains . kotlin . descriptors . Vis ibilities Ċ import Ġorg . jetbrains . kotlin . descriptors . de serialization . PLATFORM _ DEPEND ENT _ AN NOT ATION _ FQ _ NAME Ċ import Ġorg . jetbrains . kotlin . ir . Ir Element Ċ import Ġorg . jetbrains . kotlin . ir . UNDEFINED _ OFFSET Ċ 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 . symbols . Ir Simple Function Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . impl . Ir Simple Function Symbol Impl Ċ import Ġorg . jetbrains . kotlin . ir . util .* Ċ import Ġorg . jetbrains . kotlin . ir . visitor s .* Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġjava . util . function . Unary Operator Ċ Ċ internal Ġval Ġinterface Deleg ation Phase Ġ= Ġmake Ir File Phase ( ĊĠĠĠ Ġ:: Interface Deleg ation Lower ing , ĊĠĠĠ Ġname Ġ= Ġ" Interface Deleg ation ", ĊĠĠĠ Ġdescription Ġ= Ġ" Delegate Ġcalls Ġto Ġinterface Ġmembers Ġwith Ġdefault Ġimplementations Ġto ĠDefault Imp ls " Ċ ) Ċ Ċ private Ġclass ĠInterface Deleg ation Lower ing ( val Ġcontext : ĠJ vm Backend Context ) Ġ: ĠIr Element Visitor Void , ĠFile Lower ing Pass Ġ{ ĊĊĠĠĠ Ġval Ġstate : ĠGeneration State Ġ= Ġcontext . state ĊĊĠĠĠ Ġval Ġreplacement Map Ġ= Ġmutable Map Of < Ir Simple Function Symbol , ĠIr Simple Function Symbol >() ĊĊĠĠĠ Ġoverride Ġfun Ġlower ( ir File : ĠIr File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġir File . accept Children Void ( this ) ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠRe placer Ġshould Ġbe Ġrun Ġon Ġwhole Ġmodule , Ġnot Ġon Ġa Ġsingle Ġfile . ĊĠĠĠĠĠĠĠ Ġir File . accept Void ( Over ridden Symbols Re placer ( replacement Map )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠIr Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġelement . accept Children Void ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Class ( declaration : ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . visit Class ( declaration ) ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration . is Jvm Interface ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġgenerate Interface Methods ( declaration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Interface Methods ( ir Class : ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( actual Class , Ġis Default Imp ls Generation ) Ġ= Ġif Ġ( ir Class . origin Ġ== ĠJ vm Lower ed Declaration Origin . DEFAULT _ IMP LS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( ir Class . parent Ġas ĠIr Class , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( ir Class , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġto Remove Ġ= Ġmutable ListOf < Ir Simple Function >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( function Ġin Ġactual Class . functions . toList ()) Ġ{ Ġ// ĠCopy Ġthe Ġlist , Ġbecause Ġwe Ġare Ġadding Ġnew Ġdeclarations Ġfrom Ġthe Ġloop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function . origin Ġ!== ĠIr Declaration Origin . FA KE _ OVERRIDE ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġclasses , Ġonly Ġgenerate Ġinterface Ġdeleg ation Ġfor Ġfunctions Ġimmediately Ġinherited Ġfrom Ġam Ġinterface . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ( Other wise , Ġdeleg ation Ġwill Ġbe Ġpresent Ġin Ġthe Ġparent Ġclass ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Default Imp ls Generation Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . over ridden Symbols . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! it . owner . parent As Class . is Interface Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . owner . modal ity Ġ!= ĠMod ality . AB STR ACT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimplementation Ġ= Ġfunction . resolve Fake Override () Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! implementation . has Interface Parent () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVis ibilities . is Private ( implementation . visibility ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimplementation . is Def initely Not Default Imp ls Method () Ġ|| Ġimplementation . is Method Of Any () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeleg ation Ġ= Ġgenerate Deleg ation To Default Impl ( ir Class , Ġimplementation , Ġfunction , Ġis Default Imp ls Generation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Default Imp ls Generation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Remove . add ( function ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplacement Map [ function . symbol ] Ġ= Ġdeleg ation . symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġir Class . declarations . removeAll ( to Remove ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Deleg ation To Default Impl ( ĊĠĠĠĠĠĠĠ Ġir Class : ĠIr Class , ĊĠĠĠĠĠĠĠ Ġinterface Fun : ĠIr Simple Function , ĊĠĠĠĠĠĠĠ Ġinherited Fun : ĠIr Simple Function , ĊĠĠĠĠĠĠĠ Ġis Default Imp ls Generation : ĠBoolean ĊĠĠĠ Ġ): ĠIr Simple Function Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdefault Impl Fun Ġ= Ġcontext . declaration Factory . getDefault Imp ls Function ( interface Fun ) ĊĊĠĠĠĠĠĠĠ Ġval Ġir Function Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Default Imp ls Generation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= ĠWr apped Simple Function Descriptor ( inherited Fun . descriptor . annotations , Ġinherited Fun . descriptor . source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBy Ġusing ĠWr apped Descriptor , Ġwe Ġlose Ġinformation Ġwhether Ġthe Ġfunction Ġis Ġan Ġaccessor . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` Kotlin Type Mapper ` Ġneeds Ġthat Ġinfo Ġto Ġgenerate ĠJVM Ġname . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO : Ġstream line Ġname Ġgeneration . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠName . identifier ( context . state . type Mapper . map FunctionName ( inherited Fun . descriptor , ĠOwner Kind . IMPLEMENT ATION )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Function Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Declaration Origin . DEFINED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Simple Function Symbol Impl ( descriptor ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVis ibilities . PUBLIC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinherited Fun . modal ity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinherited Fun . returnType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Inline Ġ= Ġinherited Fun . is Inline , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis External Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Tail rec Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Suspend Ġ= Ġinherited Fun . is Suspend ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . bind ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġinherited Fun . parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverridden Symbols . addAll ( inherited Fun . over ridden Symbols ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Parameter Declarations From ( inherited Fun ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġcontext . declaration Factory . getDefault Imp ls Function ( inherited Fun ) ĊĊĠĠĠĠĠĠĠ Ġir Class . declarations . add ( ir Function ) ĊĊĠĠĠĠĠĠĠ Ġcontext . create Ir Builder ( ir Function . symbol , ĠUN DEFINED _ OFFSET , ĠUN DEFINED _ OFFSET ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . body Ġ= Ġir Block Body Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Return ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Call ( default Impl Fun . symbol , Ġir Function . returnType ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . dispatch Receiver Parameter ?. let Ġ{ Ġput Value Argument ( offset ++, Ġir Get ( it )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . extension Receiver Parameter ?. let Ġ{ Ġput Value Argument ( offset ++, Ġir Get ( it )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Function . value Parameters . map Indexed Ġ{ Ġi , Ġparameter Ġ-> Ġput Value Argument ( i Ġ+ Ġoffset , Ġir Get ( parameter )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġir Function ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠOver ridden Symbols Re placer ( val Ġreplacement Map : ĠMap < Ir Simple Function Symbol , ĠIr Simple Function Symbol >) Ġ: ĊĠĠĠĠĠĠĠ ĠIr Element Visitor Void Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠIr Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . accept Children Void ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Simple Function ( declaration : ĠIr Simple Function ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . over ridden Symbols . replaceAll ( Unary Operator Ġ{ Ġsymbol Ġ-> Ġreplacement Map [ symbol ] Ġ?: Ġsymbol Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Simple Function ( declaration ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIr Simple Function . has Interface Parent () Ġ= ĊĠĠĠĠĠĠĠ Ġ( parent Ġas ? ĠIr Class )?. is Interface Ġ== Ġtrue ĊĊĠĠĠ Ġprivate Ġfun ĠIr Simple Function . is Def initely Not Default Imp ls Method () Ġ= ĊĠĠĠĠĠĠĠ Ġresolve Fake Override ()?. let Ġ{ Ġorigin Ġ== ĠIr Declaration Origin . IR _ EXTERNAL _ JAVA _ DECL AR ATION _ ST UB Ġ} Ġ== Ġtrue Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ== ĠIr Declaration Origin . FUNCTION _ FOR _ DEFAULT _ PARAMETER Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Annotation ( PLATFORM _ DEPEND ENT _ AN NOT ATION _ FQ _ NAME ) Ċ } Ċ