import "@std/debug" import "@std/mem" import "@source/diagnostics" import "@source/strpool" import "@source/lexer" import "@source/ast" import "@source/parser" import "@source/sema" ast_renderer :: import "@source/ast/renderer" typecheck :: import "@source/sema/check" test import "@std/mem" test import "@std/enummap" test import "@std/arraylist" test import "@std/hashmap" test import "@std/strmap" test import "@std/meta" test import "@source/diagnostics" test import "@source/strpool" test import "@source/lexer" test import "@source/ast" test import "@source/ast/renderer" test import "@source/parser" test import "@source/sema" test import "@source/sema/check" @hide:file program :: `# literals `x float :: 123.9 `y int := 43 `z :: "hello" ` `a := 1 + 2 * 3 `b :: -3 / 2 + 1 ` `grouped proc(left, right int, extra float) void { ` value int :: later + left ` later int :: right ` empty() ` grouped(value, later, extra) `} `empty proc() void {} main proc() void! { strpool.strings = strpool.init(mem.c_allocator) defer strpool.deinit(&strpool.strings) diagnostic_store := diagnostics.init(mem.c_allocator) defer diagnostics.deinit(&diagnostic_store) scan_state := lexer.init(mem.c_allocator) defer lexer.deinit(&scan_state) try lexer.scan(&scan_state, program, &diagnostic_store) tree := try parser.parse( mem.c_allocator, scan_state.tokens.items, program, &diagnostic_store, ) defer ast.deinit(&tree) resolution := try sema.resolve(mem.c_allocator, &tree, &diagnostic_store) defer sema.deinit(&resolution) checked := try typecheck.check(mem.c_allocator, &tree, &resolution, &diagnostic_store) defer typecheck.deinit(&checked) renderer := ast_renderer.init(mem.c_allocator) defer ast_renderer.deinit(&renderer) try ast_renderer.render(&renderer, &tree) debug.print("{s}", {renderer.bytes.items}) debug.print("diagnostics: {}\n", {diagnostics.count(&diagnostic_store)}) }