diff --git a/crates/oxc_linter/src/options.rs b/crates/oxc_linter/src/options.rs index 10bd60046..2b4db4ac2 100644 --- a/crates/oxc_linter/src/options.rs +++ b/crates/oxc_linter/src/options.rs @@ -250,7 +250,7 @@ impl LintOptions { let mut rules = rules.into_iter().collect::>(); // for stable diagnostics output ordering - rules.sort_unstable_by_key(RuleEnum::name); + rules.sort_unstable_by_key(RuleEnum::id); Ok((rules, config.unwrap_or_default())) } diff --git a/crates/oxc_macros/src/declare_all_lint_rules/mod.rs b/crates/oxc_macros/src/declare_all_lint_rules/mod.rs index 7c75af492..2f8282248 100644 --- a/crates/oxc_macros/src/declare_all_lint_rules/mod.rs +++ b/crates/oxc_macros/src/declare_all_lint_rules/mod.rs @@ -60,6 +60,7 @@ pub fn declare_all_lint_rules(metadata: AllLintRulesMeta) -> TokenStream { .collect::>() .join("/") }); + let ids = rules.iter().enumerate().map(|(i, _)| i).collect::>(); let expanded = quote! { #(#use_stmts)* @@ -74,6 +75,12 @@ pub fn declare_all_lint_rules(metadata: AllLintRulesMeta) -> TokenStream { } impl RuleEnum { + pub fn id(&self) -> usize { + match self { + #(Self::#struct_names(_) => #ids),* + } + } + pub fn name(&self) -> &'static str { match self { #(Self::#struct_names(_) => #struct_names::NAME),* @@ -127,13 +134,13 @@ pub fn declare_all_lint_rules(metadata: AllLintRulesMeta) -> TokenStream { impl std::hash::Hash for RuleEnum { fn hash(&self, state: &mut H) { - self.name().hash(state); + self.id().hash(state); } } impl PartialEq for RuleEnum { fn eq(&self, other: &Self) -> bool { - self.name() == other.name() + self.id() == other.id() } } @@ -141,7 +148,7 @@ pub fn declare_all_lint_rules(metadata: AllLintRulesMeta) -> TokenStream { impl Ord for RuleEnum { fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.name().cmp(&other.name()) + self.id().cmp(&other.id()) } }