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,54 +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- c.diags.warn(a.getLoc(), "unused module '%s'", a.getName());
45+ c.diags.warn(W_unused_module, a.getLoc(), "unused module '%s'", a.getName());
4646}
4747
4848fn void Checker.check(void* arg, Decl* d) {
4949 Checker* c = arg;
5050 bool used = d.isUsed();
51- if (used && d.isPublic() && !d.isUsedPublic() && !c.warnings.no_unused_public && ! d.hasAttrUnused()) {
52- 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());
5353 }
5454
55+ WarningKind wk = W_unknown;
5556 switch (d.getKind()) {
5657 case Function:
57- if (c.warnings.no_unused_function) return;
5858 if (d.hasAttrUnused()) return;
59+ wk = W_unused_function;
5960 break;
6061 case Import:
61- if (c.warnings.no_unused_import) return ;
62+ wk = W_unused_import ;
6263 break;
6364 case StructType:
6465 if (used) {
6566 c.checkStructMembers(d);
6667 }
67- if (c.warnings.no_unused_type) return ;
68+ wk = W_unused_type ;
6869 break;
6970 case EnumType:
70- if (used && ! c.warnings.no_unused_enum_constant ) {
71- c.checkEnum((EnumTypeDecl*)d );
71+ if (used && c.warnings.test(W_unused_enum_constant) ) {
72+ c.checkEnum((EnumTypeDecl*)(d) );
7273 }
74+ wk = W_unused_enum_constant;
7375 break;
7476 case EnumConstant:
77+ wk = W_unused_enum_constant;
7578 break;
7679 case FunctionType:
77- if (c.warnings.no_unused_type) return ;
80+ wk = W_unused_type ;
7881 break;
7982 case AliasType:
80- if (c.warnings.no_unused_type) return ;
83+ wk = W_unused_type ;
8184 break;
8285 case Variable:
83- if (c.warnings.no_unused_variable) return ;
86+ wk = W_unused_variable ;
8487 break;
8588 }
8689 if (!used && !d.hasAttrUnused() && !d.isExported()) {
87- 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());
8891 return;
8992 }
9093}
@@ -96,7 +99,7 @@ fn void Checker.checkEnum(Checker* c, EnumTypeDecl* d) {
9699 EnumConstantDecl* ecd = constants[i];
97100 Decl* dd = (Decl*)ecd;
98101 if (!dd.isUsed()) {
99- 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());
100103 }
101104 }
102105}
@@ -110,8 +113,8 @@ fn void Checker.checkStructMembers(Checker* c, Decl* d) {
110113 if (member.isStructType()) {
111114 c.checkStructMembers(member);
112115 } else {
113- if (!member.isUsed() && !c.warnings.no_unused_variable ) {
114- 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());
115118 }
116119 }
117120 }
0 commit comments