summaryrefslogtreecommitdiff
path: root/cli/lsp
diff options
context:
space:
mode:
Diffstat (limited to 'cli/lsp')
-rw-r--r--cli/lsp/analysis.rs7
-rw-r--r--cli/lsp/diagnostics.rs19
-rw-r--r--cli/lsp/documents.rs52
-rw-r--r--cli/lsp/language_server.rs15
-rw-r--r--cli/lsp/tsc.rs12
5 files changed, 58 insertions, 47 deletions
diff --git a/cli/lsp/analysis.rs b/cli/lsp/analysis.rs
index 7a0c11212..1b11deca8 100644
--- a/cli/lsp/analysis.rs
+++ b/cli/lsp/analysis.rs
@@ -199,9 +199,8 @@ impl<'a> TsResponseImportMapper<'a> {
}
if self.npm_resolver.in_npm_package(specifier) {
- if let Ok(Some(pkg_id)) = self
- .npm_resolver
- .resolve_package_id_from_specifier(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);
@@ -254,7 +253,7 @@ impl<'a> TsResponseImportMapper<'a> {
let specifier_path = specifier.to_file_path().ok()?;
let root_folder = self
.npm_resolver
- .resolve_package_folder_from_specifier(specifier)
+ .resolve_pkg_folder_from_specifier(specifier)
.ok()
.flatten()?;
let package_json_path = root_folder.join("package.json");
diff --git a/cli/lsp/diagnostics.rs b/cli/lsp/diagnostics.rs
index 43ae35f54..183901fb0 100644
--- a/cli/lsp/diagnostics.rs
+++ b/cli/lsp/diagnostics.rs
@@ -800,8 +800,8 @@ fn generate_lint_diagnostics(
}
// ignore any npm package files
- if let Some(node_resolver) = &snapshot.maybe_node_resolver {
- if node_resolver.in_npm_package(document.specifier()) {
+ if let Some(npm) = &snapshot.npm {
+ if npm.node_resolver.in_npm_package(document.specifier()) {
continue;
}
}
@@ -1237,10 +1237,10 @@ fn diagnose_resolution(
} else if let Ok(pkg_ref) =
NpmPackageReqReference::from_specifier(specifier)
{
- if let Some(npm_resolver) = &snapshot.maybe_npm_resolver {
+ if let Some(npm) = &snapshot.npm {
// show diagnostics for npm package references that aren't cached
let req = pkg_ref.into_inner().req;
- if !npm_resolver.is_pkg_req_folder_cached(&req) {
+ if !npm.npm_resolver.is_pkg_req_folder_cached(&req) {
diagnostics
.push(DenoDiagnostic::NoCacheNpm(req, specifier.clone()));
}
@@ -1250,10 +1250,10 @@ fn diagnose_resolution(
if !deno_node::is_builtin_node_module(module_name) {
diagnostics
.push(DenoDiagnostic::InvalidNodeSpecifier(specifier.clone()));
- } else if let Some(npm_resolver) = &snapshot.maybe_npm_resolver {
+ } else if let Some(npm) = &snapshot.npm {
// check that a @types/node package exists in the resolver
let types_node_req = PackageReq::from_str("@types/node").unwrap();
- if !npm_resolver.is_pkg_req_folder_cached(&types_node_req) {
+ if !npm.npm_resolver.is_pkg_req_folder_cached(&types_node_req) {
diagnostics.push(DenoDiagnostic::NoCacheNpm(
types_node_req,
ModuleSpecifier::parse("npm:@types/node").unwrap(),
@@ -1291,8 +1291,8 @@ fn diagnose_dependency(
dependency_key: &str,
dependency: &deno_graph::Dependency,
) {
- if let Some(npm_resolver) = &snapshot.maybe_npm_resolver {
- if npm_resolver.in_npm_package(referrer) {
+ if let Some(npm) = &snapshot.npm {
+ if npm.npm_resolver.in_npm_package(referrer) {
return; // ignore, surface typescript errors instead
}
}
@@ -1461,8 +1461,7 @@ mod tests {
GlobalHttpCache::new(location.to_path_buf(), RealDenoCacheEnv),
)),
config: Default::default(),
- maybe_node_resolver: None,
- maybe_npm_resolver: None,
+ npm: None,
}
}
diff --git a/cli/lsp/documents.rs b/cli/lsp/documents.rs
index 24d4e2a10..1c672f623 100644
--- a/cli/lsp/documents.rs
+++ b/cli/lsp/documents.rs
@@ -2,6 +2,7 @@
use super::cache::calculate_fs_version;
use super::cache::calculate_fs_version_at_path;
+use super::language_server::StateNpmSnapshot;
use super::text::LineIndex;
use super::tsc;
use super::tsc::AssetDocument;
@@ -41,7 +42,6 @@ use deno_graph::Resolution;
use deno_runtime::deno_node;
use deno_runtime::deno_node::NodeResolution;
use deno_runtime::deno_node::NodeResolutionMode;
-use deno_runtime::deno_node::NodeResolver;
use deno_runtime::deno_node::PackageJson;
use deno_runtime::permissions::PermissionsContainer;
use deno_semver::npm::NpmPackageReqReference;
@@ -1089,7 +1089,7 @@ impl Documents {
&self,
specifiers: Vec<String>,
referrer_doc: &AssetOrDocument,
- maybe_node_resolver: Option<&Arc<NodeResolver>>,
+ maybe_npm: Option<&StateNpmSnapshot>,
) -> Vec<Option<(ModuleSpecifier, MediaType)>> {
let referrer = referrer_doc.specifier();
let dependencies = match referrer_doc {
@@ -1098,11 +1098,12 @@ impl Documents {
};
let mut results = Vec::new();
for specifier in specifiers {
- if let Some(node_resolver) = maybe_node_resolver {
- if node_resolver.in_npm_package(referrer) {
+ if let Some(npm) = maybe_npm {
+ if npm.node_resolver.in_npm_package(referrer) {
// we're in an npm package, so use node resolution
results.push(Some(NodeResolution::into_specifier_and_media_type(
- node_resolver
+ npm
+ .node_resolver
.resolve(
&specifier,
referrer,
@@ -1126,9 +1127,9 @@ impl Documents {
dependencies.as_ref().and_then(|d| d.deps.get(&specifier))
{
if let Some(specifier) = dep.maybe_type.maybe_specifier() {
- results.push(self.resolve_dependency(specifier, maybe_node_resolver));
+ results.push(self.resolve_dependency(specifier, maybe_npm));
} else if let Some(specifier) = dep.maybe_code.maybe_specifier() {
- results.push(self.resolve_dependency(specifier, maybe_node_resolver));
+ results.push(self.resolve_dependency(specifier, maybe_npm));
} else {
results.push(None);
}
@@ -1136,12 +1137,11 @@ impl Documents {
.resolve_imports_dependency(&specifier)
.and_then(|r| r.maybe_specifier())
{
- results.push(self.resolve_dependency(specifier, maybe_node_resolver));
+ results.push(self.resolve_dependency(specifier, maybe_npm));
} else if let Ok(npm_req_ref) =
NpmPackageReqReference::from_str(&specifier)
{
- results
- .push(node_resolve_npm_req_ref(npm_req_ref, maybe_node_resolver));
+ results.push(node_resolve_npm_req_ref(npm_req_ref, maybe_npm));
} else {
results.push(None);
}
@@ -1475,7 +1475,7 @@ impl Documents {
fn resolve_dependency(
&self,
specifier: &ModuleSpecifier,
- maybe_node_resolver: Option<&Arc<NodeResolver>>,
+ maybe_npm: Option<&StateNpmSnapshot>,
) -> Option<(ModuleSpecifier, MediaType)> {
if let Some(module_name) = specifier.as_str().strip_prefix("node:") {
if deno_node::is_builtin_node_module(module_name) {
@@ -1487,7 +1487,7 @@ impl Documents {
}
if let Ok(npm_ref) = NpmPackageReqReference::from_specifier(specifier) {
- return node_resolve_npm_req_ref(npm_ref, maybe_node_resolver);
+ return node_resolve_npm_req_ref(npm_ref, maybe_npm);
}
let doc = self.get(specifier)?;
let maybe_module = doc.maybe_esm_module().and_then(|r| r.as_ref().ok());
@@ -1496,7 +1496,7 @@ impl Documents {
if let Some(specifier) =
maybe_types_dependency.and_then(|d| d.maybe_specifier())
{
- self.resolve_dependency(specifier, maybe_node_resolver)
+ self.resolve_dependency(specifier, maybe_npm)
} else {
let media_type = doc.media_type();
Some((doc.specifier().clone(), media_type))
@@ -1519,18 +1519,26 @@ impl Documents {
fn node_resolve_npm_req_ref(
npm_req_ref: NpmPackageReqReference,
- maybe_node_resolver: Option<&Arc<NodeResolver>>,
+ maybe_npm: Option<&StateNpmSnapshot>,
) -> Option<(ModuleSpecifier, MediaType)> {
- maybe_node_resolver.map(|node_resolver| {
+ maybe_npm.map(|npm| {
NodeResolution::into_specifier_and_media_type(
- node_resolver
- .resolve_npm_req_reference(
- &npm_req_ref,
- NodeResolutionMode::Types,
- &PermissionsContainer::allow_all(),
- )
+ npm
+ .npm_resolver
+ .resolve_pkg_folder_from_deno_module_req(npm_req_ref.req())
.ok()
- .flatten(),
+ .and_then(|package_folder| {
+ npm
+ .node_resolver
+ .resolve_npm_reference(
+ &package_folder,
+ npm_req_ref.sub_path(),
+ NodeResolutionMode::Types,
+ &PermissionsContainer::allow_all(),
+ )
+ .ok()
+ .flatten()
+ }),
)
})
}
diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs
index d9db2edbf..38d07fb52 100644
--- a/cli/lsp/language_server.rs
+++ b/cli/lsp/language_server.rs
@@ -158,6 +158,12 @@ impl LspNpmConfigHash {
#[derive(Debug, Clone)]
pub struct LanguageServer(Arc<tokio::sync::RwLock<Inner>>);
+#[derive(Debug)]
+pub struct StateNpmSnapshot {
+ pub node_resolver: Arc<NodeResolver>,
+ pub npm_resolver: Arc<CliNpmResolver>,
+}
+
/// Snapshot of the state used by TSC.
#[derive(Debug)]
pub struct StateSnapshot {
@@ -166,8 +172,7 @@ pub struct StateSnapshot {
pub config: Arc<ConfigSnapshot>,
pub documents: Documents,
pub maybe_import_map: Option<Arc<ImportMap>>,
- pub maybe_node_resolver: Option<Arc<NodeResolver>>,
- pub maybe_npm_resolver: Option<Arc<CliNpmResolver>>,
+ pub npm: Option<StateNpmSnapshot>,
}
#[derive(Debug)]
@@ -819,8 +824,10 @@ impl Inner {
config: self.config.snapshot(),
documents: self.documents.clone(),
maybe_import_map: self.maybe_import_map.clone(),
- maybe_node_resolver: Some(node_resolver),
- maybe_npm_resolver: Some(npm_resolver),
+ npm: Some(StateNpmSnapshot {
+ node_resolver,
+ npm_resolver,
+ }),
})
}
diff --git a/cli/lsp/tsc.rs b/cli/lsp/tsc.rs
index 9a33ff5f9..cf809408b 100644
--- a/cli/lsp/tsc.rs
+++ b/cli/lsp/tsc.rs
@@ -3293,9 +3293,9 @@ fn op_is_node_file(state: &mut OpState, #[string] path: String) -> bool {
match ModuleSpecifier::parse(&path) {
Ok(specifier) => state
.state_snapshot
- .maybe_npm_resolver
+ .npm
.as_ref()
- .map(|r| r.in_npm_package(&specifier))
+ .map(|n| n.npm_resolver.in_npm_package(&specifier))
.unwrap_or(false),
Err(_) => false,
}
@@ -3341,7 +3341,7 @@ fn op_resolve(
let resolved = state.state_snapshot.documents.resolve(
args.specifiers,
&referrer_doc,
- state.state_snapshot.maybe_node_resolver.as_ref(),
+ state.state_snapshot.npm.as_ref(),
);
Ok(
resolved
@@ -3477,8 +3477,7 @@ deno_core::extension!(deno_tsc,
config: Default::default(),
documents: Documents::new(options.cache.clone()),
maybe_import_map: None,
- maybe_node_resolver: None,
- maybe_npm_resolver: None,
+ npm: None,
}),
options.performance,
));
@@ -4304,8 +4303,7 @@ mod tests {
cache_metadata: CacheMetadata::new(cache),
config: Default::default(),
maybe_import_map: None,
- maybe_node_resolver: None,
- maybe_npm_resolver: None,
+ npm: None,
}
}