/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 Ġ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 . fir . scopes . impl Ċ Ċ import Ġorg . jetbrains . kotlin . descriptors . Modal ity Ċ import Ġorg . jetbrains . kotlin . fir . F ir Session Ċ import Ġorg . jetbrains . kotlin . fir . declarations .* Ċ import Ġorg . jetbrains . kotlin . fir . scopes . F ir Type Scope Ċ import Ġorg . jetbrains . kotlin . fir . scopes . Processor Action Ċ import Ġorg . jetbrains . kotlin . fir . symbols . Con e Class Like Lookup Tag Ċ import Ġorg . jetbrains . kotlin . fir . symbols . impl .* Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ Ċ class ĠF ir Deleg ated Member Scope ( ĊĠĠĠ Ġprivate Ġval Ġuse Site Scope : ĠF ir Type Scope , ĊĠĠĠ Ġprivate Ġval Ġsession : ĠF ir Session , ĊĠĠĠ Ġprivate Ġval Ġcontaining Class : ĠC one Class Like Lookup Tag , ĊĠĠĠ Ġprivate Ġval Ġdelegate Field : ĠF ir Field , Ċ ) Ġ: ĠF ir Type Scope () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdeleg ated Function Cache Ġ= Ġmutable Map Of < F ir Named Function Symbol , ĠF ir Named Function Symbol >() ĊĠĠĠ Ġprivate Ġval Ġdeleg ated Property Cache Ġ= Ġmutable Map Of < F ir Property Symbol , ĠF ir Property Symbol >() ĊĊĠĠĠ Ġoverride Ġfun Ġprocess Functions ByName ( name : ĠName , Ġprocessor : Ġ( F ir Function Symbol <* >) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġuse Site Scope . process Functions ByName ( name ) Ġprocessor @{ Ġfunction Symbol Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function Symbol Ġ! is ĠF ir Named Function Symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor ( function Symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ processor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Ġ= Ġfunction Symbol . fir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( original . modal ity Ġ== ĠMod ality . FINAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor ( function Symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ processor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeleg ated Symbol Ġ= Ġdeleg ated Function Cache . get Or Put ( function Symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Symbol Ġ= ĠF ir Named Function Symbol ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Symbol . callable Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Fake Override Generator . create Copy For F ir Function ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Declaration Origin . Deleg ated , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Modal ity Ġ= ĠMod ality . OPEN , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Wrapper Data Ġ= ĠDeleg ated Wrapper Data ( function Symbol . fir , Ġcontaining Class , Ġdelegate Field ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. symbol Ġas ĠF ir Named Function Symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor ( deleg ated Symbol ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess Properties ByName ( name : ĠName , Ġprocessor : Ġ( F ir Variable Symbol <* >) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġuse Site Scope . process Properties ByName ( name ) Ġprocessor @{ Ġproperty Symbol Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property Symbol Ġ! is ĠF ir Property Symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor ( property Symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ processor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Ġ= Ġproperty Symbol . fir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( original . modal ity Ġ== ĠMod ality . FINAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor ( property Symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ processor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeleg ated Symbol Ġ= Ġdeleg ated Property Cache . get Or Put ( property Symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Fake Override Generator . create Copy For F ir Property ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Property Symbol ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Symbol . callable Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverridden Symbol Ġ= Ġproperty Symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Modal ity Ġ= ĠMod ality . OPEN , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Wrapper Data Ġ= ĠDeleg ated Wrapper Data ( property Symbol . fir , Ġcontaining Class , Ġdelegate Field ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor ( deleg ated Symbol ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess Direct Over ridden Function sWith Base Scope ( ĊĠĠĠĠĠĠĠ Ġfunction Symbol : ĠF ir Function Symbol <* >, ĊĠĠĠĠĠĠĠ Ġprocessor : Ġ( F ir Function Symbol <* >, ĠF ir Type Scope ) Ġ-> ĠProcessor Action ĊĠĠĠ Ġ): ĠProcessor Action Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprocess Direct Over ridden With Base Scope ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Symbol , Ġprocessor , ĠF ir Type Scope :: process Direct Over ridden Function sWith Base Scope ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess Direct Over ridden Properties With Base Scope ( ĊĠĠĠĠĠĠĠ Ġproperty Symbol : ĠF ir Property Symbol , ĊĠĠĠĠĠĠĠ Ġprocessor : Ġ( F ir Property Symbol , ĠF ir Type Scope ) Ġ-> ĠProcessor Action ĊĠĠĠ Ġ): ĠProcessor Action Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprocess Direct Over ridden With Base Scope ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Symbol , Ġprocessor , ĠF ir Type Scope :: process Direct Over ridden Properties With Base Scope ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠD Ġ: ĠF ir Callable Symbol <* >> Ġprocess Direct Over ridden With Base Scope ( ĊĠĠĠĠĠĠĠ Ġsymbol : ĠD , ĊĠĠĠĠĠĠĠ Ġno inline Ġprocessor : Ġ( D , ĠF ir Type Scope ) Ġ-> ĠProcessor Action , ĊĠĠĠĠĠĠĠ Ġprocess Direct Over ridden Call ables With Base Scope : ĠF ir Type Scope .( D , Ġ(( D , ĠF ir Type Scope ) Ġ-> ĠProcessor Action )) Ġ-> ĠProcessor Action , ĊĠĠĠ Ġ): ĠProcessor Action Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwrapped Data Ġ= Ġ( symbol . fir Ġas ? ĠF ir Callable Member Declaration <* >) ?. deleg ated Wrapper Data ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrapped Data Ġ== Ġnull Ġ|| Ġwrapped Data . containing Class Ġ!= Ġcontaining Class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Site Scope . process Direct Over ridden Call ables With Base Scope ( symbol , Ġprocessor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġprocessor ( wrapped Data . wrapped . symbol Ġas ĠD , Ġuse Site Scope ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Callable Names (): ĠSet < Name > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġuse Site Scope . get Callable Names () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Classifier Names (): ĠSet < Name > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġuse Site Scope . getClass ifier Names () ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġobject ĠDeleg ated Wrapper Data Key Ġ: ĠF ir Declaration Data Key () Ċ class ĠDeleg ated Wrapper Data < D Ġ: ĠF ir Callable Declaration < *> >( ĊĠĠĠ Ġval Ġwrapped : ĠD , ĊĠĠĠ Ġval Ġcontaining Class : ĠC one Class Like Lookup Tag , ĊĠĠĠ Ġval Ġdelegate Field : ĠF ir Field , Ċ ) Ċ var Ġ< D Ġ: ĠF ir Callable Declaration <* >> ĊĠĠĠĠĠĠĠ ĠD . deleg ated Wrapper Data : ĠDeleg ated Wrapper Data < D >? Ġby ĠF ir Declaration Data Registry . data ( Deleg ated Wrapper Data Key ) Ċ