summaryrefslogtreecommitdiff
path: root/cli/lsp/language_server.rs
diff options
context:
space:
mode:
authorKitson Kelly <me@kitsonkelly.com>2021-01-27 07:50:13 +1100
committerGitHub <noreply@github.com>2021-01-27 07:50:13 +1100
commitada43cc56ac2e337cc034f8052d7e5da61268c34 (patch)
treeb8b5f95704695163db359f3d42c1da95cbed91d2 /cli/lsp/language_server.rs
parent43f4a23f89be19549f2e798c2eb0c59925861590 (diff)
fix(lsp): handle mbc properly when formatting (#9273)
Diffstat (limited to 'cli/lsp/language_server.rs')
-rw-r--r--cli/lsp/language_server.rs82
1 files changed, 80 insertions, 2 deletions
diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs
index 55ae92c00..b322438fa 100644
--- a/cli/lsp/language_server.rs
+++ b/cli/lsp/language_server.rs
@@ -669,7 +669,7 @@ impl Inner {
)
})?
.unwrap();
-
+ let line_index = self.documents.line_index(&specifier);
let file_path =
if let Ok(file_path) = params.text_document.uri.to_file_path() {
file_path
@@ -685,7 +685,9 @@ impl Inner {
// TODO(@kitsonk) this could be handled better in `cli/tools/fmt.rs` in the
// future.
match dprint::format_text(&file_path, &file_text, &config) {
- Ok(new_text) => Some(text::get_edits(&file_text, &new_text)),
+ Ok(new_text) => {
+ Some(text::get_edits(&file_text, &new_text, line_index))
+ }
Err(err) => {
warn!("Format error: {}", err);
None
@@ -702,6 +704,7 @@ impl Inner {
Ok(Some(text_edits))
}
} else {
+ self.client.show_message(MessageType::Warning, format!("Unable to format \"{}\". Likely due to unrecoverable syntax errors in the file.", specifier)).await;
Ok(None)
}
}
@@ -1525,6 +1528,81 @@ mod tests {
}
#[tokio::test]
+ async fn test_format_mbc() {
+ let mut harness = LspTestHarness::new(vec![
+ ("initialize_request.json", LspResponse::RequestAny),
+ ("initialized_notification.json", LspResponse::None),
+ ("did_open_notification_mbc_fmt.json", LspResponse::None),
+ (
+ "formatting_request_mbc_fmt.json",
+ LspResponse::Request(
+ 2,
+ json!([
+ {
+ "range": {
+ "start": {
+ "line": 0,
+ "character": 12
+ },
+ "end": {
+ "line": 0,
+ "character": 13,
+ }
+ },
+ "newText": "\""
+ },
+ {
+ "range": {
+ "start": {
+ "line": 0,
+ "character": 21
+ },
+ "end": {
+ "line": 0,
+ "character": 22
+ }
+ },
+ "newText": "\";"
+ },
+ {
+ "range": {
+ "start": {
+ "line": 1,
+ "character": 12,
+ },
+ "end": {
+ "line": 1,
+ "character": 13,
+ }
+ },
+ "newText": "\""
+ },
+ {
+ "range": {
+ "start": {
+ "line": 1,
+ "character": 23,
+ },
+ "end": {
+ "line": 1,
+ "character": 25,
+ }
+ },
+ "newText": "\");"
+ }
+ ]),
+ ),
+ ),
+ (
+ "shutdown_request.json",
+ LspResponse::Request(3, json!(null)),
+ ),
+ ("exit_notification.json", LspResponse::None),
+ ]);
+ harness.run().await;
+ }
+
+ #[tokio::test]
async fn test_large_doc_change() {
let mut harness = LspTestHarness::new(vec![
("initialize_request.json", LspResponse::RequestAny),