/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 6 Ġ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 . resolve . calls . smart casts Ċ Ċ import Ġorg . jetbrains . kotlin . builtins . Kotlin Built Ins Ċ import Ġorg . jetbrains . kotlin . types . Error Utils Ċ import Ġorg . jetbrains . kotlin . types . Kotlin Type Ċ import Ġorg . jetbrains . kotlin . types . Type Utils Ċ Ċ private Ġval ĠKotlin Type . im manent Null ability : ĠNull ability ĊĠĠĠ Ġget () Ġ= Ġif Ġ( Type Utils . is Nullable Type ( this )) ĠNull ability . UNKNOWN Ġelse ĠNull ability . NOT _ NULL Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġdescribes Ġan Ġarbitrary Ġobject Ġwhich Ġhas Ġsome Ġvalue Ġin Ġdata Ġflow Ġanalysis . Ċ Ġ* ĠIn Ġgeneral Ġcase Ġit 's Ġsome Ġr - value . Ċ Ġ*/ Ċ class ĠData Flow Value ( ĊĠĠĠ Ġval Ġidentifier Info : ĠIdentifier Info , ĊĠĠĠ Ġval Ġtype : ĠKotlin Type , ĊĠĠĠ Ġval Ġim manent Null ability : ĠNull ability Ġ= Ġtype . im manent Null ability Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġkind : ĠKind Ġget () Ġ= Ġidentifier Info . kind ĊĊĠĠĠ Ġenum Ġclass ĠKind ( private Ġval Ġstr : ĠString , Ġval Ġdescription : ĠString Ġ= Ġstr ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠLocal Ġvalue , Ġor Ġparameter , Ġor Ġprivate Ġ/ Ġinternal Ġmember Ġvalue Ġwithout Ġopen Ġ/ Ġcustom Ġgetter , ĊĠĠĠĠĠĠĠ Ġ// Ġor Ġprotected Ġ/ Ġpublic Ġmember Ġvalue Ġfrom Ġthe Ġsame Ġmodule Ġwithout Ġopen Ġ/ Ġcustom Ġgetter ĊĠĠĠĠĠĠĠ Ġ// ĠSmart Ġcast s Ġare Ġcompletely Ġsafe ĊĠĠĠĠĠĠĠ ĠST ABLE _ VALUE (" stable Ġval "), ĊĠĠĠĠĠĠĠ Ġ// ĠBlock , Ġor Ġif Ġ/ Ġelse , Ġor Ġwhen ĊĠĠĠĠĠĠĠ ĠST ABLE _ COMPLEX _ EXPRESSION (" complex Ġexpression ", Ġ""), ĊĠĠĠĠĠĠĠ Ġ// ĠMember Ġvalue Ġwith Ġopen Ġ/ Ġcustom Ġgetter ĊĠĠĠĠĠĠĠ Ġ// ĠSmart Ġcast s Ġare Ġnot Ġsafe ĊĠĠĠĠĠĠĠ ĠPROPERTY _ WITH _ GET TER (" custom Ġgetter ", Ġ" property Ġthat Ġhas Ġopen Ġor Ġcustom Ġgetter "), ĊĠĠĠĠĠĠĠ Ġ// ĠProtected Ġ/ Ġpublic Ġmember Ġvalue Ġfrom Ġanother Ġmodule ĊĠĠĠĠĠĠĠ Ġ// ĠSmart Ġcast s Ġare Ġnot Ġsafe ĊĠĠĠĠĠĠĠ ĠA LI EN _ PUBLIC _ PROPERTY (" ali en Ġpublic ", Ġ" public ĠAPI Ġproperty Ġdeclared Ġin Ġdifferent Ġmodule "), ĊĠĠĠĠĠĠĠ Ġ// ĠLocal Ġvariable Ġnot Ġyet Ġcaptured Ġby Ġa Ġchanging Ġclosure ĊĠĠĠĠĠĠĠ Ġ// ĠSmart Ġcast s Ġare Ġsafe Ġbut Ġpossible Ġchanges Ġin Ġloops Ġ/ Ġclo s ures Ġahead Ġmust Ġbe Ġtaken Ġinto Ġaccount ĊĠĠĠĠĠĠĠ ĠST ABLE _ VARIABLE (" stable Ġvar ", Ġ" local Ġvariable Ġthat Ġcan Ġbe Ġchanged Ġsince Ġthe Ġcheck Ġin Ġa Ġloop "), ĊĠĠĠĠĠĠĠ Ġ// ĠLocal Ġvariable Ġalready Ġcaptured Ġby Ġa Ġchanging Ġclosure ĊĠĠĠĠĠĠĠ Ġ// ĠSmart Ġcast s Ġare Ġnot Ġsafe ĊĠĠĠĠĠĠĠ ĠCAP TURE D _ VARIABLE (" captured Ġvar ", Ġ" local Ġvariable Ġthat Ġis Ġcaptured Ġby Ġa Ġchanging Ġclosure "), ĊĠĠĠĠĠĠĠ Ġ// ĠMember Ġvariable Ġregardless Ġof Ġits Ġvisibility ĊĠĠĠĠĠĠĠ Ġ// ĠSmart Ġcast s Ġare Ġnot Ġsafe ĊĠĠĠĠĠĠĠ ĠMUT ABLE _ PROPERTY (" member ", Ġ" mutable Ġproperty Ġthat Ġcould Ġhave Ġbeen Ġchanged Ġby Ġthis Ġtime "), ĊĠĠĠĠĠĠĠ Ġ// ĠSome Ġcomplex Ġexpression ĊĠĠĠĠĠĠĠ Ġ// ĠSmart Ġcast s Ġare Ġnot Ġsafe ĊĠĠĠĠĠĠĠ ĠOTHER (" other ", Ġ" complex Ġexpression "); ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġstr ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSt able Ġmeans Ġhere Ġwe Ġdo Ġnot Ġexpect Ġsome Ġsudden Ġchange Ġof Ġtheir Ġvalues , ĊĠĠĠĠ Ġ* Ġlike Ġaccessing Ġmutable Ġproperties Ġin Ġanother Ġthread , Ġso Ġsmart Ġcast s Ġcan Ġbe Ġused Ġsafely . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġis Stable Ġ= Ġ( kind Ġ== ĠKind . ST ABLE _ VALUE Ġ|| Ġkind Ġ== ĠKind . ST ABLE _ VARIABLE Ġ|| Ġkind Ġ== ĠKind . ST ABLE _ COMPLEX _ EXPRESSION ) ĊĊĠĠĠ Ġval Ġcan Be Bound Ġget () Ġ= Ġidentifier Info . can Be Bound ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠData Flow Value ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( identifier Info Ġ!= Ġother . identifier Info ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ!= Ġother . type ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"$ kind Ġ$ identifier Info Ġ$ im manent Null ability " ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġtype . hashCode () Ġ+ Ġ 3 1 Ġ* Ġidentifier Info . hashCode () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġnull Value ( built Ins : ĠKotlin Built Ins ) Ġ= ĠData Flow Value ( Identifier Info . NULL , Ġbuilt Ins . nullable Nothing Type , ĠNull ability . NULL ) ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Field ĊĠĠĠĠĠĠĠ Ġval ĠERROR Ġ= ĠData Flow Value ( Identifier Info . ERROR , ĠError Utils . create ErrorType (" Error Ġtype Ġfor Ġdata Ġflow "), ĠNull ability . IMP OSS IBLE ) ĊĠĠĠ Ġ} Ċ } Ċ