1515
1616module unused_checker;
1717
18- import warning_flags;
1918import ast local;
2019import diagnostics;
20+ import warning_flags local;
2121
2222public fn void check(diagnostics.Diags* diags,
23- const warning_flags.Flags * warnings,
23+ const WarningFlags * warnings,
2424 Module* mod)
2525{
2626 Checker c = {
@@ -37,56 +37,57 @@ public fn void check(diagnostics.Diags* diags,
3737
3838type Checker struct {
3939 diagnostics.Diags* diags;
40- const warning_flags.Flags * warnings;
40+ const WarningFlags * warnings;
4141}
4242
4343fn void Checker.unused_module(void* arg, AST* a) {
4444 Checker* c = arg;
45- if (!c.warnings.no_unused_module) {
46- c.diags.warn(a.getLoc(), "unused module '%s'", a.getName());
47- }
45+ c.diags.warn(W_unused_module, a.getLoc(), "unused module '%s'", a.getName());
4846}
4947
5048fn void Checker.check(void* arg, Decl* d) {
5149 Checker* c = arg;
5250 bool used = d.isUsed();
53- if (used && d.isPublic() && !d.isUsedPublic() && !c.warnings.no_unused_public && ! d.hasAttrUnused()) {
54- c.diags.warn(d.getLoc(), "%s '%s' is not used public", d.getKindName(), d.getFullName());
51+ if (used && d.isPublic() && !d.isUsedPublic() && !d.hasAttrUnused()) {
52+ c.diags.warn(W_unused_public, d.getLoc(), "%s '%s' is not used public", d.getKindName(), d.getFullName());
5553 }
5654
55+ WarningKind wk = W_unknown;
5756 switch (d.getKind()) {
5857 case Function:
59- if (c.warnings.no_unused_function) return;
6058 if (d.hasAttrUnused()) return;
59+ wk = W_unused_function;
6160 break;
6261 case Import:
63- if (c.warnings.no_unused_import) return ;
62+ wk = W_unused_import ;
6463 break;
6564 case StructType:
6665 if (used) {
6766 c.checkStructMembers(d);
6867 }
69- if (c.warnings.no_unused_type) return ;
68+ wk = W_unused_type ;
7069 break;
7170 case EnumType:
72- if (used && ! c.warnings.no_unused_enum_constant ) {
73- c.checkEnum((EnumTypeDecl*)d );
71+ if (used && c.warnings.test(W_unused_enum_constant) ) {
72+ c.checkEnum((EnumTypeDecl*)(d) );
7473 }
74+ wk = W_unused_enum_constant;
7575 break;
7676 case EnumConstant:
77+ wk = W_unused_enum_constant;
7778 break;
7879 case FunctionType:
79- if (c.warnings.no_unused_type) return ;
80+ wk = W_unused_type ;
8081 break;
8182 case AliasType:
82- if (c.warnings.no_unused_type) return ;
83+ wk = W_unused_type ;
8384 break;
8485 case Variable:
85- if (c.warnings.no_unused_variable) return ;
86+ wk = W_unused_variable ;
8687 break;
8788 }
8889 if (!used && !d.hasAttrUnused() && !d.isExported()) {
89- c.diags.warn(d.getLoc(), "unused %s '%s'", d.getKindName(), d.getFullName());
90+ c.diags.warn(wk, d.getLoc(), "unused %s '%s'", d.getKindName(), d.getFullName());
9091 return;
9192 }
9293}
@@ -98,7 +99,7 @@ fn void Checker.checkEnum(Checker* c, EnumTypeDecl* d) {
9899 EnumConstantDecl* ecd = constants[i];
99100 Decl* dd = (Decl*)ecd;
100101 if (!dd.isUsed()) {
101- c.diags.warn(dd.getLoc(), "unused %s '%s'", dd.getKindName(), dd.getName());
102+ c.diags.warn(W_unused_enum_constant, dd.getLoc(), "unused %s '%s'", dd.getKindName(), dd.getName());
102103 }
103104 }
104105}
@@ -112,8 +113,8 @@ fn void Checker.checkStructMembers(Checker* c, Decl* d) {
112113 if (member.isStructType()) {
113114 c.checkStructMembers(member);
114115 } else {
115- if (!member.isUsed() && !c.warnings.no_unused_variable ) {
116- c.diags.warn(member.getLoc(), "unused %s member '%s'", std.isStruct() ? "struct" : "union", member.getName());
116+ if (!member.isUsed()) {
117+ c.diags.warn(W_unused_variable, member.getLoc(), "unused %s member '%s'", std.isStruct() ? "struct" : "union", member.getName());
117118 }
118119 }
119120 }
0 commit comments