mirror of https://github.com/astral-sh/ruff
Make preview part of the selector API
This commit is contained in:
parent
b9f0ade746
commit
ffbbb8d912
|
|
@ -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<RuleSelector>) -> 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;
|
||||
|
|
|
|||
|
|
@ -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<Item = Rule> + '_ {
|
||||
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<Item = Rule> + '_ {
|
||||
self.all_rules().filter(move |rule| {
|
||||
matches!(self, RuleSelector::Rule { .. }) || preview.is_enabled() || !rule.is_preview()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
pub enum RuleSelectorIter {
|
||||
|
|
|
|||
|
|
@ -70,7 +70,10 @@ pub static INCLUDE: Lazy<Vec<FilePattern>> = 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(),
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue