diff --git a/crates/flake8_to_ruff/src/plugin.rs b/crates/flake8_to_ruff/src/plugin.rs index 2c0109e987..4c43dbabfe 100644 --- a/crates/flake8_to_ruff/src/plugin.rs +++ b/crates/flake8_to_ruff/src/plugin.rs @@ -4,6 +4,7 @@ use std::str::FromStr; use anyhow::anyhow; use ruff::registry::Linter; +use ruff::settings::types::PreviewMode; use ruff::RuleSelector; #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq)] @@ -331,7 +332,7 @@ pub(crate) fn infer_plugins_from_codes(selectors: &HashSet) -> Vec .filter(|plugin| { for selector in selectors { if selector - .into_iter() + .rules(PreviewMode::Disabled) .any(|rule| Linter::from(plugin).rules().any(|r| r == rule)) { return true; diff --git a/crates/ruff/src/rule_selector.rs b/crates/ruff/src/rule_selector.rs index e8a16f38e1..5d32720829 100644 --- a/crates/ruff/src/rule_selector.rs +++ b/crates/ruff/src/rule_selector.rs @@ -9,6 +9,7 @@ use crate::codes::RuleCodePrefix; use crate::codes::RuleIter; use crate::registry::{Linter, Rule, RuleNamespace}; use crate::rule_redirects::get_redirect; +use crate::settings::types::PreviewMode; #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum RuleSelector { @@ -168,11 +169,9 @@ impl Visitor<'_> for SelectorVisitor { } } -impl IntoIterator for &RuleSelector { - type Item = Rule; - type IntoIter = RuleSelectorIter; - - fn into_iter(self) -> Self::IntoIter { +impl RuleSelector { + /// Return all matching rules, regardless of whether they're in preview. + pub fn all_rules(&self) -> impl Iterator + '_ { match self { RuleSelector::All => RuleSelectorIter::All(Rule::iter()), RuleSelector::Preview => { @@ -194,6 +193,13 @@ impl IntoIterator for &RuleSelector { } } } + + /// Returns rules matching the selector, taking into account whether preview mode is enabled. + pub fn rules(&self, preview: PreviewMode) -> impl Iterator + '_ { + self.all_rules().filter(move |rule| { + matches!(self, RuleSelector::Rule { .. }) || preview.is_enabled() || !rule.is_preview() + }) + } } pub enum RuleSelectorIter { diff --git a/crates/ruff/src/settings/defaults.rs b/crates/ruff/src/settings/defaults.rs index 69dd446e3e..123acfa55f 100644 --- a/crates/ruff/src/settings/defaults.rs +++ b/crates/ruff/src/settings/defaults.rs @@ -70,7 +70,10 @@ pub static INCLUDE: Lazy> = Lazy::new(|| { impl Default for Settings { fn default() -> Self { Self { - rules: PREFIXES.iter().flat_map(IntoIterator::into_iter).collect(), + rules: PREFIXES + .iter() + .flat_map(|selector| selector.rules(PreviewMode::default())) + .collect(), allowed_confusables: FxHashSet::from_iter([]), builtins: vec![], dummy_variable_rgx: DUMMY_VARIABLE_RGX.clone(), diff --git a/crates/ruff/src/settings/types.rs b/crates/ruff/src/settings/types.rs index bb293d3986..38ec24cc4b 100644 --- a/crates/ruff/src/settings/types.rs +++ b/crates/ruff/src/settings/types.rs @@ -194,7 +194,7 @@ pub struct PerFileIgnore { impl PerFileIgnore { pub fn new(pattern: String, prefixes: &[RuleSelector], project_root: Option<&Path>) -> Self { - let rules: RuleSet = prefixes.iter().flat_map(IntoIterator::into_iter).collect(); + let rules: RuleSet = prefixes.iter().flat_map(RuleSelector::all_rules).collect(); let path = Path::new(&pattern); let absolute = match project_root { Some(project_root) => fs::normalize_path_to(path, project_root), diff --git a/crates/ruff_workspace/src/configuration.rs b/crates/ruff_workspace/src/configuration.rs index 5a247b5d92..354df467c2 100644 --- a/crates/ruff_workspace/src/configuration.rs +++ b/crates/ruff_workspace/src/configuration.rs @@ -440,11 +440,17 @@ impl Configuration { } pub fn as_rule_table(&self) -> RuleTable { + let preview = self.preview.unwrap_or_default(); + // The select_set keeps track of which rules have been selected. - let mut select_set: RuleSet = defaults::PREFIXES.iter().flatten().collect(); + let mut select_set: RuleSet = defaults::PREFIXES + .iter() + .map(|selector| selector.rules(preview)) + .flatten() + .collect(); // The fixable set keeps track of which rules are fixable. - let mut fixable_set: RuleSet = RuleSelector::All.into_iter().collect(); + let mut fixable_set: RuleSet = RuleSelector::All.rules(preview).collect(); // Ignores normally only subtract from the current set of selected // rules. By that logic the ignore in `select = [], ignore = ["E501"]` @@ -472,9 +478,6 @@ impl Configuration { let carriedover_unfixables = carryover_unfixables.take(); for spec in Specificity::iter() { - let include_preview_rules = - self.preview.is_some_and(|preview| preview.is_enabled()); - // Iterate over rule selectors in order of specificity. for selector in selection .select @@ -483,13 +486,7 @@ impl Configuration { .chain(selection.extend_select.iter()) .filter(|s| s.specificity() == spec) { - for rule in selector { - if !matches!(spec, Specificity::Rule) - && !include_preview_rules - && rule.is_preview() - { - continue; - } + for rule in selector.rules(preview) { select_map_updates.insert(rule, true); } } @@ -499,7 +496,7 @@ impl Configuration { .chain(carriedover_ignores.into_iter().flatten()) .filter(|s| s.specificity() == spec) { - for rule in selector { + for rule in selector.rules(preview) { select_map_updates.insert(rule, false); } } @@ -511,7 +508,7 @@ impl Configuration { .chain(selection.extend_fixable.iter()) .filter(|s| s.specificity() == spec) { - for rule in selector { + for rule in selector.rules(preview) { fixable_map_updates.insert(rule, true); } } @@ -521,7 +518,7 @@ impl Configuration { .chain(carriedover_unfixables.into_iter().flatten()) .filter(|s| s.specificity() == spec) { - for rule in selector { + for rule in selector.rules(preview) { fixable_map_updates.insert(rule, false); } }