From 902a1137ea6021af8c56b82fa38b8084a89a4bb1 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Mon, 4 Mar 2024 12:34:31 -0500 Subject: 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. --- cli/lsp/diagnostics.rs | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) (limited to 'cli/lsp/diagnostics.rs') 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 { + fn check_redirect_diagnostic( + specifier: &ModuleSpecifier, + doc: &Document, + ) -> Option { + 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 { -- cgit v1.2.3