/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . Ġ ĠAll Ġrights Ġreserved . Ċ Ġ*/ Ċ Ċ package Ġorg . part i ql . lang . types Ċ Ċ import Ġorg . part i ql . lang . ast . passes . inference . is L ob Ċ import Ġorg . part i ql . lang . ast . passes . inference . is Numeric Ċ import Ġorg . part i ql . lang . ast . passes . inference . is Text Ċ import Ġorg . part i ql . lang . ast . passes . inference . is Unknown Ċ import Ġorg . part i ql . lang . eval . Expr Value Ċ import Ġorg . part i ql . lang . eval . Expr ValueType Ċ import Ġorg . part i ql . lang . eval . name Ċ import Ġorg . part i ql . lang . eval . number Value Ċ import Ġorg . part i ql . lang . eval . stringValue Ċ import Ġorg . part i ql . lang . eval . time Value Ċ import Ġjava . math . BigDecimal Ċ Ċ /** Ċ Ġ* ĠRepresents Ġstatic Ġtypes Ġavailable Ġin Ġthe Ġlanguage Ġand Ġways Ġto Ġextends Ġthem Ġto Ġcreate Ġnew Ġtypes . Ċ Ġ*/ Ċ sealed Ġclass ĠStatic Type Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġvar args Ġvariant , Ġfold s Ġ[ types ] Ġinto Ġa Ġ[ Set ] ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġusage Ġof ĠLinked HashSet Ġis Ġto Ġpreserve Ġthe Ġorder Ġof Ġ` types ` Ġto Ġensure Ġbehavior Ġis Ġconsistent Ġin Ġour Ġtests ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġunion Of ( var arg Ġtypes : ĠStatic Type , Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of ()) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunion Of ( types . toSet (), Ġmet as ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġa Ġnew Ġ[ Static Type ] Ġas Ġa Ġunion Ġof Ġthe Ġpassed Ġ[ types ]. ĠThe Ġvalues Ġtyped Ġby Ġthe Ġreturned Ġtype ĊĠĠĠĠĠĠĠĠ Ġ* Ġare Ġdefined Ġas Ġthe Ġunion Ġof Ġall Ġvalues Ġtyped Ġas Ġ[ types ] ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtypes Ġ[ Static Type ] Ġto Ġbe Ġunion ed . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ[ Static Type ] Ġrepresenting Ġthe Ġunion Ġof Ġ[ types ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġunion Of ( types : ĠSet < Static Type >, Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of ()): ĠStatic Type Ġ= ĠAny OfType ( types , Ġmet as ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġconsider Ġmaking Ġthese Ġinto Ġan Ġenumeration ... ĊĊĠĠĠĠĠĠĠ Ġ// ĠCon ven ient Ġenums Ġto Ġcreate Ġa Ġbare Ġbones Ġinstance Ġof ĠStatic Type ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠMIS SING : ĠMissing Type Ġ= ĠMissing Type ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠNULL : ĠNull Type Ġ= ĠNull Type () ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠANY : ĠAny Type Ġ= ĠAny Type () ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠNULL _ OR _ MISSING : ĠStatic Type Ġ= Ġunion Of ( NULL , ĠMIS SING ) ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠBOOL : ĠBool Type Ġ= ĠBool Type () ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠINT 2 : ĠInt Type Ġ= ĠInt Type ( Int Type . Int Range Constraint . SHORT ) ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠINT 4 : ĠInt Type Ġ= ĠInt Type ( Int Type . Int Range Constraint . INT 4 ) ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠINT 8 : ĠInt Type Ġ= ĠInt Type ( Int Type . Int Range Constraint . LONG ) ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠINT : ĠInt Type Ġ= ĠInt Type ( Int Type . Int Range Constraint . UN CON STR AIN ED ) ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠFLOAT : ĠFloat Type Ġ= ĠFloat Type () ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠDEC IMAL : ĠDecimal Type Ġ= ĠDecimal Type () ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠDATE : ĠDate Type Ġ= ĠDate Type () ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠTIME : ĠTime Type Ġ= ĠTime Type () ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠTIMESTAMP : ĠTimestamp Type Ġ= ĠTimestamp Type () ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠSYMBOL : ĠSymbol Type Ġ= ĠSymbol Type () ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠSTRING : ĠString Type Ġ= ĠString Type () ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠC LOB : ĠC lob Type Ġ= ĠC lob Type () ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠBLOB : ĠBlob Type Ġ= ĠBlob Type () ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠLIST : ĠList Type Ġ= ĠList Type () ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠSEXP : ĠS exp Type Ġ= ĠS exp Type () ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠSTR UCT : ĠStruct Type Ġ= ĠStruct Type () ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval ĠB AG : ĠBag Type Ġ= ĠBag Type () ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġfrom Expr ValueType ( expr ValueType : ĠExpr ValueType ): ĠStatic Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( expr ValueType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . MISSING Ġ-> ĠMIS SING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . NULL Ġ-> ĠNULL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . BOOL Ġ-> ĠBOOL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . INT Ġ-> ĠINT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . FLOAT Ġ-> ĠFLOAT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . DECIMAL Ġ-> ĠDEC IMAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . DATE Ġ-> ĠDATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . TIME Ġ-> ĠTIME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . TIMESTAMP Ġ-> ĠTIMESTAMP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . SYMBOL Ġ-> ĠSYMBOL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . STRING Ġ-> ĠSTRING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . C LOB Ġ-> ĠC LOB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . BLOB Ġ-> ĠBLOB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . LIST Ġ-> ĠLIST ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . SEXP Ġ-> ĠSEXP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . STRUCT Ġ-> ĠSTR UCT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . B AG Ġ-> ĠB AG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġfrom Expr Value ( expr Value : ĠExpr Value ): ĠStatic Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( expr Value . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . TIME Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Value Ġ= Ġexpr Value . time Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTime Type ( precision Ġ= Ġtime Value . precision , Ġwith TimeZone Ġ= Ġtime Value . zone Offset Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfrom Expr ValueType ( expr Value . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠAll Ġthe ĠStatic Types , Ġexcept Ġfor Ġ` ANY `. Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval ĠALL _ TYPES Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMIS SING , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNULL , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBOOL , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠINT 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠINT 4 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠINT 8 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠINT , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFLOAT , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDEC IMAL , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSYMBOL , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDATE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTIME , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTIMESTAMP , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTRING , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC LOB , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBLOB , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLIST , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSEXP , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTR UCT , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠB AG ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġto Ġsee Ġif Ġthe Ġgiven Ġ[ Expr Value ] Ġcon forms Ġto Ġthe Ġcurrent Ġ[ Static Type ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThrow ing Ġ[ Unsupported Type Check Exception ] Ġis Ġtemporary Ġwhile Ġsome Ġclasses Ġderived Ġfrom Ġ[ Static Type ] ĊĠĠĠĠ Ġ* Ġdo Ġnot Ġfully Ġimplement Ġthis Ġfunction Ġand Ġis Ġthrown Ġwhen Ġthe Ġencounter Ġsituations Ġthat Ġcan 't Ġyet Ġbe Ġchecked . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Unsupported Type Check Exception :: class ) ĊĠĠĠ Ġabstract Ġfun Ġis Instance ( value : ĠExpr Value ): ĠBoolean ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġ[ other ] Ġ[ Static Type ] Ġis Ġcomp arable Ġto Ġthe Ġcurrent Ġ[ Static Type ]. ĠCurrently , Ġtwo Ġtypes Ġare ĊĠĠĠĠ Ġ* Ġcomp arable Ġif ĊĠĠĠĠ Ġ* Ġ Ġ- Ġthey Ġare Ġboth Ġnumeric ĊĠĠĠĠ Ġ* Ġ Ġ- Ġthey Ġare Ġboth Ġtext ĊĠĠĠĠ Ġ* Ġ Ġ- Ġthey Ġare Ġboth Ġlo bs ĊĠĠĠĠ Ġ* Ġ Ġ- Ġthey Ġare Ġboth Ġ[ Single Type ] s Ġwith Ġthe Ġsame Ġ[ Single Type . runtime Type ] ĊĠĠĠĠ Ġ* Ġ Ġ- Ġone Ġ[ Static Type ] Ġfrom Ġcurrent Ġ[ Static Type ]' s Ġ[ all Types ] Ġis Ġcomp arable Ġto Ġa Ġ[ Static Type ] Ġfrom Ġ[ other ]' s ĊĠĠĠĠ Ġ* ĠĠ Ġ[ all Types ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġis Comparable To ( other : ĠStatic Type ): ĠBoolean ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠReturns Ġa Ġnullable Ġversion Ġof Ġthe Ġcurrent Ġ[ Static Type ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ ĠIf Ġit Ġalready Ġnullable , Ġreturns Ġthe Ġoriginal Ġtype . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġas Nullable () Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Nullable () Ġ-> Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġunion Of ( this , ĠNULL ). flatten () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠReturns Ġan Ġoptional Ġversion Ġof Ġthe Ġcurrent Ġ[ Static Type ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ ĠIf Ġit Ġalready Ġoptional , Ġreturns Ġthe Ġoriginal Ġtype . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġas Optional () Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Optional () Ġ-> Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġunion Of ( this , ĠMIS SING ). flatten () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġthis Ġsubtype Ġof Ġthe Ġgiven Ġ[ Static Type ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠA Ġ[ Static Type ] Ġis Ġsubtype Ġof Ġanother Ġiff Ġif Ġits Ġtype Ġdomain Ġin Ġequal Ġor Ġsmaller Ġthan Ġthe Ġgiven Ġtype . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Sub TypeOf ( other Type : ĠStatic Type ): ĠBoolean Ġ= Ġthis . type Domain . isNotEmpty () Ġ&& Ġother Type . type Domain . contains All ( this . type Domain ) ĊĊĠĠĠ Ġabstract Ġval Ġmet as : ĠMap < String , ĠAny > ĊĊĠĠĠ Ġabstract Ġval Ġtype Domain : ĠSet < Expr ValueType > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvenience Ġmethod Ġto Ġcopy Ġover ĠStatic Type Ġto Ġa Ġnew Ġinstance Ġwith Ġgiven Ġ` metas ` ĊĠĠĠĠ Ġ* ĠMissing Type Ġis Ġa Ġsingleton Ġand Ġthere Ġcan Ġonly Ġbe Ġone Ġrepresentation Ġfor Ġit ĊĠĠĠĠ Ġ* Ġi . e . Ġyou Ġcannot Ġhave Ġtwo Ġinstances Ġof ĠMissing Type Ġwith Ġdifferent Ġmet as . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġwith Met as ( metas : ĠMap < String , ĠAny >): ĠStatic Type Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAny Type Ġ-> Ġcopy ( metas Ġ= Ġmet as ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList Type Ġ-> Ġcopy ( metas Ġ= Ġmet as ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠS exp Type Ġ-> Ġcopy ( metas Ġ= Ġmet as ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBag Type Ġ-> Ġcopy ( metas Ġ= Ġmet as ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNull Type Ġ-> Ġcopy ( metas Ġ= Ġmet as ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMissing Type Ġ-> ĠMissing Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBool Type Ġ-> Ġcopy ( metas Ġ= Ġmet as ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInt Type Ġ-> Ġcopy ( metas Ġ= Ġmet as ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloat Type Ġ-> Ġcopy ( metas Ġ= Ġmet as ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDecimal Type Ġ-> Ġcopy ( metas Ġ= Ġmet as ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTimestamp Type Ġ-> Ġcopy ( metas Ġ= Ġmet as ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSymbol Type Ġ-> Ġcopy ( metas Ġ= Ġmet as ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Type Ġ-> Ġcopy ( metas Ġ= Ġmet as ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBlob Type Ġ-> Ġcopy ( metas Ġ= Ġmet as ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠC lob Type Ġ-> Ġcopy ( metas Ġ= Ġmet as ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStruct Type Ġ-> Ġcopy ( metas Ġ= Ġmet as ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAny OfType Ġ-> Ġcopy ( metas Ġ= Ġmet as ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDate Type Ġ-> Ġcopy ( metas Ġ= Ġmet as ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTime Type Ġ-> Ġcopy ( metas Ġ= Ġmet as ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠType Ġis Ġnullable Ġif Ġit Ġis Ġof ĠNull Ġtype Ġor Ġis Ġan ĠAny OfType Ġthat Ġcontains Ġa ĠNull Ġtype ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġis Nullable (): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAny OfType Ġ-> Ġtypes . any Ġ{ Ġit . is Nullable () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAny Type , Ġis ĠNull Type Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠType Ġis Ġoptional Ġif Ġit Ġis ĠAny , Ġor ĠMissing , Ġor Ġan ĠAny OfType Ġthat Ġcontains ĠAny Ġor ĠMissing Ġtype ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġis Optional (): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAny Type , ĠMissing Type Ġ-> Ġtrue Ġ// ĠAny Ġincludes ĠMissing Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAny OfType Ġ-> Ġtypes . any Ġ{ Ġit . is Optional () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġlist Ġof Ġall Ġpossible Ġtypes Ġthat Ġare Ġin Ġthe Ġdomain Ġof Ġthe Ġcurrent Ġtype . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ- ĠFor Ġnon - union Ġtypes , Ġthis Ġreturns Ġlist Ġwith Ġa Ġsingle Ġentry . ĊĠĠĠĠ Ġ* Ġ- ĠFor Ġunion Ġtypes , Ġthis Ġreturns Ġthe Ġcomplete Ġlist Ġof Ġall Ġtypes Ġin Ġthe Ġunion . Ġ Ġ( Nested Ġun ions Ġare Ġflatten ed .) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġabstract Ġval Ġall Types : ĠList < Static Type > ĊĊĠĠĠ Ġabstract Ġfun Ġflatten (): ĠStatic Type Ċ } Ċ Ċ /** Ċ Ġ* ĠRepresents Ġa ĠStatic Type Ġof Ġtype Ġ` ANY `. ĠThis Ġhas Ġno Ġruntime Ġcomponent . Ċ Ġ*/ Ċ // ĠTODO : ĠRemove Ġ` NULL ` Ġfrom Ġhere . ĠThis Ġaffects Ġinference Ġas Ġoperations Ġ( espec ially ĠNA ry ) Ġcan Ġproduce Ċ // Ġ Ġ` NULL ` Ġor Ġ` MISSING ` Ġdepending Ġon Ġa Ġnull Ġpropagation Ġor Ġan Ġincorrect Ġargument . Ċ data Ġclass ĠAny Type ( override Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of ()) Ġ: ĠStatic Type () Ġ{ ĊĠĠĠ Ġ// ĠAny Type Ġen comp asses Ġall ĠPart i QL Ġtypes Ġ( including ĠNull Ġtype ) ĊĠĠĠ Ġoverride Ġfun Ġis Instance ( value : ĠExpr Value ): ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġoverride Ġfun Ġis Comparable To ( other : ĠStatic Type ): ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġval Ġtype Domain : ĠSet < Expr ValueType > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġenum Values < Expr ValueType >(). toSet () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts Ġthis Ġinto Ġan Ġ[ Any OfType ] Ġrepresentation . ĠThis Ġmethod Ġis Ġhelpful Ġin Ġinference Ġwhen ĊĠĠĠĠ Ġ* Ġit Ġwants Ġto Ġiterate Ġover Ġall Ġpossible Ġtypes Ġof Ġan Ġexpression . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġto Any OfType () Ġ= ĠAny OfType ( type Domain . map Ġ{ Ġfrom Expr ValueType ( it ) Ġ}. toSet ()) ĊĊĠĠĠ Ġoverride Ġfun Ġflatten (): ĠStatic Type Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" any " ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠALL _ TYPES Ċ } Ċ Ċ /** Ċ Ġ* ĠRepresents Ġa Ġ[ Static Type ] Ġthat Ġis Ġtype Ġof Ġa Ġsingle Ġ[ Expr ValueType ]. Ċ Ġ*/ Ċ sealed Ġclass ĠSingle Type Ġ: ĠStatic Type () Ġ{ ĊĠĠĠ Ġabstract Ġval Ġruntime Type : ĠExpr ValueType ĊĠĠĠ Ġoverride Ġval Ġtype Domain : ĠSet < Expr ValueType > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġset Of ( runtime Type ) ĊĊĠĠĠ Ġoverride Ġfun Ġflatten (): ĠStatic Type Ġ= Ġthis ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġ[ Single Type ], Ġprovides Ġa Ġdefault Ġimplementation Ġof Ġ[ is Instance ] Ġthat Ġreturns Ġtrue ĊĠĠĠĠ Ġ* Ġif Ġthe Ġ[ Expr ValueType ] Ġof Ġ[ value ] Ġis Ġthe Ġsame Ġas Ġthe Ġ[ runtime Type ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThat Ġis Ġappropriate Ġfor Ġall Ġ[ Single Type ]- derived Ġclasses Ġthat Ġdo Ġnot Ġhave Ġspecific Ġconstraints Ġbut Ġthis Ġmust Ġbe ĊĠĠĠĠ Ġ* Ġoverridden Ġin Ġany Ġ[ Single Type ] s Ġthat Ġhave Ġconstraints Ġsuch Ġas Ġ[ Int Type ], Ġ[ StringType ] Ġand Ġ[ Decimal Type ]. ĊĠĠĠĠ Ġ* Ġ[ Null Type ] Ġalso Ġhas Ġcustom Ġimplementation Ġof Ġthis Ġfunction Ġto Ġsupport Ġ` MISSING ĠIS ĠNULL ` Ġsemantics . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġis Instance ( value : ĠExpr Value ): ĠBoolean Ġ= Ġruntime Type Ġ== Ġvalue . type ĊĊĠĠĠ Ġoverride Ġfun Ġis Comparable To ( other : ĠStatic Type ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . is Unknown () Ġ|| Ġother . is Unknown ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( other ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSingle Type Ġ-> Ġ( this . is Numeric () Ġ&& Ġother . is Numeric ()) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this . is Text () Ġ&& Ġother . is Text ()) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this . is L ob () Ġ&& Ġother . is L ob ()) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this . runtime Type Ġ== Ġother . runtime Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAny Type Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAny OfType Ġ-> Ġother . all Types . filter Ġ{ Ġ! it . is Unknown () Ġ}. any Ġ{ Ġthis . is Comparable To ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠException Ġthrown Ġwhen Ġ[ Static Type . is Instance ] Ġcannot Ġperform Ġa Ġtype Ġcheck Ġbecause Ġof Ġa Ġtemporarily Ġunimplemented Ċ Ġ* Ġcode Ġpath . Ċ Ġ* Ċ Ġ* ĠThis Ġexception Ġtype Ġneeds Ġto Ġexist Ġso Ġthat Ġthe Ġcall ers Ġcan Ġcatch Ġit Ġexplicitly Ġand Ġdis amb igu ate Ġfrom Ġthe Ġmore Ċ Ġ* Ġgeneric Ġ[ NotImplemented Error ]. Ċ Ġ*/ Ċ class ĠUnsupported Type Check Exception ( message : ĠString ) Ġ: ĠRuntimeException ( message ) Ċ Ċ /** Ċ Ġ* ĠRepresents Ġcollection Ġtypes Ġi . e Ġlist , Ġbag Ġand Ġsexp . Ċ Ġ*/ Ċ sealed Ġclass ĠCollection Type Ġ: ĠSingle Type () Ġ{ ĊĠĠĠ Ġabstract Ġval Ġelement Type : ĠStatic Type ĊĊĠĠĠ Ġoverride Ġfun Ġis Instance ( value : ĠExpr Value ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! super . is Instance ( value )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this . elementType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStatic Type . ANY Ġ-> Ġtrue Ġ// Ġno Ġneed Ġto Ġcheck Ġevery Ġelement Ġif Ġthe Ġelement Type Ġis ĠANY . ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġvalue . all Ġ{ Ġthis . elementType . is Instance ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠSingle Ġtypes Ġfrom ĠExpr ValueType . Ċ Ċ /** Ċ Ġ* ĠRepresents Ġ" null " Ġtype Ġfrom Ġthe Ġruntime Ġtypes . Ċ Ġ* Ċ Ġ* ĠThis Ġis Ġnot Ġa Ġsingleton Ġsince Ġthere Ġmay Ġbe Ġmore Ġthat Ġone Ġrepresentation Ġof Ġa ĠNull Ġtype Ġ( each Ġwith Ġdifferent Ġmet as ) Ċ Ġ*/ Ċ data Ġclass ĠNull Type ( override Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of ()) Ġ: ĠSingle Type () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġruntime Type : ĠExpr ValueType ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠExpr ValueType . NULL ĊĊĠĠĠ Ġoverride Ġfun Ġis Instance ( value : ĠExpr Value ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġvalue . type Ġ== ĠExpr ValueType . MISSING Ġ|| Ġvalue . type Ġ== ĠExpr ValueType . NULL ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( this ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" null " Ċ } Ċ Ċ /** Ċ Ġ* ĠRepresents Ġmissing Ġtype Ġfrom Ġthe Ġruntime Ġtypes . Ċ Ġ* Ċ Ġ* ĠThis Ġis Ġa Ġsingleton Ġun like Ġthe Ġrest Ġof Ġthe Ġtypes Ġas Ġthere Ġcannot Ġbe Ċ Ġ* Ġmore Ġthat Ġone Ġrepresentations Ġof Ġa Ġmissing Ġtype . Ċ Ġ*/ Ċ object ĠMissing Type Ġ: ĠSingle Type () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġruntime Type : ĠExpr ValueType ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠExpr ValueType . MISSING ĊĊĠĠĠ Ġoverride Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of () ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( this ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" missing " Ċ } Ċ Ċ data Ġclass ĠBool Type ( override Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of ()) Ġ: ĠSingle Type () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġruntime Type : ĠExpr ValueType ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠExpr ValueType . BOOL ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( this ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" bool " Ċ } Ċ Ċ data Ġclass ĠInt Type ( ĊĠĠĠ Ġval Ġrange Constraint : ĠInt Range Constraint Ġ= ĠInt Range Constraint . UN CON STR AIN ED , ĊĠĠĠ Ġoverride Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of () Ċ ) Ġ: ĠSingle Type () Ġ{ ĊĊĠĠĠ Ġenum Ġclass ĠInt Range Constraint ( val Ġnum Bytes : ĠInt , Ġval Ġvalid Range : ĠLong Range ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĠSQL 's ĠSMALL INT Ġ( 2 ĠBytes ) Ġ*/ ĊĠĠĠĠĠĠĠ ĠSH ORT ( 2 , ĠShort . MIN _ VALUE . to Long () .. Short . MAX _ VALUE . to Long ()), ĊĊĠĠĠĠĠĠĠ Ġ/** ĠSQL 's ĠINT 4 Ġ( 4 Ġbytes ) Ġ*/ ĊĠĠĠĠĠĠĠ ĠINT 4 ( 4 , ĠInt . MIN _ VALUE . to Long () .. Int . MAX _ VALUE . to Long ()), ĊĊĠĠĠĠĠĠĠ Ġ/** ĠSQL 's ĠBIGINT Ġ( 8 Ġbytes ) Ġ*/ ĊĠĠĠĠĠĠĠ ĠLONG ( 8 , ĠLong . MIN _ VALUE .. Long . MAX _ VALUE ), ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAn Ġ" un constrained " Ġinteger Ġwith Ġan Ġimplementation - defined Ġconstraint Ġthat Ġhappens Ġto Ġbe Ġ 8 Ġbytes Ġfor Ġthis ĊĠĠĠĠĠĠĠĠ Ġ* Ġimplementation . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠUN CON STR AIN ED ( 8 , ĠLong . MIN _ VALUE .. Long . MAX _ VALUE ), ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġruntime Type : ĠExpr ValueType ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠExpr ValueType . INT ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( this ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( range Constraint ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt Range Constraint . UN CON STR AIN ED Ġ-> Ġ" int " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" int ${ range Constraint . num Bytes }" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Instance ( value : ĠExpr Value ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value . type Ġ!= ĠExpr ValueType . INT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlong Value Ġ= Ġvalue . number Value (). to Long () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrange Constraint . valid Range . contains ( longValue ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠFloat Type ( override Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of ()) Ġ: ĠSingle Type () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġruntime Type : ĠExpr ValueType ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠExpr ValueType . FLOAT ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( this ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" float " Ċ } Ċ Ċ data Ġclass ĠDecimal Type ( ĊĠĠĠ Ġval Ġprecision Scale Constraint : ĠPrecision Scale Constraint Ġ= ĠPrecision Scale Constraint . Un constrained , ĊĠĠĠ Ġoverride Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of () Ċ ) Ġ: ĠSingle Type () Ġ{ ĊĊĠĠĠ Ġsealed Ġclass ĠPrecision Scale Constraint Ġ{ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġmatches ( d : ĠBigDecimal ): ĠBoolean ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠDo Ġwe Ġneed Ġun constrained Ġprecision Ġand Ġscale ? ĠWhat 's Ġour Ġlimit ? ĊĠĠĠĠĠĠĠ Ġobject ĠUn constrained Ġ: ĠPrecision Scale Constraint () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmatches ( d : ĠBigDecimal ): ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠCon str ained ( val Ġprecision : ĠInt , Ġval Ġscale : ĠInt Ġ= Ġ 0 ) Ġ: ĠPrecision Scale Constraint () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmatches ( d : ĠBigDecimal ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdv Ġ= Ġd . strip Trailing Z eros () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinteger Digits Ġ= Ġdv . precision () Ġ- Ġdv . scale () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Integer Digits Ġ= Ġprecision Ġ- Ġscale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinteger Digits Ġ<= Ġexpected Integer Digits Ġ&& Ġdv . scale () Ġ<= Ġscale ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġruntime Type : ĠExpr ValueType ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠExpr ValueType . DECIMAL ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( this ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" decimal " ĊĊĠĠĠ Ġoverride Ġfun Ġis Instance ( value : ĠExpr Value ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( value . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . DECIMAL Ġ-> Ġprecision Scale Constraint . matches ( value . scalar . number Value () Ġas ĠBigDecimal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠDate Type ( override Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of ()) Ġ: ĠSingle Type () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġruntime Type : ĠExpr ValueType ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠExpr ValueType . DATE ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( this ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" date " Ċ } Ċ Ċ data Ġclass ĠTime Type ( ĊĠĠĠ Ġval Ġprecision : ĠInt ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġwith TimeZone : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġoverride Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of () Ċ ) Ġ: ĠSingle Type () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġruntime Type : ĠExpr ValueType ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠExpr ValueType . TIME ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( this ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġwhen Ġ( with TimeZone ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ" time Ġwith Ġtime Ġzone " ĊĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ" time " ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠTimestamp Type ( override Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of ()) Ġ: ĠSingle Type () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġruntime Type : ĠExpr ValueType ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠExpr ValueType . TIMESTAMP ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( this ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" timestamp " Ċ } Ċ Ċ data Ġclass ĠSymbol Type ( override Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of ()) Ġ: ĠSingle Type () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġruntime Type : ĠExpr ValueType ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠExpr ValueType . SYMBOL ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( this ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" symbol " Ċ } Ċ Ċ data Ġclass ĠString Type ( ĊĠĠĠ Ġval Ġlength Constraint : ĠString Length Constraint Ġ= ĠString Length Constraint . Un constrained , ĊĠĠĠ Ġoverride Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of () Ċ ) Ġ: ĠSingle Type () Ġ{ ĊĊĠĠĠ Ġsealed Ġclass ĠString Length Constraint Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĠReturns Ġtrue Ġif Ġthe Ġcode Ġpoint Ġcount Ġof Ġ[ value ] Ġfalls Ġwithin Ġthe Ġconstraints . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġmatches ( value : ĠExpr Value ): ĠBoolean ĊĊĠĠĠĠĠĠĠ Ġobject ĠUn constrained Ġ: ĠString Length Constraint () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmatches ( value : ĠExpr Value ): ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠCon str ained ( val Ġlength : ĠNumber Constraint ) Ġ: ĠString Length Constraint () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmatches ( value : ĠExpr Value ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr Ġ= Ġvalue . scalar . stringValue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror (" value . scalar . stringValue () Ġunexpected ly Ġreturned Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlength . matches ( str . code Point Count ( 0 , Ġstr . length )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġruntime Type : ĠExpr ValueType ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠExpr ValueType . STRING ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( this ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" string " ĊĊĠĠĠ Ġoverride Ġfun Ġis Instance ( value : ĠExpr Value ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( value . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpr ValueType . STRING Ġ-> Ġlength Constraint . matches ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġconstructor ( number Constraint : ĠNumber Constraint ) Ġ: Ġthis ( String Length Constraint . Constr ained ( number Constraint )) Ċ } Ċ Ċ data Ġclass ĠBlob Type ( override Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of ()) Ġ: ĠSingle Type () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġruntime Type : ĠExpr ValueType ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠExpr ValueType . BLOB ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( this ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" blob " Ċ } Ċ Ċ data Ġclass ĠC lob Type ( override Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of ()) Ġ: ĠSingle Type () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġruntime Type : ĠExpr ValueType ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠExpr ValueType . C LOB ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( this ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" c lob " Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ param Ġ[ elementType ] Ġtype Ġof Ġelement Ġwithin Ġthe Ġlist . Ċ Ġ*/ Ċ data Ġclass ĠList Type ( ĊĠĠĠ Ġoverride Ġval Ġelement Type : ĠStatic Type Ġ= ĠANY , ĊĠĠĠ Ġoverride Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of () Ċ ) Ġ: ĠCollection Type () Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġruntime Type : ĠExpr ValueType ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠExpr ValueType . LIST ĊĠĠĠ Ġoverride Ġfun Ġflatten (): ĠStatic Type Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( this ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" list ($ elementType )" Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ param Ġ[ elementType ] Ġtype Ġof Ġelement Ġwithin Ġthe Ġs - exp . Ċ Ġ*/ Ċ data Ġclass ĠS exp Type ( ĊĠĠĠ Ġoverride Ġval Ġelement Type : ĠStatic Type Ġ= ĠANY , ĊĠĠĠ Ġoverride Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of () Ċ ) Ġ: ĠCollection Type () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġruntime Type : ĠExpr ValueType ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠExpr ValueType . SEXP ĊĠĠĠ Ġoverride Ġfun Ġflatten (): ĠStatic Type Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( this ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" se xp ($ elementType )" Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ param Ġ[ elementType ] Ġtype Ġof Ġelement Ġwithin Ġthe Ġbag . Ċ Ġ*/ Ċ data Ġclass ĠBag Type ( ĊĠĠĠ Ġoverride Ġval Ġelement Type : ĠStatic Type Ġ= ĠANY , ĊĠĠĠ Ġoverride Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of () Ċ ) Ġ: ĠCollection Type () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġruntime Type : ĠExpr ValueType ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠExpr ValueType . B AG ĊĊĠĠĠ Ġoverride Ġfun Ġflatten (): ĠStatic Type Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( this ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" bag ($ elementType )" Ċ } Ċ Ċ data Ġclass ĠStruct Type ( ĊĠĠĠ Ġval Ġfields : ĠMap < String , ĠStatic Type > Ġ= Ġmap Of (), ĊĠĠĠ Ġval Ġcontent Closed : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġoverride Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of () Ċ ) Ġ: ĠSingle Type () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġruntime Type : ĠExpr ValueType ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠExpr ValueType . STRUCT ĊĊĠĠĠ Ġoverride Ġfun Ġflatten (): ĠStatic Type Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( this ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġfields . entries ĊĠĠĠĠĠĠĠ Ġval Ġfirst Se veral Ġ= Ġentries . toList (). take ( 3 ). join ToString Ġ{ Ġ"${ it . key }: Ġ${ it . value }" Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentries . size Ġ<= Ġ 3 Ġ-> Ġ" struct ($ first Se veral )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" struct ($ first Se veral , Ġ... Ġand Ġ${ entries . size Ġ- Ġ 3 } Ġother Ġfield ( s )) " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBy Ġfar , Ġstructs Ġhave Ġthe Ġmost Ġcomplicated Ġlogic Ġbehind Ġtheir Ġinstance Ġcheck . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġreturns Ġtrue Ġif : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ- ĠAll Ġfields Ġare Ġinstance Ġof Ġthe Ġcorrect Ġtype Ġ( as Ġidentified Ġby Ġ[ fields ]). ĊĠĠĠĠ Ġ* Ġ- ĠIf Ġ[ content Closed ] Ġand Ġthere Ġare Ġno Ġfields Ġother Ġthan Ġthose Ġlisted Ġin Ġ[ fields ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠDuplicate Ġfields Ġare Ġsupported , Ġbut Ġall Ġinstances Ġof Ġa Ġfield Ġwith Ġthe Ġsame Ġname ĊĠĠĠĠ Ġ* Ġmust Ġmatch Ġthe Ġtype Ġspecified Ġin Ġ[ fields ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġstruct Ġcontains Ġany Ġnon - text Ġkey , Ġthis Ġautomatically Ġmeans Ġthat Ġthe Ġstruct Ġis Ġnot Ġan Ġinstance Ġof Ġthis ĊĠĠĠĠ Ġ* Ġ[ Struct Type ]. Ġ ĠWe Ġdo Ġnot Ġeven Ġhave Ġthe Ġability Ġto Ġmodel Ġthat Ġwith ĠIon / Ion ĠSchema Ġanyway . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġis Instance ( value : ĠExpr Value ): ĠBoolean Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġfields . isEmpty () Ġ&& Ġ! content Closed Ġ-> Ġvalue . type Ġ== ĠExpr ValueType . STRUCT ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . type Ġ!= ĠExpr ValueType . STRUCT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbuild Ġa Ġmulti - map Ġof Ġfields Ġin Ġthe Ġstruct . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscratch Pad Ġ= ĠHashMap < String , ĠMutable List < Expr Value >> (). also Ġ{ Ġmap Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . forEach Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreturn Ġfalse Ġearly Ġif Ġthe Ġstruct Ġkey Ġis Ġnot Ġa Ġstring Ġor Ġsymbol . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstruct Key Ġ= Ġv . name . take If Ġ{ Ġit ?. type ?. is Text Ġ?: Ġfalse Ġ} Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . get Or Put ( struct Key . stringValue ()) Ġ{ ĠArrayList () Ġ}. add ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnow Ġgo Ġth ru Ġeach Ġof Ġthe Ġ[ fields ] Ġand Ġremove Ġthose Ġthat Ġare Ġvalid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields . forEach Ġ{ Ġ( fieldName , ĠfieldType ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Values Ġ= Ġscratch Pad . remove ( fieldName ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠField Ġwas Ġ* not * Ġpresent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Values Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġfield Ġwas Ġrequired , Ġthe Ġstruct Ġis Ġnot Ġan Ġinstance Ġof Ġthis Ġ[ Struct Type ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! fieldType . is Optional ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġelse Ġthere Ġis Ġno Ġviolation , Ġkeep Ġchecking Ġother Ġfields ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġthe Ġcase Ġof Ġmultiple Ġfields Ġwith Ġthe Ġsame Ġname , Ġall Ġvalues Ġmust Ġmatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! field Values . all Ġ{ ĠfieldType . is Instance ( it ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġelse Ġthere Ġis Ġno Ġviolation , Ġkeep Ġchecking Ġother Ġfields ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġwe Ġreach Ġthis Ġpoint , Ġwe Ġdidn 't Ġfind Ġany Ġfields Ġthat Ġdo Ġnot Ġcomp ly Ġwith Ġtheir Ġfinal Ġtypes . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġno Ġfields Ġremain Ġ[ value ] Ġis Ġan Ġinstance Ġof Ġthis Ġ[ Static Type ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scratch Pad . none ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThere Ġare Ġsome Ġfields Ġleft Ġover , Ġso Ġwe Ġonly Ġneed Ġto Ġcheck Ġif Ġwe Ġare Ġclosed Content Ġor Ġnot . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! content Closed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠRepresents Ġa Ġ[ Static Type ] Ġthat 's Ġdefined Ġby Ġthe Ġunion Ġof Ġmultiple Ġ[ Static Type ] s . Ċ Ġ*/ Ċ data Ġclass ĠAny OfType ( val Ġtypes : ĠSet < Static Type >, Ġoverride Ġval Ġmet as : ĠMap < String , ĠAny > Ġ= Ġmap Of ()) Ġ: ĠStatic Type () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġtype Domain Ġ= Ġtypes . flatMap Ġ{ Ġit . type Domain Ġ}. toSet () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFl att ens Ġa Ġunion Ġtype Ġby Ġtra ver sing Ġthe Ġtypes Ġand Ġrecursively Ġb ub bling Ġup Ġthe Ġunderlying Ġunion Ġtypes . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġunion Ġtype Ġends Ġup Ġhaving Ġjust Ġone Ġtype Ġin Ġit , Ġthen Ġthat Ġtype Ġis Ġreturned . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġflatten (): ĠStatic Type Ġ= Ġthis . copy ( ĊĠĠĠĠĠĠĠ Ġtypes Ġ= Ġthis . types . flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSingle Type Ġ-> ĠlistOf ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAny Type Ġ-> ĠlistOf ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAny OfType Ġ-> Ġit . types ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. toSet () ĊĠĠĠ Ġ). let Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . types . size Ġ== Ġ 1 Ġ-> Ġit . types . first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . types . filter Is Instance < Any OfType >(). any () Ġ-> Ġit . flatten () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġflatten ed Type Ġ= Ġflatten ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAny OfType Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunion ed Types Ġ= Ġflatten ed Type . types ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( union ed Types . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ"\ $ null " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġunion ed Types . first (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġunion ed Types . join ToString Ġ{ Ġit . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" union ($ types )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġflatten ed Type . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġall Types : ĠList < Static Type > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis . types . map Ġ{ Ġit . flatten () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthe Ġvalue Ġmatches Ġany Ġof Ġthe Ġ[ types ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġis Instance ( value : ĠExpr Value ): ĠBoolean Ġ= Ġtypes . any Ġ{ Ġit . is Instance ( value ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Comparable To ( other : ĠStatic Type ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . is Unknown () Ġ|| Ġother . is Unknown ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtypes A Ġ= Ġthis . all Types . filter Ġ{ Ġ! it . is Unknown () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtypes B Ġ= Ġother . all Types . filter Ġ{ Ġ! it . is Unknown () Ġ} ĊĊĠĠĠĠĠĠĠ Ġtypes A . forEach Ġ{ Ġt A Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtypes B . forEach Ġ{ Ġt B Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t A . is Comparable To ( tB )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠNumber Constraint Ġ{ ĊĊĠĠĠ Ġ/** ĠReturns Ġtrue Ġof Ġ[ num ] Ġmatches Ġthe Ġconstraint . Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġmatches ( num : ĠInt ): ĠBoolean ĊĊĠĠĠ Ġabstract Ġval Ġvalue : ĠInt ĊĊĠĠĠ Ġdata Ġclass ĠEquals ( override Ġval Ġvalue : ĠInt ) Ġ: ĠNumber Constraint () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmatches ( num : ĠInt ): ĠBoolean Ġ= Ġvalue Ġ== Ġnum ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠUp To ( override Ġval Ġvalue : ĠInt ) Ġ: ĠNumber Constraint () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmatches ( num : ĠInt ): ĠBoolean Ġ= Ġvalue Ġ>= Ġnum ĊĠĠĠ Ġ} Ċ } Ċ