/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . Ġ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 . calls Ċ Ċ import Ġorg . jetbrains . kotlin . fir . expressions .* Ċ import Ġorg . jetbrains . kotlin . fir . types . Con e Kotlin Type Ċ import Ġorg . jetbrains . kotlin . fir . types . F ir Type Ref Ċ import Ġorg . jetbrains . kotlin . resolve . calls . inference . components . Kotlin Constraint System Comp leter Ċ import Ġorg . jetbrains . kotlin . resolve . calls . inference . components . Type Variable Direction Calculator Ċ import Ġorg . jetbrains . kotlin . resolve . calls . inference . components . Variable Fix ation Finder Ċ import Ġorg . jetbrains . kotlin . resolve . calls . inference . model . Variable With Constraints Ċ import Ġorg . jetbrains . kotlin . resolve . calls . model . Post p oned Resolved Atom Ċ import Ġorg . jetbrains . kotlin . resolve . calls . model . Post p oned Resolved Atom Marker Ċ import Ġorg . jetbrains . kotlin . types . model . Kotlin Type Marker Ċ import Ġorg . jetbrains . kotlin . types . model . is Integer Literal Type Constructor Ċ import Ġorg . jetbrains . kotlin . types . model . type Constructor Ċ import Ġorg . jetbrains . kotlin . utils . add If NotNull Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . safe As ĊĊ Ċ fun ĠC andidate . compute Completion Mode ( ĊĠĠĠ Ġcomponents : ĠInference Components , ĊĠĠĠ Ġexpected Type : ĠF ir Type Ref ?, ĊĠĠĠ Ġcurrent ReturnType : ĠC one Kotlin Type ? Ċ ): ĠKotlin Constraint System Comp leter . Constraint System Completion Mode Ġ{ ĊĠĠĠ Ġ// ĠPres ence Ġof Ġexpected Ġtype Ġmeans Ġthat Ġwe Ġtrying Ġto Ġcomplete Ġout erm ost Ġcall Ġ=> Ġcompletion Ġmode Ġshould Ġbe Ġfull ĊĠĠĠ Ġif Ġ( expected Type Ġ!= Ġnull ) Ġreturn ĠKotlin Constraint System Comp leter . Constraint System Completion Mode . FULL ĊĊĠĠĠ Ġ// ĠThis Ġis Ġquestion able Ġas Ġnull Ġreturn Ġtype Ġcan Ġbe Ġonly Ġfor Ġerror Ġcall ĊĠĠĠ Ġif Ġ( current ReturnType Ġ== Ġnull ) Ġreturn ĠKotlin Constraint System Comp leter . Constraint System Completion Mode . PAR TIAL ĊĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠConsider Ġcall Ġfoo ( bar ( x )), Ġif Ġreturn Ġtype Ġof Ġbar Ġis Ġa Ġproper Ġone , Ġthen Ġwe Ġcan Ġcomplete Ġresolve Ġfor Ġbar Ġ=> Ġfull Ġcompletion Ġmode ĊĠĠĠĠĠĠĠ Ġ// ĠOtherwise , Ġwe Ġshouldn 't Ġcomplete Ġbar Ġuntil Ġwe Ġprocess Ġcall Ġfoo ĊĠĠĠĠĠĠĠ Ġcs Builder . is Pro per Type ( current ReturnType ) Ġ-> ĠKotlin Constraint System Comp leter . Constraint System Completion Mode . FULL ĊĊĠĠĠĠĠĠĠ Ġ// ĠNested Ġcall Ġis Ġconnected Ġwith Ġthe Ġouter Ġone Ġthrough Ġthe ĠUPPER Ġconstraint Ġ( returnType Ġ<: Ġexpected Outer Type ) ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġmeans Ġthat Ġthere Ġwill Ġbe Ġno Ġnew ĠLOWER Ġconstraints Ġ=> ĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġit 's Ġpossible Ġto Ġcomplete Ġcall Ġnow Ġif Ġthere Ġare Ġproper ĠLOWER Ġconstraints ĊĠĠĠĠĠĠĠ Ġcs Builder . is Type Variable ( current ReturnType ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Pro per Non T rivial Lower Constraints ( components , Ġcurrent ReturnType )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Constraint System Comp leter . Constraint System Completion Mode . FULL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Constraint System Comp leter . Constraint System Completion Mode . PAR TIAL ĊĊĠĠĠĠĠĠĠ Ġ// ĠReturn Ġtype Ġhas Ġproper Ġequal Ġconstraints Ġ=> Ġthere Ġis Ġno Ġneed Ġin Ġthe Ġouter Ġcall ĊĠĠĠĠĠĠĠ Ġcontains Type Variable sWith Pro per Equal Constraints ( components , Ġcurrent ReturnType ) Ġ-> ĠKotlin Constraint System Comp leter . Constraint System Completion Mode . FULL ĊĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠKotlin Constraint System Comp leter . Constraint System Completion Mode . PAR TIAL ĊĠĠĠ Ġ} Ċ } Ċ Ċ val ĠC andidate . cs Builder Ġget () Ġ= Ġsystem . get Builder () Ċ Ċ private Ġfun ĠC andidate . contains Type Variable sWith Pro per Equal Constraints ( components : ĠInference Components , Ġtype : ĠC one Kotlin Type ): ĠBoolean Ġ= ĊĠĠĠ Ġwith ( components . ctx ){ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( variable Constructor , Ġvariable With Constraints ) Ġin Ġcs Builder . current Storage (). not Fixed Type Variables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! type . contains Ġ{ Ġit . type Constructor () Ġ== Ġvariable Constructor Ġ}) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstraints Ġ= Ġvariable With Constraints . constraints ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġonly Pro per Equal Constraints Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraints . isNotEmpty () Ġ&& Ġconstraints . all Ġ{ Ġit . kind . isEqual () Ġ&& Ġcs Builder . is Pro per Type ( it . type ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! only Pro per Equal Constraints ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ Ċ private Ġfun ĠC andidate . has Pro per Non T rivial Lower Constraints ( components : ĠInference Components , Ġtype Variable : ĠC one Kotlin Type ): ĠBoolean Ġ{ ĊĠĠĠ Ġassert ( cs Builder . is Type Variable ( type Variable )) Ġ{ Ġ"$ type Variable Ġis Ġnot Ġa Ġtype Ġvariable " Ġ} ĊĊĠĠĠ Ġval Ġcontext Ġ= Ġcomponents . ctx ĊĠĠĠ Ġval Ġconstructor Ġ= Ġtype Variable . type Constructor ( context ) ĊĠĠĠ Ġval Ġvariable With Constraints Ġ= Ġcs Builder . current Storage (). not Fixed Type Variables [ constructor ] Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġval Ġconstraints Ġ= Ġvariable With Constraints . constraints ĊĠĠĠ Ġreturn Ġconstraints . isNotEmpty () Ġ&& Ġconstraints . all Ġ{ ĊĠĠĠĠĠĠĠ Ġ! it . type . type Constructor ( context ). is Integer Literal Type Constructor ( context ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . kind . is Lower () Ġ&& Ġcs Builder . is Pro per Type ( it . type ) ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ Ċ class ĠConstraint System Comp leter ( val Ġcomponents : ĠInference Components ) Ġ{ ĊĠĠĠ Ġval Ġvariable Fix ation Finder Ġ= ĠVariable Fix ation Finder ( components . trivial Constraint Type Inference Oracle ) ĊĠĠĠ Ġfun Ġcomplete ( ĊĠĠĠĠĠĠĠ Ġc : ĠKotlin Constraint System Comp leter . Context , ĊĠĠĠĠĠĠĠ Ġcompletion Mode : ĠKotlin Constraint System Comp leter . Constraint System Completion Mode , ĊĠĠĠĠĠĠĠ Ġtop Level Atoms : ĠList < F ir Statement >, ĊĠĠĠĠĠĠĠ Ġcandidate ReturnType : ĠC one Kotlin Type , ĊĠĠĠĠĠĠĠ Ġanalyze : Ġ( Post p oned Resolved Atom Marker ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( analyze Post p one Argument If Possible ( c , Ġtop Level Atoms , Ġanalyze )) Ġcontinue ĊĊ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Type Variables Ġ= Ġget Ordered All Type Variables ( c , Ġcollect Variables From Context , Ġtop Level Atoms ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Type Variables Ġ= Ġc . not Fixed Type Variables . keys . toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpost p oned Kt Primitives Ġ= Ġget Ordered Not Analy zed Post p oned Arguments ( top Level Atoms ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable For Fix ation Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable Fix ation Finder . findFirst Variable For Fix ation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc , Ġall Type Variables , Ġpost p oned Kt Primitives , Ġcompletion Mode , Ġcandidate ReturnType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġbreak Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Force Callable Reference Or Lambda Resolution ( completion Mode , Ġvariable For Fix ation )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( force Post p oned Atom Resolution < Resolved Callable Reference Atom >( top Level Atoms , Ġanalyze )) Ġcontinue Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( force Post p oned Atom Resolution < Lambda WithType Variable As Expected Type Atom >( top Level Atoms , Ġanalyze )) Ġcontinue Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( variable For Fix ation . has Pro per Constraint Ġ|| Ġcompletion Mode Ġ== ĠKotlin Constraint System Comp leter . Constraint System Completion Mode . FULL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable With Constraints Ġ= Ġc . not Fixed Type Variables . getValue ( variable For Fix ation . variable ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfix Variable ( c , Ġcandidate ReturnType , Ġvariable With Constraints , Ġempty List ()) Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! variable For Fix ation . has Pro per Constraint ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . add Error ( Not En ough Information ForType Parameter ( variable With Constraints . type Variable )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( completion Mode Ġ== ĠKotlin Constraint System Comp leter . Constraint System Completion Mode . FULL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġforce Ġresolution Ġfor Ġall Ġnot - analy zed Ġargument 's ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ordered Not Analy zed Post p oned Arguments ( top Level Atoms ). forEach ( analyze ) Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . not Fixed Type Variables . isNotEmpty () Ġ&& Ġc . post p oned Type Variables . isEmpty ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Completion ( c , Ġcompletion Mode , Ġtop Level Atoms , Ġtop Level Type , Ġanalyze ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfix Variable ( ĊĠĠĠĠĠĠĠ Ġc : ĠKotlin Constraint System Comp leter . Context , ĊĠĠĠĠĠĠĠ Ġtop Level Type : ĠKotlin Type Marker , ĊĠĠĠĠĠĠĠ Ġvariable With Constraints : ĠVariable With Constraints , ĊĠĠĠĠĠĠĠ Ġpost p oned Resolve Kt Primitives : ĠList < Post p oned Resolved Atom > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdirection Ġ= ĠType Variable Direction Calculator ( c , Ġpost p oned Resolve Kt Primitives , Ġtop Level Type ). get Direction ( variable With Constraints ) ĊĠĠĠĠĠĠĠ Ġfix Variable ( c , Ġvariable With Constraints , Ġdirection ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfix Variable ( ĊĠĠĠĠĠĠĠ Ġc : ĠKotlin Constraint System Comp leter . Context , ĊĠĠĠĠĠĠĠ Ġvariable With Constraints : ĠVariable With Constraints , ĊĠĠĠĠĠĠĠ Ġdirection : ĠType Variable Direction Calculator . Resolve Direction ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Type Ġ= Ġcomponents . result Type Resolver . find Result Type ( c , Ġvariable With Constraints , Ġdirection ) ĊĠĠĠĠĠĠĠ Ġc . fix Variable ( variable With Constraints . type Variable , Ġresult Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanalyze Post p one Argument If Possible ( ĊĠĠĠĠĠĠĠ Ġc : ĠKotlin Constraint System Comp leter . Context , ĊĠĠĠĠĠĠĠ Ġtop Level Atoms : ĠList < F ir Statement >, ĊĠĠĠĠĠĠĠ Ġanalyze : Ġ( Post p oned Resolved Atom Marker ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( argument Ġin Ġget Ordered Not Analy zed Post p oned Arguments ( top Level Atoms )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( can We Analyze It ( c , Ġargument )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyze ( argument ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Ordered Not Analy zed Post p oned Arguments ( top Level Atoms : ĠList < F ir Statement >): ĠList < Post p oned Resolved Atom Marker > Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠF ir Statement . process ( to : ĠMutable List < Post p oned Resolved Atom Marker >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Function Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcandidate Ġ= Ġ( this . callee Reference Ġas ? ĠF ir Named Reference With Candidate )?. candidate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate ?. post p oned Atoms ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto . add If NotNull ( it . safe As < Post p oned Resolved Atom Marker >() ?. take Unless Ġ{ Ġit . analy zed Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . arguments . forEach Ġ{ Ġit . process ( to ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir When Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcandidate Ġ= Ġ( this . callee Reference Ġas ? ĠF ir Named Reference With Candidate )?. candidate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate ?. post p oned Atoms ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto . add If NotNull ( it . safe As < Post p oned Resolved Atom Marker >() ?. take Unless Ġ{ Ġit . analy zed Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . branches . forEach Ġ{ Ġit . result . process ( to ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Try Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcandidate Ġ= Ġ( this . callee Reference Ġas ? ĠF ir Named Reference With Candidate )?. candidate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate ?. post p oned Atoms ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto . add If NotNull ( it . safe As < Post p oned Resolved Atom Marker >() ?. take Unless Ġ{ Ġit . analy zed Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Block . process ( to ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcat ches . forEach Ġ{ Ġit . block . process ( to ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Wrapped Argument Expression Ġ-> Ġthis . expression . process ( to ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTO OD : ĠW TF ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( analy zed ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Resolved Atoms . forEach Ġ{ Ġit . process ( to ) Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnot Analy zed Arguments Ġ= Ġarray ListOf < Post p oned Resolved Atom Marker >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( primitive Ġin Ġtop Level Atoms ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprimitive . process ( not Analy zed Arguments ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnot Analy zed Arguments ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcan We Analyze It ( c : ĠKotlin Constraint System Comp leter . Context , Ġargument : ĠPost p oned Resolved Atom Marker ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( argument . analy zed ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġargument . input Types . all Ġ{ Ġc . contains Only Fixed Or Post p oned Variables ( it ) Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ