package Ġme . him 1 8 8 . kotlin . dynamic . deleg ation . compiler . backend Ċ Ċ import Ġorg . jetbrains . kotlin . ir . Ir Element Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Declaration Origin Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Field Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Simple Function Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Call Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir GetField Ċ 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 . name . Fq Name ĊĊ Ċ data Ġclass ĠDynamic Deleg ation ( ĊĠĠĠ Ġval Ġfield : ĠIr Field , ĊĠĠĠ Ġval Ġwrapper : ĠDynamic Deleg ation Wrapper , Ċ ) Ċ Ċ object ĠD DF q Names Ġ{ ĊĠĠĠ Ġval ĠD Y NAMIC _ DE LEG ATION Ġ= ĠF q Name (" me . him 1 8 8 . kotlin . dynamic . deleg ation . dynamic Deleg ation ") ĊĠĠĠ Ġval ĠPER SIST ENT Ġ= ĠF q Name (" me . him 1 8 8 . kotlin . dynamic . deleg ation . persistent ") ĊĠĠĠ Ġval ĠL AZ Y _ CLASS Ġ= ĠF q Name (" kotlin . Lazy ") ĊĠĠĠ Ġval ĠL AZ Y _ FUN Ġ= ĠF q Name (" kotlin . lazy ") ĊĊĠĠĠ Ġfun Ġis Dynamic Deleg ation ( name : ĠF q Name ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġname Ġ== ĠD Y NAMIC _ DE LEG ATION ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Calling Persistent ( name : ĠF q Name ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġname Ġ== ĠPER SIST ENT ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠIr Field . is Dynamic Deleg ation Field ( dynamic Deleg ation Symbols : ĠCollection < Ir Symbol >): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( origin Ġ!= ĠIr Declaration Origin . DE LEG ATE ) Ġreturn Ġfalse ĊĠĠĠ Ġval Ġinitializer Ġ= Ġinitializer Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġvar Ġresult Ġ= Ġfalse ĊĠĠĠ Ġinitializer . accept Children Void ( object Ġ: ĠIr Element Visitor Void Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠIr Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠIr Call ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . symbol Ġin Ġdynamic Deleg ation Symbols ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun ĠIr Simple Function . find Respons ible Deleg ation ( deleg ations : ĠList < Dynamic Deleg ation >): ĠDynamic Deleg ation ? Ġ{ ĊĠĠĠ Ġvar Ġresult : ĠDynamic Deleg ation ? Ġ= Ġnull ĊĠĠĠ Ġaccept Children Void ( object Ġ: ĠIr Element Visitor Void Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠIr Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . accept Children Void ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit GetField ( expression : ĠIr GetField ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Result Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ations . find Ġ{ Ġexpression . symbol Ġ== Ġit . field . symbol Ġ} Ġ?: Ġreturn Ġsuper . visit GetField ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġnew Result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnew Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Found Ġmultiple Ġmatching Ġdeleg ations : Ġ\ n $ result \ n $ new Result ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . visit GetField ( expression ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ