0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-03-03 17:34:47 -05:00

fix(lsp): ignore a few more diagnostics for ambient modules (#27949)

Missed a few resolution errors
This commit is contained in:
Nathan Whitaker 2025-02-03 16:13:14 -08:00 committed by Bartek Iwańczuk
parent 4101cf4274
commit f32b5f1ad1
No known key found for this signature in database
GPG key ID: 0C6BCDDC3B3AD750
2 changed files with 68 additions and 39 deletions

View file

@ -1532,6 +1532,60 @@ fn relative_specifier(specifier: &Url, referrer: &Url) -> String {
}
}
fn maybe_ambient_import_specifier(
diagnostic: &DenoDiagnostic,
) -> Option<String> {
match diagnostic {
DenoDiagnostic::NoCache(url) | DenoDiagnostic::NoLocal(url) => {
Some(url.to_string())
}
DenoDiagnostic::ResolutionError(err) => {
maybe_ambient_specifier_resolution_err(err)
}
_ => None,
}
}
fn maybe_ambient_specifier_resolution_err(
err: &ResolutionError,
) -> Option<String> {
match err {
ResolutionError::InvalidDowngrade { .. }
| ResolutionError::InvalidJsrHttpsTypesImport { .. }
| ResolutionError::InvalidLocalImport { .. } => None,
ResolutionError::InvalidSpecifier { error, .. } => match error {
SpecifierError::InvalidUrl(..) => None,
SpecifierError::ImportPrefixMissing { specifier, .. } => {
Some(specifier.to_string())
}
},
ResolutionError::ResolverError { error, .. } => match &**error {
ResolveError::Specifier(specifier_error) => match specifier_error {
SpecifierError::InvalidUrl(..) => None,
SpecifierError::ImportPrefixMissing { specifier, .. } => {
Some(specifier.to_string())
}
},
ResolveError::ImportMap(import_map_error) => {
match import_map_error.as_kind() {
ImportMapErrorKind::UnmappedBareSpecifier(spec, _) => {
Some(spec.clone())
}
ImportMapErrorKind::JsonParse(_)
| ImportMapErrorKind::ImportMapNotObject
| ImportMapErrorKind::ImportsFieldNotObject
| ImportMapErrorKind::ScopesFieldNotObject
| ImportMapErrorKind::ScopePrefixNotObject(_)
| ImportMapErrorKind::BlockedByNullEntry(_)
| ImportMapErrorKind::SpecifierResolutionFailure { .. }
| ImportMapErrorKind::SpecifierBacktracksAbovePrefix { .. } => None,
}
}
ResolveError::Other(..) => None,
},
}
}
fn diagnose_resolution(
snapshot: &language_server::StateSnapshot,
dependency_key: &str,
@ -1672,16 +1726,14 @@ fn diagnose_resolution(
}
// The specifier resolution resulted in an error, so we want to issue a
// diagnostic for that.
Resolution::Err(err) => match &**err {
ResolutionError::InvalidSpecifier {
error: SpecifierError::ImportPrefixMissing { .. },
..
} => {
Resolution::Err(err) => {
if maybe_ambient_specifier_resolution_err(err).is_none() {
diagnostics.push(DenoDiagnostic::ResolutionError(*err.clone()))
} else {
deferred_diagnostics
.push(DenoDiagnostic::ResolutionError(*err.clone()));
}
_ => diagnostics.push(DenoDiagnostic::ResolutionError(*err.clone())),
},
}
_ => (),
}
(diagnostics, deferred_diagnostics)
@ -1773,25 +1825,12 @@ fn diagnose_dependency(
deferred_diagnostics.extend(
deferred
.iter()
.filter_map(|diag| match diag {
DenoDiagnostic::NoCache(url) | DenoDiagnostic::NoLocal(url) => Some(
Box::new(
import_ranges
.iter()
.map(|range| (url.to_string(), diag.to_lsp_diagnostic(range))),
) as Box<dyn Iterator<Item = (String, lsp::Diagnostic)>>,
),
DenoDiagnostic::ResolutionError(
ResolutionError::InvalidSpecifier {
error: SpecifierError::ImportPrefixMissing { specifier, .. },
..
},
) => {
Some(Box::new(import_ranges.iter().map(|range| {
(specifier.clone(), diag.to_lsp_diagnostic(range))
})))
}
_ => None,
.filter_map(|diag| {
maybe_ambient_import_specifier(diag).map(|spec| {
import_ranges
.iter()
.map(move |range| (spec.clone(), diag.to_lsp_diagnostic(range)))
})
})
.flatten(),
);
@ -1817,18 +1856,8 @@ fn diagnose_dependency(
.map(|diag| diag.to_lsp_diagnostic(&range)),
);
deferred_diagnostics.extend(Box::new(deferred.iter().filter_map(|diag| {
match diag {
DenoDiagnostic::NoCache(url) | DenoDiagnostic::NoLocal(url) => {
Some((url.to_string(), diag.to_lsp_diagnostic(&range)))
}
DenoDiagnostic::ResolutionError(
ResolutionError::InvalidSpecifier {
error: SpecifierError::ImportPrefixMissing { specifier, .. },
..
},
) => Some((specifier.clone(), diag.to_lsp_diagnostic(&range))),
_ => None,
}
maybe_ambient_import_specifier(diag)
.map(|spec| (spec, diag.to_lsp_diagnostic(&range)))
})));
}
}

View file

@ -1,8 +1,8 @@
[UNORDERED_START]
Download http://localhost:4260/chalk
Download http://localhost:4260/@denotest%2fdep-cannot-parse
[UNORDERED_END]
Download http://localhost:4260/chalk/chalk-5.0.1.tgz
[UNORDERED_END]
Hi
TypeError: Error in @denotest/dep-cannot-parse@1.0.0 parsing version requirement for dependency "@denotest/esm-basic": "unknown-scheme:unknown"
0: Invalid version requirement