Skip to content

Commit

Permalink
refactor(lsp): determine file referrer for each document (denoland#23867
Browse files Browse the repository at this point in the history
)
  • Loading branch information
nayeemrmn authored May 23, 2024
1 parent 143ea47 commit 0a30897
Show file tree
Hide file tree
Showing 8 changed files with 320 additions and 117 deletions.
19 changes: 16 additions & 3 deletions cli/lsp/analysis.rs
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,8 @@ impl<'a> TsResponseImportMapper<'a> {
}
}

let file_referrer = self.documents.get_file_referrer(referrer);

if let Some(jsr_path) = specifier.as_str().strip_prefix(jsr_url().as_str())
{
let mut segments = jsr_path.split('/');
Expand All @@ -259,7 +261,11 @@ impl<'a> TsResponseImportMapper<'a> {
let version = Version::parse_standard(segments.next()?).ok()?;
let nv = PackageNv { name, version };
let path = segments.collect::<Vec<_>>().join("/");
let export = self.resolver.jsr_lookup_export_for_path(&nv, &path)?;
let export = self.resolver.jsr_lookup_export_for_path(
&nv,
&path,
file_referrer.as_deref(),
)?;
let sub_path = (export != ".").then_some(export);
let mut req = None;
req = req.or_else(|| {
Expand All @@ -281,7 +287,11 @@ impl<'a> TsResponseImportMapper<'a> {
}
None
});
req = req.or_else(|| self.resolver.jsr_lookup_req_for_nv(&nv));
req = req.or_else(|| {
self
.resolver
.jsr_lookup_req_for_nv(&nv, file_referrer.as_deref())
});
let spec_str = if let Some(req) = req {
let req_ref = PackageReqReference { req, sub_path };
JsrPackageReqReference::new(req_ref).to_string()
Expand All @@ -298,7 +308,10 @@ impl<'a> TsResponseImportMapper<'a> {
return Some(spec_str);
}

if let Some(npm_resolver) = self.resolver.maybe_managed_npm_resolver() {
if let Some(npm_resolver) = self
.resolver
.maybe_managed_npm_resolver(file_referrer.as_deref())
{
if npm_resolver.in_npm_package(specifier) {
if let Ok(Some(pkg_id)) =
npm_resolver.resolve_pkg_id_from_specifier(specifier)
Expand Down
14 changes: 7 additions & 7 deletions cli/lsp/completions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ pub async fn get_import_completions(
maybe_import_map: Option<&ImportMap>,
) -> Option<lsp::CompletionResponse> {
let document = documents.get(specifier)?;
let file_referrer = document.file_referrer();
let (text, _, range) = document.get_maybe_dependency(position)?;
let range = to_narrow_lsp_range(&document.text_info(), &range);
if let Some(completion_list) = get_import_map_completions(
Expand Down Expand Up @@ -209,8 +210,8 @@ pub async fn get_import_completions(
0
};
let maybe_list = module_registries
.get_completions(&text, offset, &range, |specifier| {
documents.exists(specifier)
.get_completions(&text, offset, &range, |s| {
documents.exists(s, file_referrer)
})
.await;
let list = maybe_list.unwrap_or_else(|| lsp::CompletionList {
Expand Down Expand Up @@ -825,7 +826,7 @@ mod tests {
for (specifier, source, version, language_id) in open_sources {
let specifier =
resolve_url(specifier).expect("failed to create specifier");
documents.open(specifier, *version, *language_id, (*source).into());
documents.open(specifier, *version, *language_id, (*source).into(), None);
}
for (specifier, source) in fs_sources {
let specifier =
Expand All @@ -834,10 +835,9 @@ mod tests {
.global()
.set(&specifier, HashMap::default(), source.as_bytes())
.expect("could not cache file");
assert!(
documents.get(&specifier).is_some(),
"source could not be setup"
);
let document =
documents.get_or_load(&specifier, &temp_dir.uri().join("$").unwrap());
assert!(document.is_some(), "source could not be setup");
}
documents
}
Expand Down
25 changes: 19 additions & 6 deletions cli/lsp/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1294,6 +1294,7 @@ fn diagnose_resolution(
resolution: &Resolution,
is_dynamic: bool,
maybe_assert_type: Option<&str>,
referrer_doc: &Document,
import_map: Option<&ImportMap>,
) -> Vec<DenoDiagnostic> {
fn check_redirect_diagnostic(
Expand Down Expand Up @@ -1327,13 +1328,21 @@ fn diagnose_resolution(
match resolution {
Resolution::Ok(resolved) => {
let specifier = &resolved.specifier;
let managed_npm_resolver = snapshot.resolver.maybe_managed_npm_resolver();
for (_, headers) in snapshot.resolver.redirect_chain_headers(specifier) {
let managed_npm_resolver = snapshot
.resolver
.maybe_managed_npm_resolver(referrer_doc.file_referrer());
for (_, headers) in snapshot
.resolver
.redirect_chain_headers(specifier, referrer_doc.file_referrer())
{
if let Some(message) = headers.get("x-deno-warning") {
diagnostics.push(DenoDiagnostic::DenoWarn(message.clone()));
}
}
if let Some(doc) = snapshot.documents.get(specifier) {
if let Some(doc) = snapshot
.documents
.get_or_load(specifier, referrer_doc.specifier())
{
if let Some(headers) = doc.maybe_headers() {
if let Some(message) = headers.get("x-deno-warning") {
diagnostics.push(DenoDiagnostic::DenoWarn(message.clone()));
Expand Down Expand Up @@ -1430,10 +1439,11 @@ fn diagnose_resolution(
fn diagnose_dependency(
diagnostics: &mut Vec<lsp::Diagnostic>,
snapshot: &language_server::StateSnapshot,
referrer: &ModuleSpecifier,
referrer_doc: &Document,
dependency_key: &str,
dependency: &deno_graph::Dependency,
) {
let referrer = referrer_doc.specifier();
if snapshot.resolver.in_node_modules(referrer) {
return; // ignore, surface typescript errors instead
}
Expand Down Expand Up @@ -1488,6 +1498,7 @@ fn diagnose_dependency(
},
dependency.is_dynamic,
dependency.maybe_attribute_type.as_deref(),
referrer_doc,
import_map.map(|i| i.as_ref()),
)
.iter()
Expand All @@ -1511,6 +1522,7 @@ fn diagnose_dependency(
&dependency.maybe_type,
dependency.is_dynamic,
dependency.maybe_attribute_type.as_deref(),
referrer_doc,
import_map.map(|i| i.as_ref()),
)
.iter()
Expand Down Expand Up @@ -1543,7 +1555,7 @@ fn generate_deno_diagnostics(
diagnose_dependency(
&mut diagnostics,
snapshot,
specifier,
&document,
dependency_key,
dependency,
);
Expand Down Expand Up @@ -1630,11 +1642,12 @@ mod tests {
*version,
*language_id,
(*source).into(),
None,
);
}
StateSnapshot {
project_version: 0,
documents,
documents: Arc::new(documents),
assets: Default::default(),
config: Arc::new(config),
resolver,
Expand Down
Loading

0 comments on commit 0a30897

Please sign in to comment.