ref: da5bfc6d15a50130afdcd37ed9af737a81724506
dir: /mparse/types.myr/
use std pkg parse = type srcloc = struct file : byte[:] line : int col : int ;; type attr = union `Attrpkglocal `Attrextern `Attrnoret ;; type file = struct path : byte[:] uses : usefile[:] libs : byte[:][:] extlibs : byte[:][:] extinit : dcl#[:] init : std.option(dcl#) builtin : stab# globls : stab# ns : std.htab(byte[:], stab#)# dcls : dcl#[:] ;; type node = union `Nexpr expr `Nlit lit `Nloop loopstmt `Niter iterstmt `Nif ifstmt `Nmatch matchstmt `Ncase matchcase `Ndcl dcl# `Nfunc func `Ntrait traitdef `Nimpl impldef ;; type tydef = struct ty : ty id : int32 loc : srcloc fixed : bool found : bool traits : std.bitset# ;; type ty = union `Tyvoid `Tybool /* integers */ `Tyint8 `Tyint16 `Tyint32 `Tyint /* unsigned integers */ `Tychar `Tybyte `Tyint64 `Tyuint8 `Tyuint16 `Tyuint32 `Tyuint `Tyuint64 /*floats */ `Tyflt32 `Tyflt64 /* a bit odd.. */ `Tyvalist /* compound types */ `Tyslice tydef# `Typtr tydef# `Tyarray (tydef#, node#) `Tystruct (dcl#[:]) `Tyunion (ucon#[:]) /* user defined types */ `Tygeneric (tydef#[:], tydef#) `Tyname (tydef#[:], tydef#) `Typaram byte[:] `Tyvar int64 ;; type ucon = struct loc : srcloc name : name# uty : tydef# ety : std.option(tydef#) ;; type impldef = struct vis : vis tr : name# ty : tydef# aux : tydef#[:] dcls : dcl#[:] isimport : bool ;; type expr = struct ty : tydef# loc : srcloc e : union `Oadd (node#, node#) `Osub (node#, node#) `Omul (node#, node#) `Odiv (node#, node#) `Omod (node#, node#) `Oneg node# `Obor (node#, node#) `Oband (node#, node#) `Obxor (node#, node#) `Obsl (node#, node#) `Obsr (node#, node#) `Obnot node# `Opreinc node# `Opostinc node# `Opredec node# `Opostdec node# `Oaddr node# `Oderef node# `Olor (node#, node#) `Oland (node#, node#) `Olnot node# `Oeq (node#, node#) `One (node#, node#) `Ogt (node#, node#) `Oge (node#, node#) `Olt (node#, node#) `Ole (node#, node#) `Oasn (node#, node#) `Oaddeq (node#, node#) `Osubeq (node#, node#) `Omuleq (node#, node#) `Odiveq (node#, node#) `Omodeq (node#, node#) `Oboreq (node#, node#) `Obandeq (node#, node#) `Obxoreq (node#, node#) `Obsleq (node#, node#) `Obsreq (node#, node#) `Oidx (node#, node#) `Oslice (node#, node#, node#) `Omemb (node#, byte[:]) `Osize ty# `Ocall (node#, node#[:]) `Ocast node# `Oret node# `Ojmp name# `Obreak `Ocontinue `Ovar name# `Ogap `Olit lit `Oucon (name#, std.option(node#)) `Otup node#[:] `Ostruct (name#, node#)[:] `Oarr (node#, node#)[:] `Oidxlen ;; ;; type dcl = struct id : int32 name : name vis : vis ty : tydef# init : expr# tr : traitdef# impls : std.htab(tydef#, dcl#) isglobl : bool isconst : bool isnoret : bool isinit : bool isexportinit : bool isextern : bool isimport : bool ishidden : bool ispkglocal : bool isgeneric : bool ;; type loopstmt = struct init : expr# cond : expr# step : expr# body : block# scope : stab# ;; type iterstmt = struct elt : expr# seq : expr# body : block# ;; type ifstmt = struct cond : expr# iftrue : block# iffalse : block# ;; type block = struct stab : stab# stmts : node#[:] ;; type matchstmt = struct val : expr# matches : matchcase#[:] ;; type matchcase = struct expr : node# blk : block# ;; type lit = union `Lint uint64 `Lflt flt64 `Lchr char `Lstr byte[:] `Llbl byte[:] `Lbool bool `Lvoid ;; type traitdef = struct id : int32 loc : srcloc vis : vis name : name param : tydef# aux : tydef#[:] memb : dcl#[:] funcs : dcl#[:] ;; type usefile = union `Ulocal byte[:] `Ulib byte[:] ;; type func = struct stab : stab# ty : tydef# args : dcl#[:] body : block# ;; type stab = struct super : std.option(stab#) name : byte[:] isfunc : bool syms : std.htab(name, sym)# types : std.htab(name, tysym)# impls : std.htab(name, node#)# env : std.htab(name, node#)# ;; type sym = union `Dcl dcl# `Ucon ucon# ;; type tysym = union `Tyfwd `Trfwd `Tydef tydef# `Trdef traitdef# ;; type name = struct ns : byte[:] name : byte[:] ;; type vis = union `Visintern `Vishidden `Visexport `Visbuiltin ;; ;;