From cce4ba9c2f421349e697e5af8229be7211512a60 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Thu, 30 Dec 2021 13:08:14 -0600 Subject: [PATCH] added 'did you mean ..' to unresolved symbol errors --- include/utils.h | 1 + src/symres.c | 9 +++++++-- src/utils.c | 18 ++++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/include/utils.h b/include/utils.h index edba6c78..beb916f7 100644 --- a/include/utils.h +++ b/include/utils.h @@ -34,6 +34,7 @@ u32 char_to_base16_value(char x); i32 string_process_escape_seqs(char* dest, char* src, i32 len); u32 levenshtein_distance(const char *str1, const char *str2); +char *find_closest_symbol_in_scope_and_parents(Scope *scope, char *sym); char *find_closest_symbol_in_node(AstNode *node, char *sym); extern AstTyped node_that_signals_a_yield; diff --git a/src/symres.c b/src/symres.c index 84e5ff43..e5c2a340 100644 --- a/src/symres.c +++ b/src/symres.c @@ -76,10 +76,15 @@ static SymresStatus symres_symbol(AstNode** symbol_node) { if (!res) { // :SymresStall if (report_unresolved_symbols) { + token_toggle_end(token); + char *closest = find_closest_symbol_in_scope_and_parents(curr_scope, token->text); + token_toggle_end(token); + onyx_report_error(token->pos, - "Unable to resolve symbol '%b'", + "Unable to resolve symbol '%b'. Did you mean '%s'?", token->text, - token->length); + token->length, + closest); return Symres_Error; } else { diff --git a/src/utils.c b/src/utils.c index d23ccb1c..898d29b0 100644 --- a/src/utils.c +++ b/src/utils.c @@ -997,6 +997,24 @@ char *find_closest_symbol_in_scope(Scope *scope, char *sym, u32 *out_distance) { return closest; } + +char *find_closest_symbol_in_scope_and_parents(Scope *scope, char *sym) { + u32 min_dist = 0x7fffffff; + u32 tmp_dist; + + char *closest = NULL; + while (scope != NULL) { + char *tmp_closest = find_closest_symbol_in_scope(scope, sym, &tmp_dist); + if (tmp_dist < min_dist) { + min_dist = tmp_dist; + closest = tmp_closest; + } + + scope = scope->parent; + } + + return closest; +} char *find_closest_symbol_in_node(AstNode* node, char *sym) { b32 used_pointer = 0; -- 2.25.1