frontend: update api usage with diagnostic support

This commit is contained in:
2025-05-08 20:32:22 +01:00
parent a28874145c
commit ce8a12d4f7
2 changed files with 50 additions and 24 deletions

View File

@@ -2,13 +2,13 @@
#include "cmd.h"
#include <blue/cmd.h>
#include <blue/term.h>
#include <blue/object/string.h>
#include <blue/term.h>
#include <errno.h>
#include <ivy/file.h>
#include <ivy/asm/assembler.h>
#include <ivy/asm/lex.h>
#include <ivy/asm/parse.h>
#include <ivy/asm/assembler.h>
#include <ivy/file.h>
#include <stdio.h>
enum {
@@ -19,10 +19,13 @@ enum {
static int assemble_file(const char *in_path, const char *out_path)
{
FILE *in = fopen(in_path, "r");
if (!in) {
enum ivy_status status = IVY_OK;
struct ivy_file *src = NULL;
status = ivy_file_open(in_path, &src);
if (!src) {
b_err("cannot open source file '%s'", in_path);
b_i("reason: %s", strerror(errno));
b_i("reason: %s", ivy_status_to_string(status));
return -1;
}
@@ -34,18 +37,17 @@ static int assemble_file(const char *in_path, const char *out_path)
}
struct ivy_assembler *as = NULL;
enum ivy_status status = ivy_assembler_create(out, &as);
status = ivy_assembler_create(out, &as);
if (status != IVY_OK) {
b_err("failed to initialise Ivy assembler");
b_i("reason: %s", ivy_status_to_string(status));
fclose(in);
ivy_file_close(src);
fclose(out);
return -1;
}
struct ivy_file *src = ivy_file_from_fp(in);
struct ivy_asm_lexer *lex;
status = ivy_asm_lexer_create(&lex);
if (status != IVY_OK) {
@@ -161,7 +163,8 @@ static int assemble(const b_command *cmd, const b_arglist *args, const b_array *
b_string *in_name = NULL;
b_string *out_name = NULL;
b_arglist_get_string(args, B_COMMAND_INVALID_ID, ARG_SOURCE_FILE, 0, &in_path);
b_arglist_get_string(
args, B_COMMAND_INVALID_ID, ARG_SOURCE_FILE, 0, &in_path);
if (!in_path) {
b_err("no source file specified.");
return -1;
@@ -231,7 +234,8 @@ B_COMMAND(CMD_ASSEMBLE, CMD_ROOT)
B_COMMAND_NAME("assemble");
B_COMMAND_SHORT_NAME('A');
B_COMMAND_DESC(
"assemble one or more Ivy assembly source files into Ivy object files.");
"assemble one or more Ivy assembly source files into Ivy "
"object files.");
B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT);
B_COMMAND_FUNCTION(assemble);
@@ -247,7 +251,8 @@ B_COMMAND(CMD_ASSEMBLE, CMD_ROOT)
B_OPTION_SHORT_NAME('o');
B_OPTION_LONG_NAME("out");
B_OPTION_DESC("the path to write the output binary file to.");
B_OPTION_ARG(ARG_OUT_FILE) {
B_OPTION_ARG(ARG_OUT_FILE)
{
B_ARG_NAME("path");
B_ARG_NR_VALUES(1);
}

View File

@@ -4,9 +4,11 @@
#include <blue/cmd.h>
#include <blue/term.h>
#include <errno.h>
#include <ivy/diag.h>
#include <ivy/file.h>
#include <ivy/lang/ast.h>
#include <ivy/lang/codegen.h>
#include <ivy/lang/diag.h>
#include <ivy/lang/lex.h>
#include <mie/convert.h>
#include <mie/ctx.h>
@@ -52,15 +54,30 @@ static int compile_file(const char *path, const b_arglist *args)
> 0;
bool show_ir
= b_arglist_get_count(args, OPT_SHOW_IR, B_COMMAND_INVALID_ID) > 0;
enum ivy_status status = IVY_OK;
FILE *fp = fopen(path, "r");
if (!fp) {
struct ivy_file *src = NULL;
status = ivy_file_open(path, &src);
if (!src) {
b_err("cannot open source file '%s'", path);
b_i("reason: %s", strerror(errno));
b_i("reason: %s", ivy_status_to_string(status));
return -1;
}
struct ivy_file *src = ivy_file_from_fp(fp);
struct ivy_diag_stream diag_stream;
ivy_diag_stream_init_tty(&diag_stream, b_stdtty);
struct ivy_diag_ctx *diag = NULL;
status = ivy_diag_ctx_create(&diag);
if (status != IVY_OK) {
b_err("failed to initialise Ivy diagnostic context");
ivy_file_close(src);
return -1;
}
ivy_lang_diag_ctx_init(diag);
ivy_diag_ctx_set_line_source(diag, &src->f_base);
struct ivy_lexer *lex = NULL;
if (ivy_lexer_create(&lex) != IVY_OK) {
b_err("failed to initialise Ivy lexer");
@@ -69,7 +86,7 @@ static int compile_file(const char *path, const b_arglist *args)
}
ivy_lexer_set_source(lex, &src->f_base);
enum ivy_status status = IVY_OK;
ivy_lexer_set_diag_ctx(lex, diag);
struct ivy_parser *parser = NULL;
status = ivy_parser_create(&parser);
@@ -102,9 +119,13 @@ static int compile_file(const char *path, const b_arglist *args)
}
if (status != IVY_OK) {
ivy_diag_ctx_write(
diag, IVY_DIAG_FORMAT_PRETTY, &diag_stream);
#if 0
b_err("failed to parse '%s'", path);
b_i("reason: lex error (%s)",
ivy_status_to_string(ivy_lexer_get_status(lex)));
#endif
break;
}