summaryrefslogtreecommitdiff
path: root/cli/lsp/documents.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/lsp/documents.rs')
-rw-r--r--cli/lsp/documents.rs206
1 files changed, 67 insertions, 139 deletions
diff --git a/cli/lsp/documents.rs b/cli/lsp/documents.rs
index 2de2a4406..71cc63f83 100644
--- a/cli/lsp/documents.rs
+++ b/cli/lsp/documents.rs
@@ -3,22 +3,17 @@
use super::cache::calculate_fs_version;
use super::cache::LSP_DISALLOW_GLOBAL_TO_LOCAL_COPY;
use super::config::Config;
-use super::language_server::StateNpmSnapshot;
+use super::resolver::LspResolver;
use super::testing::TestCollector;
use super::testing::TestModule;
use super::text::LineIndex;
use super::tsc;
use super::tsc::AssetDocument;
-use crate::args::package_json;
use crate::cache::HttpCache;
use crate::graph_util::CliJsrUrlProvider;
use crate::jsr::JsrCacheResolver;
use crate::lsp::logging::lsp_warn;
-use crate::npm::CliNpmResolver;
-use crate::resolver::CliGraphResolver;
-use crate::resolver::CliGraphResolverOptions;
-use crate::resolver::CliNodeResolver;
use crate::resolver::SloppyImportsFsEntry;
use crate::resolver::SloppyImportsResolution;
use crate::resolver::SloppyImportsResolver;
@@ -43,12 +38,10 @@ use deno_lockfile::Lockfile;
use deno_runtime::deno_node;
use deno_runtime::deno_node::NodeResolution;
use deno_runtime::deno_node::NodeResolutionMode;
-use deno_runtime::permissions::PermissionsContainer;
use deno_semver::jsr::JsrPackageReqReference;
use deno_semver::npm::NpmPackageReqReference;
use deno_semver::package::PackageReq;
use indexmap::IndexMap;
-use package_json::PackageJsonDepsProvider;
use std::borrow::Cow;
use std::collections::BTreeSet;
use std::collections::HashMap;
@@ -294,7 +287,7 @@ pub struct Document {
media_type: MediaType,
/// Present if and only if this is an open document.
open_data: Option<DocumentOpenData>,
- resolver: Arc<CliGraphResolver>,
+ resolver: Arc<LspResolver>,
specifier: ModuleSpecifier,
text_info: SourceTextInfo,
}
@@ -308,8 +301,7 @@ impl Document {
maybe_lsp_version: Option<i32>,
maybe_language_id: Option<LanguageId>,
maybe_headers: Option<HashMap<String, String>>,
- resolver: Arc<CliGraphResolver>,
- maybe_node_resolver: Option<&CliNodeResolver>,
+ resolver: Arc<LspResolver>,
config: Arc<Config>,
cache: &Arc<dyn HttpCache>,
) -> Arc<Self> {
@@ -318,7 +310,7 @@ impl Document {
&specifier,
maybe_headers.as_ref(),
maybe_language_id,
- maybe_node_resolver,
+ &resolver,
);
let (maybe_parsed_source, maybe_module) =
if media_type_is_diagnosable(media_type) {
@@ -366,17 +358,14 @@ impl Document {
fn with_new_config(
&self,
- resolver: Arc<CliGraphResolver>,
- maybe_node_resolver: Option<&CliNodeResolver>,
+ resolver: Arc<LspResolver>,
config: Arc<Config>,
) -> Arc<Self> {
- let graph_resolver = resolver.as_graph_resolver();
- let npm_resolver = resolver.as_graph_npm_resolver();
let media_type = resolve_media_type(
&self.specifier,
self.maybe_headers.as_ref(),
self.maybe_language_id,
- maybe_node_resolver,
+ &resolver,
);
let dependencies;
let maybe_types_dependency;
@@ -403,6 +392,8 @@ impl Document {
maybe_test_module_fut =
get_maybe_test_module_fut(maybe_parsed_source.as_ref(), &config);
} else {
+ let graph_resolver = resolver.as_graph_resolver();
+ let npm_resolver = resolver.as_graph_npm_resolver();
dependencies = Arc::new(
self
.dependencies
@@ -682,20 +673,19 @@ fn resolve_media_type(
specifier: &ModuleSpecifier,
maybe_headers: Option<&HashMap<String, String>>,
maybe_language_id: Option<LanguageId>,
- maybe_node_resolver: Option<&CliNodeResolver>,
+ resolver: &LspResolver,
) -> MediaType {
- if let Some(node_resolver) = maybe_node_resolver {
- if node_resolver.in_npm_package(specifier) {
- match node_resolver.url_to_node_resolution(specifier.clone()) {
- Ok(resolution) => {
- let (_, media_type) =
- NodeResolution::into_specifier_and_media_type(Some(resolution));
- return media_type;
- }
- Err(err) => {
- lsp_warn!("Node resolution failed for '{}': {}", specifier, err);
- }
+ if resolver.in_npm_package(specifier) {
+ match resolver.url_to_node_resolution(specifier.clone()) {
+ Ok(Some(resolution)) => {
+ let (_, media_type) =
+ NodeResolution::into_specifier_and_media_type(Some(resolution));
+ return media_type;
+ }
+ Err(err) => {
+ lsp_warn!("Node resolution failed for '{}': {}", specifier, err);
}
+ _ => {}
}
}
@@ -794,8 +784,7 @@ impl FileSystemDocuments {
pub fn get(
&self,
specifier: &ModuleSpecifier,
- resolver: &Arc<CliGraphResolver>,
- maybe_node_resolver: Option<&CliNodeResolver>,
+ resolver: &Arc<LspResolver>,
config: &Arc<Config>,
cache: &Arc<dyn HttpCache>,
) -> Option<Arc<Document>> {
@@ -814,13 +803,7 @@ impl FileSystemDocuments {
};
if dirty {
// attempt to update the file on the file system
- self.refresh_document(
- specifier,
- resolver,
- maybe_node_resolver,
- config,
- cache,
- )
+ self.refresh_document(specifier, resolver, config, cache)
} else {
old_doc
}
@@ -831,8 +814,7 @@ impl FileSystemDocuments {
fn refresh_document(
&self,
specifier: &ModuleSpecifier,
- resolver: &Arc<CliGraphResolver>,
- maybe_node_resolver: Option<&CliNodeResolver>,
+ resolver: &Arc<LspResolver>,
config: &Arc<Config>,
cache: &Arc<dyn HttpCache>,
) -> Option<Arc<Document>> {
@@ -848,7 +830,6 @@ impl FileSystemDocuments {
None,
None,
resolver.clone(),
- maybe_node_resolver,
config.clone(),
cache,
)
@@ -864,7 +845,6 @@ impl FileSystemDocuments {
None,
None,
resolver.clone(),
- maybe_node_resolver,
config.clone(),
cache,
)
@@ -893,7 +873,6 @@ impl FileSystemDocuments {
None,
maybe_headers,
resolver.clone(),
- maybe_node_resolver,
config.clone(),
cache,
)
@@ -942,11 +921,9 @@ pub struct Documents {
/// Any imports to the context supplied by configuration files. This is like
/// the imports into the a module graph in CLI.
imports: Arc<IndexMap<ModuleSpecifier, GraphImport>>,
- /// Resolver for node_modules.
- maybe_node_resolver: Option<Arc<CliNodeResolver>>,
/// A resolver that takes into account currently loaded import map and JSX
/// settings.
- resolver: Arc<CliGraphResolver>,
+ resolver: Arc<LspResolver>,
jsr_resolver: Arc<JsrCacheResolver>,
lockfile: Option<Arc<Mutex<Lockfile>>>,
/// The npm package requirements found in npm specifiers.
@@ -969,17 +946,7 @@ impl Documents {
open_docs: HashMap::default(),
file_system_docs: Default::default(),
imports: Default::default(),
- maybe_node_resolver: None,
- resolver: Arc::new(CliGraphResolver::new(CliGraphResolverOptions {
- node_resolver: None,
- npm_resolver: None,
- package_json_deps_provider: Arc::new(PackageJsonDepsProvider::default()),
- maybe_jsx_import_source_config: None,
- maybe_import_map: None,
- maybe_vendor_dir: None,
- bare_node_builtins_enabled: false,
- sloppy_imports_resolver: None,
- })),
+ resolver: Default::default(),
jsr_resolver: Arc::new(JsrCacheResolver::new(cache.clone(), None)),
lockfile: None,
npm_specifier_reqs: Default::default(),
@@ -1022,7 +989,6 @@ impl Documents {
// x-typescript-types?
None,
self.resolver.clone(),
- self.maybe_node_resolver.as_deref(),
self.config.clone(),
&self.cache,
);
@@ -1218,7 +1184,6 @@ impl Documents {
self.file_system_docs.get(
&specifier,
&self.resolver,
- self.maybe_node_resolver.as_deref(),
&self.config,
&self.cache,
)
@@ -1280,29 +1245,21 @@ impl Documents {
&self,
specifiers: &[String],
referrer: &ModuleSpecifier,
- maybe_npm: Option<&StateNpmSnapshot>,
) -> Vec<Option<(ModuleSpecifier, MediaType)>> {
let document = self.get(referrer);
let dependencies = document.as_ref().map(|d| d.dependencies());
let mut results = Vec::new();
for specifier in specifiers {
- 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(
- npm
- .node_resolver
- .resolve(
- specifier,
- referrer,
- NodeResolutionMode::Types,
- &PermissionsContainer::allow_all(),
- )
- .ok()
- .flatten(),
- )));
- continue;
- }
+ if self.resolver.in_npm_package(referrer) {
+ // we're in an npm package, so use node resolution
+ results.push(Some(NodeResolution::into_specifier_and_media_type(
+ self
+ .resolver
+ .node_resolve(specifier, referrer, NodeResolutionMode::Types)
+ .ok()
+ .flatten(),
+ )));
+ continue;
}
if specifier.starts_with("asset:") {
if let Ok(specifier) = ModuleSpecifier::parse(specifier) {
@@ -1315,9 +1272,9 @@ impl Documents {
dependencies.as_ref().and_then(|d| d.get(specifier))
{
if let Some(specifier) = dep.maybe_type.maybe_specifier() {
- results.push(self.resolve_dependency(specifier, maybe_npm, referrer));
+ results.push(self.resolve_dependency(specifier, referrer));
} else if let Some(specifier) = dep.maybe_code.maybe_specifier() {
- results.push(self.resolve_dependency(specifier, maybe_npm, referrer));
+ results.push(self.resolve_dependency(specifier, referrer));
} else {
results.push(None);
}
@@ -1325,14 +1282,14 @@ impl Documents {
.resolve_imports_dependency(specifier)
.and_then(|r| r.maybe_specifier())
{
- results.push(self.resolve_dependency(specifier, maybe_npm, referrer));
+ results.push(self.resolve_dependency(specifier, referrer));
} else if let Ok(npm_req_ref) =
NpmPackageReqReference::from_str(specifier)
{
results.push(node_resolve_npm_req_ref(
&npm_req_ref,
- maybe_npm,
referrer,
+ &self.resolver,
));
} else if let Ok(specifier) = self.resolver.as_graph_resolver().resolve(
specifier,
@@ -1343,7 +1300,7 @@ impl Documents {
},
ResolutionMode::Types,
) {
- results.push(self.resolve_dependency(&specifier, maybe_npm, referrer));
+ results.push(self.resolve_dependency(&specifier, referrer));
} else {
results.push(None);
}
@@ -1372,36 +1329,13 @@ impl Documents {
pub fn update_config(
&mut self,
config: &Config,
- node_resolver: Option<Arc<CliNodeResolver>>,
- npm_resolver: Option<Arc<dyn CliNpmResolver>>,
+ resolver: &Arc<LspResolver>,
workspace_files: &BTreeSet<ModuleSpecifier>,
) {
self.config = Arc::new(config.clone());
let config_data = config.tree.root_data();
let config_file = config_data.and_then(|d| d.config_file.as_deref());
- self.maybe_node_resolver = node_resolver.clone();
- self.resolver = Arc::new(CliGraphResolver::new(CliGraphResolverOptions {
- node_resolver,
- npm_resolver,
- package_json_deps_provider: Arc::new(PackageJsonDepsProvider::new(
- config_data
- .and_then(|d| d.package_json.as_ref())
- .map(|package_json| {
- package_json::get_local_package_json_version_reqs(package_json)
- }),
- )),
- maybe_jsx_import_source_config: config_file
- .and_then(|cf| cf.to_maybe_jsx_import_source_config().ok().flatten()),
- maybe_import_map: config_data.and_then(|d| d.import_map.clone()),
- maybe_vendor_dir: config_data.and_then(|d| d.vendor_dir.as_ref()),
- bare_node_builtins_enabled: config_file
- .map(|config| config.has_unstable("bare-node-builtins"))
- .unwrap_or(false),
- // Don't set this for the LSP because instead we'll use the OpenDocumentsLoader
- // because it's much easier and we get diagnostics/quick fixes about a redirected
- // specifier for free.
- sloppy_imports_resolver: None,
- }));
+ self.resolver = resolver.clone();
self.jsr_resolver = Arc::new(JsrCacheResolver::new(
self.cache.clone(),
config.tree.root_lockfile().cloned(),
@@ -1452,21 +1386,14 @@ impl Documents {
if !config.specifier_enabled(doc.specifier()) {
continue;
}
- *doc = doc.with_new_config(
- self.resolver.clone(),
- self.maybe_node_resolver.as_deref(),
- self.config.clone(),
- );
+ *doc = doc.with_new_config(self.resolver.clone(), self.config.clone());
}
for mut doc in self.file_system_docs.docs.iter_mut() {
if !config.specifier_enabled(doc.specifier()) {
continue;
}
- *doc.value_mut() = doc.with_new_config(
- self.resolver.clone(),
- self.maybe_node_resolver.as_deref(),
- self.config.clone(),
- );
+ *doc.value_mut() =
+ doc.with_new_config(self.resolver.clone(), self.config.clone());
}
self.open_docs = open_docs;
let mut preload_count = 0;
@@ -1484,7 +1411,6 @@ impl Documents {
fs_docs.refresh_document(
specifier,
&self.resolver,
- self.maybe_node_resolver.as_deref(),
&self.config,
&self.cache,
);
@@ -1566,7 +1492,6 @@ impl Documents {
fn resolve_dependency(
&self,
specifier: &ModuleSpecifier,
- maybe_npm: Option<&StateNpmSnapshot>,
referrer: &ModuleSpecifier,
) -> Option<(ModuleSpecifier, MediaType)> {
if let Some(module_name) = specifier.as_str().strip_prefix("node:") {
@@ -1579,13 +1504,13 @@ impl Documents {
}
if let Ok(npm_ref) = NpmPackageReqReference::from_specifier(specifier) {
- return node_resolve_npm_req_ref(&npm_ref, maybe_npm, referrer);
+ return node_resolve_npm_req_ref(&npm_ref, referrer, &self.resolver);
}
let Some(doc) = self.get(specifier) else {
return Some((specifier.clone(), MediaType::from_specifier(specifier)));
};
if let Some(specifier) = doc.maybe_types_dependency().maybe_specifier() {
- self.resolve_dependency(specifier, maybe_npm, referrer)
+ self.resolve_dependency(specifier, referrer)
} else {
let media_type = doc.media_type();
Some((doc.specifier().clone(), media_type))
@@ -1608,22 +1533,19 @@ impl Documents {
fn node_resolve_npm_req_ref(
npm_req_ref: &NpmPackageReqReference,
- maybe_npm: Option<&StateNpmSnapshot>,
referrer: &ModuleSpecifier,
+ resolver: &LspResolver,
) -> Option<(ModuleSpecifier, MediaType)> {
- maybe_npm.map(|npm| {
- NodeResolution::into_specifier_and_media_type(
- npm
- .node_resolver
- .resolve_req_reference(
- npm_req_ref,
- &PermissionsContainer::allow_all(),
- referrer,
- NodeResolutionMode::Types,
- )
- .ok(),
- )
- })
+ Some(NodeResolution::into_specifier_and_media_type(
+ resolver
+ .resolve_npm_req_reference(
+ npm_req_ref,
+ referrer,
+ NodeResolutionMode::Types,
+ )
+ .ok()
+ .flatten(),
+ ))
}
/// Loader that will look at the open documents.
@@ -1717,7 +1639,7 @@ fn parse_and_analyze_module(
text_info: SourceTextInfo,
maybe_headers: Option<&HashMap<String, String>>,
media_type: MediaType,
- resolver: &CliGraphResolver,
+ resolver: &LspResolver,
) -> (Option<ParsedSourceResult>, Option<ModuleResult>) {
let parsed_source_result = parse_source(specifier, text_info, media_type);
let module_result =
@@ -1744,7 +1666,7 @@ fn analyze_module(
specifier: &ModuleSpecifier,
parsed_source_result: &ParsedSourceResult,
maybe_headers: Option<&HashMap<String, String>>,
- resolver: &CliGraphResolver,
+ resolver: &LspResolver,
) -> ModuleResult {
match parsed_source_result {
Ok(parsed_source) => Ok(deno_graph::parse_module_from_ast(
@@ -1939,7 +1861,10 @@ console.log(b, "hello deno");
)
.await;
- documents.update_config(&config, None, None, &workspace_files);
+ let resolver = LspResolver::default()
+ .with_new_config(&config, None, None)
+ .await;
+ documents.update_config(&config, &resolver, &workspace_files);
// open the document
let document = documents.open(
@@ -1980,7 +1905,10 @@ console.log(b, "hello deno");
)
.await;
- documents.update_config(&config, None, None, &workspace_files);
+ let resolver = LspResolver::default()
+ .with_new_config(&config, None, None)
+ .await;
+ documents.update_config(&config, &resolver, &workspace_files);
// check the document's dependencies
let document = documents.get(&file1_specifier).unwrap();