From 4b495da368162a5b373d078be4ff51e55bffdf69 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 21 May 2020 14:26:44 +0200 Subject: Transition OnEnter to WorkspaceSnippetEdit This also changes our handiling of snippet edits on the client side. `editor.insertSnippet` unfortunately forces indentation, which we really don't want to have to deal with. So, let's just implement our manual hacky way of dealing with a simple subset of snippets we actually use in rust-analyzer --- crates/ra_ide/src/typing/on_enter.rs | 29 +++++------ crates/rust-analyzer/src/lsp_ext.rs | 2 +- crates/rust-analyzer/src/main_loop/handlers.rs | 4 +- crates/rust-analyzer/tests/heavy_tests/main.rs | 68 +++++++++++--------------- 4 files changed, 44 insertions(+), 59 deletions(-) (limited to 'crates') diff --git a/crates/ra_ide/src/typing/on_enter.rs b/crates/ra_ide/src/typing/on_enter.rs index 78a40cc94..85be14ad3 100644 --- a/crates/ra_ide/src/typing/on_enter.rs +++ b/crates/ra_ide/src/typing/on_enter.rs @@ -38,17 +38,15 @@ pub(crate) fn on_enter(db: &RootDatabase, position: FilePosition) -> Option bool { @@ -84,7 +82,7 @@ fn node_indent(file: &SourceFile, token: &SyntaxToken) -> Option { #[cfg(test)] mod tests { - use test_utils::{add_cursor, assert_eq_text, extract_offset}; + use test_utils::{assert_eq_text, extract_offset}; use crate::mock_analysis::single_file; @@ -98,7 +96,6 @@ mod tests { assert_eq!(result.source_file_edits.len(), 1); let mut actual = before.to_string(); result.source_file_edits[0].edit.apply(&mut actual); - let actual = add_cursor(&actual, result.cursor_position.unwrap().offset); Some(actual) } @@ -121,7 +118,7 @@ fn foo() { ", r" /// Some docs -/// <|> +/// $0 fn foo() { } ", @@ -137,7 +134,7 @@ impl S { r" impl S { /// Some - /// <|> docs. + /// $0 docs. fn foo() {} } ", @@ -151,7 +148,7 @@ fn foo() { ", r" /// -/// <|> Some docs +/// $0 Some docs fn foo() { } ", @@ -175,7 +172,7 @@ fn main() { r" fn main() { // Fix - // <|> me + // $0 me let x = 1 + 1; } ", @@ -195,7 +192,7 @@ fn main() { r" fn main() { // Fix - // <|> + // $0 // me let x = 1 + 1; } diff --git a/crates/rust-analyzer/src/lsp_ext.rs b/crates/rust-analyzer/src/lsp_ext.rs index f75a26eb7..3c7bd609d 100644 --- a/crates/rust-analyzer/src/lsp_ext.rs +++ b/crates/rust-analyzer/src/lsp_ext.rs @@ -102,7 +102,7 @@ pub enum OnEnter {} impl Request for OnEnter { type Params = lsp_types::TextDocumentPositionParams; - type Result = Option; + type Result = Option; const METHOD: &'static str = "rust-analyzer/onEnter"; } diff --git a/crates/rust-analyzer/src/main_loop/handlers.rs b/crates/rust-analyzer/src/main_loop/handlers.rs index be6a0aece..fcf08cd79 100644 --- a/crates/rust-analyzer/src/main_loop/handlers.rs +++ b/crates/rust-analyzer/src/main_loop/handlers.rs @@ -159,12 +159,12 @@ pub fn handle_join_lines( pub fn handle_on_enter( world: WorldSnapshot, params: lsp_types::TextDocumentPositionParams, -) -> Result> { +) -> Result> { let _p = profile("handle_on_enter"); let position = from_proto::file_position(&world, params)?; match world.analysis().on_enter(position)? { None => Ok(None), - Some(source_change) => to_proto::source_change(&world, source_change).map(Some), + Some(source_change) => to_proto::snippet_workspace_edit(&world, source_change).map(Some), } } diff --git a/crates/rust-analyzer/tests/heavy_tests/main.rs b/crates/rust-analyzer/tests/heavy_tests/main.rs index 74676b3ee..4e94c37e1 100644 --- a/crates/rust-analyzer/tests/heavy_tests/main.rs +++ b/crates/rust-analyzer/tests/heavy_tests/main.rs @@ -474,27 +474,21 @@ fn main() {{}} position: Position { line: 0, character: 5 }, }, json!({ - "cursorPosition": { - "position": { "character": 4, "line": 1 }, - "textDocument": { "uri": "file:///[..]src/m0.rs" } - }, - "label": "On enter", - "workspaceEdit": { - "documentChanges": [ - { - "edits": [ - { - "newText": "\n/// ", - "range": { - "end": { "character": 5, "line": 0 }, - "start": { "character": 5, "line": 0 } - } + "documentChanges": [ + { + "edits": [ + { + "insertTextFormat": 2, + "newText": "\n/// $0", + "range": { + "end": { "character": 5, "line": 0 }, + "start": { "character": 5, "line": 0 } } - ], - "textDocument": { "uri": "file:///[..]src/m0.rs", "version": null } - } - ] - } + } + ], + "textDocument": { "uri": "file:///[..]src/m0.rs", "version": null } + } + ] }), ); let elapsed = start.elapsed(); @@ -526,27 +520,21 @@ version = \"0.0.0\" position: Position { line: 0, character: 8 }, }, json!({ - "cursorPosition": { - "position": { "line": 1, "character": 4 }, - "textDocument": { "uri": "file:///[..]src/main.rs" } - }, - "label": "On enter", - "workspaceEdit": { - "documentChanges": [ - { - "edits": [ - { - "newText": "\r\n/// ", - "range": { - "end": { "line": 0, "character": 8 }, - "start": { "line": 0, "character": 8 } - } + "documentChanges": [ + { + "edits": [ + { + "insertTextFormat": 2, + "newText": "\r\n/// $0", + "range": { + "end": { "line": 0, "character": 8 }, + "start": { "line": 0, "character": 8 } } - ], - "textDocument": { "uri": "file:///[..]src/main.rs", "version": null } - } - ] - } + } + ], + "textDocument": { "uri": "file:///[..]src/main.rs", "version": null } + } + ] }), ); } -- cgit v1.2.3