package Ġme . him 1 8 8 . kotlin . dynamic . deleg ation . compiler . backend Ċ Ċ import Ġme . him 1 8 8 . kotlin . dynamic . deleg ation . compiler . config . Plugin Configuration Ċ import Ġorg . jetbrains . kotlin . backend . common . Body Lower ing Pass Ċ 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 . extensions . Ir Generation Extension Ċ import Ġorg . jetbrains . kotlin . backend . common . extensions . Ir Plugin Context Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . addChild Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . copy To Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . parent sWith Self Ċ import Ġorg . jetbrains . kotlin . backend . common . run On File Post fix Ċ import Ġorg . jetbrains . kotlin . descriptors . Descriptor Vis ibilities Ċ import Ġorg . jetbrains . kotlin . ir . Ir Statement Ċ import Ġorg . jetbrains . kotlin . ir . assert Cast Ċ import Ġorg . jetbrains . kotlin . ir . builders . declarations . build Field Ċ import Ġorg . jetbrains . kotlin . ir . builders . declarations . build Fun Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Call Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Expr Body Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Get Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir GetField Ċ import Ġorg . jetbrains . kotlin . ir . declarations .* Ċ import Ġorg . jetbrains . kotlin . ir . declarations . impl . Ir Factory Impl Ċ import Ġorg . jetbrains . kotlin . ir . expressions .* Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Simple Function Symbol Ċ import Ġorg . jetbrains . kotlin . ir . types . Ir Type Ċ import Ġorg . jetbrains . kotlin . ir . types . getClass Ċ import Ġorg . jetbrains . kotlin . ir . types . type With Ċ import Ġorg . jetbrains . kotlin . ir . util .* Ċ 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 . Name Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . first Is Instance Ċ Ċ class ĠPlugin Ir Generation Extension ( ĊĠĠĠ Ġprivate Ġval Ġext : ĠPlugin Configuration Ċ ) Ġ: ĠIr Generation Extension Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate ( module Fragment : ĠIr Module Fragment , Ġplugin Context : ĠIr Plugin Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠPlugin Generation Context ( plugin Context , Ġext ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġmodule Fragment . files ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDynamic Deleg ation Lower ing Pass ( context ). run On File Post fix ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRemove Delegate Field Initializer Pass ( plugin Context , Ġext ). run On File Post fix ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPersistent Lower ing Pass ( context ). run On File Post fix ( file ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠPlugin Generation Context ( ĊĠĠĠ Ġval Ġir Context : ĠIr Plugin Context , ĊĠĠĠ Ġval Ġext : ĠPlugin Configuration , ĊĠĠĠ Ġval Ġwrapper Expression Mapper : ĠWrapper Expression Mapper Ġ= ĠWrapper Expression Mapper ( ir Context , Ġext ), Ċ ) Ċ Ċ class ĠRemove Delegate Field Initializer Pass ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠIr Plugin Context , ĊĠĠĠ Ġprivate Ġval Ġext : ĠPlugin Configuration , Ċ ) Ġ: ĠClass Lower ing Pass Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġlower ( ir Class : ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsymbols Ġ= Ġcontext . reference Functions ( DD Fq Names . DYNAMIC _ DE LEG ATION ) ĊĠĠĠĠĠĠĠ Ġir Class . transform Declarations Flat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠIr Field Ġ&& Ġit . is Dynamic Deleg ation Field ( symbols )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . initializer Ġ= Ġnull Ġ// Ġnot Ġremoving Ġthe Ġfield Ġfor Ġcompatibility ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠPersistent Lower ing Pass ( ĊĠĠĠ Ġprivate Ġval Ġplugin Context : ĠPlugin Generation Context , Ċ ) Ġ: ĠBody Lower ing Pass Ġ{ ĊĠĠĠ Ġprivate Ġval Ġir Context Ġget () Ġ= Ġplugin Context . ir Context ĊĊĠĠĠ Ġprivate Ġval Ġpersistent Symbols Ġ= Ġplugin Context . ir Context . reference Functions ( DD Fq Names . PER SIST ENT ) ĊĠĠĠ Ġprivate Ġval Ġlazy Class Symbol Ġ= Ġplugin Context . ir Context . reference Class ( DD Fq Names . LA ZY _ CLASS ) !! ĊĠĠĠ Ġprivate Ġval Ġlazy GetValue Symbol Ġ= Ġlazy Class Symbol . getProperty Getter (" value ") !! ĊĠĠĠ Ġprivate Ġval Ġlazy Fun Symbol : ĠIr Simple Function Symbol Ġ= ĊĠĠĠĠĠĠĠ Ġplugin Context . ir Context . reference Functions ( DD Fq Names . LA ZY _ FUN ). single Ġ{ Ġfunction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Parameters Ġ= Ġfunction . owner . value Parameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters . size Ġ== Ġ 1 Ġ&& Ġvalue Parameters . single (). type . getClass () Ġ== Ġplugin Context . ir Context . ir Built Ins . function N ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlower ( ir Body : ĠIr Body , Ġcontainer : ĠIr Declaration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġir Body . transform Children Void ( object Ġ: ĠIr Element Transformer Void () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Call ( expression : ĠIr Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . symbol Ġ! in Ġpersistent Symbols ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġprocess Call ( expression , Ġcontainer ) Ġ?: Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġstatement Ġis Ġcalling Ġ` persistent ` ĊĠĠĠ Ġprivate Ġfun Ġprocess Call ( statement : ĠIr Call , Ġcontainer : ĠIr Declaration ): ĠIr Expression ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( statement . type Arguments Count Ġ== Ġ 0 ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( statement . value Arguments Count Ġ== Ġ 0 ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( container Ġ! is ĠIr Simple Function ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġdeclaration Container Ġ= Ġcontainer . parent sWith Self . first Is Instance < Ir Declaration Container >() ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration Container Ġ! is ĠIr Symbol Owner ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval ĠpropertyName Ġ= Ġnext PropertyName ( container , Ġdeclaration Container ) ĊĊĠĠĠĠĠĠĠ Ġval Ġorigin Type Argument Ġ= Ġstatement . getType Argument ( 0 ) !! ĊĊĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġplugin Context . ir Context . ir Factory . build Field Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Static Ġ= Ġdeclaration Container Ġis ĠIr File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠpropertyName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġlazy Class Symbol . type With ( origin Type Argument ) ĊĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġfield Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . parent Ġ= Ġdeclaration Container ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration Container . addChild ( field ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfield . initializer Ġ= Ġplugin Context . ir Context . create Ir Builder ( field . symbol ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ= Ġlazy Ġ{ Ġstatement . call () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Expr Body ( ir Call ( lazy Fun Symbol ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin Dispatch Receiver Type Ġ= Ġcontainer . dispatch Receiver Parameter ?. type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġstatement . getValue Argument ( 0 ) !!. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Dispatch Re ceiv ers ( declaration Container , Ġfield , Ġorigin Dispatch Receiver Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġreplace Ġ` persistent Ġ{ Ġ Ġ}` Ġwith Ġ` this . fn $ pers 1 ` Ġ( get Ġfield ) ĊĠĠĠĠĠĠĠ Ġreturn Ġplugin Context . ir Context . create Ir Builder ( container . symbol ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlazy Ġ= Ġir GetField ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . dispatch Receiver Parameter ?. let (:: ir Get ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ// ĠIr File Ġdoesn 't Ġneed Ġdispatch Ġreceiver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Call ( lazy GetValue Symbol , Ġdispatch Receiver Ġ= Ġlazy ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIr Expression . transform Dispatch Re ceiv ers ( ĊĠĠĠĠĠĠĠ Ġdeclaration Container : ĠIr Declaration Container , ĊĠĠĠĠĠĠĠ Ġfield : ĠIr Field , ĊĠĠĠĠĠĠĠ Ġorigin Dispatch Receiver Type : ĠIr Type ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration Container Ġ! is ĠIr Class ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġplugin Context . ir Context . create Ir Builder ( field . symbol ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Dispatch Receiver Ġ= Ġdeclaration Container . this Receiver Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġtransform Children Void ( object Ġ: ĠIr Element Transformer Void () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit GetValue ( expression : ĠIr GetValue ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . type Ġ== Ġorigin Dispatch Receiver Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuilder . ir Get ( new Dispatch Receiver ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . visit GetValue ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnext PropertyName ( container : ĠIr Declaration , Ġdeclaration Container : ĠIr Declaration Container ): ĠName Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġshift Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠName . identifier ( container . getName (). asString () Ġ+ Ġ"\ $ pers $ shift ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( declaration Container . declarations . any Ġ{ Ġit . getName OrNull () Ġ== Ġname Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshift ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIr Declaration . getName (): ĠName Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠgetName OrNull () Ġ?: Ġerror (" No Ġname : Ġ$ this ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIr Declaration . getName OrNull (): ĠName ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this Ġis ĠIr Declaration WithName ) Ġname Ġelse Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠDynamic Deleg ation Lower ing Pass ( ĊĠĠĠ Ġprivate Ġval Ġplugin Context : ĠPlugin Generation Context , Ċ ) Ġ: ĠClass Lower ing Pass Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdynamic Deleg ation Symbols Ġ= ĊĠĠĠĠĠĠĠ Ġplugin Context . ir Context . reference Functions ( DD Fq Names . DYNAMIC _ DE LEG ATION ) ĊĊĠĠĠ Ġoverride Ġfun Ġlower ( ir Class : ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelegate Fields Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . fields ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . is Dynamic Deleg ation Field ( dynamic Deleg ation Symbols ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDynamic Deleg ation ( it , Ġgenerate Dynamic Deleg ation Wrapper ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĊĠĠĠĠĠĠĠ Ġdelegate Fields . as Sequence (). flatMap Ġ{ Ġit . wrapper . declarations () Ġ}. forEach Ġ{ Ġir Class . declarations . add ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġir Class . transform ( Dynamic Extension Class Transformer ( plugin Context , Ġdelegate Fields . toList ()), Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġwrapper Ġreturns Ġthe Ġdeleg ated Ġinstance ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate Dynamic Deleg ation Wrapper ( field : ĠIr Field ): ĠDynamic Deleg ation Wrapper Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġextract Actual Call (): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinitializer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield . initializer ?. expression ?. assert Cast < Ir Call >() ?. getValue Argument ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror (" Could Ġnot Ġfind Ġan Ġinitializer Ġfor ĠDE LEG ATE Ġfield Ġ'${ field . render ()} '. ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠIr Factory Impl . build Fun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠName . identifier ("${ field . name }- wrapper ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= Ġfield . start Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset Ġ= Ġfield . end Offset ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠD Y NAMIC _ DE LEG ATION _ WRAPPER ĊĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġfield . type ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠDescriptor Vis ibilities . PRIVATE ĊĠĠĠĠĠĠĠ Ġ}. run Ġwrapper @{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġfield . parent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Parameter Ġ= Ġfield . parent As Class . this Receiver ?. copy To ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( expr , Ġhelper Field ) Ġ= Ġplugin Context . wrapper Expression Mapper . map ( symbol , Ġextract Actual Call ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġplugin Context . ir Context . create Ir Builder ( symbol ). ir Expr Body ( expr ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠDynamic Deleg ation Wrapper ( this , Ġhelper Field ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* ĠTransform Ġ[ Ir Declaration Origin . DE LEG ATED _ MEMBER ] Ġfrom Ġ` ir GetField ` Ġto Ġ` ir Call ( wrapper )` Ċ Ġ*/ Ċ class ĠDynamic Extension Class Transformer ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠPlugin Generation Context , ĊĠĠĠ Ġprivate Ġval Ġdeleg ations : ĠList < Dynamic Deleg ation > Ċ ) Ġ: ĠIr Element Transformer Void WithContext () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġvisit Declaration ( declaration : ĠIr Declaration Base ): ĠIr Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġ! is ĠIr Simple Function ) Ġreturn Ġsuper . visit Declaration ( declaration ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( declaration . origin Ġ== ĠIr Declaration Origin . DE LEG ATED _ MEMBER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeleg ation Ġ= Ġdeclaration . find Respons ible Deleg ation ( deleg ations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġsuper . visit Declaration ( declaration ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelegate Call Ġ= Ġwhen Ġ( val Ġexpr Ġ= Ġdeclaration . body ?. statements ?. single ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Return Ġ-> Ġexpr . value . assert Cast () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Call Ġ-> Ġexpr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġreturn Ġsuper . visit Declaration ( declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unsupported Ġexpr : Ġ${ expr :: class . qualified Name } Ġ$ expr ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . body Ġ= Ġcontext . ir Context . create Ir Builder ( declaration . symbol ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelegate Instance Ġ= Ġir Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ation . wrapper . function . symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġdeclaration . dispatch Receiver Parameter ?. let Ġ{ Ġir Get ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Expr Body ( ir Call ( delegate Call . symbol , Ġdispatch Receiver Ġ= Ġdelegate Instance ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Extension Receiver From ( delegate Call ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Arguments From ( delegate Call ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . visit Declaration ( declaration ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠIr Call . copy Arguments From ( delegate Call : ĠIr Call ) Ġ{ ĊĠĠĠ Ġrepeat ( delegate Call . value Arguments Count ) Ġ{ ĊĠĠĠĠĠĠĠ Ġput Value Argument ( it , Ġdelegate Call . getValue Argument ( it )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġrepeat ( delegate Call . type Arguments Count ) Ġ{ ĊĠĠĠĠĠĠĠ Ġput Type Argument ( it , Ġdelegate Call . getType Argument ( it )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠIr Call . copy Extension Receiver From ( delegate Call : ĠIr Call ) Ġ{ ĊĠĠĠ Ġthis . extension Receiver Ġ= Ġdelegate Call . extension Receiver Ċ }