fix(lsp): remove redirect diagnostic (#28988)

This commit is contained in:
Nayeem Rahman 2025-04-21 19:14:00 +01:00 committed by GitHub
parent 104514b06d
commit d26be98377
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 0 additions and 204 deletions

View file

@ -1191,12 +1191,6 @@ pub enum DenoDiagnostic {
NotInstalledNpm(PackageReq, ModuleSpecifier),
/// A local module was not found on the local file system.
NoLocal(ModuleSpecifier),
/// The specifier resolved to a remote specifier that was redirected to
/// another specifier.
Redirect {
from: ModuleSpecifier,
to: ModuleSpecifier,
},
/// An error occurred when resolving the specifier string.
ResolutionError(deno_graph::ResolutionError),
/// Invalid `node:` specifier.
@ -1216,7 +1210,6 @@ impl DenoDiagnostic {
Self::NotInstalledJsr(_, _) => "not-installed-jsr",
Self::NotInstalledNpm(_, _) => "not-installed-npm",
Self::NoLocal(_) => "no-local",
Self::Redirect { .. } => "redirect",
Self::ResolutionError(err) => {
if graph_util::get_resolution_error_bare_node_specifier(err).is_some() {
"import-node-prefix-missing"
@ -1469,7 +1462,6 @@ impl DenoDiagnostic {
});
(lsp::DiagnosticSeverity::ERROR, no_local_message(specifier, sloppy_resolution.as_ref().map(|(resolved, sloppy_reason)| sloppy_reason.suggestion_message_for_specifier(resolved))), data)
},
Self::Redirect { from, to} => (lsp::DiagnosticSeverity::INFORMATION, format!("The import of \"{from}\" was redirected to \"{to}\"."), Some(json!({ "specifier": from, "redirect": to }))),
Self::ResolutionError(err) => {
let mut message;
message = enhanced_resolution_error_message(err);
@ -1589,32 +1581,6 @@ fn diagnose_resolution(
referrer_module: &DocumentModule,
import_map: Option<&ImportMap>,
) -> (Vec<DenoDiagnostic>, Vec<DenoDiagnostic>) {
fn check_redirect_diagnostic(
specifier: &ModuleSpecifier,
module: &DocumentModule,
) -> Option<DenoDiagnostic> {
// If the module was redirected, we want to issue an informational
// diagnostic that indicates this. This then allows us to issue a code
// action to replace the specifier with the final redirected one.
if specifier.scheme() == "jsr" || specifier == module.specifier.as_ref() {
return None;
}
// don't bother warning about sloppy import redirects from .js to .d.ts
// because explaining how to fix this via a diagnostic involves using
// @ts-types and that's a bit complicated to explain
let is_sloppy_import_dts_redirect = module.specifier.scheme() == "file"
&& module.media_type.is_declaration()
&& !MediaType::from_specifier(specifier).is_declaration();
if is_sloppy_import_dts_redirect {
return None;
}
Some(DenoDiagnostic::Redirect {
from: specifier.clone(),
to: module.specifier.as_ref().clone(),
})
}
let mut diagnostics = vec![];
let mut deferred_diagnostics = vec![];
match resolution {
@ -1639,10 +1605,6 @@ fn diagnose_resolution(
diagnostics.push(DenoDiagnostic::DenoWarn(message.clone()));
}
}
if let Some(diagnostic) = check_redirect_diagnostic(specifier, &module)
{
diagnostics.push(diagnostic);
}
if module.media_type == MediaType::Json {
match maybe_assert_type {
// The module has the correct assertion type, no diagnostic

View file

@ -1,7 +1,6 @@
// Copyright 2018-2025 the Deno authors. MIT license.
use std::fs;
use std::str::FromStr;
use ntest_timeout::timeout;
use pretty_assertions::assert_eq;
@ -10875,171 +10874,6 @@ fn lsp_npmrc() {
client.shutdown();
}
#[test]
#[timeout(300_000)]
fn lsp_diagnostics_warn_redirect() {
let context = TestContextBuilder::new()
.use_http_server()
.use_temp_cwd()
.build();
let mut client = context.new_lsp_command().build();
client.initialize_default();
client.did_open(
json!({
"textDocument": {
"uri": "file:///a/file.ts",
"languageId": "typescript",
"version": 1,
"text": "import * as a from \"http://127.0.0.1:4545/x_deno_warning.js\";\n\nconsole.log(a)\n",
},
}),
);
client.write_request(
"workspace/executeCommand",
json!({
"command": "deno.cache",
"arguments": [
["http://127.0.0.1:4545/x_deno_warning.js"],
"file:///a/file.ts",
],
}),
);
let diagnostics = client.read_diagnostics();
assert_eq!(
diagnostics.messages_with_source("deno"),
lsp::PublishDiagnosticsParams {
uri: lsp::Uri::from_str("file:///a/file.ts").unwrap(),
diagnostics: vec![
lsp::Diagnostic {
range: lsp::Range {
start: lsp::Position {
line: 0,
character: 19
},
end: lsp::Position {
line: 0,
character: 60
}
},
severity: Some(lsp::DiagnosticSeverity::WARNING),
code: Some(lsp::NumberOrString::String("deno-warn".to_string())),
source: Some("deno".to_string()),
message: "foobar".to_string(),
..Default::default()
},
lsp::Diagnostic {
range: lsp::Range {
start: lsp::Position {
line: 0,
character: 19
},
end: lsp::Position {
line: 0,
character: 60
}
},
severity: Some(lsp::DiagnosticSeverity::INFORMATION),
code: Some(lsp::NumberOrString::String("redirect".to_string())),
source: Some("deno".to_string()),
message: "The import of \"http://127.0.0.1:4545/x_deno_warning.js\" was redirected to \"http://127.0.0.1:4545/lsp/x_deno_warning_redirect.js\".".to_string(),
data: Some(json!({"specifier": "http://127.0.0.1:4545/x_deno_warning.js", "redirect": "http://127.0.0.1:4545/lsp/x_deno_warning_redirect.js"})),
..Default::default()
}
],
version: Some(1),
}
);
client.shutdown();
}
#[test]
#[timeout(300_000)]
fn lsp_redirect_quick_fix() {
let context = TestContextBuilder::new()
.use_http_server()
.use_temp_cwd()
.build();
let mut client = context.new_lsp_command().build();
client.initialize_default();
client.did_open(
json!({
"textDocument": {
"uri": "file:///a/file.ts",
"languageId": "typescript",
"version": 1,
"text": "import * as a from \"http://127.0.0.1:4545/x_deno_warning.js\";\n\nconsole.log(a)\n",
},
}),
);
client.write_request(
"workspace/executeCommand",
json!({
"command": "deno.cache",
"arguments": [
["http://127.0.0.1:4545/x_deno_warning.js"],
"file:///a/file.ts",
],
}),
);
let diagnostics = client
.read_diagnostics()
.messages_with_source("deno")
.diagnostics;
let res = client.write_request(
"textDocument/codeAction",
json!(json!({
"textDocument": {
"uri": "file:///a/file.ts"
},
"range": {
"start": { "line": 0, "character": 19 },
"end": { "line": 0, "character": 60 }
},
"context": {
"diagnostics": diagnostics,
"only": ["quickfix"]
}
})),
);
assert_eq!(
res,
json!([{
"title": "Update specifier to its redirected specifier.",
"kind": "quickfix",
"diagnostics": [
{
"range": {
"start": { "line": 0, "character": 19 },
"end": { "line": 0, "character": 60 }
},
"severity": 3,
"code": "redirect",
"source": "deno",
"message": "The import of \"http://127.0.0.1:4545/x_deno_warning.js\" was redirected to \"http://127.0.0.1:4545/lsp/x_deno_warning_redirect.js\".",
"data": {
"specifier": "http://127.0.0.1:4545/x_deno_warning.js",
"redirect": "http://127.0.0.1:4545/lsp/x_deno_warning_redirect.js"
}
}
],
"edit": {
"changes": {
"file:///a/file.ts": [
{
"range": {
"start": { "line": 0, "character": 19 },
"end": { "line": 0, "character": 60 }
},
"newText": "\"http://127.0.0.1:4545/lsp/x_deno_warning_redirect.js\""
}
]
}
}
}])
);
client.shutdown();
}
#[test]
#[timeout(300_000)]
fn lsp_lockfile_redirect_resolution() {