From 5bc78de8086fed2e79950e38b5de47d1c0e002ef Mon Sep 17 00:00:00 2001 From: Nayeem Rahman Date: Wed, 12 Jun 2024 22:22:57 +0100 Subject: [PATCH] fix(lsp): strip .js before probing for valid import fix (#24188) --- cli/lsp/analysis.rs | 6 ++- tests/integration/lsp_tests.rs | 72 ++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/cli/lsp/analysis.rs b/cli/lsp/analysis.rs index 62feeb602e..8480f6e1de 100644 --- a/cli/lsp/analysis.rs +++ b/cli/lsp/analysis.rs @@ -76,7 +76,10 @@ static PREFERRED_FIXES: Lazy> = static IMPORT_SPECIFIER_RE: Lazy = lazy_regex::lazy_regex!(r#"\sfrom\s+["']([^"']*)["']"#); -const SUPPORTED_EXTENSIONS: &[&str] = &[".ts", ".tsx", ".js", ".jsx", ".mjs"]; +const SUPPORTED_EXTENSIONS: &[&str] = &[ + ".ts", ".tsx", ".js", ".jsx", ".mjs", ".mts", ".cjs", ".cts", ".d.ts", + ".d.mts", ".d.cts", +]; #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct DataQuickFixChange { @@ -436,6 +439,7 @@ impl<'a> TsResponseImportMapper<'a> { return Some(specifier); } } + let specifier = specifier.strip_suffix(".js").unwrap_or(specifier); for ext in SUPPORTED_EXTENSIONS { let specifier_with_ext = format!("{specifier}{ext}"); if self diff --git a/tests/integration/lsp_tests.rs b/tests/integration/lsp_tests.rs index 9442852930..713594a105 100644 --- a/tests/integration/lsp_tests.rs +++ b/tests/integration/lsp_tests.rs @@ -6071,6 +6071,78 @@ export class DuckConfig { client.shutdown(); } +#[test] +fn lsp_code_actions_imports_dts() { + let context = TestContextBuilder::new().use_temp_cwd().build(); + let temp_dir = context.temp_dir(); + source_file( + temp_dir.path().join("decl.d.ts"), + "export type SomeType = 1;\n", + ); + let mut client = context.new_lsp_command().build(); + client.initialize_default(); + let diagnostics = client.did_open(json!({ + "textDocument": { + "uri": temp_dir.uri().join("file.ts").unwrap(), + "languageId": "typescript", + "version": 1, + "text": r#" + const a: SomeType = 1; + console.log(a); + "#, + } + })); + let res = client.write_request( + "textDocument/codeAction", + json!({ + "textDocument": { + "uri": temp_dir.uri().join("file.ts").unwrap(), + }, + "range": { + "start": { "line": 1, "character": 17 }, + "end": { "line": 1, "character": 25 }, + }, + "context": { + "diagnostics": diagnostics.all(), + "only": ["quickfix"], + }, + }), + ); + assert_eq!( + res, + json!([{ + "title": "Add import from \"./decl.d.ts\"", + "kind": "quickfix", + "diagnostics": [{ + "range": { + "start": { "line": 1, "character": 17 }, + "end": { "line": 1, "character": 25 }, + }, + "severity": 1, + "code": 2304, + "source": "deno-ts", + "message": "Cannot find name 'SomeType'.", + }], + "edit": { + "documentChanges": [{ + "textDocument": { + "uri": temp_dir.uri().join("file.ts").unwrap(), + "version": 1, + }, + "edits": [{ + "range": { + "start": { "line": 0, "character": 0 }, + "end": { "line": 0, "character": 0 }, + }, + "newText": "import { SomeType } from \"./decl.d.ts\";\n", + }], + }], + }, + }]) + ); + client.shutdown(); +} + #[test] fn lsp_code_actions_refactor() { let context = TestContextBuilder::new().use_temp_cwd().build();