81 lines
2.6 KiB
TypeScript
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;
|
|
}
|