1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-24 15:19:26 -05:00

fix(lsp): import map lookup for jsr subpath auto import (#25025)

This commit is contained in:
Nayeem Rahman 2024-08-14 22:38:18 +01:00 committed by GitHub
parent 3a3315cc7f
commit 4eff1e8ec4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 86 additions and 2 deletions

View file

@ -312,6 +312,16 @@ impl<'a> TsResponseImportMapper<'a> {
if let Some(result) = import_map.lookup(&specifier, referrer) {
return Some(result);
}
if let Some(req_ref_str) = specifier.as_str().strip_prefix("jsr:") {
if !req_ref_str.starts_with('/') {
let specifier_str = format!("jsr:/{req_ref_str}");
if let Ok(specifier) = ModuleSpecifier::parse(&specifier_str) {
if let Some(result) = import_map.lookup(&specifier, referrer) {
return Some(result);
}
}
}
}
}
return Some(spec_str);
}

View file

@ -5482,6 +5482,80 @@ fn lsp_jsr_auto_import_completion_import_map() {
client.shutdown();
}
#[test]
fn lsp_jsr_auto_import_completion_import_map_sub_path() {
let context = TestContextBuilder::new()
.use_http_server()
.use_temp_cwd()
.build();
let temp_dir = context.temp_dir();
temp_dir.write(
"deno.json",
json!({
"imports": {
"@std/path": "jsr:@std/path@^0.220.1",
},
})
.to_string(),
);
let file = source_file(
temp_dir.path().join("file.ts"),
r#"
// Adds jsr:@std/path@^0.220.1/normalize to the module graph.
import "jsr:@std/url@^0.220.1/normalize";
normalize
"#,
);
let mut client = context.new_lsp_command().build();
client.initialize_default();
client.write_request(
"workspace/executeCommand",
json!({
"command": "deno.cache",
"arguments": [[], file.uri()],
}),
);
client.read_diagnostics();
client.did_open_file(&file);
let list = client.get_completion_list(
file.uri(),
(3, 15),
json!({ "triggerKind": 1 }),
);
let item = list
.items
.iter()
.find(|i| {
i.label == "normalize"
&& json!(&i.label_details)
.to_string()
.contains("\"@std/path/posix/normalize\"")
})
.unwrap();
let res = client.write_request("completionItem/resolve", json!(item));
assert_eq!(
res,
json!({
"label": "normalize",
"labelDetails": { "description": "@std/path/posix/normalize" },
"kind": 3,
"detail": "function normalize(path: string): string",
"documentation": { "kind": "markdown", "value": "Normalize the `path`, resolving `'..'` and `'.'` segments.\nNote that resolving these segments does not necessarily mean that all will be eliminated.\nA `'..'` at the top-level will be preserved, and an empty path is canonically `'.'`.\n\n*@param* - path to be normalized" },
"sortText": "\u{ffff}16_0",
"additionalTextEdits": [
{
"range": {
"start": { "line": 2, "character": 6 },
"end": { "line": 2, "character": 6 },
},
"newText": "import { normalize } from \"@std/path/posix/normalize\";\n",
},
],
}),
);
client.shutdown();
}
#[test]
fn lsp_jsr_code_action_missing_declaration() {
let context = TestContextBuilder::new()

View file

@ -1,7 +1,7 @@
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
// This module is browser compatible.
import { join as posixJoin } from "jsr:/@std/path@^0.220.1/posix/join";
import { join as posixJoin } from "jsr:@std/path@^0.220.1/posix/join";
/**
* Join a base `URL` and a series of `paths`, then normalizes the resulting URL.

View file

@ -1,7 +1,7 @@
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
// This module is browser compatible.
import { normalize as posixNormalize } from "jsr:/@std/path@^0.220.1/posix/normalize";
import { normalize as posixNormalize } from "jsr:@std/path@^0.220.1/posix/normalize";
/**
* Normalize the `URL`, resolving `'..'` and `'.'` segments and multiple