mirror of
https://github.com/denoland/deno.git
synced 2024-11-21 15:04:11 -05:00
fix(lsp): import map lookup for jsr subpath auto import (#25025)
This commit is contained in:
parent
3a3315cc7f
commit
4eff1e8ec4
4 changed files with 86 additions and 2 deletions
|
@ -312,6 +312,16 @@ impl<'a> TsResponseImportMapper<'a> {
|
||||||
if let Some(result) = import_map.lookup(&specifier, referrer) {
|
if let Some(result) = import_map.lookup(&specifier, referrer) {
|
||||||
return Some(result);
|
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);
|
return Some(spec_str);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5482,6 +5482,80 @@ fn lsp_jsr_auto_import_completion_import_map() {
|
||||||
client.shutdown();
|
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]
|
#[test]
|
||||||
fn lsp_jsr_code_action_missing_declaration() {
|
fn lsp_jsr_code_action_missing_declaration() {
|
||||||
let context = TestContextBuilder::new()
|
let context = TestContextBuilder::new()
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
||||||
// This module is browser compatible.
|
// 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.
|
* Join a base `URL` and a series of `paths`, then normalizes the resulting URL.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
||||||
// This module is browser compatible.
|
// 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
|
* Normalize the `URL`, resolving `'..'` and `'.'` segments and multiple
|
||||||
|
|
Loading…
Reference in a new issue