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;
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 {
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;