Stop relying on hashmap iteration for unused macro rules arms
This commit is contained in:
parent
3efd5926f6
commit
0c8d81b4df
@ -1193,7 +1193,11 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
|||||||
if !ident.as_str().starts_with('_') {
|
if !ident.as_str().starts_with('_') {
|
||||||
self.r.unused_macros.insert(def_id, (node_id, ident));
|
self.r.unused_macros.insert(def_id, (node_id, ident));
|
||||||
for (rule_i, rule_span) in &self.r.macro_map[&def_id.to_def_id()].rule_spans {
|
for (rule_i, rule_span) in &self.r.macro_map[&def_id.to_def_id()].rule_spans {
|
||||||
self.r.unused_macro_rules.insert((def_id, *rule_i), (ident, *rule_span));
|
self.r
|
||||||
|
.unused_macro_rules
|
||||||
|
.entry(def_id)
|
||||||
|
.or_default()
|
||||||
|
.insert(*rule_i, (ident, *rule_span));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1122,7 +1122,8 @@ pub struct Resolver<'ra, 'tcx> {
|
|||||||
local_macro_def_scopes: FxHashMap<LocalDefId, Module<'ra>>,
|
local_macro_def_scopes: FxHashMap<LocalDefId, Module<'ra>>,
|
||||||
ast_transform_scopes: FxHashMap<LocalExpnId, Module<'ra>>,
|
ast_transform_scopes: FxHashMap<LocalExpnId, Module<'ra>>,
|
||||||
unused_macros: FxHashMap<LocalDefId, (NodeId, Ident)>,
|
unused_macros: FxHashMap<LocalDefId, (NodeId, Ident)>,
|
||||||
unused_macro_rules: FxHashMap<(LocalDefId, usize), (Ident, Span)>,
|
/// A map from the macro to all its potentially unused arms.
|
||||||
|
unused_macro_rules: FxIndexMap<LocalDefId, FxHashMap<usize, (Ident, Span)>>,
|
||||||
proc_macro_stubs: FxHashSet<LocalDefId>,
|
proc_macro_stubs: FxHashSet<LocalDefId>,
|
||||||
/// Traces collected during macro resolution and validated when it's complete.
|
/// Traces collected during macro resolution and validated when it's complete.
|
||||||
single_segment_macro_resolutions:
|
single_segment_macro_resolutions:
|
||||||
|
@ -340,7 +340,9 @@ impl<'ra, 'tcx> ResolverExpand for Resolver<'ra, 'tcx> {
|
|||||||
|
|
||||||
fn record_macro_rule_usage(&mut self, id: NodeId, rule_i: usize) {
|
fn record_macro_rule_usage(&mut self, id: NodeId, rule_i: usize) {
|
||||||
let did = self.local_def_id(id);
|
let did = self.local_def_id(id);
|
||||||
self.unused_macro_rules.remove(&(did, rule_i));
|
if let Some(rules) = self.unused_macro_rules.get_mut(&did) {
|
||||||
|
rules.remove(&rule_i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_unused_macros(&mut self) {
|
fn check_unused_macros(&mut self) {
|
||||||
@ -352,18 +354,24 @@ impl<'ra, 'tcx> ResolverExpand for Resolver<'ra, 'tcx> {
|
|||||||
BuiltinLintDiag::UnusedMacroDefinition(ident.name),
|
BuiltinLintDiag::UnusedMacroDefinition(ident.name),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
for (&(def_id, arm_i), &(ident, rule_span)) in self.unused_macro_rules.iter() {
|
|
||||||
if self.unused_macros.contains_key(&def_id) {
|
for (&def_id, unused_arms) in self.unused_macro_rules.iter() {
|
||||||
// We already lint the entire macro as unused
|
let mut unused_arms = unused_arms.iter().collect::<Vec<_>>();
|
||||||
continue;
|
unused_arms.sort_by_key(|&(&arm_i, _)| arm_i);
|
||||||
|
|
||||||
|
for (&arm_i, &(ident, rule_span)) in unused_arms {
|
||||||
|
if self.unused_macros.contains_key(&def_id) {
|
||||||
|
// We already lint the entire macro as unused
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let node_id = self.def_id_to_node_id[def_id];
|
||||||
|
self.lint_buffer.buffer_lint(
|
||||||
|
UNUSED_MACRO_RULES,
|
||||||
|
node_id,
|
||||||
|
rule_span,
|
||||||
|
BuiltinLintDiag::MacroRuleNeverUsed(arm_i, ident.name),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
let node_id = self.def_id_to_node_id[def_id];
|
|
||||||
self.lint_buffer.buffer_lint(
|
|
||||||
UNUSED_MACRO_RULES,
|
|
||||||
node_id,
|
|
||||||
rule_span,
|
|
||||||
BuiltinLintDiag::MacroRuleNeverUsed(arm_i, ident.name),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,17 +10,17 @@ note: the lint level is defined here
|
|||||||
LL | #![deny(unused_macro_rules)]
|
LL | #![deny(unused_macro_rules)]
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: rule #3 of macro `num2` is never used
|
|
||||||
--> $DIR/unused-macro-rules-compile-error.rs:22:5
|
|
||||||
|
|
|
||||||
LL | (two_) => { compile_error! };
|
|
||||||
| ^^^^^^
|
|
||||||
|
|
||||||
error: rule #2 of macro `num2` is never used
|
error: rule #2 of macro `num2` is never used
|
||||||
--> $DIR/unused-macro-rules-compile-error.rs:20:5
|
--> $DIR/unused-macro-rules-compile-error.rs:20:5
|
||||||
|
|
|
|
||||||
LL | (two) => { fn compile_error() {} };
|
LL | (two) => { fn compile_error() {} };
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
||||||
|
error: rule #3 of macro `num2` is never used
|
||||||
|
--> $DIR/unused-macro-rules-compile-error.rs:22:5
|
||||||
|
|
|
||||||
|
LL | (two_) => { compile_error! };
|
||||||
|
| ^^^^^^
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
error: rule #4 of macro `num` is never used
|
error: rule #2 of macro `num` is never used
|
||||||
--> $DIR/unused-macro-rules-decl.rs:11:5
|
--> $DIR/unused-macro-rules-decl.rs:9:5
|
||||||
|
|
|
|
||||||
LL | (four) => { 4 },
|
LL | (two) => { 2 },
|
||||||
| ^^^^^^
|
| ^^^^^
|
||||||
|
|
|
|
||||||
note: the lint level is defined here
|
note: the lint level is defined here
|
||||||
--> $DIR/unused-macro-rules-decl.rs:2:9
|
--> $DIR/unused-macro-rules-decl.rs:2:9
|
||||||
@ -10,11 +10,11 @@ note: the lint level is defined here
|
|||||||
LL | #![deny(unused_macro_rules)]
|
LL | #![deny(unused_macro_rules)]
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: rule #2 of macro `num` is never used
|
error: rule #4 of macro `num` is never used
|
||||||
--> $DIR/unused-macro-rules-decl.rs:9:5
|
--> $DIR/unused-macro-rules-decl.rs:11:5
|
||||||
|
|
|
|
||||||
LL | (two) => { 2 },
|
LL | (four) => { 4 },
|
||||||
| ^^^^^
|
| ^^^^^^
|
||||||
|
|
||||||
error: rule #3 of macro `num_rec` is never used
|
error: rule #3 of macro `num_rec` is never used
|
||||||
--> $DIR/unused-macro-rules-decl.rs:31:5
|
--> $DIR/unused-macro-rules-decl.rs:31:5
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
error: rule #4 of macro `num` is never used
|
error: rule #2 of macro `num` is never used
|
||||||
--> $DIR/unused-macro-rules.rs:10:5
|
--> $DIR/unused-macro-rules.rs:8:5
|
||||||
|
|
|
|
||||||
LL | (four) => { 4 };
|
LL | (two) => { 2 };
|
||||||
| ^^^^^^
|
| ^^^^^
|
||||||
|
|
|
|
||||||
note: the lint level is defined here
|
note: the lint level is defined here
|
||||||
--> $DIR/unused-macro-rules.rs:1:9
|
--> $DIR/unused-macro-rules.rs:1:9
|
||||||
@ -10,11 +10,11 @@ note: the lint level is defined here
|
|||||||
LL | #![deny(unused_macro_rules)]
|
LL | #![deny(unused_macro_rules)]
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: rule #2 of macro `num` is never used
|
error: rule #4 of macro `num` is never used
|
||||||
--> $DIR/unused-macro-rules.rs:8:5
|
--> $DIR/unused-macro-rules.rs:10:5
|
||||||
|
|
|
|
||||||
LL | (two) => { 2 };
|
LL | (four) => { 4 };
|
||||||
| ^^^^^
|
| ^^^^^^
|
||||||
|
|
||||||
error: rule #3 of macro `num_rec` is never used
|
error: rule #3 of macro `num_rec` is never used
|
||||||
--> $DIR/unused-macro-rules.rs:30:5
|
--> $DIR/unused-macro-rules.rs:30:5
|
||||||
|
Loading…
x
Reference in New Issue
Block a user