diff options
| author | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2026-02-13 15:15:03 +0100 |
|---|---|---|
| committer | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2026-02-13 15:15:03 +0100 |
| commit | 6386b395de7e0e537e092601ff0ac4d353806ebb (patch) | |
| tree | 80d44c794e9a4d13dedc2479db832e4f7eb1bb0f /src | |
| parent | f7f19e5ebe45547732c2af39aa7f71feefd76f72 (diff) | |
Add `-did-you-mean-limit:N`
```
-did-you-mean-limit:<integer>
Sets the maximum number of suggestions the compiler provides.
Must be an integer >0.
If not set, the default limit is 10.
```
e.g. with a limit of 5
```
W:/Scratch/main.odin(44:7) Error: Undeclared name 'B1' for type 'E'
e = .B1
^^
Suggestion: Did you mean?
A23
A02
A19
A20
A21
... and 25 more ...
```
Diffstat (limited to 'src')
| -rw-r--r-- | src/build_settings.cpp | 3 | ||||
| -rw-r--r-- | src/check_expr.cpp | 6 | ||||
| -rw-r--r-- | src/main.cpp | 24 |
3 files changed, 33 insertions, 0 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 40c1c86c4..f46b7d247 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -9,6 +9,7 @@ // #endif #define DEFAULT_MAX_ERROR_COLLECTOR_COUNT (36) +#define DEFAULT_DID_YOU_MEAN_LIMIT (10) enum TargetOsKind : u16 { TargetOs_Invalid, @@ -581,6 +582,8 @@ struct BuildContext { bool show_debug_messages; + int did_you_mean_limit; + bool copy_file_contents; bool no_rtti; diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 1c09ad908..f2cdcc2ea 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -153,13 +153,19 @@ gb_internal bool is_load_directive_call(Ast *call) { gb_internal LoadDirectiveResult check_load_directive(CheckerContext *c, Operand *operand, Ast *call, Type *type_hint, bool err_on_not_found); gb_internal void check_did_you_mean_print(DidYouMeanAnswers *d, char const *prefix = "") { + int limit = build_context.did_you_mean_limit; auto results = did_you_mean_results(d); + int count = 0; if (results.count != 0) { error_line("\tSuggestion: Did you mean?\n"); for (auto const &result : results) { String const &target = result.target; error_line("\t\t%s%.*s\n", prefix, LIT(target)); // error_line("\t\t%.*s %td\n", LIT(target), results[i].distance); + if (limit > 0 && ++count == limit) { + error_line("\t\t... and %td more ...", results.count - limit); + break; + } } } } diff --git a/src/main.cpp b/src/main.cpp index bba9ffe13..fdafa0cf2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -330,6 +330,7 @@ enum BuildFlagKind { BuildFlag_UseSingleModule, BuildFlag_NoThreadedChecker, BuildFlag_ShowDebugMessages, + BuildFlag_DidYouMeanLimit, BuildFlag_ShowDefineables, BuildFlag_ExportDefineables, @@ -562,6 +563,7 @@ gb_internal bool parse_build_flags(Array<String> args) { add_flag(&build_flags, BuildFlag_UseSingleModule, str_lit("use-single-module"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_NoThreadedChecker, str_lit("no-threaded-checker"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_ShowDebugMessages, str_lit("show-debug-messages"), BuildFlagParam_None, Command_all); + add_flag(&build_flags, BuildFlag_DidYouMeanLimit, str_lit("did-you-mean-limit"), BuildFlagParam_Integer, Command__does_check); add_flag(&build_flags, BuildFlag_ShowDefineables, str_lit("show-defineables"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_ExportDefineables, str_lit("export-defineables"), BuildFlagParam_String, Command__does_check); @@ -1305,6 +1307,20 @@ gb_internal bool parse_build_flags(Array<String> args) { case BuildFlag_ShowDebugMessages: build_context.show_debug_messages = true; break; + + case BuildFlag_DidYouMeanLimit: + { + GB_ASSERT(value.kind == ExactValue_Integer); + isize count = cast(isize)big_int_to_i64(&value.value_integer); + if (count <= 0) { + gb_printf_err("%.*s expected a positive non-zero number, got %.*s\n", LIT(name), LIT(param)); + build_context.did_you_mean_limit = DEFAULT_DID_YOU_MEAN_LIMIT; + } else { + build_context.did_you_mean_limit = (int)count; + } + } + break; + case BuildFlag_Vet: build_context.vet_flags |= VetFlag_All; break; @@ -1853,6 +1869,8 @@ gb_internal bool parse_build_flags(Array<String> args) { bad_flags = true; } + if (build_context.did_you_mean_limit == 0) build_context.did_you_mean_limit = DEFAULT_DID_YOU_MEAN_LIMIT; + return !bad_flags; } @@ -2836,6 +2854,12 @@ gb_internal int print_show_help(String const arg0, String command, String option print_usage_line(2, "Must be an integer >0."); print_usage_line(2, "If not set, the default max error count is %d.", DEFAULT_MAX_ERROR_COLLECTOR_COUNT); } + + if (print_flag("-did-you-mean-limit:<integer>")) { + print_usage_line(2, "Sets the maximum number of suggestions the compiler provides."); + print_usage_line(2, "Must be an integer >0."); + print_usage_line(2, "If not set, the default limit is %d.", DEFAULT_DID_YOU_MEAN_LIMIT); + } } if (run_or_build) { |