summaryrefslogtreecommitdiff
path: root/cli/lsp/resolver.rs
diff options
context:
space:
mode:
authorNayeem Rahman <nayeemrmn99@gmail.com>2024-11-06 06:26:46 +0000
committerGitHub <noreply@github.com>2024-11-06 06:26:46 +0000
commit5088b25f2315fa45e912377356a89ba2a44dbcda (patch)
tree52d41a8da5e8ab84dcc6eb59c7ca902e9d7b25b9 /cli/lsp/resolver.rs
parentef7432c03f83ad9e9ca2812d0ab5653e87fa5259 (diff)
feat(lsp): auto-import completions from byonm dependencies (#26680)
Diffstat (limited to 'cli/lsp/resolver.rs')
-rw-r--r--cli/lsp/resolver.rs45
1 files changed, 45 insertions, 0 deletions
diff --git a/cli/lsp/resolver.rs b/cli/lsp/resolver.rs
index 9ce76005e..f5df24d57 100644
--- a/cli/lsp/resolver.rs
+++ b/cli/lsp/resolver.rs
@@ -74,6 +74,7 @@ struct LspScopeResolver {
pkg_json_resolver: Option<Arc<PackageJsonResolver>>,
redirect_resolver: Option<Arc<RedirectResolver>>,
graph_imports: Arc<IndexMap<ModuleSpecifier, GraphImport>>,
+ package_json_deps_by_resolution: Arc<IndexMap<ModuleSpecifier, String>>,
config_data: Option<Arc<ConfigData>>,
}
@@ -88,6 +89,7 @@ impl Default for LspScopeResolver {
pkg_json_resolver: None,
redirect_resolver: None,
graph_imports: Default::default(),
+ package_json_deps_by_resolution: Default::default(),
config_data: None,
}
}
@@ -165,6 +167,33 @@ impl LspScopeResolver {
)
})
.unwrap_or_default();
+ let package_json_deps_by_resolution = (|| {
+ let node_resolver = node_resolver.as_ref()?;
+ let package_json = config_data?.maybe_pkg_json()?;
+ let referrer = package_json.specifier();
+ let dependencies = package_json.dependencies.as_ref()?;
+ let result = dependencies
+ .iter()
+ .flat_map(|(name, _)| {
+ let req_ref =
+ NpmPackageReqReference::from_str(&format!("npm:{name}")).ok()?;
+ let specifier = into_specifier_and_media_type(Some(
+ node_resolver
+ .resolve_req_reference(
+ &req_ref,
+ &referrer,
+ NodeResolutionMode::Types,
+ )
+ .ok()?,
+ ))
+ .0;
+ Some((specifier, name.clone()))
+ })
+ .collect();
+ Some(result)
+ })();
+ let package_json_deps_by_resolution =
+ Arc::new(package_json_deps_by_resolution.unwrap_or_default());
Self {
cjs_tracker: lsp_cjs_tracker,
graph_resolver,
@@ -174,6 +203,7 @@ impl LspScopeResolver {
pkg_json_resolver: Some(pkg_json_resolver),
redirect_resolver,
graph_imports,
+ package_json_deps_by_resolution,
config_data: config_data.cloned(),
}
}
@@ -216,6 +246,9 @@ impl LspScopeResolver {
redirect_resolver: self.redirect_resolver.clone(),
pkg_json_resolver: Some(pkg_json_resolver),
graph_imports: self.graph_imports.clone(),
+ package_json_deps_by_resolution: self
+ .package_json_deps_by_resolution
+ .clone(),
config_data: self.config_data.clone(),
})
}
@@ -407,6 +440,18 @@ impl LspResolver {
)))
}
+ pub fn file_url_to_package_json_dep(
+ &self,
+ specifier: &ModuleSpecifier,
+ file_referrer: Option<&ModuleSpecifier>,
+ ) -> Option<String> {
+ let resolver = self.get_scope_resolver(file_referrer);
+ resolver
+ .package_json_deps_by_resolution
+ .get(specifier)
+ .cloned()
+ }
+
pub fn in_node_modules(&self, specifier: &ModuleSpecifier) -> bool {
fn has_node_modules_dir(specifier: &ModuleSpecifier) -> bool {
// consider any /node_modules/ directory as being in the node_modules