summaryrefslogtreecommitdiff
path: root/cli/lsp/analysis.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2023-09-29 09:26:25 -0400
committerGitHub <noreply@github.com>2023-09-29 09:26:25 -0400
commit5edd102f3f912a53c7bcad3b0fa4feb672ada323 (patch)
tree2402b64e527bd859f3a2c71d3e96a89992002aa2 /cli/lsp/analysis.rs
parentd43e48c4e96b02289d505cd2558ba85d7d6cb57b (diff)
refactor(cli): make `CliNpmResolver` a trait (#20732)
This makes `CliNpmResolver` a trait. The terminology used is: - **managed** - Deno manages the node_modules folder and does an auto-install (ex. `ManagedCliNpmResolver`) - **byonm** - "Bring your own node_modules" (ex. `ByonmCliNpmResolver`, which is in this PR, but unimplemented at the moment) Part of #18967
Diffstat (limited to 'cli/lsp/analysis.rs')
-rw-r--r--cli/lsp/analysis.rs64
1 files changed, 33 insertions, 31 deletions
diff --git a/cli/lsp/analysis.rs b/cli/lsp/analysis.rs
index 1b11deca8..1f12fb76b 100644
--- a/cli/lsp/analysis.rs
+++ b/cli/lsp/analysis.rs
@@ -163,7 +163,7 @@ pub struct TsResponseImportMapper<'a> {
documents: &'a Documents,
maybe_import_map: Option<&'a ImportMap>,
npm_resolution: &'a NpmResolution,
- npm_resolver: &'a CliNpmResolver,
+ npm_resolver: &'a dyn CliNpmResolver,
}
impl<'a> TsResponseImportMapper<'a> {
@@ -171,7 +171,7 @@ impl<'a> TsResponseImportMapper<'a> {
documents: &'a Documents,
maybe_import_map: Option<&'a ImportMap>,
npm_resolution: &'a NpmResolution,
- npm_resolver: &'a CliNpmResolver,
+ npm_resolver: &'a dyn CliNpmResolver,
) -> Self {
Self {
documents,
@@ -198,39 +198,41 @@ impl<'a> TsResponseImportMapper<'a> {
}
}
- if self.npm_resolver.in_npm_package(specifier) {
- if let Ok(Some(pkg_id)) =
- self.npm_resolver.resolve_pkg_id_from_specifier(specifier)
- {
- let pkg_reqs =
- self.npm_resolution.resolve_pkg_reqs_from_pkg_id(&pkg_id);
- // check if any pkg reqs match what is found in an import map
- if !pkg_reqs.is_empty() {
- let sub_path = self.resolve_package_path(specifier);
- if let Some(import_map) = self.maybe_import_map {
- for pkg_req in &pkg_reqs {
- let paths = vec![
- concat_npm_specifier("npm:", pkg_req, sub_path.as_deref()),
- concat_npm_specifier("npm:/", pkg_req, sub_path.as_deref()),
- ];
- for path in paths {
- if let Some(mapped_path) = ModuleSpecifier::parse(&path)
- .ok()
- .and_then(|s| import_map.lookup(&s, referrer))
- {
- return Some(mapped_path);
+ if let Some(npm_resolver) = self.npm_resolver.as_managed() {
+ if npm_resolver.in_npm_package(specifier) {
+ if let Ok(Some(pkg_id)) =
+ npm_resolver.resolve_pkg_id_from_specifier(specifier)
+ {
+ let pkg_reqs =
+ self.npm_resolution.resolve_pkg_reqs_from_pkg_id(&pkg_id);
+ // check if any pkg reqs match what is found in an import map
+ if !pkg_reqs.is_empty() {
+ let sub_path = self.resolve_package_path(specifier);
+ if let Some(import_map) = self.maybe_import_map {
+ for pkg_req in &pkg_reqs {
+ let paths = vec![
+ concat_npm_specifier("npm:", pkg_req, sub_path.as_deref()),
+ concat_npm_specifier("npm:/", pkg_req, sub_path.as_deref()),
+ ];
+ for path in paths {
+ if let Some(mapped_path) = ModuleSpecifier::parse(&path)
+ .ok()
+ .and_then(|s| import_map.lookup(&s, referrer))
+ {
+ return Some(mapped_path);
+ }
}
}
}
- }
- // if not found in the import map, return the first pkg req
- if let Some(pkg_req) = pkg_reqs.first() {
- return Some(concat_npm_specifier(
- "npm:",
- pkg_req,
- sub_path.as_deref(),
- ));
+ // if not found in the import map, return the first pkg req
+ if let Some(pkg_req) = pkg_reqs.first() {
+ return Some(concat_npm_specifier(
+ "npm:",
+ pkg_req,
+ sub_path.as_deref(),
+ ));
+ }
}
}
}