aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-04-11 15:24:36 +0100
committergingerBill <bill@gingerbill.org>2024-04-11 15:24:36 +0100
commitb6d2ac11b8a3fa34542333966f3958602b6ba2c8 (patch)
tree267eb2b350163b766a3d772ccfa2eb5159a30996
parent6c38ae36580156171c453579942991b431f6b27b (diff)
Add `-vet-unused-variables` and ``-vet-unused-imports` (`-vet-unused` is both)
-rw-r--r--src/build_settings.cpp21
-rw-r--r--src/checker.cpp5
-rw-r--r--src/main.cpp31
3 files changed, 41 insertions, 16 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp
index 30d6f0b3c..ad1b3e884 100644
--- a/src/build_settings.cpp
+++ b/src/build_settings.cpp
@@ -272,13 +272,16 @@ enum BuildPath : u8 {
};
enum VetFlags : u64 {
- VetFlag_NONE = 0,
- VetFlag_Unused = 1u<<0, // 1
- VetFlag_Shadowing = 1u<<1, // 2
- VetFlag_UsingStmt = 1u<<2, // 4
- VetFlag_UsingParam = 1u<<3, // 8
- VetFlag_Style = 1u<<4, // 16
- VetFlag_Semicolon = 1u<<5, // 32
+ VetFlag_NONE = 0,
+ VetFlag_Shadowing = 1u<<0,
+ VetFlag_UsingStmt = 1u<<1,
+ VetFlag_UsingParam = 1u<<2,
+ VetFlag_Style = 1u<<3,
+ VetFlag_Semicolon = 1u<<4,
+ VetFlag_UnusedVariables = 1u<<5,
+ VetFlag_UnusedImports = 1u<<6,
+
+ VetFlag_Unused = VetFlag_UnusedVariables|VetFlag_UnusedImports,
VetFlag_All = VetFlag_Unused|VetFlag_Shadowing|VetFlag_UsingStmt,
@@ -288,6 +291,10 @@ enum VetFlags : u64 {
u64 get_vet_flag_from_name(String const &name) {
if (name == "unused") {
return VetFlag_Unused;
+ } else if (name == "unused-variables") {
+ return VetFlag_UnusedVariables;
+ } else if (name == "unused-imports") {
+ return VetFlag_UnusedImports;
} else if (name == "shadowing") {
return VetFlag_Shadowing;
} else if (name == "using-stmt") {
diff --git a/src/checker.cpp b/src/checker.cpp
index 3556c4647..35554cf44 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -728,7 +728,10 @@ gb_internal void check_scope_usage(Checker *c, Scope *scope, u64 vet_flags) {
} else if (vet_flags) {
switch (ve.kind) {
case VettedEntity_Unused:
- if (vet_flags & VetFlag_Unused) {
+ if (e->kind == Entity_Variable && (vet_flags & VetFlag_UnusedVariables) != 0) {
+ error(e->token, "'%.*s' declared but not used", LIT(name));
+ }
+ if ((e->kind == Entity_ImportName || e->kind == Entity_LibraryName) && (vet_flags & VetFlag_UnusedImports) != 0) {
error(e->token, "'%.*s' declared but not used", LIT(name));
}
break;
diff --git a/src/main.cpp b/src/main.cpp
index 2dbb72ca2..36a99ec32 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -253,6 +253,8 @@ enum BuildFlagKind {
BuildFlag_Vet,
BuildFlag_VetShadowing,
BuildFlag_VetUnused,
+ BuildFlag_VetUnusedImports,
+ BuildFlag_VetUnusedVariables,
BuildFlag_VetUsingStmt,
BuildFlag_VetUsingParam,
BuildFlag_VetStyle,
@@ -444,6 +446,8 @@ gb_internal bool parse_build_flags(Array<String> args) {
add_flag(&build_flags, BuildFlag_Vet, str_lit("vet"), BuildFlagParam_None, Command__does_check);
add_flag(&build_flags, BuildFlag_VetUnused, str_lit("vet-unused"), BuildFlagParam_None, Command__does_check);
+ add_flag(&build_flags, BuildFlag_VetUnusedVariables, str_lit("vet-unused-variables"), BuildFlagParam_None, Command__does_check);
+ add_flag(&build_flags, BuildFlag_VetUnusedImports, str_lit("vet-unused-imports"), BuildFlagParam_None, Command__does_check);
add_flag(&build_flags, BuildFlag_VetShadowing, str_lit("vet-shadowing"), BuildFlagParam_None, Command__does_check);
add_flag(&build_flags, BuildFlag_VetUsingStmt, str_lit("vet-using-stmt"), BuildFlagParam_None, Command__does_check);
add_flag(&build_flags, BuildFlag_VetUsingParam, str_lit("vet-using-param"), BuildFlagParam_None, Command__does_check);
@@ -1026,10 +1030,9 @@ gb_internal bool parse_build_flags(Array<String> args) {
case BuildFlag_UseSeparateModules:
build_context.use_separate_modules = true;
break;
- case BuildFlag_NoThreadedChecker: {
+ case BuildFlag_NoThreadedChecker:
build_context.no_threaded_checker = true;
break;
- }
case BuildFlag_ShowDebugMessages:
build_context.show_debug_messages = true;
break;
@@ -1037,12 +1040,14 @@ gb_internal bool parse_build_flags(Array<String> args) {
build_context.vet_flags |= VetFlag_All;
break;
- case BuildFlag_VetUnused: build_context.vet_flags |= VetFlag_Unused; break;
- case BuildFlag_VetShadowing: build_context.vet_flags |= VetFlag_Shadowing; break;
- case BuildFlag_VetUsingStmt: build_context.vet_flags |= VetFlag_UsingStmt; break;
- case BuildFlag_VetUsingParam: build_context.vet_flags |= VetFlag_UsingParam; break;
- case BuildFlag_VetStyle: build_context.vet_flags |= VetFlag_Style; break;
- case BuildFlag_VetSemicolon: build_context.vet_flags |= VetFlag_Semicolon; break;
+ case BuildFlag_VetUnusedVariables: build_context.vet_flags |= VetFlag_UnusedVariables; break;
+ case BuildFlag_VetUnusedImports: build_context.vet_flags |= VetFlag_UnusedImports; break;
+ case BuildFlag_VetUnused: build_context.vet_flags |= VetFlag_Unused; break;
+ case BuildFlag_VetShadowing: build_context.vet_flags |= VetFlag_Shadowing; break;
+ case BuildFlag_VetUsingStmt: build_context.vet_flags |= VetFlag_UsingStmt; break;
+ case BuildFlag_VetUsingParam: build_context.vet_flags |= VetFlag_UsingParam; break;
+ case BuildFlag_VetStyle: build_context.vet_flags |= VetFlag_Style; break;
+ case BuildFlag_VetSemicolon: build_context.vet_flags |= VetFlag_Semicolon; break;
case BuildFlag_IgnoreUnknownAttributes:
build_context.ignore_unknown_attributes = true;
@@ -1875,6 +1880,8 @@ gb_internal void print_show_help(String const arg0, String const &command) {
print_usage_line(2, "Does extra checks on the code.");
print_usage_line(2, "Extra checks include:");
print_usage_line(3, "-vet-unused");
+ print_usage_line(3, "-vet-unused-variables");
+ print_usage_line(3, "-vet-unused-imports");
print_usage_line(3, "-vet-shadowing");
print_usage_line(3, "-vet-using-stmt");
print_usage_line(0, "");
@@ -1883,6 +1890,14 @@ gb_internal void print_show_help(String const arg0, String const &command) {
print_usage_line(2, "Checks for unused declarations.");
print_usage_line(0, "");
+ print_usage_line(1, "-vet-unused-variables");
+ print_usage_line(2, "Checks for unused variable declarations.");
+ print_usage_line(0, "");
+
+ print_usage_line(1, "-vet-unused-imports");
+ print_usage_line(2, "Checks for unused import declarations.");
+ print_usage_line(0, "");
+
print_usage_line(1, "-vet-shadowing");
print_usage_line(2, "Checks for variable shadowing within procedures.");
print_usage_line(0, "");