/* Ċ Ġ* Ġ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 . fir . resolve . transformers . body . resolve Ċ Ċ import Ġorg . jetbrains . kotlin . fir . F ir Element Ċ import Ġorg . jetbrains . kotlin . fir . F ir Session Ċ import Ġorg . jetbrains . kotlin . fir . declarations . F ir Value Parameter Ċ import Ġorg . jetbrains . kotlin . fir . expressions . F ir ArgumentList Ċ import Ġorg . jetbrains . kotlin . fir . expressions . F ir Expression Ċ import Ġorg . jetbrains . kotlin . fir . expressions . builder . build Var arg Arguments Expression Ċ import Ġorg . jetbrains . kotlin . fir . type Context Ċ import Ġorg . jetbrains . kotlin . fir . render WithType Ċ import Ġorg . jetbrains . kotlin . fir . resolve . Scope Session Ċ import Ġorg . jetbrains . kotlin . fir . resolve . inference . Inference Components Ċ import Ġorg . jetbrains . kotlin . fir . resolve . transformers . ReturnType Calculator Ċ import Ġorg . jetbrains . kotlin . fir . scopes . impl . with Re placed Con e Type Ċ import Ġorg . jetbrains . kotlin . fir . symbols . F ir Based Symbol Ċ import Ġorg . jetbrains . kotlin . fir . types . Con e Kotlin Type Ċ import Ġorg . jetbrains . kotlin . fir . types . F ir Type Ref Ċ import Ġorg . jetbrains . kotlin . fir . types . array ElementType Ċ import Ġkotlin . math . min Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠF ir Element > ĠF ir Based Symbol <* >. fir Unsafe (): ĠT Ġ{ ĊĠĠĠ Ġval Ġfir Ġ= Ġthis . fir ĊĠĠĠ Ġrequire ( fir Ġis ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Not Ġan Ġexpected Ġfir Ġelement Ġtype Ġ= Ġ${ T :: class }, Ġsymbol Ġ= Ġ${ this }, Ġfir Ġ= Ġ${ fir . render WithType () }" ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfir Ċ } Ċ Ċ internal Ġinline Ġvar ĠF ir Expression . result Type : ĠF ir Type Ref ĊĠĠĠ Ġget () Ġ= Ġtype Ref ĊĠĠĠ Ġset ( type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreplace Type Ref ( type ) ĊĠĠĠ Ġ} Ċ Ċ internal Ġfun Ġinference Components ( ĊĠĠĠ Ġsession : ĠF ir Session , ĊĠĠĠ ĠreturnType Calculator : ĠReturn Type Calculator , ĊĠĠĠ Ġscope Session : ĠScope Session Ċ ): ĠInference Components Ġ{ ĊĠĠĠ Ġval Ġinference Context Ġ= Ġsession . type Context ĊĠĠĠ Ġreturn ĠInference Components ( inference Context , Ġsession , ĠreturnType Calculator , Ġscope Session ) Ċ } Ċ Ċ internal Ġfun Ġremap Arguments With Var arg ( ĊĠĠĠ Ġvar arg Parameter : ĠF ir Value Parameter , ĊĠĠĠ Ġvar arg ArrayType : ĠC one Kotlin Type , ĊĠĠĠ Ġargument List : ĠF ir ArgumentList , ĊĠĠĠ Ġargument Mapping : ĠMap < F ir Expression , ĠF ir Value Parameter > Ċ ): ĠMap < F ir Expression , ĠF ir Value Parameter > Ġ{ ĊĠĠĠ Ġ// ĠCreate Ġa ĠF ir Var arg Argument Expression Ġfor Ġthe Ġvar arg Ġarguments ĊĠĠĠ Ġval Ġvar arg ParameterType Ref Ġ= Ġvar arg Parameter . returnType Ref ĊĠĠĠ Ġval Ġvar arg ElementType Ġ= Ġvar arg ArrayType . array ElementType () ĊĠĠĠ Ġvar Ġfirst Index Ġ= Ġargument List . arguments . size ĊĠĠĠ Ġval Ġnew Argument Mapping Ġ= Ġmutable Map Of < F ir Expression , ĠF ir Value Parameter >() ĊĠĠĠ Ġval Ġvar arg Argument Ġ= Ġbuild Var arg Arguments Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . var arg ElementType Ġ= Ġvar arg ParameterType Ref . with Re placed Con e Type ( var arg ElementType ) ĊĠĠĠĠĠĠĠ Ġthis . type Ref Ġ= Ġvar arg ParameterType Ref . with Re placed Con e Type ( var arg ArrayType ) ĊĠĠĠĠĠĠĠ Ġfor Ġ(( i , Ġarg ) Ġin Ġargument List . arguments . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Parameter Ġ= Ġargument Mapping [ arg ] Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Parameter . is Var arg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Index Ġ= Ġmin ( first Index , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ+= Ġarg ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Argument Mapping [ arg ] Ġ= Ġvalue Parameter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġnew Argument Mapping [ var arg Argument ] Ġ= Ġvar arg Parameter ĊĠĠĠ Ġreturn Ġnew Argument Mapping Ċ } Ċ