added 'did you mean ..' to unresolved symbol errors
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 30 Dec 2021 19:08:14 +0000 (13:08 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 30 Dec 2021 19:08:14 +0000 (13:08 -0600)
include/utils.h
src/symres.c
src/utils.c

index edba6c78e43cd04827f7e7a24fbe53dc7f576387..beb916f75e46368e633d5acdfe8bdaef2f2f5a13 100644 (file)
@@ -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;
index 84e5ff43c72ba1e93a7d688fda3dc353afda30f0..e5c2a34033f10e004791cb3a08bc23a352eaeaf9 100644 (file)
@@ -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 {
index d23ccb1c8277766148a40238824becb7353772b3..898d29b0513a864a9670a55bbb90061cafe10fef 100644 (file)
@@ -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;