import { defineCommand } from "@bunli/core"; import { boringGrammar } from "../parse/grammar"; import { semantics } from "../parse/semantics"; import TraitChecker from "../types/trait_checker"; import { TypeAliasResolver } from "../types/type_alias_resolution"; import { TypeSystem } from "../types/type_system"; import { TypeChecker } from "../types/type_checker"; export const run = defineCommand({ name: "run", description: "Run a boringlang file", handler: async ({ positional }) => { const [path] = positional; if (!path) { throw new Error("Usage: run "); } const file = Bun.file(path); const text = await file.text(); const match = boringGrammar.match(text, "Module"); if (match.succeeded()) { const adapter = semantics(match); const ast = adapter.toAST(); new TraitChecker().withModule(ast); const aliasResolvedAst = new TypeAliasResolver().withModule(ast); const typeSystem = new TypeSystem(); const typeChecker = new TypeChecker(); typeChecker.withModule(aliasResolvedAst, typeSystem); typeSystem.solve(); console.log(JSON.stringify(typeSystem, null, 2)); // console.log(JSON.stringify(aliasResolvedAst, null, 2)); } else { console.log(match.message); // console.log(boringGrammar.trace(text, "Module").toString()); } }, });