/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 7 Ġ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 . types . checker Ċ Ċ import Ġorg . jetbrains . kotlin . builtins . Kotlin Built Ins Ċ import Ġorg . jetbrains . kotlin . descriptors . Classifier Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Type Parameter Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . annotations . Annotations Ċ import Ġorg . jetbrains . kotlin . resolve . calls . inference . Capt ured Type Constructor Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . Member Scope Ċ import Ġorg . jetbrains . kotlin . types .* Ċ import Ġorg . jetbrains . kotlin . types . model . Capture Status Ċ import Ġorg . jetbrains . kotlin . types . model . Capt ured Type Marker Ċ import Ġorg . jetbrains . kotlin . types . ref inement . Type Ref inement Ċ import Ġorg . jetbrains . kotlin . types . type Util . as Type Projection Ċ import Ġorg . jetbrains . kotlin . types . type Util . built Ins Ċ Ċ // Ġnull Ġmeans Ġthat Ġtype Ġshould Ġbe Ġle aved Ġas Ġis Ċ fun Ġprepare Argument Type Reg arding Capture Types ( argument Type : ĠUn wrapped Type ): ĠUn wrapped Type ? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( argument Type Ġis ĠNew Capt ured Type ) Ġnull Ġelse Ġcapture From Expression ( argument Type ) Ċ } Ċ Ċ fun Ġcapture From Expression ( type : ĠUn wrapped Type ): ĠUn wrapped Type ? Ġ= ĊĠĠĠ Ġcapture From Expression ( type . lower If Flex ible ()) Ċ Ċ private Ġfun Ġcapture From Expression ( type : ĠSimple Type ): ĠUn wrapped Type ? Ġ{ ĊĠĠĠ Ġval Ġtype Constructor Ġ= Ġtype . constructor ĊĠĠĠ Ġif Ġ( type Constructor Ġis ĠIntersection Type Constructor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġchanged Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġcaptured Sup ert ypes Ġ= Ġtype Constructor . sup ert ypes . map Ġ{ Ġsup ertype Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun wrapped Ġ= Ġsup ertype . unwrap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcapture From Expression ( un wrapped )?. apply Ġ{ Ġchanged Ġ= Ġtrue Ġ} Ġ?: Ġun wrapped ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! changed ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġintersect Types ( captured Sup ert ypes ). make Nullable As Specified ( type . is Marked Nullable ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġcapture From Arguments ( type , ĠCapture Status . FROM _ EXPRESSION ) Ċ } Ċ Ċ // Ġthis Ġfunction Ġsuppose Ġthat Ġinput Ġtype Ġis Ġsimple Ġclassifier Ġtype Ċ internal Ġfun Ġcapture From Arguments ( ĊĠĠĠ Ġtype : ĠSimple Type , ĊĠĠĠ Ġstatus : ĠCapture Status Ċ ): ĠSimple Type ? Ġ{ ĊĠĠĠ Ġif Ġ( type . arguments . size Ġ!= Ġtype . constructor . parameters . size ) Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġarguments Ġ= Ġtype . arguments ĊĠĠĠ Ġif Ġ( arguments . all Ġ{ Ġit . projection Kind Ġ== ĠVari ance . IN VARIANT Ġ}) Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġcaptured Arguments Ġ= Ġarguments . zip ( type . constructor . parameters ). map Ġ{ Ġ( projection , Ġparameter ) Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( projection . projection Kind Ġ== ĠVari ance . IN VARIANT ) Ġreturn @ map Ġprojection ĊĊĠĠĠĠĠĠĠ Ġval Ġlower Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! projection . is Star Projection Ġ&& Ġprojection . projection Kind Ġ== ĠVari ance . IN _ VARI ANCE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprojection . type . unwrap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠNew Capt ured Type ( status , Ġlower Type , Ġprojection , Ġparameter ). as Type Projection () Ġ// Ġtodo Ġoptimization : Ġdo Ġnot Ġcreate Ġtype Ġprojection ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsubstit utor Ġ= ĠType Constructor Substitution . create ( type . constructor , Ġcaptured Arguments ). build Subst it utor () ĊĠĠĠ Ġfor Ġ( index Ġin Ġarguments . indices ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Projection Ġ= Ġarguments [ index ] ĊĠĠĠĠĠĠĠ Ġval Ġnew Projection Ġ= Ġcaptured Arguments [ index ] ĊĊĠĠĠĠĠĠĠ Ġif Ġ( old Projection . projection Kind Ġ== ĠVari ance . IN VARIANT ) Ġcontinue ĊĠĠĠĠĠĠĠ Ġval Ġcaptured Type Sup ert ypes Ġ= Ġtype . constructor . parameters [ index ]. upper Bounds . map To ( mutable ListOf ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNew Kotlin Type Checker . Default . transform To New Type ( subst it utor . safe Subst itute ( it , ĠVari ance . IN VARIANT ). unwrap ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! old Projection . is Star Projection Ġ&& Ġold Projection . projection Kind Ġ== ĠVari ance . OUT _ VARI ANCE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcaptured Type Sup ert ypes Ġ+= ĠNew Kotlin Type Checker . Default . transform To New Type ( old Projection . type . unwrap ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcaptured Type Ġ= Ġnew Projection . type Ġas ĠNew Capt ured Type ĊĠĠĠĠĠĠĠ Ġcaptured Type . constructor . initialize Sup ert ypes ( captured Type Sup ert ypes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠKotlin Type Factory . simple Type ( type . annotations , Ġtype . constructor , Ġcaptured Arguments , Ġtype . is Marked Nullable ) Ċ } Ċ Ċ /** Ċ Ġ* ĠNow Ġ[ lower Type ] Ġis Ġnot Ġnull Ġonly Ġfor Ġin Ġprojection s . Ċ Ġ* ĠExample : Ġ` Inv < in ĠString >` ĠFor Ġ` in ĠString ` Ġwe Ġcreate ĠCapt ured Type Ġwith Ġ[ lower Type ] Ġ= ĠString . Ċ Ġ* Ċ Ġ* ĠTODO : Ġinterface ĠD < T , ĠS : ĠList < T >, ĠD < *, ĠList < Number >> Ġ-> ĠD < Q , ĠList < Number >> Ċ Ġ* ĠĠĠĠ ĠWe Ġshould Ġset Ġ[ lower Type ] Ġfor ĠQ Ġas ĠNumber . ĠFor Ġthis Ġwe Ġshould Ġuse Ġconstraint Ġsystem . Ċ Ġ* Ċ Ġ*/ Ċ class ĠNew Capt ured Type ( ĊĠĠĠ Ġval Ġcapture Status : ĠCapture Status , ĊĠĠĠ Ġoverride Ġval Ġconstructor : ĠNew Capt ured Type Constructor , ĊĠĠĠ Ġval Ġlower Type : ĠUn wrapped Type ?, Ġ// Ġtodo Ġcheck Ġlower Ġtype Ġfor Ġnullable Ġcaptured Ġtypes ĊĠĠĠ Ġoverride Ġval Ġannotations : ĠAn notations Ġ= ĠAn notations . EMPTY , ĊĠĠĠ Ġoverride Ġval Ġis Marked Nullable : ĠBoolean Ġ= Ġfalse Ċ ) Ġ: ĠSimple Type (), ĠCapt ured Type Marker Ġ{ ĊĠĠĠ Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcapture Status : ĠCapture Status , Ġlower Type : ĠUn wrapped Type ?, Ġprojection : ĠType Projection , Ġtype Parameter : ĠType Parameter Descriptor ĊĠĠĠ Ġ) Ġ: Ġthis ( capture Status , ĠNew Capt ured Type Constructor ( projection , Ġtype Parameter Ġ= Ġtype Parameter ), Ġlower Type ) ĊĊĠĠĠ Ġoverride Ġval Ġarguments : ĠList < Type Projection > Ġget () Ġ= ĠlistOf () ĊĊĠĠĠ Ġoverride Ġval Ġmember Scope : ĠMember Scope Ġ// Ġtodo Ġwhat Ġabout Ġfoo (). bar () Ġwhere Ġfoo () Ġreturn Ġcaptured Ġtype ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠError Utils . create Error Scope (" No Ġmember Ġresolution Ġshould Ġbe Ġdone Ġon Ġcaptured Ġtype !", Ġtrue ) ĊĊĠĠĠ Ġoverride Ġfun Ġreplace Annotations ( new Annotations : ĠAn notations ) Ġ= ĊĠĠĠĠĠĠĠ ĠNew Capt ured Type ( capture Status , Ġconstructor , Ġlower Type , Ġnew Annotations , Ġis Marked Nullable ) ĊĊĠĠĠ Ġoverride Ġfun Ġmake Nullable As Specified ( new Null ability : ĠBoolean ) Ġ= ĊĠĠĠĠĠĠĠ ĠNew Capt ured Type ( capture Status , Ġconstructor , Ġlower Type , Ġannotations , Ġnew Null ability ) ĊĊĠĠĠ Ġ@ Type Ref inement ĊĠĠĠ Ġoverride Ġfun Ġref ine ( kotlin Type Ref iner : ĠKotlin Type Ref iner ) Ġ= ĊĠĠĠĠĠĠĠ ĠNew Capt ured Type ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcapture Status , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor . ref ine ( kotlin Type Ref iner ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlower Type ?. let Ġ{ Ġkotlin Type Ref iner . ref ine Type ( it ). unwrap () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotations , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Marked Nullable ĊĠĠĠĠĠĠĠ Ġ) Ċ } Ċ Ċ class ĠNew Capt ured Type Constructor ( ĊĠĠĠ Ġoverride Ġval Ġprojection : ĠType Projection , ĊĠĠĠ Ġprivate Ġvar Ġsup ert ypes Computation : Ġ(() Ġ-> ĠList < Un wrapped Type >) ? Ġ= Ġnull , ĊĠĠĠ Ġprivate Ġval Ġoriginal : ĠNew Capt ured Type Constructor ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġtype Parameter : ĠType Parameter Descriptor ? Ġ= Ġnull Ċ ) Ġ: ĠCapt ured Type Constructor Ġ{ ĊĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprojection : ĠType Projection , ĊĠĠĠĠĠĠĠ Ġsup ert ypes : ĠList < Un wrapped Type >, ĊĠĠĠĠĠĠĠ Ġoriginal : ĠNew Capt ured Type Constructor ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ: Ġthis ( projection , Ġ{ Ġsup ert ypes Ġ}, Ġoriginal ) ĊĊĠĠĠ Ġprivate Ġval Ġ_ sup ert ypes Ġby Ġlazy ( Lazy Thread Safety Mode . PUBLIC ATION ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsup ert ypes Computation ?. invoke () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinitialize Sup ert ypes ( sup ert ypes : ĠList < Un wrapped Type >) Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( this . sup ert ypes Computation Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Already Ġinitialized ! ĠoldValue Ġ= Ġ${ this . sup ert ypes Computation }, ĠnewValue Ġ= Ġ$ sup ert ypes " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . sup ert ypes Computation Ġ= Ġ{ Ġsup ert ypes Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Sup ert ypes () Ġ= Ġ_ sup ert ypes Ġ?: Ġempty List () ĊĠĠĠ Ġoverride Ġfun Ġget Parameters (): ĠList < Type Parameter Descriptor > Ġ= Ġempty List () ĊĊĠĠĠ Ġoverride Ġfun Ġis Final () Ġ= Ġfalse ĊĠĠĠ Ġoverride Ġfun Ġis Den ot able () Ġ= Ġfalse ĊĠĠĠ Ġoverride Ġfun Ġget Declaration Descriptor (): ĠClass ifier Descriptor ? Ġ= Ġnull ĊĠĠĠ Ġoverride Ġfun Ġget Built Ins (): ĠKotlin Built Ins Ġ= Ġprojection . type . built Ins ĊĊĠĠĠ Ġ@ Type Ref inement ĊĠĠĠ Ġoverride Ġfun Ġref ine ( kotlin Type Ref iner : ĠKotlin Type Ref iner ) Ġ= ĊĠĠĠĠĠĠĠ ĠNew Capt ured Type Constructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprojection . ref ine ( kotlin Type Ref iner ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsup ert ypes Computation ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsup ert ypes . map Ġ{ Ġit . ref ine ( kotlin Type Ref iner ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal Ġ?: Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Parameter Ġ= Ġtype Parameter ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġother Ġas ĠNew Capt ured Type Constructor ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( original Ġ?: Ġthis ) Ġ=== Ġ( other . original Ġ?: Ġother ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġoriginal ?. hashCode () Ġ?: Ġsuper . hashCode () ĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Capt ured Type ($ projection )" Ċ } Ċ