2025-03-27 15:39:53 +01:00

36 lines
1005 B
TypeScript

import * as ast from "./ast.ts";
export type Ty =
| { tag: "error" }
| { tag: "unknown" }
| { tag: "void" }
| { tag: "int" }
| { tag: "str" }
| { tag: "ptr"; ty: Ty }
| { tag: "fn"; stmt: ast.Stmt; params: Ty[]; returnTy: Ty };
export function tyToString(ty: Ty): string {
switch (ty.tag) {
case "error":
return `<error>`;
case "unknown":
return `<unknown>`;
case "void":
return `()`;
case "int":
return `int`;
case "str":
return `str`;
case "ptr":
return `*${tyToString(ty.ty)}`;
case "fn": {
const k = ty.stmt.kind as ast.StmtKind & { tag: "fn" };
const params = ty.params
.map((param, i) => `${k.params[i].ident}: ${tyToString(param)}`)
.join(", ");
const returnTy = tyToString(ty.returnTy);
return `fn ${k.ident}(${params}) -> ${returnTy}`;
}
}
}