Added colored error and warning compiler messages. (#2253)

* Added colored error and warning compiler messages.
* Fixed the warning messages to be colored yellow instead of blue.
* Made the use_ansi function public with compiler_internal.h and toggleable colored error messages with the --ansi flag
* Moved use_ansi declaration. No ansi on test/lsp output.

---------

Co-authored-by: Christoffer Lerno <christoffer@aegik.com>
This commit is contained in:
cubedium
2025-06-29 18:22:09 +00:00
committed by GitHub
parent d46733e11a
commit a13eb99962
3 changed files with 61 additions and 17 deletions

View File

@@ -900,16 +900,7 @@ static void setup_bool_define(const char *id, bool value)
setup_define(id, expr_new_const_bool(INVALID_SPAN, type_bool, value));
}
#if FETCH_AVAILABLE
const char * vendor_fetch_single(const char* lib, const char* path)
{
const char *resource = str_printf("/c3lang/vendor/releases/download/latest/%s.c3l", lib);
const char *destination = file_append_path(path, str_printf("%s.c3l", lib));
const char *error = download_file("https://github.com", resource, destination);
return error;
}
static bool use_ansi(void)
bool use_ansi(void)
{
switch (compiler.context.ansi)
{
@@ -927,6 +918,15 @@ static bool use_ansi(void)
#endif
}
#if FETCH_AVAILABLE
const char * vendor_fetch_single(const char* lib, const char* path)
{
const char *resource = str_printf("/c3lang/vendor/releases/download/latest/%s.c3l", lib);
const char *destination = file_append_path(path, str_printf("%s.c3l", lib));
const char *error = download_file("https://github.com", resource, destination);
return error;
}
#define PROGRESS_BAR_LENGTH 35
void update_progress_bar(const char* lib, int current_step, int total_steps)

View File

@@ -2398,6 +2398,7 @@ bool sema_resolve_array_like_len(SemaContext *context, TypeInfo *type_info, Arra
bool sema_resolve_type_info(SemaContext *context, TypeInfo *type_info, ResolveTypeKind kind);
bool sema_unresolved_type_is_generic(SemaContext *context, TypeInfo *type_info);
bool use_ansi(void);
void print_error_at(SourceSpan loc, const char *message, ...);
void print_error_after(SourceSpan loc, const char *message, ...);
void sema_note_prev_at(SourceSpan loc, const char *message, ...);
@@ -2584,7 +2585,6 @@ BinaryOp binaryop_from_token(TokenType type);
BinaryOp binaryop_assign_base_op(BinaryOp assign_binary_op);
TokenType binaryop_to_token(BinaryOp type);
// ---- static inline function implementations.
INLINE Type *type_no_optional(Type *type)

View File

@@ -75,6 +75,7 @@ static void print_error_type_at(SourceSpan location, const char *message, PrintT
}
else if (compiler.build.test_output || compiler.build.benchmark_output)
{
bool ansi = use_ansi();
switch (print_type)
{
case PRINT_TYPE_ERROR:
@@ -162,18 +163,40 @@ static void print_error_type_at(SourceSpan location, const char *message, PrintT
}
eprintf("\n");
bool ansi = use_ansi();
if (col_location)
{
switch (print_type)
{
case PRINT_TYPE_ERROR:
eprintf("(%s:%d:%d) Error: %s\n\n", file->full_path, location.row, col_location, message);
if (ansi)
{
eprintf("(%s:%d:%d) \x1b[31;1mError\x1b[0m: %s\n\n", file->full_path, location.row, col_location, message);
}
else
{
eprintf("(%s:%d:%d) Error: %s\n\n", file->full_path, location.row, col_location, message);
}
break;
case PRINT_TYPE_NOTE:
eprintf("(%s:%d:%d) Note: %s\n\n", file->full_path, location.row, col_location, message);
if (ansi)
{
eprintf("(%s:%d:%d) \x1b[1mNote\x1b[0m: %s\n\n", file->full_path, location.row, col_location, message);
}
else
{
eprintf("(%s:%d:%d) Note: %s\n\n", file->full_path, location.row, col_location, message);
}
break;
case PRINT_TYPE_WARN:
eprintf("(%s:%d:%d) Warning: %s\n\n", file->full_path, location.row, col_location, message);
if (ansi)
{
eprintf("(%s:%d:%d) \x1b[33;1mWarning\x1b[0m: %s\n\n", file->full_path, location.row, col_location, message);
}
else
{
eprintf("(%s:%d:%d) Warning: %s\n\n", file->full_path, location.row, col_location, message);
}
break;
default:
UNREACHABLE
@@ -184,13 +207,34 @@ static void print_error_type_at(SourceSpan location, const char *message, PrintT
switch (print_type)
{
case PRINT_TYPE_ERROR:
eprintf("(%s:%d) Error: %s\n\n", file->full_path, location.row, message);
if (ansi)
{
eprintf("(%s:%d) \x1b[31;1mError\x1b[0m: %s\n\n", file->full_path, location.row, message);
}
else
{
eprintf("(%s:%d) Error: %s\n\n", file->full_path, location.row, message);
}
break;
case PRINT_TYPE_NOTE:
eprintf("(%s:%d) Note: %s\n\n", file->full_path, location.row, message);
if (ansi)
{
eprintf("(%s:%d) \x1b[1mNote\x1b[0m: %s\n\n", file->full_path, location.row, message);
}
else
{
eprintf("(%s:%d) Note: %s\n\n", file->full_path, location.row, message);
}
break;
case PRINT_TYPE_WARN:
eprintf("(%s:%d) Warning: %s\n\n", file->full_path, location.row, message);
if (ansi)
{
eprintf("(%s:%d) \x1b[33;1mWarning\x1b[0m: %s\n\n", file->full_path, location.row, message);
}
else
{
eprintf("(%s:%d) Warning: %s\n\n", file->full_path, location.row, message);
}
break;
default:
UNREACHABLE