mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 23:28:48 +00:00
collect and show docs of defineables
This commit is contained in:
@@ -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 the arg is a selector expression we don't add it, `-define` only allows identifiers.
|
||||||
if (arg->kind == Ast_Ident) {
|
if (arg->kind == Ast_Ident) {
|
||||||
Defineable defineable = {};
|
Defineable defineable = {};
|
||||||
|
defineable.docs = nullptr;
|
||||||
defineable.name = arg->Ident.token.string;
|
defineable.name = arg->Ident.token.string;
|
||||||
defineable.default_value = exact_value_bool(false);
|
defineable.default_value = exact_value_bool(false);
|
||||||
defineable.pos = arg->Ident.token.pos;
|
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") {
|
} else if (name == "config") {
|
||||||
if (ce->args.count != 2) {
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
Ast *arg = unparen_expr(ce->args[0]);
|
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 defineable = {};
|
||||||
|
defineable.docs = nullptr;
|
||||||
defineable.name = name;
|
defineable.name = name;
|
||||||
defineable.default_value = def.value;
|
defineable.default_value = def.value;
|
||||||
defineable.pos = arg->Ident.token.pos;
|
defineable.pos = arg->Ident.token.pos;
|
||||||
|
|
||||||
|
if (c->decl) {
|
||||||
|
defineable.docs = c->decl->docs;
|
||||||
|
}
|
||||||
|
|
||||||
MUTEX_GUARD(&c->info->defineables_mutex);
|
MUTEX_GUARD(&c->info->defineables_mutex);
|
||||||
array_add(&c->info->defineables, defineable);
|
array_add(&c->info->defineables, defineable);
|
||||||
|
|
||||||
|
|||||||
+4
-3
@@ -377,9 +377,10 @@ struct GenTypesData {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct Defineable {
|
struct Defineable {
|
||||||
String name;
|
String name;
|
||||||
ExactValue default_value;
|
ExactValue default_value;
|
||||||
TokenPos pos;
|
TokenPos pos;
|
||||||
|
CommentGroup *docs;
|
||||||
|
|
||||||
// These strings are only computed from previous fields when defineables are being shown or exported.
|
// These strings are only computed from previous fields when defineables are being shown or exported.
|
||||||
String default_value_str;
|
String default_value_str;
|
||||||
|
|||||||
+34
-28
@@ -1593,7 +1593,8 @@ gb_internal void check_defines(BuildContext *bc, Checker *c) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!found) {
|
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");
|
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));
|
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) {
|
for_array(i, c->info.defineables) {
|
||||||
Defineable *def = &c->info.defineables[i];
|
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) {
|
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) {
|
for_array(i, c->info.defineables) {
|
||||||
Defineable *def = &c->info.defineables[i];
|
Defineable *def = &c->info.defineables[i];
|
||||||
if (def->name.len > max_name_len) {
|
if (has_ansi_terminal_colours()) {
|
||||||
max_name_len = def->name.len;
|
gb_printf("\x1b[0;90m");
|
||||||
}
|
}
|
||||||
|
printf("%.*s\n", LIT(def->pos_str));
|
||||||
if (def->default_value_str.len > max_default_len) {
|
if (def->docs) {
|
||||||
max_default_len = def->default_value_str.len;
|
for (Token const &token : def->docs->list) {
|
||||||
|
gb_printf("%.*s\n", LIT(token.string));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if (has_ansi_terminal_colours()) {
|
||||||
if (def->pos_str.len > max_pos_len) {
|
gb_printf("\x1b[0m");
|
||||||
max_pos_len = def->pos_str.len;
|
|
||||||
}
|
}
|
||||||
}
|
gb_printf("%.*s :: %.*s\n\n", LIT(def->name), LIT(def->default_value_str));
|
||||||
|
|
||||||
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));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user