diff options
-rw-r--r-- | cli/lsp/completions.rs | 5 | ||||
-rw-r--r-- | cli/lsp/diagnostics.rs | 12 | ||||
-rw-r--r-- | cli/lsp/documents.rs | 76 | ||||
-rw-r--r-- | cli/lsp/language_server.rs | 5 | ||||
-rw-r--r-- | cli/lsp/testing/server.rs | 6 | ||||
-rw-r--r-- | cli/lsp/tsc.rs | 3 |
6 files changed, 64 insertions, 43 deletions
diff --git a/cli/lsp/completions.rs b/cli/lsp/completions.rs index ccb945a0b..cb8bd446d 100644 --- a/cli/lsp/completions.rs +++ b/cli/lsp/completions.rs @@ -3,6 +3,7 @@ use super::client::Client; use super::config::ConfigSnapshot; use super::documents::Documents; +use super::documents::DocumentsFilter; use super::lsp_custom; use super::registries::ModuleRegistry; use super::tsc; @@ -278,7 +279,7 @@ fn get_import_map_completions( if let Ok(resolved) = import_map.resolve(&key, specifier) { let resolved = resolved.to_string(); let workspace_items: Vec<lsp::CompletionItem> = documents - .documents(false, true) + .documents(DocumentsFilter::AllDiagnosable) .into_iter() .filter_map(|d| { let specifier_str = d.specifier().to_string(); @@ -460,7 +461,7 @@ fn get_workspace_completions( documents: &Documents, ) -> Vec<lsp::CompletionItem> { let workspace_specifiers = documents - .documents(false, true) + .documents(DocumentsFilter::AllDiagnosable) .into_iter() .map(|d| d.specifier().clone()) .collect(); diff --git a/cli/lsp/diagnostics.rs b/cli/lsp/diagnostics.rs index a9274801a..8ba8ce074 100644 --- a/cli/lsp/diagnostics.rs +++ b/cli/lsp/diagnostics.rs @@ -6,6 +6,7 @@ use super::client::Client; use super::config::ConfigSnapshot; use super::documents; use super::documents::Document; +use super::documents::DocumentsFilter; use super::language_server; use super::language_server::StateSnapshot; use super::performance::Performance; @@ -454,7 +455,9 @@ async fn generate_lint_diagnostics( lint_options: &LintOptions, token: CancellationToken, ) -> DiagnosticVec { - let documents = snapshot.documents.documents(true, true); + let documents = snapshot + .documents + .documents(DocumentsFilter::OpenDiagnosable); let workspace_settings = config.settings.workspace.clone(); let lint_rules = get_configured_rules(lint_options.rules.clone()); let mut diagnostics_vec = Vec::new(); @@ -530,7 +533,7 @@ async fn generate_ts_diagnostics( let mut diagnostics_vec = Vec::new(); let specifiers = snapshot .documents - .documents(true, true) + .documents(DocumentsFilter::OpenDiagnosable) .into_iter() .map(|d| d.specifier().clone()); let (enabled_specifiers, disabled_specifiers) = specifiers @@ -1025,7 +1028,10 @@ async fn generate_deno_diagnostics( ) -> DiagnosticVec { let mut diagnostics_vec = Vec::new(); - for document in snapshot.documents.documents(true, true) { + for document in snapshot + .documents + .documents(DocumentsFilter::OpenDiagnosable) + { if token.is_cancelled() { break; } diff --git a/cli/lsp/documents.rs b/cli/lsp/documents.rs index 20ca755d9..d8a94e538 100644 --- a/cli/lsp/documents.rs +++ b/cli/lsp/documents.rs @@ -800,6 +800,17 @@ fn get_document_path( } } +/// Specify the documents to include on a `documents.documents(...)` call. +#[derive(Debug, Clone, Copy)] +pub enum DocumentsFilter { + /// Includes all the documents (diagnosable & non-diagnosable, open & file system). + All, + /// Includes all the diagnosable documents (open & file system). + AllDiagnosable, + /// Includes only the diagnosable documents that are open. + OpenDiagnosable, +} + #[derive(Debug, Clone, Default)] pub struct Documents { /// The DENO_DIR that the documents looks for non-file based modules. @@ -1011,47 +1022,44 @@ impl Documents { } } - /// Return a vector of documents that are contained in the document store, - /// where `open_only` flag would provide only those documents currently open - /// in the editor and `diagnosable_only` would provide only those documents - /// that the language server can provide diagnostics for. - pub fn documents( - &self, - open_only: bool, - diagnosable_only: bool, - ) -> Vec<Document> { - if open_only { - self + /// Return a collection of documents that are contained in the document store + /// based on the provided filter. + pub fn documents(&self, filter: DocumentsFilter) -> Vec<Document> { + match filter { + DocumentsFilter::OpenDiagnosable => self .open_docs .values() .filter_map(|doc| { - if !diagnosable_only || doc.is_diagnosable() { + if doc.is_diagnosable() { Some(doc.clone()) } else { None } }) - .collect() - } else { - // it is technically possible for a Document to end up in both the open - // and closed documents so we need to ensure we don't return duplicates - let mut seen_documents = HashSet::new(); - let file_system_docs = self.file_system_docs.lock(); - self - .open_docs - .values() - .chain(file_system_docs.docs.values()) - .filter_map(|doc| { - // this prefers the open documents - if seen_documents.insert(doc.specifier().clone()) - && (!diagnosable_only || doc.is_diagnosable()) - { - Some(doc.clone()) - } else { - None - } - }) - .collect() + .collect(), + DocumentsFilter::AllDiagnosable | DocumentsFilter::All => { + let diagnosable_only = + matches!(filter, DocumentsFilter::AllDiagnosable); + // it is technically possible for a Document to end up in both the open + // and closed documents so we need to ensure we don't return duplicates + let mut seen_documents = HashSet::new(); + let file_system_docs = self.file_system_docs.lock(); + self + .open_docs + .values() + .chain(file_system_docs.docs.values()) + .filter_map(|doc| { + // this prefers the open documents + if seen_documents.insert(doc.specifier().clone()) + && (!diagnosable_only || doc.is_diagnosable()) + { + Some(doc.clone()) + } else { + None + } + }) + .collect() + } } } @@ -1592,7 +1600,7 @@ console.log(b, "hello deno"); // At this point the document will be in both documents and the shared file system documents. // Now make sure that the original documents doesn't return both copies - assert_eq!(documents.documents(false, false).len(), 1); + assert_eq!(documents.documents(DocumentsFilter::All).len(), 1); } #[test] diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs index 72beb04bb..372a1489d 100644 --- a/cli/lsp/language_server.rs +++ b/cli/lsp/language_server.rs @@ -44,6 +44,7 @@ use super::documents::to_lsp_range; use super::documents::AssetOrDocument; use super::documents::Document; use super::documents::Documents; +use super::documents::DocumentsFilter; use super::documents::LanguageId; use super::logging::lsp_log; use super::lsp_custom; @@ -3223,7 +3224,7 @@ impl Inner { )?; cli_options.set_import_map_specifier(self.maybe_import_map_uri.clone()); - let open_docs = self.documents.documents(true, true); + let open_docs = self.documents.documents(DocumentsFilter::OpenDiagnosable); Ok(Some(PrepareCacheResult { cli_options, open_docs, @@ -3341,7 +3342,7 @@ impl Inner { let mut contents = String::new(); let mut documents_specifiers = self .documents - .documents(false, false) + .documents(DocumentsFilter::All) .into_iter() .map(|d| d.specifier().clone()) .collect::<Vec<_>>(); diff --git a/cli/lsp/testing/server.rs b/cli/lsp/testing/server.rs index 61db4316a..638ab5b55 100644 --- a/cli/lsp/testing/server.rs +++ b/cli/lsp/testing/server.rs @@ -8,6 +8,7 @@ use super::lsp_custom; use crate::lsp::client::Client; use crate::lsp::client::TestingNotification; use crate::lsp::config; +use crate::lsp::documents::DocumentsFilter; use crate::lsp::language_server::StateSnapshot; use crate::lsp::performance::Performance; @@ -92,7 +93,10 @@ impl TestServer { // eliminating any we go over when iterating over the document let mut keys: HashSet<ModuleSpecifier> = tests.keys().cloned().collect(); - for document in snapshot.documents.documents(false, true) { + for document in snapshot + .documents + .documents(DocumentsFilter::AllDiagnosable) + { let specifier = document.specifier(); keys.remove(specifier); let script_version = document.script_version(); diff --git a/cli/lsp/tsc.rs b/cli/lsp/tsc.rs index 3c70e4029..6ef9b1dc3 100644 --- a/cli/lsp/tsc.rs +++ b/cli/lsp/tsc.rs @@ -3,6 +3,7 @@ use super::code_lens; use super::config; use super::documents::AssetOrDocument; +use super::documents::DocumentsFilter; use super::language_server; use super::language_server::StateSnapshot; use super::performance::Performance; @@ -2760,7 +2761,7 @@ fn op_respond(state: &mut OpState, args: Response) -> bool { fn op_script_names(state: &mut OpState) -> Vec<String> { let state = state.borrow_mut::<State>(); let documents = &state.state_snapshot.documents; - let open_docs = documents.documents(true, true); + let open_docs = documents.documents(DocumentsFilter::OpenDiagnosable); let mut result = Vec::new(); let mut seen = HashSet::new(); |