aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLaytan Laats <laytanlaats@hotmail.com>2024-06-07 14:48:11 +0200
committerLaytan Laats <laytanlaats@hotmail.com>2024-06-07 15:08:41 +0200
commit315695b4f8b3437fb63cfc99c976b76be4cee173 (patch)
treef7268ca204e874cb46a4dc26406ca66b2bc1deb9 /src
parentfa086906865c04531b3803f1f0cb1ee17dfe5c7e (diff)
collect and show docs of defineables
Diffstat (limited to 'src')
-rw-r--r--src/check_builtin.cpp8
-rw-r--r--src/checker.hpp7
-rw-r--r--src/main.cpp62
3 files changed, 45 insertions, 32 deletions
diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp
index a74082fb2..54708b5ae 100644
--- a/src/check_builtin.cpp
+++ b/src/check_builtin.cpp
@@ -1759,6 +1759,7 @@ gb_internal bool check_builtin_procedure_directive(CheckerContext *c, Operand *o
// If the arg is a selector expression we don't add it, `-define` only allows identifiers.
if (arg->kind == Ast_Ident) {
Defineable defineable = {};
+ defineable.docs = nullptr;
defineable.name = arg->Ident.token.string;
defineable.default_value = exact_value_bool(false);
defineable.pos = arg->Ident.token.pos;
@@ -1769,7 +1770,7 @@ gb_internal bool check_builtin_procedure_directive(CheckerContext *c, Operand *o
} else if (name == "config") {
if (ce->args.count != 2) {
- error(call, "'#config' expects 2 argument, got %td", ce->args.count);
+ error(call, "'#config' expects 2 arguments, got %td", ce->args.count);
return false;
}
Ast *arg = unparen_expr(ce->args[0]);
@@ -1806,10 +1807,15 @@ gb_internal bool check_builtin_procedure_directive(CheckerContext *c, Operand *o
}
Defineable defineable = {};
+ defineable.docs = nullptr;
defineable.name = name;
defineable.default_value = def.value;
defineable.pos = arg->Ident.token.pos;
+ if (c->decl) {
+ defineable.docs = c->decl->docs;
+ }
+
MUTEX_GUARD(&c->info->defineables_mutex);
array_add(&c->info->defineables, defineable);
diff --git a/src/checker.hpp b/src/checker.hpp
index 9db5757e3..1a8cef29a 100644
--- a/src/checker.hpp
+++ b/src/checker.hpp
@@ -377,9 +377,10 @@ struct GenTypesData {
};
struct Defineable {
- String name;
- ExactValue default_value;
- TokenPos pos;
+ String name;
+ ExactValue default_value;
+ TokenPos pos;
+ CommentGroup *docs;
// These strings are only computed from previous fields when defineables are being shown or exported.
String default_value_str;
diff --git a/src/main.cpp b/src/main.cpp
index 793030f3f..530681d03 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1593,7 +1593,8 @@ gb_internal void check_defines(BuildContext *bc, Checker *c) {
}
if (!found) {
- warning(nullptr, "given -define:%s is unused in the project", name);
+ ERROR_BLOCK();
+ warning(nullptr, "given -define:%.*s is unused in the project", LIT(name));
error_line("\tSuggestion: use the -show-defineables flag for an overview of the possible defines\n");
}
}
@@ -1639,44 +1640,49 @@ gb_internal void export_defineables(Checker *c, String path) {
}
defer (gb_file_close(&f));
- gb_fprintf(&f, "Defineable,Default Value,Location\n");
+ gbString docs = gb_string_make(heap_allocator(), "");
+ defer (gb_string_free(docs));
+
+ gb_fprintf(&f, "Defineable,Default Value,Docs,Location\n");
for_array(i, c->info.defineables) {
Defineable *def = &c->info.defineables[i];
- gb_fprintf(&f,"%.*s,%.*s,%.*s\n", LIT(def->name), LIT(def->default_value_str), LIT(def->pos_str));
+
+ gb_string_clear(docs);
+ if (def->docs) {
+ docs = gb_string_appendc(docs, "\"");
+ for (Token const &token : def->docs->list) {
+ for (isize i = 0; i < token.string.len; i++) {
+ u8 c = token.string.text[i];
+ if (c == '"') {
+ docs = gb_string_appendc(docs, "\"\"");
+ } else {
+ docs = gb_string_append_length(docs, &c, 1);
+ }
+ }
+ }
+ docs = gb_string_appendc(docs, "\"");
+ }
+
+ gb_fprintf(&f,"%.*s,%.*s,%s,%.*s\n", LIT(def->name), LIT(def->default_value_str), docs, LIT(def->pos_str));
}
}
gb_internal void show_defineables(Checker *c) {
- isize max_name_len = gb_strlen("Defineable");
- isize max_default_len = gb_strlen("Default Value");
- isize max_pos_len = gb_strlen("Location");
-
for_array(i, c->info.defineables) {
Defineable *def = &c->info.defineables[i];
- if (def->name.len > max_name_len) {
- max_name_len = def->name.len;
+ if (has_ansi_terminal_colours()) {
+ gb_printf("\x1b[0;90m");
}
-
- if (def->default_value_str.len > max_default_len) {
- max_default_len = def->default_value_str.len;
+ printf("%.*s\n", LIT(def->pos_str));
+ if (def->docs) {
+ for (Token const &token : def->docs->list) {
+ gb_printf("%.*s\n", LIT(token.string));
+ }
}
-
- if (def->pos_str.len > max_pos_len) {
- max_pos_len = def->pos_str.len;
+ if (has_ansi_terminal_colours()) {
+ gb_printf("\x1b[0m");
}
- }
-
- printf("%-*s - %-*s - %-*s\n",
- cast(int)max_name_len, "Defineable",
- cast(int)max_default_len, "Default Value",
- cast(int)max_pos_len, "Location");
-
- for_array(i, c->info.defineables) {
- Defineable *def = &c->info.defineables[i];
- printf("%-*.*s - %-*.*s - %-*.*s\n",
- cast(int)max_name_len, LIT(def->name),
- cast(int)max_default_len, LIT(def->default_value_str),
- cast(int)max_pos_len, LIT(def->pos_str));
+ gb_printf("%.*s :: %.*s\n\n", LIT(def->name), LIT(def->default_value_str));
}
}