slige-mirror/compiler/middle/hir_eq.ts
2025-01-29 14:53:39 +01:00

81 lines
2.6 KiB
TypeScript

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;
}