diff --git a/crates/ruff_server/src/fix.rs b/crates/ruff_server/src/fix.rs index 5969c89d82c859..163d097c4e6b05 100644 --- a/crates/ruff_server/src/fix.rs +++ b/crates/ruff_server/src/fix.rs @@ -9,10 +9,10 @@ use ruff_linter::{ }; use ruff_notebook::SourceValue; use ruff_source_file::LineIndex; -use ruff_workspace::resolver::{match_any_exclusion, match_any_inclusion}; use crate::{ edit::{Replacement, ToRangeExt}, + resolve::is_document_excluded, session::DocumentQuery, PositionEncoding, }; @@ -33,32 +33,12 @@ pub(crate) fn fix_all( // If the document is excluded, return an empty list of fixes. let package = if let Some(document_path) = document_path.as_ref() { - if let Some(exclusion) = match_any_exclusion( + if is_document_excluded( document_path, - &file_resolver_settings.exclude, - &file_resolver_settings.extend_exclude, - Some(&linter_settings.exclude), + file_resolver_settings, + Some(linter_settings), None, ) { - tracing::debug!( - "Ignored path via `{}`: {}", - exclusion, - document_path.display() - ); - return Ok(Fixes::default()); - } - - if let Some(inclusion) = match_any_inclusion( - document_path, - &file_resolver_settings.include, - &file_resolver_settings.extend_include, - ) { - tracing::debug!( - "Included path via `{}`: {}", - inclusion, - document_path.display() - ); - } else { return Ok(Fixes::default()); } diff --git a/crates/ruff_server/src/lib.rs b/crates/ruff_server/src/lib.rs index 595fe7c270e5f4..58b501742a2b8b 100644 --- a/crates/ruff_server/src/lib.rs +++ b/crates/ruff_server/src/lib.rs @@ -12,6 +12,7 @@ mod edit; mod fix; mod format; mod lint; +mod resolve; mod server; mod session; mod trace; diff --git a/crates/ruff_server/src/lint.rs b/crates/ruff_server/src/lint.rs index 16e0a23ed56d06..be12d99abba928 100644 --- a/crates/ruff_server/src/lint.rs +++ b/crates/ruff_server/src/lint.rs @@ -19,10 +19,10 @@ use ruff_python_codegen::Stylist; use ruff_python_index::Indexer; use ruff_source_file::{LineIndex, Locator}; use ruff_text_size::{Ranged, TextRange}; -use ruff_workspace::resolver::{match_any_exclusion, match_any_inclusion}; use crate::{ edit::{NotebookRange, ToRangeExt}, + resolve::is_document_excluded, session::DocumentQuery, PositionEncoding, DIAGNOSTIC_NAME, }; @@ -72,32 +72,12 @@ pub(crate) fn check( // If the document is excluded, return an empty list of diagnostics. let package = if let Some(document_path) = document_path.as_ref() { - if let Some(exclusion) = match_any_exclusion( + if is_document_excluded( document_path, - &file_resolver_settings.exclude, - &file_resolver_settings.extend_exclude, - Some(&linter_settings.exclude), + file_resolver_settings, + Some(linter_settings), None, ) { - tracing::debug!( - "Ignored path via `{}`: {}", - exclusion, - document_path.display() - ); - return DiagnosticsMap::default(); - } - - if let Some(inclusion) = match_any_inclusion( - document_path, - &file_resolver_settings.include, - &file_resolver_settings.extend_include, - ) { - tracing::debug!( - "Included path via `{}`: {}", - inclusion, - document_path.display() - ); - } else { return DiagnosticsMap::default(); } diff --git a/crates/ruff_server/src/resolve.rs b/crates/ruff_server/src/resolve.rs new file mode 100644 index 00000000000000..970551e7186c45 --- /dev/null +++ b/crates/ruff_server/src/resolve.rs @@ -0,0 +1,45 @@ +use std::path::Path; + +use ruff_linter::settings::LinterSettings; +use ruff_workspace::resolver::{match_any_exclusion, match_any_inclusion}; +use ruff_workspace::{FileResolverSettings, FormatterSettings}; + +/// Return `true` if the document at the given [`Path`] should be excluded. +/// +/// The tool-specific settings should be provided if the request for the document is specific to +/// that tool. For example, a diagnostics request should provide the linter settings while the +/// formatting request should provide the formatter settings. +/// +/// The logic for the resolution considers both inclusion and exclusion and is as follows: +/// 1. Check for global `exclude` and `extend-exclude` options along with tool specific `exclude` +/// option (`lint.exclude`, `format.exclude`). +/// 2. Check for global `include` and `extend-include` options. +pub(crate) fn is_document_excluded( + path: &Path, + resolver_settings: &FileResolverSettings, + linter_settings: Option<&LinterSettings>, + formatter_settings: Option<&FormatterSettings>, +) -> bool { + if let Some(exclusion) = match_any_exclusion( + path, + &resolver_settings.exclude, + &resolver_settings.extend_exclude, + linter_settings.map(|s| &*s.exclude), + formatter_settings.map(|s| &*s.exclude), + ) { + tracing::debug!("Ignored path via `{}`: {}", exclusion, path.display()); + return true; + } + + if let Some(inclusion) = match_any_inclusion( + path, + &resolver_settings.include, + &resolver_settings.extend_include, + ) { + tracing::debug!("Included path via `{}`: {}", inclusion, path.display()); + false + } else { + // Path is excluded by not being in the inclusion set. + true + } +} diff --git a/crates/ruff_server/src/server/api/requests/format.rs b/crates/ruff_server/src/server/api/requests/format.rs index c7ef008598a008..e2139132308c66 100644 --- a/crates/ruff_server/src/server/api/requests/format.rs +++ b/crates/ruff_server/src/server/api/requests/format.rs @@ -2,10 +2,10 @@ use lsp_types::{self as types, request as req}; use types::TextEdit; use ruff_source_file::LineIndex; -use ruff_workspace::resolver::{match_any_exclusion, match_any_inclusion}; use crate::edit::{Replacement, ToRangeExt}; use crate::fix::Fixes; +use crate::resolve::is_document_excluded; use crate::server::api::LSPResult; use crate::server::{client::Notifier, Result}; use crate::session::{DocumentQuery, DocumentSnapshot}; @@ -85,24 +85,12 @@ fn format_text_document( // If the document is excluded, return early. if let Some(file_path) = query.file_path() { - if let Some(exclusion) = match_any_exclusion( + if is_document_excluded( &file_path, - &file_resolver_settings.exclude, - &file_resolver_settings.extend_exclude, + file_resolver_settings, None, - Some(&formatter_settings.exclude), + Some(formatter_settings), ) { - tracing::debug!("Ignored path via `{}`: {}", exclusion, file_path.display()); - return Ok(None); - } - - if let Some(inclusion) = match_any_inclusion( - &file_path, - &file_resolver_settings.include, - &file_resolver_settings.extend_include, - ) { - tracing::debug!("Included path via `{}`: {}", inclusion, file_path.display()); - } else { return Ok(None); } } diff --git a/crates/ruff_server/src/server/api/requests/format_range.rs b/crates/ruff_server/src/server/api/requests/format_range.rs index 14ae299074b9d6..d13d79f41f82ed 100644 --- a/crates/ruff_server/src/server/api/requests/format_range.rs +++ b/crates/ruff_server/src/server/api/requests/format_range.rs @@ -1,8 +1,8 @@ use lsp_types::{self as types, request as req, Range}; -use ruff_workspace::resolver::{match_any_exclusion, match_any_inclusion}; use crate::edit::{RangeExt, ToRangeExt}; +use crate::resolve::is_document_excluded; use crate::server::api::LSPResult; use crate::server::{client::Notifier, Result}; use crate::session::{DocumentQuery, DocumentSnapshot}; @@ -50,24 +50,12 @@ fn format_text_document_range( // If the document is excluded, return early. if let Some(file_path) = query.file_path() { - if let Some(exclusion) = match_any_exclusion( + if is_document_excluded( &file_path, - &file_resolver_settings.exclude, - &file_resolver_settings.extend_exclude, + file_resolver_settings, None, - Some(&formatter_settings.exclude), + Some(formatter_settings), ) { - tracing::debug!("Ignored path via `{}`: {}", exclusion, file_path.display()); - return Ok(None); - } - - if let Some(inclusion) = match_any_inclusion( - &file_path, - &file_resolver_settings.include, - &file_resolver_settings.extend_include, - ) { - tracing::debug!("Included path via `{}`: {}", inclusion, file_path.display()); - } else { return Ok(None); } }