Skip to content

Commit

Permalink
perf(linter-macros): only iterate over all rules once (#4672)
Browse files Browse the repository at this point in the history
  • Loading branch information
DonIsaac committed Aug 6, 2024
1 parent 9b51e04 commit 69c6b65
Showing 1 changed file with 20 additions and 12 deletions.
32 changes: 20 additions & 12 deletions crates/oxc_macros/src/declare_all_lint_rules.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use convert_case::{Case, Casing};
use itertools::Itertools as _;
use proc_macro::TokenStream;
use quote::quote;
use syn::{
Expand Down Expand Up @@ -37,18 +38,25 @@ impl Parse for AllLintRulesMeta {
#[allow(clippy::cognitive_complexity, clippy::too_many_lines)]
pub fn declare_all_lint_rules(metadata: AllLintRulesMeta) -> TokenStream {
let AllLintRulesMeta { rules } = metadata;
let use_stmts = rules.iter().map(|rule| &rule.path).collect::<Vec<_>>();
let struct_names = rules.iter().map(|rule| &rule.name).collect::<Vec<_>>();
let plugin_names = rules.iter().map(|node| {
node.path
.segments
.iter()
.take(node.path.segments.len() - 1)
.map(|s| format!("{}", s.ident))
.collect::<Vec<_>>()
.join("/")
});
let ids = rules.iter().enumerate().map(|(i, _)| i).collect::<Vec<_>>();

let mut use_stmts = Vec::with_capacity(rules.len());
let mut struct_names = Vec::with_capacity(rules.len());
let mut plugin_names = Vec::with_capacity(rules.len());
let mut ids = Vec::with_capacity(rules.len());

for (i, rule) in rules.iter().enumerate() {
use_stmts.push(&rule.path);
struct_names.push(&rule.name);
plugin_names.push(
rule.path
.segments
.iter()
.take(rule.path.segments.len() - 1)
.map(|s| format!("{}", s.ident))
.join("/"),
);
ids.push(i);
}

let expanded = quote! {
#(pub use self::#use_stmts::#struct_names;)*
Expand Down

0 comments on commit 69c6b65

Please sign in to comment.