/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* Ġ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 . Class Lower ing Pass Ċ import Ġorg . jetbrains . kotlin . backend . common . Common Backend Context Ċ import Ġorg . jetbrains . kotlin . backend . common . Ir Element Transformer Void WithContext Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . copy To Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . create Implicit Parameter Declaration With Wrapped Descriptor Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . create Ir Builder Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . ir Block Ċ import Ġorg . jetbrains . kotlin . backend . common . ph aser . make Ir File Phase Ċ import Ġorg . jetbrains . kotlin . backend . jvm . Jvm Lower ed Declaration Origin Ċ import Ġorg . jetbrains . kotlin . backend . jvm . local Declarations Phase Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Kind Ċ import Ġorg . jetbrains . kotlin . descriptors . Modal ity Ċ import Ġorg . jetbrains . kotlin . descriptors . Vis ibilities Ċ import Ġorg . jetbrains . kotlin . ir . builders .* Ċ import Ġorg . jetbrains . kotlin . ir . builders . declarations .* Ċ import Ġorg . jetbrains . kotlin . ir . declarations .* Ċ import Ġorg . jetbrains . kotlin . ir . expressions .* Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir Instance Initializer Call Impl Ċ import Ġorg . jetbrains . kotlin . ir . types . Ir Type Ċ import Ġorg . jetbrains . kotlin . ir . types . classifier OrFail Ċ import Ġorg . jetbrains . kotlin . ir . types . is Nullable Ċ import Ġorg . jetbrains . kotlin . ir . util . construct ors Ċ import Ġorg . jetbrains . kotlin . ir . util . fq Name When Available Ċ import Ġorg . jetbrains . kotlin . ir . util . functions Ċ import Ġorg . jetbrains . kotlin . ir . util . isNull Const Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . transform Children Void Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . util . Operator Name Con ventions Ċ Ċ internal Ġval Ġsingle Abstract Method Phase Ġ= Ġmake Ir File Phase ( ĊĠĠĠ Ġ:: Single Abstract Method Lower ing , ĊĠĠĠ Ġname Ġ= Ġ" Single Abstract Method ", ĊĠĠĠ Ġdescription Ġ= Ġ" Replace ĠSAM Ġconversions Ġwith Ġinstances Ġof Ġinterface - implement ing Ġclasses ", ĊĠĠĠ Ġpr erequis ite Ġ= Ġset Of ( local Declarations Phase ) Ċ ) Ċ Ċ class ĠSingle Abstract Method Lower ing ( val Ġcontext : ĠCommon Backend Context ) Ġ: ĠClass Lower ing Pass Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġlower ( ir Class : ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcached Implement ations Ġ= Ġmutable Map Of < Pair < Ir Type , ĠIr Type >, ĠIr Class >() ĊĠĠĠĠĠĠĠ Ġval Ġlocal Implement ations Ġ= Ġmutable ListOf < Ir Class >() ĊĠĠĠĠĠĠĠ Ġir Class . transform Children Void ( object Ġ: ĠIr Element Transformer Void WithContext () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Type Operator ( expression : ĠIr Type Operator Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . operator Ġ!= ĠIr Type Operator . SAM _ CONVERSION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . visit Type Operator ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuper Type Ġ= Ġexpression . type Operand ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinvok able Ġ= Ġexpression . argument . transform ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRunning Ġin Ġthe Ġclass Ġcontext , Ġso Ġempty Ġscope Ġmeans Ġthis Ġis Ġa Ġfield / anonymous Ġinitializer . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope Owner Symbol Ġ= Ġcurrent Scope ?. scope ?. scope Owner Symbol Ġ?: Ġir Class . symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontext . create Ir Builder ( scope Owner Symbol ). ir Block ( inv ok able , Ġnull , Ġsuper Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNot Ġan Ġex haustive Ġcheck , Ġbut Ġenough Ġto Ġcover Ġthe Ġmost Ġcommon Ġcases . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inv ok able Ġis ĠIr Function Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRunnable (:: function ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ create Function Proxy Instance ( super Type , Ġinvok able ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( inv ok able Ġis ĠIr Block Ġ&& Ġinvok able . statements . last () Ġis ĠIr Function Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRunnable Ġ{ Ġlambda Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( statement Ġin Ġinvok able . statements . drop Last ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ statement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ create Function Proxy Instance ( super Type , Ġinvok able . statements . last () Ġas ĠIr Function Reference ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFall Ġback Ġto Ġmaterial izing Ġan Ġinvok able Ġobject . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ createObject Proxy Instance ( super Type , Ġinvok able , Ġexpression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConstruct Ġa Ġclass Ġthat Ġimplements Ġthe Ġspecified ĠSAM Ġinterface Ġand Ġcontains Ġa Ġbunch Ġof Ġfields ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġwhich Ġthe Ġarguments Ġto Ġthe Ġconstructor Ġare Ġstored : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġclass Ġsam $ n ( private Ġval Ġarg 0 : ĠT 0 , Ġ...) Ġ{ Ġoverride Ġfun Ġmethod (...) Ġ= Ġ< wh atever Ġbuild Override Ġreturns > Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġimplement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Type : ĠIr Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters : ĠList < Ir Type >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute Owner : ĠIr Attribute Container , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Override : ĠIr Simple Function .( List < Ir Field >) Ġ-> ĠIr Body ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠIr Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠsuperClass Ġ= Ġsuper Type . classifier OrFail . owner Ġas ĠIr Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġlanguage Ġdocumentation Ġpro hib its Ġcasting Ġlamb das Ġto Ġclasses , Ġbut Ġif Ġit Ġwas Ġallowed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġ` ir Delegating Constructor Call ` Ġin Ġthe Ġconstructor Ġbelow Ġwould Ġneed Ġto Ġbe Ġmodified . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( super Class . kind Ġ== ĠClass Kind . INTERFACE ) Ġ{ Ġ" SAM Ġconversion Ġto Ġan Ġabstract Ġclass Ġnot Ġallowed " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubclass Ġ= Ġbuild Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠName . special ("< sam Ġadapter Ġfor Ġ${ super Class . fq Name When Available }> ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠJ vm Lower ed Declaration Origin . GENERATED _ SAM _ IMPLEMENT ATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Implicit Parameter Declaration With Wrapped Descriptor () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġir Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġconvert Ġall Ġtype Ġparameters Ġto Ġupper Ġbounds ? ĠSee Ġthe Ġkt 1 1 6 9 6 Ġtest . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Types Ġ+= Ġsuper Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. copy Attributes ( attribute Owner ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġparameters . map Indexed Ġ{ Ġi , ĠfieldType Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass . addField Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠName . identifier (" arg $ i ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠfieldType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= Ġsubclass . origin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠVis ibilities . PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass . add Constructor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= Ġsubclass . origin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Primary Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( field Ġin Ġfields ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Value Parameter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġfield . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġfield . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= Ġsubclass . origin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġcontext . create Ir Builder ( symbol ). ir Block Body ( start Offset , Ġend Offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Delegating Constructor Call ( context . ir Built Ins . any Class . owner . construct ors . single ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( field , Ġparameter ) Ġin Ġfields . zip ( value Parameters )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Set Field ( ir Get ( subclass . this Receiver !! ), Ġfield , Ġir Get ( parameter )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ir Instance Initializer Call Impl ( start Offset , Ġend Offset , Ġsubclass . symbol , Ġcontext . ir Built Ins . unit Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuper Method Ġ= ĠsuperClass . functions . single Ġ{ Ġit . modal ity Ġ== ĠMod ality . AB STR ACT Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass . addFunction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġsuper Method . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġsuper Method . returnType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= Ġsuper Method . visibility ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= Ġsubclass . origin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverridden Symbols . add ( super Method . symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Parameter Ġ= Ġsubclass . this Receiver !!. copy To ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Method . value Parameters . map To ( value Parameters ) Ġ{ Ġit . copy To ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġbuild Override ( fields ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsubclass ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConstruct Ġa Ġclass Ġthat Ġwraps Ġan Ġinvok able Ġobject Ġinto Ġan Ġimplementation Ġof Ġan Ġinterface : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġclass Ġsam $ n ( private Ġval Ġinvok able : ĠF ) Ġ: ĠInterface Ġ{ Ġoverride Ġfun Ġmethod (...) Ġ= Ġinvok able (...) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Object Proxy ( super Type : ĠIr Type , Ġinvok able Type : ĠIr Type , Ġattribute Owner : ĠIr Attribute Container ): ĠIr Class Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimplement ( super Type , ĠlistOf ( inv ok able Type ), Ġattribute Owner ) Ġ{ Ġfields Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . create Ir Builder ( symbol ). ir Block Body ( start Offset , Ġend Offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinvok able Class Ġ= Ġinvok able Type . classifier OrFail . owner Ġas ĠIr Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Return ( ir Call ( inv ok able Class . functions . single Ġ{ Ġit . name Ġ== ĠOperator Name Con ventions . IN VOKE Ġ}). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir GetField ( ir Get ( dispatch Receiver Parameter !! ), Ġfields [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters . forEach Indexed Ġ{ Ġi , Ġparameter Ġ-> Ġput Value Argument ( i , Ġir Get ( parameter )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun ĠIr Block Builder . createObject Proxy Instance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Type : ĠIr Type , Ġinvok able : ĠIr Expression , Ġattribute Owner : ĠIr Attribute Container ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġgenerate Ġa Ġwrapper Ġclass Ġfor Ġnull , Ġit Ġhas Ġno Ġinvoke () Ġanyway . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inv ok able . isNull Const ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinvok able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimplementation Ġ= Ġcached Implement ations . get Or Put ( super Type Ġto Ġinvok able . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Object Proxy ( super Type , Ġinvok able . type , Ġattribute Owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( super Type . is Nullable () Ġ&& Ġinvok able . type . is Nullable ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinvok able Variable Ġ= Ġir Temporary ( inv ok able ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= Ġir Call ( implementation . construct ors . single ()). apply Ġ{ Ġput Value Argument ( 0 , Ġir Get ( inv ok able Variable )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir If Null ( super Type , Ġir Get ( inv ok able Variable ), Ġir Null (), Ġinstance ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Call ( implementation . construct ors . single ()). apply Ġ{ Ġput Value Argument ( 0 , Ġinvok able ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġlower ing Ġis Ġlocated Ġafter ĠLocal Declarations Lower ing . ĠOn Ġthe Ġone Ġhand , Ġthis Ġallows Ġus Ġto Ġcache ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġobject - wrapping Ġclasses Ġwithout Ġchecking Ġif Ġthe Ġtypes Ġare Ġlocal Ġdeclarations Ġor Ġnot . ĠOn Ġthe Ġother Ġhand , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġmeans Ġwe Ġneed Ġto Ġmanually Ġcreate Ġfields Ġfor Ġall Ġbound Ġarguments Ġwhen Ġwrapping Ġcallable Ġreferences . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠIr Function Reference . arguments : ĠList < Ir Expression ?> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( dispatch Receiver ). filter Ġ{ Ġsymbol . owner . dispatch Receiver Parameter Ġ!= Ġnull Ġ} Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( extension Receiver ). filter Ġ{ Ġsymbol . owner . extension Receiver Parameter Ġ!= Ġnull Ġ} Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġvalue Arguments Count ). map (:: getValue Argument ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConstruct Ġa Ġclass Ġthat Ġforwards Ġmethod Ġcalls Ġto Ġan Ġexisting Ġfunction / method : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġclass Ġsam $ n ( private Ġval Ġreceiver : ĠR ) Ġ: ĠInterface Ġ{ Ġoverride Ġfun Ġmethod (...) Ġ= Ġreceiver . target (...) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUn like Ġthe Ġabove Ġvariant , Ġthis Ġavoids Ġmaterial izing Ġan Ġinvok able ĠK Function Ġrepresenting ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġtarget Ġin ĠCallable Reference Lower ing , Ġthus Ġproducing Ġone Ġless Ġclass . ĠThis Ġis Ġactually Ġvery ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcommon , Ġas Ġ` Interface Ġ{ Ġsomething Ġ}` Ġis Ġa Ġlocal Ġfunction Ġ+ Ġa ĠSAM - conversion Ġof Ġa Ġreference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġit Ġinto Ġan Ġimplementation . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Function Proxy ( super Type : ĠIr Type , Ġreference : ĠIr Function Reference ): ĠIr Class Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimplement ( super Type , Ġreference . arguments . map NotNull Ġ{ Ġit ?. type Ġ}, Ġreference ) Ġ{ Ġfields Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . create Ir Builder ( symbol ). ir Block Body ( start Offset , Ġend Offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Return ( ir Call ( reference . symbol ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbound Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= Ġreference . arguments . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir GetField ( ir Get ( dispatch Receiver Parameter !! ), Ġfields [ bound Offset ++ ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Get ( value Parameters [ offset ++ ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reference . symbol . owner . dispatch Receiver Parameter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġarguments . remove At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reference . symbol . owner . extension Receiver Parameter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextension Receiver Ġ= Ġarguments . remove At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . forEach Indexed (:: put Value Argument ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun ĠIr Block Builder . create Function Proxy Instance ( super Type : ĠIr Type , Ġreference : ĠIr Function Reference ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimplementation Ġ= Ġcreate Function Proxy ( super Type , Ġreference ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reference . origin Ġ== ĠIr Statement Origin . AN ONY MO US _ FUNCTION Ġ|| Ġreference . origin Ġ== ĠIr Statement Origin . L AMBDA ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġreference . symbol . owner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimplementation . functions . single (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotations . addAll ( target . annotations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters . forEach Indexed Ġ{ Ġi , Ġp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . annotations . addAll ( target . value Parameters [ i ]. annotations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Implement ations Ġ+= Ġimplementation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġir Call ( implementation . construct ors . single ()). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreference . arguments . filter NotNull (). forEach Indexed (:: put Value Argument ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġir Class . declarations Ġ+= Ġcached Implement ations . values ĊĠĠĠĠĠĠĠ Ġir Class . declarations Ġ+= Ġlocal Implement ations ĊĠĠĠ Ġ} Ċ } Ċ