From 4f12b31dc8bfbd994599a936870b85d45262aefa Mon Sep 17 00:00:00 2001 From: Martin Fischer Date: Sat, 21 Jan 2023 05:10:39 +0100 Subject: [PATCH] refactor: Drop RuleSelector::codes in favor of IntoIterator impl --- ruff_dev/src/generate_rules_table.rs | 2 +- ruff_macros/src/rule_code_prefix.rs | 29 ++++++++++++++++------------ src/flake8_to_ruff/plugin.rs | 5 ++--- src/rules/pandas_vet/mod.rs | 2 +- src/rules/pyflakes/mod.rs | 2 +- src/settings/defaults.rs | 2 +- src/settings/mod.rs | 8 ++++---- src/settings/types.rs | 2 +- 8 files changed, 28 insertions(+), 24 deletions(-) diff --git a/ruff_dev/src/generate_rules_table.rs b/ruff_dev/src/generate_rules_table.rs index 6870b10c47..d8f840c78a 100644 --- a/ruff_dev/src/generate_rules_table.rs +++ b/ruff_dev/src/generate_rules_table.rs @@ -25,7 +25,7 @@ fn generate_table(table_out: &mut String, selector: &RuleSelector) { table_out.push('\n'); table_out.push_str("| ---- | ---- | ------- | --- |"); table_out.push('\n'); - for rule in selector.codes() { + for rule in selector { let fix_token = match rule.autofixable() { None => "", Some(_) => "🛠", diff --git a/ruff_macros/src/rule_code_prefix.rs b/ruff_macros/src/rule_code_prefix.rs index df07418615..c2b6e7aacd 100644 --- a/ruff_macros/src/rule_code_prefix.rs +++ b/ruff_macros/src/rule_code_prefix.rs @@ -184,7 +184,7 @@ fn generate_impls<'a>( prefix_to_codes: &BTreeMap>, variant_name: impl Fn(&str) -> &'a Ident, ) -> proc_macro2::TokenStream { - let codes_match_arms = prefix_to_codes.iter().map(|(prefix, codes)| { + let into_iter_match_arms = prefix_to_codes.iter().map(|(prefix, codes)| { let codes = codes.iter().map(|code| { let rule_variant = variant_name(code); quote! { @@ -198,12 +198,12 @@ fn generate_impls<'a>( crate::warn_user_once!( "`{}` has been remapped to `{}`", #prefix_str, #target ); - vec![#(#codes),*] + vec![#(#codes),*].into_iter() } } } else { quote! { - #prefix_ident::#prefix => vec![#(#codes),*], + #prefix_ident::#prefix => vec![#(#codes),*].into_iter(), } } }); @@ -248,15 +248,6 @@ fn generate_impls<'a>( quote! { impl #prefix_ident { - pub fn codes(&self) -> Vec<#rule_type> { - use colored::Colorize; - - #[allow(clippy::match_same_arms)] - match self { - #(#codes_match_arms)* - } - } - pub fn specificity(&self) -> SuffixLength { #[allow(clippy::match_same_arms)] match self { @@ -265,6 +256,20 @@ fn generate_impls<'a>( } } + impl IntoIterator for &#prefix_ident { + type Item = #rule_type; + type IntoIter = ::std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + use colored::Colorize; + + #[allow(clippy::match_same_arms)] + match self { + #(#into_iter_match_arms)* + } + } + } + pub const CATEGORIES: &[#prefix_ident] = &[#(#categories)*]; } } diff --git a/src/flake8_to_ruff/plugin.rs b/src/flake8_to_ruff/plugin.rs index d2eb17382e..c2fb1c770e 100644 --- a/src/flake8_to_ruff/plugin.rs +++ b/src/flake8_to_ruff/plugin.rs @@ -275,9 +275,8 @@ pub fn infer_plugins_from_codes(selectors: &BTreeSet) -> Vec Result<()> { let contents = dedent(contents); - let settings = settings::Settings::for_rules(RuleSelector::PD.codes()); + let settings = settings::Settings::for_rules(&RuleSelector::PD); let tokens: Vec = rustpython_helpers::tokenize(&contents); let locator = Locator::new(&contents); let stylist = Stylist::from_contents(&contents, &locator); diff --git a/src/rules/pyflakes/mod.rs b/src/rules/pyflakes/mod.rs index 975ce5bb4c..04cd165839 100644 --- a/src/rules/pyflakes/mod.rs +++ b/src/rules/pyflakes/mod.rs @@ -209,7 +209,7 @@ mod tests { /// Note that all tests marked with `#[ignore]` should be considered TODOs. fn flakes(contents: &str, expected: &[Rule]) -> Result<()> { let contents = dedent(contents); - let settings = settings::Settings::for_rules(RuleSelector::F.codes()); + let settings = settings::Settings::for_rules(&RuleSelector::F); let tokens: Vec = rustpython_helpers::tokenize(&contents); let locator = Locator::new(&contents); let stylist = Stylist::from_contents(&contents, &locator); diff --git a/src/settings/defaults.rs b/src/settings/defaults.rs index 4747ff2c96..aed73e2347 100644 --- a/src/settings/defaults.rs +++ b/src/settings/defaults.rs @@ -52,7 +52,7 @@ pub static EXCLUDE: Lazy> = Lazy::new(|| { impl Default for Settings { fn default() -> Self { Self { - rules: PREFIXES.iter().flat_map(RuleSelector::codes).into(), + rules: PREFIXES.iter().flat_map(IntoIterator::into_iter).into(), allowed_confusables: FxHashSet::from_iter([]).into(), builtins: vec![], dummy_variable_rgx: DUMMY_VARIABLE_RGX.clone().into(), diff --git a/src/settings/mod.rs b/src/settings/mod.rs index 2fb0a3d43d..83eeb26943 100644 --- a/src/settings/mod.rs +++ b/src/settings/mod.rs @@ -210,9 +210,9 @@ impl Settings { } #[cfg(test)] - pub fn for_rules(rule_codes: Vec) -> Self { + pub fn for_rules(rules: impl IntoIterator) -> Self { Self { - rules: rule_codes.into(), + rules: rules.into(), ..Settings::default() } } @@ -323,12 +323,12 @@ fn resolve_codes<'a>(specs: impl IntoIterator>) -> FxHas ] { for selector in spec.select { if selector.specificity() == specificity { - rules.extend(selector.codes()); + rules.extend(selector); } } for selector in spec.ignore { if selector.specificity() == specificity { - for rule in selector.codes() { + for rule in selector { rules.remove(&rule); } } diff --git a/src/settings/types.rs b/src/settings/types.rs index 7146eb1787..3b4ea5dfa7 100644 --- a/src/settings/types.rs +++ b/src/settings/types.rs @@ -94,7 +94,7 @@ pub struct PerFileIgnore { impl PerFileIgnore { pub fn new(pattern: String, prefixes: &[RuleSelector], project_root: Option<&Path>) -> Self { - let rules: FxHashSet<_> = prefixes.iter().flat_map(RuleSelector::codes).collect(); + let rules: FxHashSet<_> = prefixes.iter().flat_map(IntoIterator::into_iter).collect(); let path = Path::new(&pattern); let absolute = match project_root { Some(project_root) => fs::normalize_path_to(path, project_root),