aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2026-02-13 15:15:03 +0100
committerJeroen van Rijn <Kelimion@users.noreply.github.com>2026-02-13 15:15:03 +0100
commit6386b395de7e0e537e092601ff0ac4d353806ebb (patch)
tree80d44c794e9a4d13dedc2479db832e4f7eb1bb0f
parentf7f19e5ebe45547732c2af39aa7f71feefd76f72 (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 ... ```
-rw-r--r--src/build_settings.cpp3
-rw-r--r--src/check_expr.cpp6
-rw-r--r--src/main.cpp24
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) {