/* Ċ Ġ* ĠCopyright ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . ĠAll ĠRights ĠReserved . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "). Ċ Ġ* ĠYou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠA Ġcopy Ġof Ġthe ĠLicense Ġis Ġlocated Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* Ġor Ġin Ġthe Ġ" license " Ġfile Ġaccompanying Ġthis Ġfile . ĠThis Ġfile Ġ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 . part i ql . pig . domain . model Ċ Ċ import Ġcom . amazon . ion element . api . Meta Container Ċ import Ġcom . amazon . ion element . api . empty Meta Container Ċ import Ġcom . amazon . ion element . api . location Ċ import Ġcom . amazon . ion element . api . location ToString ĊĊ Ċ /** ĠBase Ġclass Ġfor Ġtop Ġlevel Ġstatements Ġof Ġa Ġtype Ġuniverse Ġdefinition . Ġ*/ Ġ Ċ sealed Ġclass ĠStatement ( val Ġmet as : ĠMeta Container ) Ċ Ċ /** ĠRepresents Ġa Ġfully Ġdefined Ġtype Ġdomain . Ġ*/ Ċ class ĠType Domain ( ĊĠĠĠ Ġ/** ĠThe Ġname Ġof Ġthe Ġtype Ġdomain . Ġ*/ ĊĠĠĠ Ġval Ġtag : ĠString , ĊĠĠĠ Ġ/** ĠThe Ġlist Ġof Ġuser - defined Ġtypes . Ġ ĠDoes Ġnot Ġinclude Ġprimitive Ġtypes . Ġ*/ ĊĠĠĠ Ġval Ġuser Types : ĠList < DataType >, ĊĠĠĠ Ġmet as : ĠMeta Container Ġ= Ġempty Meta Container () Ċ ): ĠStatement ( metas ) Ġ{ ĊĊĠĠĠ Ġ/** ĠAll Ġdata Ġtypes . Ġ( User Ġtypes Ġ+ Ġprimitives ). Ġ*/ ĊĠĠĠ Ġval Ġtypes : ĠList < DataType > Ġ= ĠlistOf ( DataType . Int , ĠDataType . Symbol , ĠDataType . Ion ) Ġ+ Ġuser Types ĊĊĠĠĠ Ġfun Ġresolve Type Ref ( type Ref : ĠType Ref ) Ġ= ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġis Ġnot Ġcall Ġ` invalid Domain ` Ġbecause Ġwe 're Ġassuming Ġthat Ġthe Ġdomain Ġhas Ġbeen Ġchecked Ġfor Ġerrors ĊĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġan Ġ[ Invalid StateException ] Ġis Ġthrown Ġhere Ġa Ġbug Ġprobably Ġexists Ġin Ġ[ Type Domain ]' s Ġerror Ġchecking . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġtypes . find Ġ{ Ġit . tag Ġ== Ġtype Ref . typeName Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror ("${ location ToString ( type Ref . metas . location )} : ĠCould n 't Ġresolve Ġtype Ġ'${ type Ref . typeName }' ") Ċ } Ċ Ċ /** Ċ Ġ* ĠRepresents Ġdifferences Ġto Ġanother Ġtype Ġdomain Ġexpressed Ġas Ġdelt as . Ċ Ġ* Ċ Ġ* ĠGiven Ġa Ġ[ Type Domain ] Ġand Ġa Ġ[ Per muted Domain ] Ġa Ġnew Ġ[ Type Domain ] Ġcan Ġbe Ġcomputed Ġwhich Ġdiffers Ġfrom Ġthe Ġoriginal Ċ Ġ* Ġas Ġspecified Ġby Ġthe Ġ[ Per muted Domain ]. Ċ Ġ*/ Ċ class ĠPer muted Domain ( ĊĠĠĠ Ġval Ġtag : ĠString , ĊĠĠĠ Ġval Ġper mut es Domain : ĠString , ĊĠĠĠ Ġval Ġexcluded Types : ĠList < String >, ĊĠĠĠ Ġval Ġincluded Types : ĠList < DataType >, ĊĠĠĠ Ġval Ġper muted Sum s : ĠList < Per muted Sum >, ĊĠĠĠ Ġmet as : ĠMeta Container Ċ ) Ġ: ĠStatement ( metas ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġmap Ġof Ġconcrete Ġtype Ġdomains Ġkey ed Ġby Ġname , Ġgenerates Ġa Ġnew Ġconcrete Ġtype Ġdomain Ġwith Ġthe Ġdelt as ĊĠĠĠĠ Ġ* Ġof Ġthis Ġ[ Per muted Domain ] Ġinstance Ġapplied . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcompute Per mutation ( domains : ĠMap < String , ĠType Domain >): ĠType Domain Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġper mut ing Domain Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdomains [ this . per mut es Domain ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġsemantic Error ( metas , ĠSemantic Error Context . Domain Per mut es Non Ex istent Domain ( tag , Ġper mut es Domain )) ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Types Ġ= Ġper mut ing Domain . types . to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġexcluded Types . forEach Ġ{ Ġremoved TypeName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype ToRemove Ġ= Ġnew Types . single OrNull Ġ{ Ġit . tag Ġ== Ġremoved TypeName Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ToRemove Ġ== Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsemantic Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmet as , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSemantic Error Context . Cannot Remove Non Ex istent Type ( removed TypeName , Ġtag , Ġper mut es Domain )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ToRemove . is Builtin Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsemantic Error ( this . metas , ĠSemantic Error Context . Cannot Remove Builtin Type ( removed TypeName )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! new Types . remove If Ġ{ Ġold Type Ġ-> Ġold Type . tag Ġ== Ġremoved TypeName Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Failed Ġto Ġremove Ġ$ removed TypeName Ġfor Ġsome Ġreason ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġdo Ġalter ations Ġfirst Ġsince Ġif Ġwe Ġalter Ġa Ġnew Ġtype Ġand Ġthen Ġadd Ġanother Ġwith Ġthe Ġsame Ġname ĊĠĠĠĠĠĠĠ Ġ// Ġit Ġwill Ġcause Ġa Ġduplicate Ġtype Ġname Ġerror . Ġ ĠThis Ġwould Ġnot Ġhappen Ġin Ġthe Ġreverse Ġorder . ĊĠĠĠĠĠĠĠ Ġper muted Sum s . forEach Ġ{ Ġext Sum Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( val Ġtype To Alter Ġ= Ġnew Types . single OrNull Ġ{ Ġit . tag Ġ== Ġext Sum . tag Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsemantic Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġext Sum . metas , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSemantic Error Context . Cannot Perm ute Non Ex istent Sum ( ext Sum . tag , Ġtag , Ġper mut es Domain )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDataType . Tuple , Ġis ĠDataType . Int , Ġis ĠDataType . Symbol Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsemantic Error ( ext Sum . metas , ĠSemantic Error Context . Cannot Perm ute Non Sum Type ( ext Sum . tag )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDataType . Sum Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Variants Ġ= Ġtype To Alter . variants . to Mutable List () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremoved Variant Tags Ġ= Ġext Sum . removed Variants . toSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremoved Variant Tags . forEach Ġ{ Ġremoved TagName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! new Variants . remove If Ġ{ Ġit . tag Ġ== Ġremoved TagName }) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsemantic Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġext Sum . metas , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSemantic Error Context . Cannot Remove Non Ex istent Sum Variant ( ext Sum . tag , Ġremoved TagName )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Variants . addAll ( ext Sum . added Variants ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Sum Type Ġ= ĠDataType . Sum ( ext Sum . tag , Ġnew Variants , Ġmet as ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! new Types . remove ( type To Alter )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthis Ġhappens Ġit 's Ġa Ġbug ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Failed Ġto Ġremove Ġaltered Ġtype Ġ'${ type To Alter . tag }' Ġfor Ġsome Ġreason ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Types . add ( new Sum Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnew Types . addAll ( this . included Types ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġerror Check Ġis Ġbeing Ġcalled Ġby ĠType Un iverse . resolve Extensions ĊĠĠĠĠĠĠĠ Ġreturn ĠType Domain ( tag , Ġnew Types . filter Ġ{ Ġ! it . is Builtin Ġ}, Ġmet as ) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** ĠRepresents Ġdifferences Ġto Ġa Ġsum Ġin Ġthe Ġdomain Ġbeing Ġper muted . Ġ*/ Ċ class ĠPer muted Sum ( ĊĠĠĠ Ġval Ġtag : ĠString , ĊĠĠĠ Ġval Ġremoved Variants : ĠList < String >, ĊĠĠĠ Ġval Ġadded Variants : ĠList < DataType . Tuple >, ĊĠĠĠ Ġval Ġmet as : ĠMeta Container Ċ ) Ċ