summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNayeem Rahman <nayeemrmn99@gmail.com>2024-06-12 22:22:57 +0100
committerGitHub <noreply@github.com>2024-06-12 22:22:57 +0100
commitb30e5c09859000896a0caf52e78b0cbdb58955ef (patch)
tree49279398226125675bfecbfe6b180bd731a06ee0
parent1d290ccc2a39d355aa0e43e86f5f4ce09a0bd655 (diff)
fix(lsp): strip .js before probing for valid import fix (#24188)
-rw-r--r--cli/lsp/analysis.rs6
-rw-r--r--tests/integration/lsp_tests.rs72
2 files changed, 77 insertions, 1 deletions
diff --git a/cli/lsp/analysis.rs b/cli/lsp/analysis.rs
index 62feeb602..8480f6e1d 100644
--- a/cli/lsp/analysis.rs
+++ b/cli/lsp/analysis.rs
@@ -76,7 +76,10 @@ static PREFERRED_FIXES: Lazy<HashMap<&'static str, (u32, bool)>> =
static IMPORT_SPECIFIER_RE: Lazy<Regex> =
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 944285293..713594a10 100644
--- a/tests/integration/lsp_tests.rs
+++ b/tests/integration/lsp_tests.rs
@@ -6072,6 +6072,78 @@ export class DuckConfig {
}
#[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();
let mut client = context.new_lsp_command().build();