summaryrefslogtreecommitdiff
path: root/cli/lsp/diagnostics.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2024-03-04 12:34:31 -0500
committerGitHub <noreply@github.com>2024-03-04 17:34:31 +0000
commit902a1137ea6021af8c56b82fa38b8084a89a4bb1 (patch)
treeda83a61ba60f6ebd15e6474197c7016853704a20 /cli/lsp/diagnostics.rs
parent5a28d70e05d9854102e983a4c4fd1cf4238361dc (diff)
fix(lsp): do not warn about local file "redirects" from .js to .d.ts files (#22670)
The diagnostic was incorrect when importing a `.js` file with a corresponding `.d.ts` file with sloppy imports because it would say to change the `.js` extension to `.d.ts`, which is incorrect. We might as well just hide this diagnostic.
Diffstat (limited to 'cli/lsp/diagnostics.rs')
-rw-r--r--cli/lsp/diagnostics.rs38
1 files changed, 29 insertions, 9 deletions
diff --git a/cli/lsp/diagnostics.rs b/cli/lsp/diagnostics.rs
index 6deafde4c..fe6904830 100644
--- a/cli/lsp/diagnostics.rs
+++ b/cli/lsp/diagnostics.rs
@@ -1305,6 +1305,33 @@ fn diagnose_resolution(
is_dynamic: bool,
maybe_assert_type: Option<&str>,
) -> Vec<DenoDiagnostic> {
+ fn check_redirect_diagnostic(
+ specifier: &ModuleSpecifier,
+ doc: &Document,
+ ) -> Option<DenoDiagnostic> {
+ let doc_specifier = doc.specifier();
+ // 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" || doc_specifier == specifier {
+ 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
+ // @deno-types and that's a bit complicated to explain
+ let is_sloppy_import_dts_redirect = doc_specifier.scheme() == "file"
+ && doc.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: doc_specifier.clone(),
+ })
+ }
+
let mut diagnostics = vec![];
match resolution {
Resolution::Ok(resolved) => {
@@ -1319,15 +1346,8 @@ fn diagnose_resolution(
}
}
if let Some(doc) = snapshot.documents.get(specifier) {
- let doc_specifier = doc.specifier();
- // 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" && doc_specifier != specifier {
- diagnostics.push(DenoDiagnostic::Redirect {
- from: specifier.clone(),
- to: doc_specifier.clone(),
- });
+ if let Some(diagnostic) = check_redirect_diagnostic(specifier, &doc) {
+ diagnostics.push(diagnostic);
}
if doc.media_type() == MediaType::Json {
match maybe_assert_type {