/* Ċ Ġ* Ġ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 Ċ Ċ import Ġorg . jetbrains . kotlin . types . checker . Jet Type Checker Ċ import Ġorg . jetbrains . kotlin . types . Approx imation . Data Flow Extras Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġkotlin . platform . platform Static Ċ import Ġorg . jetbrains . kotlin . name . Class Id Ċ Ċ public Ġtrait ĠFlex ible Type Capabilities Ġ{ ĊĠĠĠ Ġfun Ġ< T : ĠType Capability > Ġget Capability ( capability Class : ĠClass < T >, Ġjet Type : ĠJet Type , Ġflexibility : ĠFlex ibility ): ĠT ? ĊĠĠĠ Ġval Ġid : ĠString ĊĊĠĠĠ Ġobject ĠNONE Ġ: ĠFlex ible Type Capabilities Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠType Capability > Ġget Capability ( capability Class : ĠClass < T >, Ġjet Type : ĠJet Type , Ġflexibility : ĠFlex ibility ): ĠT ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġid : ĠString Ġget () Ġ= Ġ" NONE " ĊĠĠĠ Ġ} Ċ } Ċ Ċ public Ġtrait ĠFlex ibility Ġ: ĠType Capability , ĠSub typing Represent atives Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġa Ġ" magic " Ġclassifier : Ġwhen Ġtype Ġresolver Ġsees Ġit Ġin Ġthe Ġcode , Ġe . g . Ġft < Foo , ĠFoo ? >, Ġinstead Ġof Ġcreating Ġa Ġnormal Ġtype , ĊĠĠĠĠĠĠĠ Ġ// Ġit Ġcreates Ġa Ġflexible Ġtype , Ġe . g . Ġ( Foo .. Foo ?). ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġused Ġin Ġtests Ġand ĠEvaluate ĠExpression Ġto Ġhave Ġflexible Ġtypes Ġin Ġthe Ġcode , ĊĠĠĠĠĠĠĠ Ġ// Ġbut Ġnormal Ġusers Ġshould Ġnot Ġbe Ġreferencing Ġthis Ġclassifier ĊĠĠĠĠĠĠĠ Ġpublic Ġval ĠF LEX IBLE _ TYPE _ CLAS SI FIER : ĠClass Id Ġ= ĠClass Id . top Level ( Fq Name (" kotlin . internal . flex ible . ft ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġlower Bound Ġis Ġa Ġsubtype Ġof Ġupper Bound ĊĠĠĠ Ġpublic Ġval Ġlower Bound : ĠJet Type ĊĠĠĠ Ġpublic Ġval Ġupper Bound : ĠJet Type ĊĊĠĠĠ Ġpublic Ġval Ġextra Capabilities : ĠFlex ible Type Capabilities ĊĊĠĠĠ Ġoverride Ġval Ġsub Type Represent ative : ĠJet Type ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġlower Bound ĊĊĠĠĠ Ġoverride Ġval Ġsuper Type Represent ative : ĠJet Type ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġupper Bound ĊĊĠĠĠ Ġoverride Ġfun Ġsame Type Constructor ( type : ĠJet Type ) Ġ= Ġfalse Ċ } Ċ Ċ public Ġfun ĠJet Type . is Flex ible (): ĠBoolean Ġ= Ġthis . get Capability ( java Class < Flex ibility >()) Ġ!= Ġnull Ċ public Ġfun ĠJet Type . flex ibility (): ĠFlex ibility Ġ= Ġthis . get Capability ( java Class < Flex ibility >()) !! Ċ Ċ public Ġfun ĠJet Type . isNull ability Flex ible (): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġflexibility Ġ= Ġthis . get Capability ( java Class < Flex ibility >()) Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġreturn ĠType Utils . is Nullable Type ( flex ibility . lower Bound ) Ġ!= ĠType Utils . is Nullable Type ( flex ibility . upper Bound ) Ċ } Ċ Ċ // ĠThis Ġfunction Ġis Ġintended Ġprimarily Ġfor Ġsets : Ġsince ĠJet Type . equals () Ġrepresents Ġ_ synt act ical _ Ġequality Ġof Ġtypes , Ċ // Ġwhereas ĠJet Type Checker . DEFAULT . equals Types () Ġrepresents Ġsemantic Ġequality Ċ // ĠA Ġset Ġof Ġtypes Ġ( e . g . Ġexact Ġbounds Ġetc ) Ġmay Ġcontain , Ġfor Ġexample , ĠX , ĠX ? Ġand ĠX ! Ċ // ĠThese Ġare Ġnot Ġequal Ġsynt act ically Ġ( by ĠJet Type . equals ()), Ġbut ĠX ! Ġis Ġ_ compatible _ Ġwith Ġothers Ġas Ġexact Ġbounds , Ċ // Ġmore over , ĠX ! Ġis Ġa Ġbetter Ġfit . Ċ // Ċ // ĠSo , Ġwe Ġare Ġlooking Ġfor Ġa Ġtype Ġamong Ġthis Ġset Ġsuch Ġthat Ġit Ġis Ġequal Ġto Ġall Ġothers Ġsemantic ally Ċ // Ġ( by ĠJet Type Checker . DEFAULT . equals Types ()), Ġand Ġfits Ġat Ġleast Ġas Ġwell Ġas Ġthey Ġdo . Ċ fun ĠCollection < Jet Type >. single Best Represent ative (): ĠJet Type ? Ġ{ ĊĠĠĠ Ġif Ġ( this . size () Ġ== Ġ 1 ) Ġreturn Ġthis . first () ĊĊĠĠĠ Ġreturn Ġthis . first OrNull Ġ{ ĊĠĠĠĠĠĠĠ Ġcandidate Ġ-> ĊĠĠĠĠĠĠĠ Ġthis . all Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate Ġ== Ġother Ġ|| ĠJet Type Checker . DEFAULT . equal Types ( candidate , Ġother ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠCollection < Type Projection >. single Best Represent ative (): ĠType Projection ? Ġ{ ĊĠĠĠ Ġif Ġ( this . size () Ġ== Ġ 1 ) Ġreturn Ġthis . first () ĊĊĠĠĠ Ġval Ġprojection Kinds Ġ= Ġthis . map Ġ{ Ġit . get Projection Kind () Ġ}. toSet () ĊĠĠĠ Ġif Ġ( projection Kinds . size () Ġ!= Ġ 1 ) Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġbest Type Ġ= Ġthis . map Ġ{ Ġit . getType () Ġ}. single Best Represent ative () ĊĠĠĠ Ġif Ġ( best Type Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠ Ġreturn ĠType Projection Impl ( projection Kinds . single (), Ġbest Type ) Ċ } Ċ Ċ public Ġfun ĠJet Type . lower If Flex ible (): ĠJet Type Ġ= Ġif Ġ( this . is Flex ible ()) Ġthis . flex ibility (). lower Bound Ġelse Ġthis Ċ public Ġfun ĠJet Type . upper If Flex ible (): ĠJet Type Ġ= Ġif Ġ( this . is Flex ible ()) Ġthis . flex ibility (). upper Bound Ġelse Ġthis Ċ Ċ public Ġtrait ĠNull Aware ness Ġ: ĠType Capability Ġ{ ĊĠĠĠ Ġpublic Ġfun Ġmake Nullable As Specified ( nullable : ĠBoolean ): ĠJet Type ĊĠĠĠ Ġpublic Ġfun Ġcompute Is Nullable (): ĠBoolean Ċ } Ċ Ċ public Ġtrait ĠAppro x imation Ġ: ĠType Capability Ġ{ ĊĠĠĠ Ġpublic Ġclass ĠInfo ( val Ġfrom : ĠJet Type , Ġval Ġto : ĠJet Type , Ġval Ġmessage : ĠString ) ĊĠĠĠ Ġpublic Ġtrait ĠData Flow Extras Ġ{ ĊĠĠĠĠĠĠĠ Ġobject ĠEMPTY Ġ: ĠData Flow Extras Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġcan BeNull : ĠBoolean Ġget () Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġpossible Types : ĠSet < Jet Type > Ġget () Ġ= Ġset Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġpresent able Text : ĠString Ġ= Ġ"< unknown >" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠOnly Message ( message : ĠString ) Ġ: ĠData Flow Extras Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġcan BeNull : ĠBoolean Ġget () Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġpossible Types : ĠSet < Jet Type > Ġget () Ġ= Ġset Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġpresent able Text : ĠString Ġ= Ġmessage ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcan BeNull : ĠBoolean ĊĠĠĠĠĠĠĠ Ġval Ġpossible Types : ĠSet < Jet Type > ĊĠĠĠĠĠĠĠ Ġval Ġpresent able Text : ĠString ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġapproximate To Expected Type ( expected Type : ĠJet Type , Ġdata Flow Extras : ĠData Flow Extras ): ĠInfo ? Ċ } Ċ Ċ fun ĠAppro x imation . Info . assertNotNull (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġfrom . upper If Flex ible (). is Marked Nullable () Ġ&& Ġ! Type Utils . is Nullable Type ( to ) Ċ } Ċ Ċ public Ġfun ĠJet Type . get Approx imation To ( ĊĠĠĠĠĠĠĠ Ġexpected Type : ĠJet Type , ĊĠĠĠĠĠĠĠ Ġextras : ĠAppro x imation . Data Flow Extras Ġ= ĠAppro x imation . Data Flow Extras . EMPTY Ċ ): ĠAppro x imation . Info ? Ġ= Ġthis . get Capability ( java Class < Approx imation >()) ?. approx imate To Expected Type ( expected Type , Ġextras ) Ċ Ċ trait ĠFlex ible Type Deleg ation Ġ: ĠType Capability Ġ{ ĊĠĠĠ Ġpublic Ġval Ġdelegate Type : ĠJet Type Ċ } Ċ Ċ public Ġopen Ġclass ĠDeleg ating Flex ible Type Ġprotected Ġ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġlower Bound : ĠJet Type , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġupper Bound : ĠJet Type , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġextra Capabilities : ĠFlex ible Type Capabilities Ċ ) Ġ: ĠDeleg ating Type (), ĠNull Aware ness , ĠFlex ibility , ĠFlex ible Type Deleg ation , ĠAppro x imation Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġplatform Static Ġfun Ġcreate ( lower Bound : ĠJet Type , Ġupper Bound : ĠJet Type , Ġextra Capabilities : ĠFlex ible Type Capabilities ): ĠJet Type Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lower Bound Ġ== Ġupper Bound ) Ġreturn Ġlower Bound ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDeleg ating Flex ible Type ( lower Bound , Ġupper Bound , Ġextra Capabilities ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ASSERT IONS _ ENABLED ) Ġ{ Ġ// Ġworkaround Ġfor ĠK T - 7 5 4 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Ġ(! lower Bound . is Flex ible ()) Ġ{ Ġ" Lower Ġbound Ġof Ġa Ġflexible Ġtype Ġcan Ġnot Ġbe Ġflexible : Ġ$ lower Bound " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Ġ(! upper Bound . is Flex ible ()) Ġ{ Ġ" Upper Ġbound Ġof Ġa Ġflexible Ġtype Ġcan Ġnot Ġbe Ġflexible : Ġ$ upper Bound " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Ġ( lower Bound Ġ!= Ġupper Bound ) Ġ{ Ġ" Lower Ġand Ġupper Ġbounds Ġare Ġequal : Ġ$ lower Bound Ġ== Ġ$ upper Bound " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Ġ( Jet Type Checker . DEFAULT . is Subtype Of ( lower Bound , Ġupper Bound )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Lower Ġbound Ġ$ lower Bound Ġof Ġa Ġflexible Ġtype Ġmust Ġbe Ġa Ġsubtype Ġof Ġthe Ġupper Ġbound Ġ$ upper Bound " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠType Capability > Ġget Capability ( capability Class : ĠClass < T >): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġextra Capabilities . get Capability ( capability Class , Ġthis , Ġthis ) Ġ?: Ġsuper < Delegating Type >. get Capability ( capability Class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmake Nullable As Specified ( nullable : ĠBoolean ): ĠJet Type Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Utils . make Nullable As Specified ( lower Bound , Ġnullable ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Utils . make Nullable As Specified ( upper Bound , Ġnullable ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextra Capabilities ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcompute Is Nullable () Ġ= Ġdelegate Type . is Marked Nullable () ĊĊĠĠĠ Ġoverride Ġfun Ġis Marked Nullable (): ĠBoolean Ġ= Ġget Capability ( java Class < Null Aware ness >()) !!. compute Is Nullable () ĊĊĠĠĠ Ġoverride Ġfun Ġapproximate To Expected Type ( expected Type : ĠJet Type , Ġdata Flow Extras : ĠAppro x imation . Data Flow Extras ): ĠAppro x imation . Info ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġval Ġfoo : ĠAny ? Ġ= Ġfoo () Ġ: ĠFoo ! ĊĠĠĠĠĠĠĠ Ġif Ġ( Jet Type Checker . DEFAULT . is Subtype Of ( upper Bound , Ġexpected Type )) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġ( foo Ġ: ĠFoo ! Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġval Ġbar : ĠAny Ġ= Ġfoo ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! data Flow Extras . can BeNull Ġ&& ĠJet Type Checker . DEFAULT . is Subtype Of ( Type Utils . make NotNull able ( upper Bound ), Ġexpected Type )) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġmaybe Ġcheck Ġpossible Types Ġto Ġavoid Ġextra Ġapprox im ations ĊĊĠĠĠĠĠĠĠ Ġreturn ĠAppro x imation . Info ( this , Ġexpected Type , Ġdata Flow Extras . present able Text ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġdelegate Type : ĠJet Type Ġ= Ġlower Bound ĊĊĠĠĠ Ġoverride Ġfun Ġget Delegate () Ġ= Ġget Capability ( java Class < Flex ible Type Deleg ation >()) !!. delegate Type ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" ('$ lower Bound ' .. '$ upper Bound ')" Ċ } Ċ