mirror of
https://github.com/Mercantec-GHC/h4-projekt-gruppe-0-sm.git
synced 2025-04-27 08:24:05 +02:00
51 lines
1.5 KiB
TypeScript
51 lines
1.5 KiB
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 };
|
|
|
|
type TyToStringOpts = {
|
|
short?: boolean;
|
|
};
|
|
|
|
export function tyToString(ty: Ty, opts: TyToStringOpts = {}): 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": {
|
|
if (!opts.short) {
|
|
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}`;
|
|
} else {
|
|
const k = ty.stmt.kind as ast.StmtKind & { tag: "fn" };
|
|
const params = ty.params
|
|
.map((param) => tyToString(param))
|
|
.join(", ");
|
|
const returnTy = tyToString(ty.returnTy);
|
|
return `fn(${params}) -> ${returnTy}`;
|
|
}
|
|
}
|
|
}
|
|
}
|