refactor: Drop RuleSelector::codes in favor of IntoIterator impl

This commit is contained in:
Martin Fischer 2023-01-21 05:10:39 +01:00 committed by Charlie Marsh
parent 9f14e7c830
commit 4f12b31dc8
8 changed files with 28 additions and 24 deletions

View File

@ -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(_) => "🛠",

View File

@ -184,7 +184,7 @@ fn generate_impls<'a>(
prefix_to_codes: &BTreeMap<Ident, BTreeSet<String>>,
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<Self::Item>;
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)*];
}
}

View File

@ -275,9 +275,8 @@ pub fn infer_plugins_from_codes(selectors: &BTreeSet<RuleSelector>) -> Vec<Plugi
.filter(|plugin| {
for selector in selectors {
if selector
.codes()
.iter()
.any(|rule| plugin.selector().codes().contains(rule))
.into_iter()
.any(|rule| plugin.selector().into_iter().any(|r| r == rule))
{
return true;
}

View File

@ -19,7 +19,7 @@ mod tests {
fn rule_code(contents: &str, expected: &[Rule]) -> 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<LexResult> = rustpython_helpers::tokenize(&contents);
let locator = Locator::new(&contents);
let stylist = Stylist::from_contents(&contents, &locator);

View File

@ -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<LexResult> = rustpython_helpers::tokenize(&contents);
let locator = Locator::new(&contents);
let stylist = Stylist::from_contents(&contents, &locator);

View File

@ -52,7 +52,7 @@ pub static EXCLUDE: Lazy<Vec<FilePattern>> = 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(),

View File

@ -210,9 +210,9 @@ impl Settings {
}
#[cfg(test)]
pub fn for_rules(rule_codes: Vec<Rule>) -> Self {
pub fn for_rules(rules: impl IntoIterator<Item = Rule>) -> Self {
Self {
rules: rule_codes.into(),
rules: rules.into(),
..Settings::default()
}
}
@ -323,12 +323,12 @@ fn resolve_codes<'a>(specs: impl IntoIterator<Item = RuleCodeSpec<'a>>) -> 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);
}
}

View File

@ -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),