mirror of
https://github.com/denoland/deno.git
synced 2024-11-21 15:04:11 -05:00
fix(lsp): apply import fix to missing declaration code action (#23924)
This commit is contained in:
parent
ddb5449f42
commit
cc8c0609eb
7 changed files with 185 additions and 3 deletions
24
cli/jsr.rs
24
cli/jsr.rs
|
@ -111,12 +111,32 @@ impl JsrCacheResolver {
|
|||
) -> Option<String> {
|
||||
let info = self.package_version_info(nv)?;
|
||||
let path = path.strip_prefix("./").unwrap_or(path);
|
||||
let mut sloppy_fallback = None;
|
||||
for (export, path_) in info.exports() {
|
||||
if path_.strip_prefix("./").unwrap_or(path_) == path {
|
||||
let path_ = path_.strip_prefix("./").unwrap_or(path_);
|
||||
if path_ == path {
|
||||
return Some(export.strip_prefix("./").unwrap_or(export).to_string());
|
||||
}
|
||||
// TSC in some cases will suggest a `.js` import path for a `.d.ts` source
|
||||
// file.
|
||||
if sloppy_fallback.is_none() {
|
||||
let path = path
|
||||
.strip_suffix(".js")
|
||||
.or_else(|| path.strip_suffix(".mjs"))
|
||||
.or_else(|| path.strip_suffix(".cjs"))
|
||||
.unwrap_or(path);
|
||||
let path_ = path_
|
||||
.strip_suffix(".d.ts")
|
||||
.or_else(|| path_.strip_suffix(".d.mts"))
|
||||
.or_else(|| path_.strip_suffix(".d.cts"))
|
||||
.unwrap_or(path_);
|
||||
if path_ == path {
|
||||
sloppy_fallback =
|
||||
Some(export.strip_prefix("./").unwrap_or(export).to_string());
|
||||
}
|
||||
}
|
||||
}
|
||||
None
|
||||
sloppy_fallback
|
||||
}
|
||||
|
||||
pub fn lookup_req_for_nv(&self, nv: &PackageNv) -> Option<PackageReq> {
|
||||
|
|
|
@ -544,7 +544,10 @@ fn fix_ts_import_action(
|
|||
action: &tsc::CodeFixAction,
|
||||
import_mapper: &TsResponseImportMapper,
|
||||
) -> Result<tsc::CodeFixAction, AnyError> {
|
||||
if action.fix_name == "import" {
|
||||
if matches!(
|
||||
action.fix_name.as_str(),
|
||||
"import" | "fixMissingFunctionDeclaration"
|
||||
) {
|
||||
let change = action
|
||||
.changes
|
||||
.first()
|
||||
|
|
|
@ -5364,6 +5364,126 @@ fn lsp_jsr_auto_import_completion_import_map() {
|
|||
client.shutdown();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lsp_jsr_code_action_missing_declaration() {
|
||||
let context = TestContextBuilder::new()
|
||||
.use_http_server()
|
||||
.use_temp_cwd()
|
||||
.build();
|
||||
let temp_dir = context.temp_dir();
|
||||
let file = source_file(
|
||||
temp_dir.path().join("file.ts"),
|
||||
r#"
|
||||
import { someFunction } from "jsr:@denotest/types-file";
|
||||
assertReturnType(someFunction());
|
||||
"#,
|
||||
);
|
||||
let mut client = context.new_lsp_command().build();
|
||||
client.initialize_default();
|
||||
client.write_request(
|
||||
"workspace/executeCommand",
|
||||
json!({
|
||||
"command": "deno.cache",
|
||||
"arguments": [[], file.uri()],
|
||||
}),
|
||||
);
|
||||
client.did_open_file(&file);
|
||||
let res = client.write_request(
|
||||
"textDocument/codeAction",
|
||||
json!({
|
||||
"textDocument": {
|
||||
"uri": file.uri(),
|
||||
},
|
||||
"range": {
|
||||
"start": { "line": 2, "character": 6 },
|
||||
"end": { "line": 2, "character": 22 },
|
||||
},
|
||||
"context": {
|
||||
"diagnostics": [
|
||||
{
|
||||
"range": {
|
||||
"start": { "line": 2, "character": 6 },
|
||||
"end": { "line": 2, "character": 22 },
|
||||
},
|
||||
"severity": 8,
|
||||
"code": 2304,
|
||||
"source": "deno-ts",
|
||||
"message": "Cannot find name 'assertReturnType'.",
|
||||
"relatedInformation": [],
|
||||
},
|
||||
],
|
||||
"only": ["quickfix"],
|
||||
},
|
||||
}),
|
||||
);
|
||||
assert_eq!(
|
||||
res,
|
||||
json!([
|
||||
{
|
||||
"title": "Add missing function declaration 'assertReturnType'",
|
||||
"kind": "quickfix",
|
||||
"diagnostics": [
|
||||
{
|
||||
"range": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"character": 6,
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"character": 22,
|
||||
},
|
||||
},
|
||||
"severity": 8,
|
||||
"code": 2304,
|
||||
"source": "deno-ts",
|
||||
"message": "Cannot find name 'assertReturnType'.",
|
||||
"relatedInformation": [],
|
||||
},
|
||||
],
|
||||
"edit": {
|
||||
"documentChanges": [
|
||||
{
|
||||
"textDocument": {
|
||||
"uri": file.uri(),
|
||||
"version": 1,
|
||||
},
|
||||
"edits": [
|
||||
{
|
||||
"range": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"character": 6,
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"character": 6,
|
||||
},
|
||||
},
|
||||
"newText": "import { ReturnType } from \"jsr:@denotest/types-file/types\";\n",
|
||||
},
|
||||
{
|
||||
"range": {
|
||||
"start": {
|
||||
"line": 3,
|
||||
"character": 0,
|
||||
},
|
||||
"end": {
|
||||
"line": 3,
|
||||
"character": 0,
|
||||
},
|
||||
},
|
||||
"newText": "\n function assertReturnType(arg0: ReturnType) {\n throw new Error(\"Function not implemented.\");\n }\n",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
])
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lsp_code_actions_deno_cache_npm() {
|
||||
let context = TestContextBuilder::new().use_temp_cwd().build();
|
||||
|
|
5
tests/registry/jsr/@denotest/types-file/1.0.0/mod.ts
Normal file
5
tests/registry/jsr/@denotest/types-file/1.0.0/mod.ts
Normal file
|
@ -0,0 +1,5 @@
|
|||
import type { ReturnType } from "./types.d.ts";
|
||||
|
||||
export function someFunction(): ReturnType {
|
||||
return {};
|
||||
}
|
1
tests/registry/jsr/@denotest/types-file/1.0.0/types.d.ts
vendored
Normal file
1
tests/registry/jsr/@denotest/types-file/1.0.0/types.d.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
export interface ReturnType {}
|
28
tests/registry/jsr/@denotest/types-file/1.0.0_meta.json
Normal file
28
tests/registry/jsr/@denotest/types-file/1.0.0_meta.json
Normal file
|
@ -0,0 +1,28 @@
|
|||
{
|
||||
"exports": {
|
||||
".": "./mod.ts",
|
||||
"./types": "./types.d.ts"
|
||||
},
|
||||
"moduleGraph1": {
|
||||
"/types.d.ts": {},
|
||||
"/mod.ts": {
|
||||
"dependencies": [
|
||||
{
|
||||
"type": "static",
|
||||
"kind": "importType",
|
||||
"specifier": "./types.d.ts",
|
||||
"specifierRange": [
|
||||
[
|
||||
0,
|
||||
42
|
||||
],
|
||||
[
|
||||
0,
|
||||
46
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
5
tests/registry/jsr/@denotest/types-file/meta.json
Normal file
5
tests/registry/jsr/@denotest/types-file/meta.json
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"versions": {
|
||||
"1.0.0": {}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue