summaryrefslogtreecommitdiff
path: root/cli/lsp
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
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')
-rw-r--r--cli/lsp/analysis.rs64
-rw-r--r--cli/lsp/diagnostics.rs1
-rw-r--r--cli/lsp/language_server.rs22
-rw-r--r--cli/lsp/tsc.rs1
4 files changed, 47 insertions, 41 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(),
+ ));
+ }
}
}
}
diff --git a/cli/lsp/diagnostics.rs b/cli/lsp/diagnostics.rs
index 183901fb0..9ec273d7f 100644
--- a/cli/lsp/diagnostics.rs
+++ b/cli/lsp/diagnostics.rs
@@ -38,7 +38,6 @@ use deno_graph::ResolutionError;
use deno_graph::SpecifierError;
use deno_lint::rules::LintRule;
use deno_runtime::deno_node;
-use deno_runtime::deno_node::NpmResolver;
use deno_runtime::tokio_util::create_basic_runtime;
use deno_semver::npm::NpmPackageReqReference;
use deno_semver::package::PackageReq;
diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs
index 38d07fb52..9b3500361 100644
--- a/cli/lsp/language_server.rs
+++ b/cli/lsp/language_server.rs
@@ -105,6 +105,7 @@ use crate::lsp::urls::LspUrlKind;
use crate::npm::create_npm_fs_resolver;
use crate::npm::CliNpmRegistryApi;
use crate::npm::CliNpmResolver;
+use crate::npm::ManagedCliNpmResolver;
use crate::npm::NpmCache;
use crate::npm::NpmCacheDir;
use crate::npm::NpmResolution;
@@ -137,7 +138,7 @@ struct LspNpmServices {
/// Npm resolution that is stored in memory.
resolution: Arc<NpmResolution>,
/// Resolver for npm packages.
- resolver: Arc<CliNpmResolver>,
+ resolver: Arc<dyn CliNpmResolver>,
}
#[derive(Debug, PartialEq, Eq)]
@@ -161,7 +162,7 @@ pub struct LanguageServer(Arc<tokio::sync::RwLock<Inner>>);
#[derive(Debug)]
pub struct StateNpmSnapshot {
pub node_resolver: Arc<NodeResolver>,
- pub npm_resolver: Arc<CliNpmResolver>,
+ pub npm_resolver: Arc<dyn CliNpmResolver>,
}
/// Snapshot of the state used by TSC.
@@ -506,7 +507,7 @@ fn create_npm_resolver_and_resolution(
npm_cache: Arc<NpmCache>,
node_modules_dir_path: Option<PathBuf>,
maybe_snapshot: Option<ValidSerializedNpmResolutionSnapshot>,
-) -> (Arc<CliNpmResolver>, Arc<NpmResolution>) {
+) -> (Arc<dyn CliNpmResolver>, Arc<NpmResolution>) {
let resolution = Arc::new(NpmResolution::from_serialized(
api,
maybe_snapshot,
@@ -525,7 +526,7 @@ fn create_npm_resolver_and_resolution(
NpmSystemInfo::default(),
);
(
- Arc::new(CliNpmResolver::new(
+ Arc::new(ManagedCliNpmResolver::new(
fs,
resolution.clone(),
fs_resolver,
@@ -802,7 +803,7 @@ impl Inner {
self.config.maybe_lockfile().cloned(),
));
let node_fs = Arc::new(deno_fs::RealFs);
- let npm_resolver = Arc::new(CliNpmResolver::new(
+ let npm_resolver = Arc::new(ManagedCliNpmResolver::new(
node_fs.clone(),
npm_resolution.clone(),
create_npm_fs_resolver(
@@ -1440,8 +1441,13 @@ impl Inner {
let package_reqs = self.documents.npm_package_reqs();
let npm_resolver = self.npm.resolver.clone();
// spawn to avoid the LSP's Send requirements
- let handle =
- spawn(async move { npm_resolver.set_package_reqs(&package_reqs).await });
+ let handle = spawn(async move {
+ if let Some(npm_resolver) = npm_resolver.as_managed() {
+ npm_resolver.set_package_reqs(&package_reqs).await
+ } else {
+ Ok(())
+ }
+ });
if let Err(err) = handle.await.unwrap() {
lsp_warn!("Could not set npm package requirements. {:#}", err);
}
@@ -2156,7 +2162,7 @@ impl Inner {
&self.documents,
self.maybe_import_map.as_deref(),
&self.npm.resolution,
- &self.npm.resolver,
+ self.npm.resolver.as_ref(),
)
}
diff --git a/cli/lsp/tsc.rs b/cli/lsp/tsc.rs
index cf809408b..7999cb1df 100644
--- a/cli/lsp/tsc.rs
+++ b/cli/lsp/tsc.rs
@@ -49,7 +49,6 @@ use deno_core::JsRuntime;
use deno_core::ModuleSpecifier;
use deno_core::OpState;
use deno_core::RuntimeOptions;
-use deno_runtime::deno_node::NpmResolver;
use deno_runtime::tokio_util::create_basic_runtime;
use lazy_regex::lazy_regex;
use log::error;