diff --git a/crates/ruff_server/src/fix.rs b/crates/ruff_server/src/fix.rs index 4ee9a48f47205..374d3ac25a573 100644 --- a/crates/ruff_server/src/fix.rs +++ b/crates/ruff_server/src/fix.rs @@ -27,15 +27,14 @@ pub(crate) fn fix_all( encoding: PositionEncoding, ) -> crate::Result { let source_kind = query.make_source_kind(); - - let file_resolver_settings = query.settings().file_resolver(); + let settings = query.settings(); let document_path = query.file_path(); // If the document is excluded, return an empty list of fixes. let package = if let Some(document_path) = document_path.as_ref() { if is_document_excluded_for_linting( document_path, - file_resolver_settings, + &settings.file_resolver, linter_settings, query.text_document_language_id(), ) { @@ -71,7 +70,7 @@ pub(crate) fn fix_all( &query.virtual_file_path(), package, flags::Noqa::Enabled, - query.settings().unsafe_fixes(), + settings.unsafe_fixes, linter_settings, &source_kind, source_type, diff --git a/crates/ruff_server/src/lint.rs b/crates/ruff_server/src/lint.rs index 0990439d52ac1..9b9e8a06d2e0d 100644 --- a/crates/ruff_server/src/lint.rs +++ b/crates/ruff_server/src/lint.rs @@ -67,16 +67,15 @@ pub(crate) fn check( show_syntax_errors: bool, ) -> DiagnosticsMap { let source_kind = query.make_source_kind(); - let file_resolver_settings = query.settings().file_resolver(); - let linter_settings = query.settings().linter(); + let settings = query.settings(); let document_path = query.file_path(); // If the document is excluded, return an empty list of diagnostics. let package = if let Some(document_path) = document_path.as_ref() { if is_document_excluded_for_linting( document_path, - file_resolver_settings, - linter_settings, + &settings.file_resolver, + &settings.linter, query.text_document_language_id(), ) { return DiagnosticsMap::default(); @@ -86,7 +85,7 @@ pub(crate) fn check( document_path .parent() .expect("a path to a document should have a parent path"), - &linter_settings.namespace_packages, + &settings.linter.namespace_packages, ) .map(PackageRoot::root) } else { @@ -118,7 +117,7 @@ pub(crate) fn check( &stylist, &indexer, &directives, - linter_settings, + &settings.linter, flags::Noqa::Enabled, &source_kind, source_type, @@ -130,7 +129,7 @@ pub(crate) fn check( &diagnostics, &locator, indexer.comment_ranges(), - &linter_settings.external, + &settings.linter.external, &directives.noqa_line_for, stylist.line_ending(), ); diff --git a/crates/ruff_server/src/server/api/requests/code_action_resolve.rs b/crates/ruff_server/src/server/api/requests/code_action_resolve.rs index 7cf9a1df3fb67..0cdd026539470 100644 --- a/crates/ruff_server/src/server/api/requests/code_action_resolve.rs +++ b/crates/ruff_server/src/server/api/requests/code_action_resolve.rs @@ -93,7 +93,7 @@ pub(super) fn fix_all_edit( query: &DocumentQuery, encoding: PositionEncoding, ) -> crate::Result { - crate::fix::fix_all(query, query.settings().linter(), encoding) + crate::fix::fix_all(query, &query.settings().linter, encoding) } pub(super) fn resolve_edit_for_organize_imports( @@ -110,7 +110,7 @@ pub(super) fn organize_imports_edit( query: &DocumentQuery, encoding: PositionEncoding, ) -> crate::Result { - let mut linter_settings = query.settings().linter().clone(); + let mut linter_settings = query.settings().linter.clone(); linter_settings.rules = [ Rule::UnsortedImports, // I001 Rule::MissingRequiredImport, // I002 diff --git a/crates/ruff_server/src/server/api/requests/format.rs b/crates/ruff_server/src/server/api/requests/format.rs index f865591124bae..0a42a610d0cd1 100644 --- a/crates/ruff_server/src/server/api/requests/format.rs +++ b/crates/ruff_server/src/server/api/requests/format.rs @@ -82,15 +82,14 @@ fn format_text_document( encoding: PositionEncoding, is_notebook: bool, ) -> Result { - let file_resolver_settings = query.settings().file_resolver(); - let formatter_settings = query.settings().formatter(); + let settings = query.settings(); // If the document is excluded, return early. if let Some(file_path) = query.file_path() { if is_document_excluded_for_formatting( &file_path, - file_resolver_settings, - formatter_settings, + &settings.file_resolver, + &settings.formatter, text_document.language_id(), ) { return Ok(None); @@ -98,7 +97,7 @@ fn format_text_document( } let source = text_document.contents(); - let formatted = crate::format::format(text_document, query.source_type(), formatter_settings) + let formatted = crate::format::format(text_document, query.source_type(), &settings.formatter) .with_failure_code(lsp_server::ErrorCode::InternalError)?; let Some(mut formatted) = formatted 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 c8ef5c9aaba4e..8a2a5371b64e7 100644 --- a/crates/ruff_server/src/server/api/requests/format_range.rs +++ b/crates/ruff_server/src/server/api/requests/format_range.rs @@ -46,15 +46,14 @@ fn format_text_document_range( query: &DocumentQuery, encoding: PositionEncoding, ) -> Result { - let file_resolver_settings = query.settings().file_resolver(); - let formatter_settings = query.settings().formatter(); + let settings = query.settings(); // If the document is excluded, return early. if let Some(file_path) = query.file_path() { if is_document_excluded_for_formatting( &file_path, - file_resolver_settings, - formatter_settings, + &settings.file_resolver, + &settings.formatter, text_document.language_id(), ) { return Ok(None); @@ -67,7 +66,7 @@ fn format_text_document_range( let formatted_range = crate::format::format_range( text_document, query.source_type(), - formatter_settings, + &settings.formatter, range, ) .with_failure_code(lsp_server::ErrorCode::InternalError)?; diff --git a/crates/ruff_server/src/session/index/ruff_settings.rs b/crates/ruff_server/src/session/index/ruff_settings.rs index 409c3082bdc9d..5edc1c97de3a8 100644 --- a/crates/ruff_server/src/session/index/ruff_settings.rs +++ b/crates/ruff_server/src/session/index/ruff_settings.rs @@ -1,4 +1,5 @@ use std::collections::BTreeMap; +use std::ops::Deref; use std::path::{Path, PathBuf}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; @@ -6,12 +7,11 @@ use std::sync::Arc; use anyhow::Context; use ignore::{WalkBuilder, WalkState}; -use ruff_linter::settings::types::UnsafeFixes; use ruff_linter::{ - display_settings, fs::normalize_path_to, settings::types::FilePattern, - settings::types::PreviewMode, + fs::normalize_path_to, settings::types::FilePattern, settings::types::PreviewMode, }; use ruff_workspace::resolver::match_exclusion; +use ruff_workspace::Settings; use ruff_workspace::{ configuration::{Configuration, FormatConfiguration, LintConfiguration, RuleSelection}, pyproject::{find_user_settings_toml, settings_toml}, @@ -24,14 +24,16 @@ pub struct RuffSettings { /// The path to this configuration file, used for debugging. /// The default fallback configuration does not have a file path. path: Option, - /// Toggle for unsafe fixes. - unsafe_fixes: UnsafeFixes, - /// Settings used to manage file inclusion and exclusion. - file_resolver: ruff_workspace::FileResolverSettings, - /// Settings to pass into the Ruff linter. - linter: ruff_linter::settings::LinterSettings, - /// Settings to pass into the Ruff formatter. - formatter: ruff_workspace::FormatterSettings, + /// The resolved settings. + settings: Settings, +} + +impl Deref for RuffSettings { + type Target = Settings; + + fn deref(&self) -> &Settings { + &self.settings + } } pub(super) struct RuffSettingsIndex { @@ -42,15 +44,7 @@ pub(super) struct RuffSettingsIndex { impl std::fmt::Display for RuffSettings { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - display_settings! { - formatter = f, - fields = [ - self.file_resolver, - self.linter, - self.formatter - ] - } - Ok(()) + std::fmt::Display::fmt(&self.settings, f) } } @@ -80,32 +74,9 @@ impl RuffSettings { RuffSettings { path, - unsafe_fixes: fallback.unsafe_fixes, - file_resolver: fallback.file_resolver, - formatter: fallback.formatter, - linter: fallback.linter, + settings: fallback, } } - - /// Return the [`ruff_workspace::FileResolverSettings`] for this [`RuffSettings`]. - pub(crate) fn file_resolver(&self) -> &ruff_workspace::FileResolverSettings { - &self.file_resolver - } - - /// Return the [`ruff_linter::settings::LinterSettings`] for this [`RuffSettings`]. - pub(crate) fn linter(&self) -> &ruff_linter::settings::LinterSettings { - &self.linter - } - - /// Return the [`ruff_workspace::FormatterSettings`] for this [`RuffSettings`]. - pub(crate) fn formatter(&self) -> &ruff_workspace::FormatterSettings { - &self.formatter - } - - /// Return the [`UnsafeFixes`] for this [`RuffSettings`]. - pub(crate) fn unsafe_fixes(&self) -> UnsafeFixes { - self.unsafe_fixes - } } impl RuffSettingsIndex { @@ -152,10 +123,7 @@ impl RuffSettingsIndex { directory.to_path_buf(), Arc::new(RuffSettings { path: Some(pyproject), - unsafe_fixes: settings.unsafe_fixes, - file_resolver: settings.file_resolver, - linter: settings.linter, - formatter: settings.formatter, + settings, }), ); break; @@ -210,7 +178,7 @@ impl RuffSettingsIndex { // Add any settings within the workspace itself let mut builder = WalkBuilder::new(root); builder.standard_filters( - respect_gitignore.unwrap_or_else(|| fallback.file_resolver().respect_gitignore), + respect_gitignore.unwrap_or_else(|| fallback.file_resolver.respect_gitignore), ); builder.hidden(false); builder.threads( @@ -277,10 +245,7 @@ impl RuffSettingsIndex { directory, Arc::new(RuffSettings { path: Some(pyproject), - unsafe_fixes: settings.unsafe_fixes, - file_resolver: settings.file_resolver, - linter: settings.linter, - formatter: settings.formatter, + settings, }), ); }