/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 5 Ġ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 . type Util Ċ Ċ import Ġorg . jetbrains . kotlin . builtins . Kotlin Built Ins Ċ import Ġorg . jetbrains . kotlin . descriptors . Callable Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Declaration Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Type Parameter Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . annotations . Annotations Ċ import Ġorg . jetbrains . kotlin . types .* Ċ import Ġorg . jetbrains . kotlin . types . checker . Kotlin Type Checker Ċ import Ġorg . jetbrains . kotlin . utils . to ReadOnly List Ċ import Ġjava . util .* Ċ Ċ public Ġenum Ġclass ĠType Null ability Ġ{ ĊĠĠĠ ĠNOT _ NULL , ĊĠĠĠ ĠNULL ABLE , ĊĠĠĠ ĠF LEX IBLE Ċ } Ċ Ċ public Ġfun ĠKotlin Type . null ability (): ĠType Null ability Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġis Null ability Flex ible () Ġ-> ĠType Null ability . FLEX IBLE ĊĠĠĠĠĠĠĠ ĠType Utils . is Nullable Type ( this ) Ġ-> ĠType Null ability . NULL ABLE ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠType Null ability . NOT _ NULL ĊĠĠĠ Ġ} Ċ } Ċ Ċ val ĠKotlin Type . built Ins : ĠKotlin Built Ins ĊĠĠĠ Ġget () Ġ= Ġconstructor . built Ins Ċ Ċ fun ĠKotlin Type . make Nullable () Ġ= ĠType Utils . make Nullable ( this ) Ċ fun ĠKotlin Type . make NotNull able () Ġ= ĠType Utils . make NotNull able ( this ) Ċ Ċ fun ĠKotlin Type . immediate Sup ert ypes (): ĠCollection < Kotlin Type > Ġ= ĠType Utils . get Immediate Sup ert ypes ( this ) Ċ fun ĠKotlin Type . sup ert ypes (): ĠCollection < Kotlin Type > Ġ= ĠType Utils . getAll Sup ert ypes ( this ) Ċ Ċ fun ĠKotlin Type . is Nothing (): ĠBoolean Ġ= ĠKotlin Built Ins . is Nothing ( this ) Ċ fun ĠKotlin Type . is Unit (): ĠBoolean Ġ= ĠKotlin Built Ins . is Unit ( this ) Ċ fun ĠKotlin Type . is Any Or Nullable Any (): ĠBoolean Ġ= ĠKotlin Built Ins . is Any Or Nullable Any ( this ) Ċ fun ĠKotlin Type . is Boolean (): ĠBoolean Ġ= ĠKotlin Built Ins . is Boolean ( this ) Ċ fun ĠKotlin Type . is Boolean Or Nullable Boolean (): ĠBoolean Ġ= ĠKotlin Built Ins . is Boolean Or Nullable Boolean ( this ) Ċ Ċ private Ġfun ĠKotlin Type . get Cont ained Type Parameters (): ĠCollection < Type Parameter Descriptor > Ġ{ ĊĠĠĠ Ġval Ġdeclaration Descriptor Ġ= Ġget Constructor (). get Declaration Descriptor () ĊĠĠĠ Ġif Ġ( declaration Descriptor Ġis ĠType Parameter Descriptor ) Ġreturn ĠlistOf ( declaration Descriptor ) ĊĊĠĠĠ Ġval Ġflexibility Ġ= Ġget Capability ( java Class < Flex ibility >()) ĊĠĠĠ Ġif Ġ( flex ibility Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġflexibility . lower Bound . get Cont ained Type Parameters () Ġ+ Ġflexibility . upper Bound . get Cont ained Type Parameters () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġget Arguments (). filter Ġ{ Ġ! it . is Star Projection () Ġ}. map Ġ{ Ġit . getType () Ġ}. flatMap Ġ{ Ġit . get Cont ained Type Parameters () Ġ} Ċ } Ċ Ċ fun ĠDeclaration Descriptor . get Capt ured Type Parameters (): ĠCollection < Type Parameter Descriptor > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠLinked HashSet < Type Parameter Descriptor >() ĊĠĠĠ Ġval Ġcontaining Declaration Ġ= Ġthis . get Containing Declaration () ĊĊĠĠĠ Ġif Ġ( containing Declaration Ġis ĠClass Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . addAll ( containing Declaration . getDefault Type (). get Cont ained Type Parameters ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġif Ġ( containing Declaration Ġis ĠCallable Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . addAll ( containing Declaration . getType Parameters ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( containing Declaration Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . addAll ( containing Declaration . get Capt ured Type Parameters ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ public Ġfun ĠKotlin Type . get Cont ained And Capt ured Type Parameter Construct ors (): ĠCollection < Type Constructor > Ġ{ ĊĠĠĠ Ġ// Ġtodo Ġtype Ġarguments Ġ( instead Ġof Ġtype Ġparameters ) Ġof Ġthe Ġtype Ġof Ġouter Ġclass Ġmust Ġbe Ġconsidered ; ĠK T - 6 3 2 5 ĊĠĠĠ Ġval Ġcaptured Type Parameters Ġ= Ġget Constructor (). get Declaration Descriptor ()?. get Capt ured Type Parameters () Ġ?: Ġempty List () ĊĠĠĠ Ġval Ġtype Parameters Ġ= Ġget Cont ained Type Parameters () Ġ+ Ġcaptured Type Parameters ĊĠĠĠ Ġreturn Ġtype Parameters . map Ġ{ Ġit . getType Constructor () Ġ}. to ReadOnly List () Ċ } Ċ Ċ public Ġfun ĠKotlin Type . is Subtype Of ( super Type : ĠKotlin Type ): ĠBoolean Ġ= ĠKotlin Type Checker . DEFAULT . is Subtype Of ( this , Ġsuper Type ) Ċ Ċ public Ġfun ĠKotlin Type . cannot Be Re ified (): ĠBoolean Ġ= ĠKotlin Built Ins . is Nothing Or Nullable Nothing ( this ) Ġ|| Ġthis . is Dynamic () Ċ Ċ fun ĠType Projection . substitute ( do Subst itute : Ġ( Kotlin Type ) Ġ-> ĠKotlin Type ): ĠType Projection Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( is Star Projection ()) ĊĠĠĠĠĠĠĠ Ġthis ĊĠĠĠ Ġelse ĠType Projection Impl ( get Projection Kind (), Ġdo Subst itute ( getType ())) Ċ } Ċ Ċ fun ĠKotlin Type . replace Annotations ( new Annotations : ĠAn notations ): ĠKotlin Type Ġ{ ĊĠĠĠ Ġif Ġ( annotations . isEmpty () Ġ&& Ġnew Annotations . isEmpty ()) Ġreturn Ġthis ĊĠĠĠ Ġreturn Ġobject Ġ: ĠDeleg ating Type () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Delegate () Ġ= Ġthis @ replace Annotations ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Annotations () Ġ= Ġnew Annotations ĊĠĠĠ Ġ} Ċ } Ċ Ċ public Ġfun ĠKotlin Type Checker . equal Types OrNull s ( type 1 : ĠKotlin Type ?, Ġtype 2 : ĠKotlin Type ?): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( type 1 Ġ=== Ġtype 2 ) Ġreturn Ġtrue ĊĠĠĠ Ġif Ġ( type 1 Ġ== Ġnull Ġ|| Ġtype 2 Ġ== Ġnull ) Ġreturn Ġfalse ĊĠĠĠ Ġreturn Ġequal Types ( type 1 , Ġtype 2 ) Ċ } Ċ Ċ fun ĠKotlin Type . get Nested Arguments (): ĠList < Type Projection > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠArrayList < Type Projection >() ĊĊĠĠĠ Ġval Ġstack Ġ= ĠArray Deque < Type Projection >() ĊĠĠĠ Ġstack . push ( Type Projection Impl ( this )) ĊĊĠĠĠ Ġwhile Ġ(! stack . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Projection Ġ= Ġstack . pop () ĊĠĠĠĠĠĠĠ Ġif Ġ( type Projection . is Star Projection ()) Ġcontinue ĊĊĠĠĠĠĠĠĠ Ġresult . add ( type Projection ) ĊĊĠĠĠĠĠĠĠ Ġtype Projection . getType (). get Arguments (). forEach Ġ{ Ġstack . add ( it ) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun ĠKotlin Type . contains Error () Ġ= ĠError Utils . contains ErrorType ( this ) Ċ Ċ public Ġfun ĠList < Kotlin Type >. default Projection s (): ĠList < Type Projection > Ġ= Ġmap Ġ{ ĠType Projection Impl ( it ) Ġ} Ċ Ċ public Ġfun ĠKotlin Type . is Default Bound (): ĠBoolean Ġ= ĠKotlin Built Ins . is Default Bound ( get Sup ertype Represent ative ()) Ċ Ċ public Ġfun Ġcreate Projection ( type : ĠKotlin Type , Ġprojection Kind : ĠVari ance , Ġtype Parameter Descriptor : ĠType Parameter Descriptor ?): ĠType Projection Ġ= ĊĠĠĠĠĠĠĠ ĠType Projection Impl ( if Ġ( type Parameter Descriptor ?. variance Ġ== Ġprojection Kind ) ĠVari ance . IN VARIANT Ġelse Ġprojection Kind , Ġtype ) Ċ Ċ fun ĠCollection < Kotlin Type >. closure ( f : Ġ( Kotlin Type ) Ġ-> ĠCollection < Kotlin Type >): ĠCollection < Kotlin Type > Ġ{ ĊĠĠĠ Ġif Ġ( size Ġ== Ġ 0 ) Ġreturn Ġthis ĊĊĠĠĠ Ġval Ġresult Ġ= ĠHashSet ( this ) ĊĠĠĠ Ġvar Ġelements ToCheck Ġ= Ġresult ĊĠĠĠ Ġvar Ġold Size Ġ= Ġ 0 ĊĠĠĠ Ġwhile Ġ( result . size Ġ> Ġold Size ) Ġ{ ĊĠĠĠĠĠĠĠ Ġold Size Ġ= Ġresult . size ĊĠĠĠĠĠĠĠ Ġval Ġto Add Ġ= Ġhash Set Of < Kotlin Type >() ĊĠĠĠĠĠĠĠ Ġelements ToCheck . forEach Ġ{ Ġto Add . addAll ( f ( it )) Ġ} ĊĠĠĠĠĠĠĠ Ġresult . addAll ( to Add ) ĊĠĠĠĠĠĠĠ Ġelements ToCheck Ġ= Ġto Add ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun Ġbound Closure ( types : ĠCollection < Kotlin Type >): ĠCollection < Kotlin Type > Ġ= ĊĠĠĠĠĠĠĠ Ġtypes . closure Ġ{ Ġtype Ġ-> ĠType Utils . getType Parameter Descriptor OrNull ( type )?. upper Bounds Ġ?: Ġempty Set () Ġ} Ċ Ċ fun Ġconst it uent Types ( types : ĠCollection < Kotlin Type >): ĠCollection < Kotlin Type > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġhash Set Of < Kotlin Type >() ĊĠĠĠ Ġconst it uent Types ( result , Ġtypes ) ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ private Ġfun Ġconst it uent Types ( result : ĠMutable Set < Kotlin Type >, Ġtypes : ĠCollection < Kotlin Type >) Ġ{ ĊĠĠĠ Ġresult . addAll ( types ) ĊĠĠĠ Ġfor Ġ( type Ġin Ġtypes ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( type . is Flex ible ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Ġ( type . flex ibility ()) Ġ{ Ġconst it uent Types ( result , Ġset Of ( lower Bound , Ġupper Bound )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst it uent Types ( result , Ġtype . arguments . filter Not Ġ{ Ġit . is Star Projection Ġ}. map Ġ{ Ġit . type Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ