From 728d205d9d2551a356a022b6b083bcdcf081f3bf Mon Sep 17 00:00:00 2001 From: Jean Pierre Date: Thu, 5 Aug 2021 20:46:32 -0500 Subject: feat(lsp): implement refactoring code actions (#11555) Closes: denoland/vscode_deno#433 --- cli/tests/integration/lsp_tests.rs | 39 +++++ cli/tests/lsp/code_action_params_refactor.json | 21 +++ .../lsp/code_action_resolve_params_refactor.json | 20 +++ .../lsp/code_action_resolve_response_refactor.json | 58 ++++++++ cli/tests/lsp/code_action_response_refactor.json | 157 +++++++++++++++++++++ 5 files changed, 295 insertions(+) create mode 100644 cli/tests/lsp/code_action_params_refactor.json create mode 100644 cli/tests/lsp/code_action_resolve_params_refactor.json create mode 100644 cli/tests/lsp/code_action_resolve_response_refactor.json create mode 100644 cli/tests/lsp/code_action_response_refactor.json (limited to 'cli/tests') diff --git a/cli/tests/integration/lsp_tests.rs b/cli/tests/integration/lsp_tests.rs index 8bf019aa7..e66b59c2b 100644 --- a/cli/tests/integration/lsp_tests.rs +++ b/cli/tests/integration/lsp_tests.rs @@ -2115,6 +2115,45 @@ fn lsp_code_actions_imports() { shutdown(&mut client); } +#[test] +fn lsp_code_actions_refactor() { + let mut client = init("initialize_params.json"); + did_open( + &mut client, + json!({ + "textDocument": { + "uri": "file:///a/file.ts", + "languageId": "typescript", + "version": 1, + "text": "var x: { a?: number; b?: string } = {};\n" + } + }), + ); + let (maybe_res, maybe_err) = client + .write_request( + "textDocument/codeAction", + load_fixture("code_action_params_refactor.json"), + ) + .unwrap(); + assert!(maybe_err.is_none()); + assert_eq!( + maybe_res, + Some(load_fixture("code_action_response_refactor.json")) + ); + let (maybe_res, maybe_err) = client + .write_request( + "codeAction/resolve", + load_fixture("code_action_resolve_params_refactor.json"), + ) + .unwrap(); + assert!(maybe_err.is_none()); + assert_eq!( + maybe_res, + Some(load_fixture("code_action_resolve_response_refactor.json")) + ); + shutdown(&mut client); +} + #[test] fn lsp_code_actions_deadlock() { let mut client = init("initialize_params.json"); diff --git a/cli/tests/lsp/code_action_params_refactor.json b/cli/tests/lsp/code_action_params_refactor.json new file mode 100644 index 000000000..9fe359498 --- /dev/null +++ b/cli/tests/lsp/code_action_params_refactor.json @@ -0,0 +1,21 @@ +{ + "textDocument": { + "uri": "file:///a/file.ts" + }, + "range": { + "start": { + "line": 0, + "character": 7 + }, + "end": { + "line": 0, + "character": 33 + } + }, + "context": { + "diagnostics": [], + "only": [ + "refactor" + ] + } +} diff --git a/cli/tests/lsp/code_action_resolve_params_refactor.json b/cli/tests/lsp/code_action_resolve_params_refactor.json new file mode 100644 index 000000000..d4bb3bd81 --- /dev/null +++ b/cli/tests/lsp/code_action_resolve_params_refactor.json @@ -0,0 +1,20 @@ +{ + "title": "Extract to interface", + "kind": "refactor.extract.interface", + "isPreferred": true, + "data": { + "specifier": "file:///a/file.ts", + "range": { + "start": { + "line": 0, + "character": 7 + }, + "end": { + "line": 0, + "character": 33 + } + }, + "refactorName": "Extract type", + "actionName": "Extract to interface" + } +} diff --git a/cli/tests/lsp/code_action_resolve_response_refactor.json b/cli/tests/lsp/code_action_resolve_response_refactor.json new file mode 100644 index 000000000..721a76a6b --- /dev/null +++ b/cli/tests/lsp/code_action_resolve_response_refactor.json @@ -0,0 +1,58 @@ +{ + "title": "Extract to interface", + "kind": "refactor.extract.interface", + "edit": { + "documentChanges": [ + { + "textDocument": { + "uri": "file:///a/file.ts", + "version": 1 + }, + "edits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "interface NewType {\n a?: number;\n b?: string;\n}\n\n" + }, + { + "range": { + "start": { + "line": 0, + "character": 7 + }, + "end": { + "line": 0, + "character": 33 + } + }, + "newText": "NewType" + } + ] + } + ] + }, + "isPreferred": true, + "data": { + "specifier": "file:///a/file.ts", + "range": { + "start": { + "line": 0, + "character": 7 + }, + "end": { + "line": 0, + "character": 33 + } + }, + "refactorName": "Extract type", + "actionName": "Extract to interface" + } +} diff --git a/cli/tests/lsp/code_action_response_refactor.json b/cli/tests/lsp/code_action_response_refactor.json new file mode 100644 index 000000000..87f354e37 --- /dev/null +++ b/cli/tests/lsp/code_action_response_refactor.json @@ -0,0 +1,157 @@ +[ + { + "title": "Extract to type alias", + "kind": "refactor.extract.type", + "isPreferred": true, + "data": { + "specifier": "file:///a/file.ts", + "range": { + "start": { + "line": 0, + "character": 7 + }, + "end": { + "line": 0, + "character": 33 + } + }, + "refactorName": "Extract type", + "actionName": "Extract to type alias" + } + }, + { + "title": "Extract to interface", + "kind": "refactor.extract.interface", + "isPreferred": true, + "data": { + "specifier": "file:///a/file.ts", + "range": { + "start": { + "line": 0, + "character": 7 + }, + "end": { + "line": 0, + "character": 33 + } + }, + "refactorName": "Extract type", + "actionName": "Extract to interface" + } + }, + { + "title": "Extract function", + "kind": "refactor.extract.function", + "isPreferred": false, + "disabled": { + "reason": "Statement or expression expected." + }, + "data": { + "specifier": "file:///a/file.ts", + "range": { + "start": { + "line": 0, + "character": 7 + }, + "end": { + "line": 0, + "character": 33 + } + }, + "refactorName": "Extract Symbol", + "actionName": "Extract Function" + } + }, + { + "title": "Extract constant", + "kind": "refactor.extract.constant", + "isPreferred": false, + "disabled": { + "reason": "Statement or expression expected." + }, + "data": { + "specifier": "file:///a/file.ts", + "range": { + "start": { + "line": 0, + "character": 7 + }, + "end": { + "line": 0, + "character": 33 + } + }, + "refactorName": "Extract Symbol", + "actionName": "Extract Constant" + } + }, + { + "title": "Convert default export to named export", + "kind": "refactor.rewrite.export.named", + "isPreferred": false, + "disabled": { + "reason": "Could not find export statement" + }, + "data": { + "specifier": "file:///a/file.ts", + "range": { + "start": { + "line": 0, + "character": 7 + }, + "end": { + "line": 0, + "character": 33 + } + }, + "refactorName": "Convert export", + "actionName": "Convert default export to named export" + } + }, + { + "title": "Convert named export to default export", + "kind": "refactor.rewrite.export.default", + "isPreferred": false, + "disabled": { + "reason": "Could not find export statement" + }, + "data": { + "specifier": "file:///a/file.ts", + "range": { + "start": { + "line": 0, + "character": 7 + }, + "end": { + "line": 0, + "character": 33 + } + }, + "refactorName": "Convert export", + "actionName": "Convert named export to default export" + } + }, + { + "title": "Convert namespace import to named imports", + "kind": "refactor.rewrite.import.named", + "isPreferred": false, + "disabled": { + "reason": "Selection is not an import declaration." + }, + "data": { + "specifier": "file:///a/file.ts", + "range": { + "start": { + "line": 0, + "character": 7 + }, + "end": { + "line": 0, + "character": 33 + } + }, + "refactorName": "Convert import", + "actionName": "Convert namespace import to named imports" + } + } +] -- cgit v1.2.3