/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* Ġ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 . types Ċ Ċ import Ġorg . jetbrains . kotlin . fir . symbols . Standard Class Ids Ċ import Ġorg . jetbrains . kotlin . fir . symbols . impl . Con e Class Like Lookup Tag Impl Ċ import Ġorg . jetbrains . kotlin . fir . types . impl . Con e Class Like Type Impl Ċ import Ġorg . jetbrains . kotlin . name . Class Id Ċ import Ġorg . jetbrains . kotlin . types . model . Simple Type Marker Ċ Ċ class ĠC one Integer Literal Type Impl Ġ: ĠC one Integer Literal Type Ġ{ ĊĠĠĠ Ġoverride Ġval Ġpossible Types : ĠCollection < Con e Class Like Type > ĊĊĠĠĠ Ġconstructor ( value : ĠLong ) Ġ: Ġsuper ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpossible Types Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġfun Ġcheck Bounds And Add Possible Type ( class Id : ĠClass Id , Ġrange : ĠLong Range ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġin Ġrange ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpossible Types . add ( create Type ( class Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Signed Possible Types () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Bounds And Add Possible Type ( Standard Class Ids . Int , ĠINT _ RANGE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpossible Types Ġ+= Ġcreate Type ( Standard Class Ids . Long ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Bounds And Add Possible Type ( Standard Class Ids . Byte , ĠBYTE _ RANGE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Bounds And Add Possible Type ( Standard Class Ids . Short , ĠSH ORT _ RANGE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Signed Possible Types () ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġadd Ġsupport Ġof Ġunsigned Ġtypes ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġconstructor ( value : ĠLong , Ġpossible Types : ĠCollection < Con e Class Like Type >) Ġ: Ġsuper ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . possible Types Ġ= Ġpossible Types ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġsup ert ypes : ĠList < Con e Class Like Type > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNUMBER _ TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC one Class Like Type Impl ( COMP AR ABLE _ TAG , ĠarrayOf ( Con e Kotlin Type Projection Out ( this )), Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Approx imated Type ( expected Type : ĠC one Kotlin Type ?): ĠC one Class Like Type Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( expected Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , Ġ! in Ġpossible Types Ġ-> Ġpossible Types . first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġexpected Type Ġas ĠC one Class Like Type ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate Type ( class Id : ĠClass Id ): ĠC one Class Like Type Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠC one Class Like Type Impl ( Con e Class Like Lookup Tag Impl ( class Id ), Ġempty Array (), Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠNUMBER _ TYPE Ġ= Ġcreate Type ( Standard Class Ids . Number ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠINT _ RANGE Ġ= ĠInt . MIN _ VALUE . to Long () .. Int . MAX _ VALUE . to Long () ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠBYTE _ RANGE Ġ= ĠByte . MIN _ VALUE . to Long () .. Byte . MAX _ VALUE . to Long () ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSH ORT _ RANGE Ġ= ĠShort . MIN _ VALUE . to Long () .. Short . MAX _ VALUE . to Long () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCOMP AR ABLE _ TAG Ġ= ĠC one Class Like Lookup Tag Impl ( Standard Class Ids . Comparable ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġfind Common Super Type ( types : ĠCollection < Simple Type Marker >): ĠSimple Type Marker ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfind Common Super Type Or Intersection Type ( types , ĠMode . COMMON _ SUPER _ TYPE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfind Intersection Type ( types : ĠCollection < Simple Type Marker >): ĠSimple Type Marker ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfind Common Super Type Or Intersection Type ( types , ĠMode . INTER SECTION _ TYPE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġenum Ġclass ĠMode Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMON _ SUPER _ TYPE , ĠINTER SECTION _ TYPE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġintersection ( IL T ( types ), ĠPrimitive Type ) Ġ= Ġcommon Super Type ( IL T ( types ), ĠPrimitive Type ) Ġ= ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠĠ ĠPrimitive Type Ġ Ġin Ġtypes Ġ Ġ-> ĠPrimitive Type ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠĠ ĠPrimitive Type Ġ! in Ġtypes Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġintersection ( IL T ( types _ 1 ), ĠI LT ( types _ 2 )) Ġ= ĠI LT ( types _ 1 Ġunion Ġtypes _ 2 ) ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġcommon Super Type ( IL T ( types _ 1 ), ĠI LT ( types _ 2 )) Ġ= ĠI LT ( types _ 1 Ġintersect Ġtypes _ 2 ) ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfind Common Super Type Or Intersection Type ( types : ĠCollection < Simple Type Marker >, Ġmode : ĠMode ): ĠSimple Type Marker ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( types . isEmpty ()) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtypes . reduce Ġ{ Ġleft : ĠSimple Type Marker ?, Ġright : ĠSimple Type Marker ? Ġ-> Ġfold ( left , Ġright , Ġmode ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfold ( left : ĠSimple Type Marker ?, Ġright : ĠSimple Type Marker ?, Ġmode : ĠMode ): ĠSimple Type Marker ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Ġ== Ġnull Ġ|| Ġright Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġis ĠC one Integer Literal Type Ġ&& Ġright Ġis ĠC one Integer Literal Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfold ( left , Ġright , Ġmode ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġis ĠC one Integer Literal Type Ġ-> Ġfold ( left , Ġright ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġis ĠC one Integer Literal Type Ġ-> Ġfold ( right , Ġleft ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfold ( left : ĠC one Integer Literal Type , Ġright : ĠC one Integer Literal Type , Ġmode : ĠMode ): ĠC one Integer Literal Type ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpossible Types Ġ= Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMode . COMMON _ SUPER _ TYPE Ġ-> Ġleft . possible Types Ġintersect Ġright . possible Types ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMode . INTER SECTION _ TYPE Ġ-> Ġleft . possible Types Ġunion Ġright . possible Types ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠC one Integer Literal Type Impl ( left . value , Ġpossible Types ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfold ( left : ĠC one Integer Literal Type , Ġright : ĠSimple Type Marker ): ĠSimple Type Marker ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( right Ġin Ġleft . possible Types ) Ġright Ġelse Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠC one Kotlin Type . approx imate Integer Literal Type ( expected Type : ĠC one Kotlin Type ? Ġ= Ġnull ): ĠC one Kotlin Type Ġ= ĊĠĠĠ Ġ( this Ġas ? ĠC one Integer Literal Type )?. get Approx imated Type ( expected Type ) Ġ?: Ġthis Ċ Ċ fun ĠC one Kotlin Type . approx imate Integer Literal Type OrNull ( expected Type : ĠC one Kotlin Type ? Ġ= Ġnull ): ĠC one Kotlin Type ? Ġ= ĊĠĠĠ Ġ( this Ġas ? ĠC one Integer Literal Type )?. get Approx imated Type ( expected Type )