-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
format_range.rs
84 lines (74 loc) · 2.73 KB
/
format_range.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
use lsp_types::{self as types, request as req, Range};
use ruff_workspace::resolver::match_any_exclusion;
use crate::edit::{RangeExt, ToRangeExt};
use crate::server::api::LSPResult;
use crate::server::{client::Notifier, Result};
use crate::session::{DocumentQuery, DocumentSnapshot};
use crate::{PositionEncoding, TextDocument};
pub(crate) struct FormatRange;
impl super::RequestHandler for FormatRange {
type RequestType = req::RangeFormatting;
}
impl super::BackgroundDocumentRequestHandler for FormatRange {
super::define_document_url!(params: &types::DocumentRangeFormattingParams);
fn run_with_snapshot(
snapshot: DocumentSnapshot,
_notifier: Notifier,
params: types::DocumentRangeFormattingParams,
) -> Result<super::FormatResponse> {
format_document_range(&snapshot, params.range)
}
}
/// Formats the specified [`Range`] in the [`DocumentSnapshot`].
fn format_document_range(
snapshot: &DocumentSnapshot,
range: Range,
) -> Result<super::FormatResponse> {
let text_document = snapshot
.query()
.as_single_document()
.expect("format should only be called on text documents or notebook cells");
let query = snapshot.query();
format_text_document_range(text_document, range, query, snapshot.encoding())
}
/// Formats the specified [`Range`] in the [`TextDocument`].
fn format_text_document_range(
text_document: &TextDocument,
range: Range,
query: &DocumentQuery,
encoding: PositionEncoding,
) -> Result<super::FormatResponse> {
let file_resolver_settings = query.settings().file_resolver();
let formatter_settings = query.settings().formatter();
// If the document is excluded, return early.
if let Some(file_path) = query.file_path() {
if let Some(exclusion) = match_any_exclusion(
&file_path,
&file_resolver_settings.exclude,
&file_resolver_settings.extend_exclude,
None,
Some(&formatter_settings.exclude),
) {
tracing::debug!("Ignored path via `{}`: {}", exclusion, file_path.display());
return Ok(None);
}
}
let text = text_document.contents();
let index = text_document.index();
let range = range.to_text_range(text, index, encoding);
let formatted_range = crate::format::format_range(
text_document,
query.source_type(),
formatter_settings,
range,
)
.with_failure_code(lsp_server::ErrorCode::InternalError)?;
Ok(formatted_range.map(|formatted_range| {
vec![types::TextEdit {
range: formatted_range
.source_range()
.to_range(text, index, encoding),
new_text: formatted_range.into_code(),
}]
}))
}