/** Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠIsl on ĠSch er er Ċ Ġ* Ċ Ġ* Ġ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 Ġnov ah . ast . source Ċ Ċ import Ġnov ah . data . Label Map Ċ import Ġnov ah . data . Labels Ċ import Ġnov ah . data . show Ċ import Ġnov ah . frontend . Comment Ċ import Ġnov ah . frontend . Span Ċ import Ġnov ah . frontend . Sp anned Ċ Ċ data Ġclass ĠModule ( ĊĠĠĠ Ġval Ġname : ĠSp anned < String >, ĊĠĠĠ Ġval Ġsource Name : ĠString , ĊĠĠĠ Ġval Ġimports : ĠList < Import >, ĊĠĠĠ Ġval Ġforeign s : ĠList < Foreign Import >, ĊĠĠĠ Ġval Ġdecl s : ĠList < Decl >, ĊĠĠĠ Ġval Ġspan : ĠSpan Ċ ) Ġ{ ĊĠĠĠ Ġvar Ġcomment : ĠComment ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġresolved Imports Ġ= Ġempty Map < String , ĠString >() ĊĠĠĠ Ġvar Ġresolved Type aliases Ġ= Ġempty List < Decl . Type alias Decl >() ĊĊĠĠĠ Ġvar Ġforeign Types Ġ= Ġempty Map < String , ĠString >() ĊĊĠĠĠ Ġfun Ġwith Comment ( c : ĠComment ?) Ġ= Ġapply Ġ{ Ġcomment Ġ= Ġc Ġ} Ċ } Ċ Ċ enum Ġclass ĠVisibility Ġ{ ĊĠĠĠ ĠPUBLIC , ĠPRIVATE ; ĊĊĠĠĠ Ġfun Ġis Public () Ġ= Ġthis Ġ== ĠPUBLIC Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġreference Ġthat Ġcan Ġbe Ġimported Ċ Ġ*/ Ċ sealed Ġclass ĠDeclaration Ref ( open Ġval Ġname : ĠString , Ġopen Ġval Ġspan : ĠSpan ) Ġ{ ĊĠĠĠ Ġdata Ġclass ĠRef Var ( override Ġval Ġname : ĠString , Ġoverride Ġval Ġspan : ĠSpan ) Ġ: ĠDeclaration Ref ( name , Ġspan ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġname ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ` null ` Ġct ors Ġmean Ġonly Ġthe Ġtype Ġis Ġimported , Ġbut Ġno Ġconstructors . ĊĠĠĠĠ Ġ* ĠEmpty Ġct ors Ġmean Ġall Ġconstructors Ġare Ġimported . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠRef Type ( val Ġbinder : ĠSp anned < String >, Ġoverride Ġval Ġspan : ĠSpan , Ġval Ġct ors : ĠList < Sp anned < String >> ? Ġ= Ġnull ) Ġ: ĊĠĠĠĠĠĠĠ ĠDeclaration Ref ( binder . value , Ġspan ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġct ors Ġ== Ġnull Ġ-> Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġct ors . isEmpty () Ġ-> Ġ"$ name (.. )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġname Ġ+ Ġct ors . join ToString ( prefix Ġ= Ġ" (", Ġpostfix Ġ= Ġ") ") Ġ{ Ġit . value Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠImport ( open Ġval Ġmodule : ĠSp anned < String >) Ġ{ ĊĠĠĠ Ġdata Ġclass ĠRaw ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġmodule : ĠSp anned < String >, ĊĠĠĠĠĠĠĠ Ġval Ġspan : ĠSpan , ĊĠĠĠĠĠĠĠ Ġval Ġalias : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġauto : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ) Ġ: ĠImport ( module ) ĊĊĠĠĠ Ġdata Ġclass ĠEx posing ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġmodule : ĠSp anned < String >, ĊĠĠĠĠĠĠĠ Ġval Ġdefs : ĠList < Declaration Ref >, ĊĠĠĠĠĠĠĠ Ġval Ġspan : ĠSpan , ĊĠĠĠĠĠĠĠ Ġval Ġalias : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ: ĠImport ( module ) ĊĊĠĠĠ Ġfun Ġalias (): ĠString ? Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠRaw Ġ-> Ġalias ĊĠĠĠĠĠĠĠ Ġis ĠEx posing Ġ-> Ġalias ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġspan (): ĠSpan Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠRaw Ġ-> Ġspan ĊĠĠĠĠĠĠĠ Ġis ĠEx posing Ġ-> Ġspan ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Auto (): ĠBoolean Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠEx posing Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġis ĠRaw Ġ-> Ġauto ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġcomment : ĠComment ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġwith Comment ( c : ĠComment ?) Ġ= Ġapply Ġ{ Ġcomment Ġ= Ġc Ġ} Ċ } Ċ Ċ data Ġclass ĠForeign Import ( val Ġtype : ĠString , Ġval Ġalias : ĠString ?, Ġval Ġspan : ĠSpan ) Ġ{ ĊĠĠĠ Ġfun Ġname () Ġ= Ġalias Ġ?: Ġtype . split (". "). last () Ċ } Ċ Ċ sealed Ġclass ĠDecl ( val Ġname : ĠString , Ġval Ġvisibility : ĠVisibility ) Ġ{ ĊĠĠĠ Ġclass ĠType Decl ( ĊĠĠĠĠĠĠĠ Ġval Ġbinder : ĠSp anned < String >, ĊĠĠĠĠĠĠĠ Ġval Ġty Vars : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġval Ġdata Ct ors : ĠList < Data Constructor >, ĊĠĠĠĠĠĠĠ Ġvisibility : ĠVisibility , ĊĠĠĠĠĠĠĠ Ġval Ġis Opaque : ĠBoolean ĊĠĠĠ Ġ) Ġ: ĠDecl ( binder . value , Ġvisibility ) ĊĊĠĠĠ Ġclass ĠVal Decl ( ĊĠĠĠĠĠĠĠ Ġval Ġbinder : ĠSp anned < String >, ĊĠĠĠĠĠĠĠ Ġval Ġpatterns : ĠList < Pattern >, ĊĠĠĠĠĠĠĠ Ġval Ġexp : ĠExpr , ĊĠĠĠĠĠĠĠ Ġval Ġsignature : ĠSignature ?, ĊĠĠĠĠĠĠĠ Ġvisibility : ĠVisibility , ĊĠĠĠĠĠĠĠ Ġval Ġis Instance : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġval Ġis Operator : ĠBoolean ĊĠĠĠ Ġ) Ġ: ĠDecl ( binder . value , Ġvisibility ) ĊĊĠĠĠ Ġclass ĠType alias Decl ( name : ĠString , Ġval Ġty Vars : ĠList < String >, Ġval Ġtype : ĠType , Ġvisibility : ĠVisibility ) Ġ: ĊĠĠĠĠĠĠĠ ĠDecl ( name , Ġvisibility ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġexpanded : ĠType ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġfree Vars Ġ= Ġmutable Set Of < String >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġcomment : ĠComment ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġspan Ġ= ĠSpan . empty () ĊĊĠĠĠ Ġfun Ġwith Span ( s : ĠSpan , Ġe : ĠSpan ) Ġ= Ġapply Ġ{ Ġspan Ġ= ĠSpan ( s . start Line , Ġs . start Column , Ġe . end Line , Ġe . end Column ) Ġ} Ċ } Ċ Ċ data Ġclass ĠSignature ( val Ġtype : ĠType , Ġval Ġspan : ĠSpan ) Ċ Ċ data Ġclass ĠData Constructor ( ĊĠĠĠ Ġval Ġname : ĠSp anned < String >, ĊĠĠĠ Ġval Ġargs : ĠList < Type >, ĊĠĠĠ Ġval Ġvisibility : ĠVisibility , ĊĠĠĠ Ġval Ġspan : ĠSpan Ċ ) Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġname . value Ġ+ Ġargs . join ToString (" Ġ", Ġprefix Ġ= Ġ" Ġ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠExpr Ġ{ ĊĠĠĠ Ġdata Ġclass ĠInt 3 2 ( val Ġv : ĠInt , Ġval Ġtext : ĠString ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠInt 6 4 ( val Ġv : ĠLong , Ġval Ġtext : ĠString ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠFloat 3 2 ( val Ġv : ĠFloat , Ġval Ġtext : ĠString ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠFloat 6 4 ( val Ġv : ĠDouble , Ġval Ġtext : ĠString ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠString E ( val Ġv : ĠString , Ġval Ġraw : ĠString , Ġval Ġmulti : ĠBoolean Ġ= Ġfalse ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠChar E ( val Ġv : ĠChar , Ġval Ġraw : ĠString ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠBool ( val Ġv : ĠBoolean ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠVar ( val Ġname : ĠString , Ġval Ġalias : ĠString ? Ġ= Ġnull ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠOperator ( val Ġname : ĠString , Ġval Ġis Prefix : ĠBoolean , Ġval Ġalias : ĠString ? Ġ= Ġnull ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠImp licit Var ( val Ġname : ĠString , Ġval Ġalias : ĠString ? Ġ= Ġnull ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠConstructor ( val Ġname : ĠString , Ġval Ġalias : ĠString ? Ġ= Ġnull ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠLambda ( val Ġpatterns : ĠList < Pattern >, Ġval Ġbody : ĠExpr ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠApp ( val Ġfn : ĠExpr , Ġval Ġarg : ĠExpr ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠBin App ( val Ġop : ĠExpr , Ġval Ġleft : ĠExpr , Ġval Ġright : ĠExpr ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠIf ( val Ġcond : ĠExpr , Ġval Ġthen Case : ĠExpr , Ġval Ġelse Case : ĠExpr ?) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠLet ( val Ġlet Def : ĠLet Def , Ġval Ġbody : ĠExpr ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠMatch ( val Ġex ps : ĠList < Expr >, Ġval Ġcases : ĠList < Case >) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠAnn ( val Ġexp : ĠExpr , Ġval Ġtype : ĠType ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠDo ( val Ġex ps : ĠList < Expr >) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠDo Let ( val Ġlet Def : ĠLet Def ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠLet Bang ( val Ġlet Def : ĠLet Def , Ġval Ġbody : ĠExpr ?) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠFor ( val Ġlet Def : ĠLet Def , Ġval Ġbody : ĠExpr ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠP are ns ( val Ġexp : ĠExpr ) Ġ: ĠExpr () ĊĠĠĠ Ġclass ĠUnit Ġ: ĠExpr () ĊĠĠĠ Ġclass ĠRecord Empty Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠRecord Select ( val Ġexp : ĠExpr , Ġval Ġlabels : ĠList < Sp anned < String >>) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠRecord Extend ( val Ġlabels : ĠLabels < Expr >, Ġval Ġexp : ĠExpr ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠRecord Restrict ( val Ġexp : ĠExpr , Ġval Ġlabels : ĠList < String >) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠRecord Update ( val Ġexp : ĠExpr , Ġval Ġlabels : ĠList < Sp anned < String >>, Ġval Ġvalue : ĠExpr , Ġval ĠisSet : ĠBoolean ) Ġ: ĊĠĠĠĠĠĠĠ ĠExpr () ĊĊĠĠĠ Ġdata Ġclass ĠRecord Merge ( val Ġexp 1 : ĠExpr , Ġval Ġexp 2 : ĠExpr ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠList Literal ( val Ġex ps : ĠList < Expr >) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠSet Literal ( val Ġex ps : ĠList < Expr >) Ġ: ĠExpr () ĊĠĠĠ Ġclass ĠUnd erscore Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠThrow ( val Ġexp : ĠExpr ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠTry Catch ( val Ġtry Expr : ĠExpr , Ġval Ġcases : ĠList < Case >, Ġval Ġfinally Exp : ĠExpr ?) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠWhile ( val Ġcond : ĠExpr , Ġval Ġex ps : ĠList < Expr >) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠComp utation ( val Ġbuilder : ĠVar , Ġval Ġex ps : ĠList < Expr >) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠReturn ( val Ġexp : ĠExpr ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠY ield ( val Ġexp : ĠExpr ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠDo Bang ( val Ġexp : ĠExpr ) Ġ: ĠExpr () ĊĠĠĠ Ġclass ĠNull Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠType Cast ( val Ġexp : ĠExpr , Ġval Ġcast : ĠType ) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠForeign Static Field ( val Ġclazz : ĠSp anned < String >, Ġval Ġfield : ĠSp anned < String >) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠForeign Field ( val Ġexp : ĠExpr , Ġval Ġfield : ĠSp anned < String >) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠForeign Method ( val Ġexp : ĠExpr , Ġval Ġmethod : ĠSp anned < String >, Ġval Ġargs : ĠList < Expr >) Ġ: ĠExpr () ĊĠĠĠ Ġdata Ġclass ĠForeign Static Method ( val Ġclazz : ĠSp anned < String >, Ġval Ġmethod : ĠSp anned < String >, Ġval Ġargs : ĠList < Expr >) Ġ: ĊĠĠĠĠĠĠĠ ĠExpr () ĊĊĠĠĠ Ġvar Ġspan Ġ= ĠSpan . empty () ĊĠĠĠ Ġvar Ġcomment : ĠComment ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġwith Span ( s : ĠSpan ) Ġ= Ġapply Ġ{ Ġspan Ġ= Ġs Ġ} ĊĠĠĠ Ġfun Ġwith Span ( s : ĠSpan , Ġe : ĠSpan ) Ġ= Ġapply Ġ{ Ġspan Ġ= ĠSpan ( s . start Line , Ġs . start Column , Ġe . end Line , Ġe . end Column ) Ġ} ĊĊĠĠĠ Ġfun Ġwith Comment ( c : ĠComment ?) Ġ= Ġapply Ġ{ Ġcomment Ġ= Ġc Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġwith Span And Comment ( s : ĠSp anned < T >) Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġspan Ġ= Ġs . span ĊĠĠĠĠĠĠĠ Ġcomment Ġ= Ġs . comment ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Simple (): ĠBoolean Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠIf , Ġis ĠLet , Ġis ĠMatch , Ġis ĠDo , Ġis ĠDo Let , Ġis ĠTry Catch , Ġis ĠWhile , Ġis ĠComp utation Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġis ĠAnn Ġ-> Ġexp . is Simple () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠExpr . Var . fullname (): ĠString Ġ= Ġif Ġ( alias Ġ!= Ġnull ) Ġ"$ alias .$ name " Ġelse Ġname Ċ fun ĠExpr . Implicit Var . fullname (): ĠString Ġ= Ġif Ġ( alias Ġ!= Ġnull ) Ġ"$ alias .$ name " Ġelse Ġname Ċ fun ĠExpr . Constructor . fullname (): ĠString Ġ= Ġif Ġ( alias Ġ!= Ġnull ) Ġ"$ alias .$ name " Ġelse Ġname Ċ fun ĠExpr . Operator . fullname (): ĠString Ġ= Ġif Ġ( alias Ġ!= Ġnull ) Ġ"$ alias .$ name " Ġelse Ġname Ċ Ċ data Ġclass ĠB inder ( val Ġname : ĠString , Ġval Ġspan : ĠSpan , Ġval Ġis Implicit : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġname Ċ } Ċ Ċ sealed Ġclass ĠLet Def ( open Ġval Ġexpr : ĠExpr ) Ġ{ ĊĠĠĠ Ġdata Ġclass ĠDef Bind ( ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠB inder , ĊĠĠĠĠĠĠĠ Ġval Ġpatterns : ĠList < Pattern >, ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġexpr : ĠExpr , ĊĠĠĠĠĠĠĠ Ġval Ġis Instance : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġval Ġtype : ĠType ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ: ĠLet Def ( expr ) ĊĊĠĠĠ Ġdata Ġclass ĠDef Pattern ( val Ġpat : ĠPattern , Ġoverride Ġval Ġexpr : ĠExpr ) Ġ: ĠLet Def ( expr ) Ċ } Ċ Ċ data Ġclass ĠCase ( val Ġpatterns : ĠList < Pattern >, Ġval Ġexp : ĠExpr , Ġval Ġguard : ĠExpr ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġfun Ġpattern Span () Ġ= ĠSpan . new ( patterns [ 0 ]. span , Ġpatterns . last (). span ) Ċ } Ċ Ċ sealed Ġclass ĠPattern ( open Ġval Ġspan : ĠSpan ) Ġ{ ĊĠĠĠ Ġdata Ġclass ĠW ildcard ( override Ġval Ġspan : ĠSpan ) Ġ: ĠPattern ( span ) ĊĠĠĠ Ġdata Ġclass ĠLiteral P ( val Ġlit : ĠLiteral Pattern , Ġoverride Ġval Ġspan : ĠSpan ) Ġ: ĠPattern ( span ) ĊĠĠĠ Ġdata Ġclass ĠVar ( val Ġv : ĠExpr . Var ) Ġ: ĠPattern ( v . span ) ĊĠĠĠ Ġdata Ġclass ĠC tor ( val Ġctor : ĠExpr . Constructor , Ġval Ġfields : ĠList < Pattern >, Ġoverride Ġval Ġspan : ĠSpan ) Ġ: ĠPattern ( span ) ĊĠĠĠ Ġdata Ġclass ĠRecord ( val Ġlabels : ĠLabel Map < Pattern >, Ġoverride Ġval Ġspan : ĠSpan ) Ġ: ĠPattern ( span ) ĊĠĠĠ Ġdata Ġclass ĠList P ( val Ġelems : ĠList < Pattern >, Ġoverride Ġval Ġspan : ĠSpan ) Ġ: ĠPattern ( span ) ĊĠĠĠ Ġdata Ġclass ĠList Head Tail ( val Ġhead : ĠPattern , Ġval Ġtail : ĠPattern , Ġoverride Ġval Ġspan : ĠSpan ) Ġ: ĠPattern ( span ) ĊĠĠĠ Ġdata Ġclass ĠNamed ( val Ġpat : ĠPattern , Ġval Ġname : ĠSp anned < String >, Ġoverride Ġval Ġspan : ĠSpan ) Ġ: ĠPattern ( span ) ĊĠĠĠ Ġdata Ġclass ĠUnit ( override Ġval Ġspan : ĠSpan ) Ġ: ĠPattern ( span ) ĊĠĠĠ Ġdata Ġclass ĠType Test ( val Ġtype : ĠType , Ġval Ġalias : ĠString ?, Ġoverride Ġval Ġspan : ĠSpan ) Ġ: ĠPattern ( span ) ĊĠĠĠ Ġdata Ġclass ĠImp licit Pattern ( val Ġpat : ĠPattern , Ġoverride Ġval Ġspan : ĠSpan ) Ġ: ĠPattern ( span ) ĊĊĠĠĠ Ġ// Ġthose Ġlast Ġpatterns Ġwill Ġde Ġdes ug ared Ġduring Ġdes ugar Ġphase ĊĠĠĠ Ġdata Ġclass ĠP are ns ( val Ġpattern : ĠPattern , Ġoverride Ġval Ġspan : ĠSpan ) Ġ: ĠPattern ( span ) ĊĠĠĠ Ġdata Ġclass ĠType Annotation ( val Ġpat : ĠVar , Ġval Ġtype : ĠType , Ġoverride Ġval Ġspan : ĠSpan ) Ġ: ĠPattern ( span ) Ċ } Ċ Ċ sealed Ġclass ĠLiteral Pattern Ġ{ ĊĠĠĠ Ġdata Ġclass ĠBool Literal ( val Ġe : ĠExpr . Bool ) Ġ: ĠLiteral Pattern () ĊĠĠĠ Ġdata Ġclass ĠChar Literal ( val Ġe : ĠExpr . Char E ) Ġ: ĠLiteral Pattern () ĊĠĠĠ Ġdata Ġclass ĠString Literal ( val Ġe : ĠExpr . String E ) Ġ: ĠLiteral Pattern () ĊĠĠĠ Ġdata Ġclass ĠInt 3 2 Literal ( val Ġe : ĠExpr . Int 3 2 ) Ġ: ĠLiteral Pattern () ĊĠĠĠ Ġdata Ġclass ĠInt 6 4 Literal ( val Ġe : ĠExpr . Int 6 4 ) Ġ: ĠLiteral Pattern () ĊĠĠĠ Ġdata Ġclass ĠFloat 3 2 Literal ( val Ġe : ĠExpr . Float 3 2 ) Ġ: ĠLiteral Pattern () ĊĠĠĠ Ġdata Ġclass ĠFloat 6 4 Literal ( val Ġe : ĠExpr . Float 6 4 ) Ġ: ĠLiteral Pattern () Ċ } Ċ Ċ type alias ĠRow Ġ= ĠType Ċ Ċ sealed Ġclass ĠType ( open Ġval Ġspan : ĠSpan ) Ġ{ ĊĠĠĠ Ġdata Ġclass ĠT Const ( val Ġname : ĠString , Ġval Ġalias : ĠString ? Ġ= Ġnull , Ġoverride Ġval Ġspan : ĠSpan ) Ġ: ĠType ( span ) ĊĠĠĠ Ġdata Ġclass ĠT App ( val Ġtype : ĠType , Ġval Ġtypes : ĠList < Type > Ġ= ĠlistOf (), Ġoverride Ġval Ġspan : ĠSpan ) Ġ: ĠType ( span ) ĊĠĠĠ Ġdata Ġclass ĠT Fun ( val Ġarg : ĠType , Ġval Ġret : ĠType , Ġoverride Ġval Ġspan : ĠSpan ) Ġ: ĠType ( span ) ĊĠĠĠ Ġdata Ġclass ĠTP are ns ( val Ġtype : ĠType , Ġoverride Ġval Ġspan : ĠSpan ) Ġ: ĠType ( span ) ĊĠĠĠ Ġdata Ġclass ĠT Record ( val Ġrow : ĠRow , Ġoverride Ġval Ġspan : ĠSpan ) Ġ: ĠType ( span ) ĊĠĠĠ Ġdata Ġclass ĠT Row Empty ( override Ġval Ġspan : ĠSpan ) Ġ: ĠType ( span ) ĊĠĠĠ Ġdata Ġclass ĠT Row Extend ( val Ġlabels : ĠLabels < Type >, Ġval Ġrow : ĠRow , Ġoverride Ġval Ġspan : ĠSpan ) Ġ: ĠType ( span ) ĊĠĠĠ Ġdata Ġclass ĠT Implicit ( val Ġtype : ĠType , Ġoverride Ġval Ġspan : ĠSpan ) Ġ: ĠType ( span ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWalk s Ġthis Ġtype Ġbottom -> up ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġeverywhere ( f : Ġ( Type ) Ġ-> ĠType ): ĠType Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġgo ( t : ĠType ): ĠType Ġ= Ġwhen Ġ( t ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT Const Ġ-> Ġf ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT App Ġ-> Ġf ( t . copy ( type Ġ= Ġgo ( t . type ), Ġtypes Ġ= Ġt . types . map (:: go ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT Fun Ġ-> Ġf ( t . copy ( go ( t . arg ), Ġgo ( t . ret ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTP are ns Ġ-> Ġf ( t . copy ( go ( t . type ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT Record Ġ-> Ġf ( t . copy ( go ( t . row ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT Row Empty Ġ-> Ġf ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT Row Extend Ġ-> Ġf ( t . copy ( row Ġ= Ġgo ( t . row ), Ġlabels Ġ= Ġt . labels . map Ġ{ Ġ( k , Ġv ) Ġ-> Ġk Ġto Ġgo ( v ) Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT Implicit Ġ-> Ġf ( t . copy ( go ( t . type ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġgo ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġeverywhere Unit ( f : Ġ( Type ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġeverywhere Ġ{ Ġty Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf ( ty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġty ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFind Ġany Ġun bound Ġvariables Ġin Ġthis Ġtype ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfind Free Vars ( bound : ĠList < String >): ĠList < String > Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠT Const Ġ-> Ġif Ġ( name [ 0 ]. is LowerCase () Ġ&& Ġname Ġ! in Ġbound ) ĠlistOf ( name ) Ġelse ĠlistOf () ĊĠĠĠĠĠĠĠ Ġis ĠT Fun Ġ-> Ġarg . find Free Vars ( bound ) Ġ+ Ġret . find Free Vars ( bound ) ĊĠĠĠĠĠĠĠ Ġis ĠT App Ġ-> Ġtype . find Free Vars ( bound ) Ġ+ Ġtypes . flatMap Ġ{ Ġit . find Free Vars ( bound ) Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠTP are ns Ġ-> Ġtype . find Free Vars ( bound ) ĊĠĠĠĠĠĠĠ Ġis ĠT Record Ġ-> Ġrow . find Free Vars ( bound ) ĊĠĠĠĠĠĠĠ Ġis ĠT Row Empty Ġ-> Ġempty List () ĊĠĠĠĠĠĠĠ Ġis ĠT Row Extend Ġ-> Ġrow . find Free Vars ( bound ) Ġ+ Ġlabels . flatMap Ġ{ Ġ(_, Ġv ) Ġ-> Ġv . find Free Vars ( bound ) Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠT Implicit Ġ-> Ġtype . find Free Vars ( bound ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsubst Var ( from : ĠString , Ġnew : ĠType ): ĠType Ġ= Ġeverywhere Ġ{ Ġty Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( ty Ġis ĠT Const Ġ&& Ġty . name Ġ== Ġfrom ) Ġnew Ġelse Ġty ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsubst Vars ( map : ĠMap < String , ĠType >): ĠType Ġ= Ġeverywhere Ġ{ Ġty Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( ty Ġis ĠT Const ) Ġmap [ ty . name ] Ġ?: Ġty Ġelse Ġty ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsimple Name (): ĠString ? Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠT Const Ġ-> Ġname ĊĠĠĠĠĠĠĠ Ġis ĠT App Ġ-> Ġtype . simple Name () ĊĠĠĠĠĠĠĠ Ġis ĠTP are ns Ġ-> Ġtype . simple Name () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwith Span ( s : ĠSpan ) Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠT Const Ġ-> Ġcopy ( span Ġ= Ġs ) ĊĠĠĠĠĠĠĠ Ġis ĠT Fun Ġ-> Ġcopy ( span Ġ= Ġs ) ĊĠĠĠĠĠĠĠ Ġis ĠT App Ġ-> Ġcopy ( span Ġ= Ġs ) ĊĠĠĠĠĠĠĠ Ġis ĠTP are ns Ġ-> Ġcopy ( span Ġ= Ġs ) ĊĠĠĠĠĠĠĠ Ġis ĠT Record Ġ-> Ġcopy ( span Ġ= Ġs ) ĊĠĠĠĠĠĠĠ Ġis ĠT Row Empty Ġ-> Ġcopy ( span Ġ= Ġs ) ĊĠĠĠĠĠĠĠ Ġis ĠT Row Extend Ġ-> Ġcopy ( span Ġ= Ġs ) ĊĠĠĠĠĠĠĠ Ġis ĠT Implicit Ġ-> Ġcopy ( span Ġ= Ġs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow (): ĠString Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠT Const Ġ-> Ġname ĊĠĠĠĠĠĠĠ Ġis ĠT App Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs name Ġ= Ġtype . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( types . isEmpty ()) Ġs name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġs name Ġ+ Ġ" Ġ" Ġ+ Ġtypes . join ToString (" Ġ") Ġ{ Ġit . show () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠT Fun Ġ-> Ġ"${ arg . show ()} Ġ-> Ġ${ ret . show () }" ĊĠĠĠĠĠĠĠ Ġis ĠTP are ns Ġ-> Ġ" (${ type . show () })" ĊĠĠĠĠĠĠĠ Ġis ĠT Implicit Ġ-> Ġ"{{ Ġ${ type . show ()} Ġ}}" ĊĠĠĠĠĠĠĠ Ġis ĠT Row Empty Ġ-> Ġ" []" ĊĠĠĠĠĠĠĠ Ġis ĠT Row Extend Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabels Ġ= Ġlabels . show Ġ{ Ġk , Ġv Ġ-> Ġ"$ k Ġ: Ġ${ v . show () }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr Ġ= Ġwhen Ġ( row ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT Row Empty Ġ-> Ġlabels ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! is ĠT Row Extend Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( labels . isBlank ()) Ġ"| Ġ${ row . show () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ"$ labels Ġ| Ġ${ row . show () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrows Ġ= Ġrow . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( labels . isBlank ()) Ġrows . substring ( 2 , Ġrows . last Index Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ"$ labels , Ġ${ rows . substring ( 2 , Ġrows . last Index Ġ- Ġ 1 )}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ Ġ$ str Ġ] " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠT Record Ġ-> Ġwhen Ġ( row ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT Row Empty Ġ-> Ġ"{} " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! is ĠT Row Extend Ġ-> Ġ"{ Ġ| Ġ${ row . show ()} Ġ}" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrows Ġ= Ġrow . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" {" Ġ+ Ġrows . substring ( 1 , Ġrows . last Index ) Ġ+ Ġ" }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠType . T Const . fullname (): ĠString Ġ= Ġif Ġ( alias Ġ!= Ġnull ) Ġ"$ alias .$ name " Ġelse Ġname