/* Ċ Ġ* Ġ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 . nj 2 k . inference . common Ċ Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Type Parameter Descriptor Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . analyze Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . resolve To Descriptor If Any Ċ import Ġorg . jetbrains . kotlin . idea . resolve . Resolution Facade Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . forEach Desc endant OfType Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . get Strict Parent OfType Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . resolve . calls . call Util . getType Ċ import Ġorg . jetbrains . kotlin . types . Kotlin Type Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . safe As Ċ Ċ abstract Ġclass ĠContext Collector ( private Ġval Ġresolution Facade : ĠResolution Facade ) Ġ{ ĊĠĠĠ Ġprivate Ġfun ĠKotlin Type . class Reference (): ĠClass Reference ? Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġdescriptor Ġ= Ġconstructor . declaration Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠClass Descriptor Ġ-> Ġdescriptor . class Reference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Parameter Descriptor Ġ-> ĠType Parameter Reference ( descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠK t Type Reference . class Reference (): ĠClass Reference ? Ġ= ĊĠĠĠĠĠĠĠ Ġanalyze ( resolution Facade )[ Binding Context . TYPE , Ġthis ]?. class Reference () ĊĊĠĠĠ Ġprivate Ġfun ĠK t Type Element . to Data (): ĠType Element Data ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Reference Ġ= Ġparent Ġas ? ĠK t Type Reference Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġanalyze ( resolution Facade )[ Binding Context . TYPE , Ġtype Reference ] Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġtype Parameter Descriptor Ġ= Ġtype . constructor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. declaration Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . safe As < Type Parameter Descriptor >() Ġ?: Ġreturn ĠType Element Data Impl ( this , Ġtype ) ĊĠĠĠĠĠĠĠ Ġreturn ĠType Parameter Element Data ( this , Ġtype , Ġtype Parameter Descriptor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcollect Type Variables ( elements : ĠList < Kt Element >): ĠInference Context Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeclaration To Type Variable Ġ= Ġmutable Map Of < Kt Named Declaration , ĠType Variable >() ĊĠĠĠĠĠĠĠ Ġval Ġtype Element To Type Variable Ġ= Ġmutable Map Of < Kt Type Element , ĠType Variable >() ĊĠĠĠĠĠĠĠ Ġval Ġtype Based Type Variables Ġ= Ġmutable ListOf < Type Based Type Variable >() ĊĊĠĠĠĠĠĠĠ Ġfun ĠK t Type Reference . to Bound Type ( owner : ĠType Variable Owner , Ġdefault State : ĠState ? Ġ= Ġnull ): ĠBound Type ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Element Ġ= Ġtype Element Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Reference Ġ= Ġclass Reference () Ġ?: ĠNo Class Reference ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġdefault State Ġ?: Ġclass Reference . getState ( type Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Arguments Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( class Reference Ġis ĠDescriptor Class Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element . type Arguments As Types . zip ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Reference . descriptor . declared Type Parameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġtype Argument , Ġtype Parameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Argument ?. to Bound Type ( owner ) Ġ?: ĠBound Type . STAR _ PRO JECTION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Parameter . variance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġempty List () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Variable Ġ= ĠType Element Based Type Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Reference , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Arguments , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element . to Data () Ġ?: Ġreturn Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element To Type Variable [ type Element ] Ġ= Ġtype Variable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtype Variable . as Bound Type () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠKotlin Type . to Bound Type (): ĠBound Type ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Reference Ġ= Ġclass Reference () Ġ?: ĠNo Class Reference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġclass Reference . getState ( type Element Ġ= Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Arguments Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( class Reference Ġis ĠDescriptor Class Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . zip ( class Reference . descriptor . declared Type Parameters ) Ġ{ Ġtype Argument , Ġtype Parameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Argument . type . to Bound Type () Ġ?: ĠBound Type . STAR _ PRO JECTION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Parameter . variance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġempty List () ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Variable Ġ= ĠType Based Type Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Reference , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Arguments , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Based Type Variables Ġ+= Ġtype Variable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtype Variable . as Bound Type () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsubstit utors Ġ= Ġmutable Map Of < Class Descriptor , ĠSuper Types Subst it utor >() ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Or As Expression ( type Reference : ĠK t Type Reference ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Element Ġ= Ġtype Reference . type Element Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Variable Ġ= Ġtype Reference . to Bound Type ( Other Target )?. type Variable Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element To Type Variable [ type Element ] Ġ= Ġtype Variable ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġelements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . forEach Desc endant OfType < Kt Expression > Ġ{ Ġexpression Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression Ġis ĠK t Callable Declaration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( expression Ġis ĠK t Parameter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġexpression Ġis ĠK t Property ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġexpression Ġis ĠK t Named Function ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Reference Ġ= Ġexpression . type Reference Ġ?: Ġreturn @ run ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Variable Ġ= Ġtype Reference . to Bound Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Parameter Ġ-> Ġexpression . get Strict Parent OfType < Kt Function >() ?. let (:: Function Parameter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Function Ġ-> ĠFunction ReturnType ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Property Ġ-> ĠProperty ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠOther Target ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?. type Variable Ġ?: Ġreturn @ run ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration To Type Variable [ expression ] Ġ= Ġtype Variable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression Ġis ĠK t Type Parameter List Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( type Parameter Ġin Ġexpression . type Parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Parameter . extends Bound ?. to Bound Type ( Other Target , Ġdefault State Ġ= ĠState . UPPER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( constraint Ġin Ġexpression . type Constraints ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint . bound Type Reference ?. to Bound Type ( Other Target , Ġdefault State Ġ= ĠState . UPPER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Class Or Object Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġexpression . super TypeList Entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( argument Ġin Ġentry . type Reference ?. type Element ?. type Arguments As Types Ġ?: Ġcontinue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument ?. to Bound Type ( Other Target ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . resolve To Descriptor If Any ( resolution Facade ) Ġ?: Ġreturn @ forEach Desc endant OfType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubstit utors [ descriptor ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSuper Types Subst it utor . createFrom Kt Class ( expression , Ġresolution Facade ) Ġ?: Ġreturn @ forEach Desc endant OfType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( type Parameter Ġin Ġexpression . type Parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Variable Ġ= Ġtype Parameter . resolve To Descriptor If Any ( resolution Facade ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . safe As < Type Parameter Descriptor >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . default Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . to Bound Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . type Variable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration To Type Variable [ type Parameter ] Ġ= Ġtype Variable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Call Expression Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( type Argument Ġin Ġexpression . type Arguments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Argument . type Reference ?. to Bound Type ( Type Argument ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Lambda Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġexpression . analyze ( resolution Facade ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġexpression . getType ( context )?. arguments ?. last OrNull ()?. type Ġ?: Ġreturn @ forEach Desc endant OfType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Variable Ġ= ĠreturnType . to Bound Type ()?. type Variable Ġ?: Ġreturn @ forEach Desc endant OfType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration To Type Variable [ expression . function Literal ] Ġ= Ġtype Variable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Binary Expression WithType RHS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Or As Expression ( expression . right Ġ?: Ġreturn @ forEach Desc endant OfType ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Is Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Or As Expression ( expression . type Reference Ġ?: Ġreturn @ forEach Desc endant OfType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Variables Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( type Element To Type Variable . values Ġ+ Ġdeclaration To Type Variable . values Ġ+ Ġtype Based Type Variables ). distinct () ĊĠĠĠĠĠĠĠ Ġreturn ĠInference Context ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelements , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Variables , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Element To Type Variable , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration To Type Variable , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration To Type Variable . map NotNull Ġ{ Ġ( key , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey . resolve To Descriptor If Any ( resolution Facade )?. let Ġ{ Ġit Ġto Ġvalue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubstit utors ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun ĠClass Reference . getState ( type Element : ĠK t Type Element ?): ĠState Ċ }