import { arrayEq, exhausted } from "../util.ts"; import { Ident, Item, Stmt, VariantData } from "./hir.ts"; /// Shallow equality export function stmtEq(a: Stmt, b: Stmt): boolean { const [ak, bk] = [a.kind, b.kind]; switch (ak.tag) { case "error": return ak.tag === bk.tag; case "item": return ak.tag === bk.tag && ak.item === bk.item; case "let": return ak.tag === bk.tag && ak.pat === bk.pat && ak.ty === bk.ty && ak.expr === bk.expr; case "return": return ak.tag === bk.tag && ak.expr === bk.expr; case "break": return ak.tag === bk.tag && ak.expr === bk.expr; case "continue": return ak.tag === bk.tag; case "assign": return ak.tag === bk.tag && ak.assignType === bk.assignType && ak.subject === bk.subject && ak.value === bk.value; case "expr": return ak.tag === bk.tag && ak.expr === bk.expr; } exhausted(ak); } /// Shallow equality export function itemEq(a: Item, b: Item): boolean { const [ak, bk] = [a.kind, b.kind]; switch (ak.tag) { case "error": return ak.tag === bk.tag; case "mod_block": return ak.tag === bk.tag && ak.block === bk.block; case "mod_file": return ak.tag === bk.tag && ak.filePath === bk.filePath; case "enum": return ak.tag === bk.tag && arrayEq(ak.variants, bk.variants); case "struct": return ak.tag === bk.tag && variantDataEq(ak.data, bk.data); case "fn": return ak.tag === bk.tag; case "use": return ak.tag === bk.tag; case "type_alias": return ak.tag === bk.tag; } exhausted(ak); } export function variantDataEq(a: VariantData, b: VariantData): boolean { const [ak, bk] = [a.kind, b.kind]; switch (ak.tag) { case "error": return ak.tag === bk.tag; case "unit": return ak.tag === bk.tag; case "tuple": return ak.tag === bk.tag && arrayEq(ak.elems, bk.elems, variantDataEq); case "struct": return ak.tag === bk.tag && arrayEq( ak.fields, bk.fields, (a, b) => identEq(a.ident, b.ident) && a.ty === b.ty && a.pub === b.pub && a.span === b.span, ); } exhausted(ak); } export function identEq(a: Ident, b: Ident): boolean { return a.id === b.id; }