1
0
Fork 0
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:
Nayeem Rahman 2024-05-21 21:15:16 +01:00 committed by GitHub
parent ddb5449f42
commit cc8c0609eb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 185 additions and 3 deletions

View file

@ -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> {

View file

@ -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()

View file

@ -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();

View file

@ -0,0 +1,5 @@
import type { ReturnType } from "./types.d.ts";
export function someFunction(): ReturnType {
return {};
}

View file

@ -0,0 +1 @@
export interface ReturnType {}

View 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
]
]
}
]
}
}
}

View file

@ -0,0 +1,5 @@
{
"versions": {
"1.0.0": {}
}
}