/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 6 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . resolve . calls . inference Ċ Ċ import Ġorg . jetbrains . kotlin . builtins .* Ċ import Ġorg . jetbrains . kotlin . coroutines . has Suspend FunctionType Ċ import Ġorg . jetbrains . kotlin . descriptors . Callable Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Function Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Value Parameter Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . annotations . Annotations Ċ import Ġorg . jetbrains . kotlin . psi . Kt Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Function Ċ import Ġorg . jetbrains . kotlin . psi . Kt Lambda Expression Ċ import Ġorg . jetbrains . kotlin . psi . Value Argument Ċ import Ġorg . jetbrains . kotlin . renderer . Descriptor Renderer Ċ import Ġorg . jetbrains . kotlin . renderer . Descriptor Renderer Options Ċ import Ġorg . jetbrains . kotlin . resolve . calls . Argument Type Resolver Ċ import Ġorg . jetbrains . kotlin . resolve . calls . Argument Type Resolver . get Callable Reference Expression If Any Ċ import Ġorg . jetbrains . kotlin . resolve . calls . Argument Type Resolver . get Function Literal Argument If Any Ċ import Ġorg . jetbrains . kotlin . resolve . calls . Call Comp leter Ċ import Ġorg . jetbrains . kotlin . resolve . calls . call Resolver Util . Resolve Arguments Mode . RESOL VE _ FUNCTION _ ARGUMENT S Ċ import Ġorg . jetbrains . kotlin . resolve . calls . call Resolver Util . get Effective Expected Type Ċ import Ġorg . jetbrains . kotlin . resolve . calls . call Resolver Util . has Unknown Function Parameter Ċ import Ġorg . jetbrains . kotlin . resolve . calls . context .* Ċ import Ġorg . jetbrains . kotlin . resolve . calls . inference . constraint Position . Constraint Position Kind Ċ import Ġorg . jetbrains . kotlin . resolve . calls . model . Argument Match Ċ import Ġorg . jetbrains . kotlin . resolve . calls . model . is Re ally Success Ċ import Ġorg . jetbrains . kotlin . resolve . calls . results . Over load Resolution Results Impl Ċ import Ġorg . jetbrains . kotlin . resolve . calls . tasks . Tracing Strategy Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . built Ins Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . re ceiv ers . Receiver Value Ċ import Ġorg . jetbrains . kotlin . types .* Ċ import Ġorg . jetbrains . kotlin . types . Type Utils . NO _ EXPECTED _ TYPE Ċ import Ġorg . jetbrains . kotlin . types . checker . New Kotlin Type Checker Ċ import Ġorg . jetbrains . kotlin . types . checker . Type Checker Context Ċ import Ġorg . jetbrains . kotlin . types . expressions . Expression Typing Services Ċ import Ġorg . jetbrains . kotlin . types . expressions . Kotlin TypeInfo Ċ import Ġorg . jetbrains . kotlin . types . type Util . as Type Projection Ċ import Ġorg . jetbrains . kotlin . types . type Util . built Ins Ċ import Ġorg . jetbrains . kotlin . types . type Util . contains Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠType Template ( ĊĠĠĠĠĠĠĠ Ġval Ġtype Variable : ĠType Variable , ĊĠĠĠĠĠĠĠ Ġval Ġcoroutine Inference Data : ĠCor outine Inference Data Ċ ) Ġ: ĠFlex ible Type ( type Variable . original Type Parameter . built Ins . nothing Type , Ġtype Variable . original Type Parameter . built Ins . nullable Any Type ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġreplace Annotations ( new Annotations : ĠAn notations ) Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġfun Ġmake Nullable As Specified ( new Null ability : ĠBoolean ) Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġval Ġdelegate : ĠSimple Type ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġupper Bound ĊĊĠĠĠ Ġoverride Ġfun Ġrender ( renderer : ĠDescriptor Renderer , Ġoptions : ĠDescriptor Renderer Options ) Ġ= ĊĠĠĠĠĠĠĠ Ġ"~ ${ renderer . render Type ( type Variable . type )}" Ċ } Ċ Ċ class ĠCor outine Inference Data Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcs Builder Ġ= ĠConstraint System Builder Impl () ĊĠĠĠ Ġprivate Ġval Ġtype Templates Ġ= ĠHashMap < Type Variable , ĠType Template >() ĊĠĠĠ Ġprivate Ġvar Ġhere Is Bad Call Ġ= Ġfalse ĊĊĠĠĠ Ġfun ĠgetType Template ( type Variable : ĠType Variable ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Templates . get Or Put ( type Variable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Template ( type Variable , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit System () Ġ{ ĊĠĠĠĠĠĠĠ Ġcs Builder . register Type Variables ( Call Handle . NONE , Ġtype Templates . keys . map Ġ{ Ġit . fresh Type Parameter Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto New Variable Type ( type : ĠKotlin Type ): ĠKotlin Type Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( type . unwrap () Ġas ? ĠType Template )?. type Variable ?. fresh Type Parameter ?. let Ġ{ Ġtype Variable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcs Builder . type Variable Subst it utors [ Call Handle . NONE ]?. subst itution ?. get ( type Variable . default Type )?. type ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġtype ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Constraint ( sub Type : ĠKotlin Type , Ġsuper Type : ĠKotlin Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcs Builder . add Subtype Constraint ( to New Variable Type ( sub Type ), Ġto New Variable Type ( super Type ), ĠConstraint Position Kind . SPECIAL . position ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreport Inference Result ( external CS Builder : ĠConstraint System . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( here Is Bad Call ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġresulting Substitution Ġ= Ġcs Builder . build (). result ing Subst it utor . subst itution ĊĠĠĠĠĠĠĠ Ġfor Ġ(( original Type Variable ) Ġin Ġtype Templates ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresulting Substitution [ original Type Variable . type ]?. type . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexternal CS Builder . add Subtype Constraint ( original Type Variable . type , Ġit , ĠConstraint Position Kind . FROM _ COMP LE TER . position ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexternal CS Builder . add Subtype Constraint ( it , Ġoriginal Type Variable . type , ĠConstraint Position Kind . FROM _ COMP LE TER . position ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbad Call H app ened () Ġ{ ĊĠĠĠĠĠĠĠ Ġhere Is Bad Call Ġ= Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠCor outine Inference Support ( ĊĠĠĠĠĠĠĠ Ġval Ġargument Type Resolver : ĠArgument Type Resolver , ĊĠĠĠĠĠĠĠ Ġval Ġexpression Typing Services : ĠExpression Typing Services Ċ ) Ġ{ ĊĠĠĠ Ġ@ set : Inject ĊĠĠĠ Ġlateinit Ġvar Ġcall Comp leter : ĠCall Comp leter ĊĊĠĠĠ Ġfun Ġanalyze Coroutine ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Literal : ĠK t Function , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Argument : ĠValue Argument , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcs Builder : ĠConstraint System . Builder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠCall Candidate Resolution Context <* >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlambda Expected Type : ĠKotlin Type ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġargument Expression Ġ= Ġvalue Argument . get Argument Expression () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ(! lambda Expected Type . is Suspend FunctionType ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġlambda Receiver Type Ġ= Ġlambda Expected Type . get Receiver Type From FunctionType () Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġinference Data Ġ= ĠCor outine Inference Data () ĊĊĠĠĠĠĠĠĠ Ġval Ġconstraint System Ġ= Ġcs Builder . build () ĊĠĠĠĠĠĠĠ Ġval Ġnew Substitution Ġ= Ġobject Ġ: ĠDeleg ated Type Substitution ( constraint System . current Subst it utor . subst itution ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget ( key : ĠKotlin Type ): ĠType Projection ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubstit uted Type Ġ= Ġsuper . get ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( subst it uted Type ?. type Ġ!= ĠType Utils . D ONT _ C ARE ) Ġreturn Ġsubstit uted Type ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtodo : Ġwhat Ġabout Ġnullable Ġtype ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Variable Ġ= Ġconstraint System . type Variables . first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . original Type Parameter . default Type Ġ== Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn Ġsubstit uted Type ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinference Data . getType Template ( type Variable ). as Type Projection () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapproximate Contr av ari ant Capt ured Types () Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Receiver Type Ġ= Ġnew Substitution . build Subst it utor (). substitute ( lambda Receiver Type , ĠVari ance . IN VARIANT ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġapproximation Subst it utor Ġ= Ġobject Ġ: ĠDeleg ated Type Substitution ( constraint System . current Subst it utor . subst itution ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapproximate Contr av ari ant Capt ured Types () Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġapprox imated Lambda Type Ġ= Ġapproximation Subst it utor . build Subst it utor (). substitute ( lambda Expected Type , ĠVari ance . IN _ VARI ANCE ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Expected Type Ġ= Ġcreate FunctionType ( new Receiver Type . built Ins , Ġapprox imated Lambda Type . annotations , Ġnew Receiver Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapprox imated Lambda Type . getValue Parameter Types From FunctionType (). map ( Type Projection :: getType ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Names Ġ= Ġnull , Ġ// ĠTODO : Ġparameter Names ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġapprox imated Lambda Type . get ReturnType From FunctionType (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Function Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( has Unknown Function Parameter ( new Expected Type )) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġinference Data . init System () ĊĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġtrace Ġshouldn 't Ġbe Ġcommitted ĊĠĠĠĠĠĠĠ Ġval Ġtemporary For Coroutine Ġ= ĠTemporary Trace And Cache . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , Ġ" trace Ġfor Ġtype Ġargument Ġinference Ġfor Ġcoroutine ", Ġfunction Literal ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Context Ġ= Ġcontext . replace Expected Type ( new Expected Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace Data Flow Info ( context . candidate Call . data Flow Info For Arguments . getInfo ( value Argument )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace Context Dependency ( Context Dependency . INDEP END ENT ). replace Trace And Cache ( temporary For Coroutine ) ĊĠĠĠĠĠĠĠ Ġargument Type Resolver . get Function Literal TypeInfo ( argument Expression , Ġfunction Literal , Ġnew Context , ĠRES OL VE _ FUNCTION _ ARGUMENT S ) ĊĊĠĠĠĠĠĠĠ Ġinference Data . report Inference Result ( cs Builder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Coroutine Calls ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠBasic Call Resolution Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracing Strategy : ĠTr acing Strategy , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverload Results : ĠOver load Resolution Results Impl < *> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinference Data Ġ= Ġoverload Results . get Coroutine Inference Data () Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġresulting Call Ġ= Ġoverload Results . result ing Call ĊĊĠĠĠĠĠĠĠ Ġforce Inference For Arguments ( context ) Ġ{ Ġ_: ĠValue Argument , Ġ_: ĠKotlin Type Ġ-> Ġ/* Ġdo Ġnothing Ġ*/ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcall Comp leter . complete Call ( context , Ġoverload Results , Ġtracing Strategy ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! result ing Call . is Re ally Success ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Bad Call ( result ing Call . result ing Descriptor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinference Data . bad Call H app ened () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġforce Inference For Arguments ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Argument : ĠValue Argument , Ġkotlin Type : ĠKotlin Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargument Match Ġ= Ġresulting Call . get Argument Mapping ( value Argument ) Ġas ? ĠArgument Match ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn @ force Inference For Arguments ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( New Kotlin Type Checker ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Type Ġ= Ġget Effective Expected Type ( argument Match . value Parameter , Ġvalue Argument ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Type Checker Context (). is Subtype Of ( kotlin Type . unwrap (), Ġparameter Type . unwrap ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġextension Receiver Ġ= Ġresulting Call . result ing Descriptor . extension Receiver Parameter Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġresulting Call . extension Receiver ?. let Ġ{ Ġactual Receiver Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( New Kotlin Type Checker ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Type Checker Context (). is Subtype Of ( actual Receiver . type . unwrap (), Ġextension Receiver . value . type . unwrap ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Bad Call ( result ing Descriptor : ĠCallable Descriptor ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠKotlin Type . contains Type Template () Ġ= Ġcontains Ġ{ Ġit Ġis ĠType Template Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġresulting Descriptor . returnType Ġ?: Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( returnType . contains Type Template ()) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result ing Descriptor Ġ! is ĠFunction Descriptor Ġ|| Ġresulting Descriptor . is Suspend ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( value Parameter Ġin Ġresulting Descriptor . value Parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Parameter . type . contains Type Template ()) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠCor outine Type Checker Context Ġ: ĠType Checker Context ( error Type Equals To Anything Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Subtype Constraint ( sub Type : ĠUn wrapped Type , Ġsuper Type : ĠUn wrapped Type ): ĠBoolean ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( sub Type Ġas ? ĠType Template Ġ?: Ġsuper Type Ġas ? ĠType Template )?. coroutine Inference Data ?. add Constraint ( sub Type , Ġsuper Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġforce Inference For Arguments ( context : ĠCall Resolution Context <* >, Ġcallback : Ġ( argument : ĠValue Argument , Ġargument Type : ĠKotlin Type ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinfo For Arguments Ġ= Ġcontext . data Flow Info For Arguments ĊĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġcontext . call ĊĠĠĠĠĠĠĠ Ġval Ġbase Context Ġ= Ġcontext . replace Context Dependency ( Context Dependency . INDEP END ENT ). replace Expected Type ( NO _ EXPECTED _ TYPE ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( argument Ġin Ġcall . value Arguments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression Ġ= Ġargument . get Argument Expression () Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Info For Call Ġ= Ġget Argument TypeInfo ( expression , Ġbase Context . replace Data Flow Info ( info For Arguments . getInfo ( argument ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Info For Call . type ?. let Ġ{ Ġcallback ( argument , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Argument TypeInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression : ĠK t Expression , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠCall Resolution Context < *> ĊĠĠĠ Ġ): ĠKotlin TypeInfo Ġ{ ĊĠĠĠĠĠĠĠ Ġget Function Literal Argument If Any ( expression , Ġcontext )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġargument Type Resolver . get Function Literal TypeInfo ( expression , Ġit , Ġcontext , ĠRES OL VE _ FUNCTION _ ARGUMENT S ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget Callable Reference Expression If Any ( expression , Ġcontext )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġargument Type Resolver . get Callable Reference TypeInfo ( expression , Ġit , Ġcontext , ĠRES OL VE _ FUNCTION _ ARGUMENT S ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġexpression Typing Services . getType Info ( expression , Ġcontext ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġis Coroutine Call With Additional Inference ( parameter Descriptor : ĠValue Parameter Descriptor , Ġargument : ĠValue Argument ) Ġ= ĊĠĠĠĠĠĠĠ Ġparameter Descriptor . has Suspend FunctionType Ġ&& ĊĠĠĠĠĠĠĠ Ġargument . get Argument Expression () Ġis ĠK t Lambda Expression Ġ&& ĊĠĠĠĠĠĠĠ Ġparameter Descriptor . type . let Ġ{ Ġit . is Builtin Functional Type Ġ&& Ġit . get Receiver Type From FunctionType () Ġ!= Ġnull Ġ} ĊĊ Ċ fun ĠOver load Resolution Results Impl <* >. is Result With Coroutine Inference () Ġ= Ġget Coroutine Inference Data () Ġ!= Ġnull Ċ Ċ private Ġfun ĠOver load Resolution Results Impl <* >. get Coroutine Inference Data (): ĠCor outine Inference Data ? Ġ{ ĊĠĠĠ Ġif Ġ(! is Single Result ) Ġreturn Ġnull ĊĊĠĠĠ Ġfun ĠgetData ( receiver Value : ĠReceiver Value ?): ĠCor outine Inference Data ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcoroutine Inference Data : ĠCor outine Inference Data ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreceiver Value ?. type ?. contains Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġas ? ĠType Template )?. coroutine Inference Data ?. let Ġ{ Ġcoroutine Inference Data Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcoroutine Inference Data ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠgetData ( result ing Call . dispatch Receiver ) Ġ?: ĠgetData ( result ing Call . extension Receiver ) Ċ } Ċ