From 410679285b3dcad6e4610813a74615f8dc11d74d Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 26 Jul 2021 20:16:47 +0300 Subject: [PATCH] internal: prepare to track changes to mem_docs --- crates/rust-analyzer/src/document.rs | 16 ------- crates/rust-analyzer/src/global_state.rs | 10 ++--- crates/rust-analyzer/src/lib.rs | 2 +- crates/rust-analyzer/src/main_loop.rs | 10 ++--- crates/rust-analyzer/src/mem_docs.rs | 56 ++++++++++++++++++++++++ crates/rust-analyzer/src/reload.rs | 2 +- 6 files changed, 68 insertions(+), 28 deletions(-) delete mode 100644 crates/rust-analyzer/src/document.rs create mode 100644 crates/rust-analyzer/src/mem_docs.rs diff --git a/crates/rust-analyzer/src/document.rs b/crates/rust-analyzer/src/document.rs deleted file mode 100644 index cf091510ffa..00000000000 --- a/crates/rust-analyzer/src/document.rs +++ /dev/null @@ -1,16 +0,0 @@ -//! In-memory document information. - -/// Information about a document that the Language Client -/// knows about. -/// Its lifetime is driven by the textDocument/didOpen and textDocument/didClose -/// client notifications. -#[derive(Debug, Clone)] -pub(crate) struct DocumentData { - pub(crate) version: i32, -} - -impl DocumentData { - pub(crate) fn new(version: i32) -> Self { - DocumentData { version } - } -} diff --git a/crates/rust-analyzer/src/global_state.rs b/crates/rust-analyzer/src/global_state.rs index 853b73b70ef..b21fff7071a 100644 --- a/crates/rust-analyzer/src/global_state.rs +++ b/crates/rust-analyzer/src/global_state.rs @@ -8,7 +8,7 @@ use crossbeam_channel::{unbounded, Receiver, Sender}; use flycheck::FlycheckHandle; use ide::{Analysis, AnalysisHost, Cancellable, Change, FileId}; -use ide_db::base_db::{CrateId, VfsPath}; +use ide_db::base_db::CrateId; use lsp_types::{SemanticTokens, Url}; use parking_lot::{Mutex, RwLock}; use project_model::{ @@ -20,11 +20,11 @@ use crate::{ config::Config, diagnostics::{CheckFixes, DiagnosticCollection}, - document::DocumentData, from_proto, line_index::{LineEndings, LineIndex}, lsp_ext, main_loop::Task, + mem_docs::MemDocs, op_queue::OpQueue, reload::SourceRootConfig, request_metrics::{LatestRequests, RequestMetrics}, @@ -57,7 +57,7 @@ pub(crate) struct GlobalState { pub(crate) config: Arc, pub(crate) analysis_host: AnalysisHost, pub(crate) diagnostics: DiagnosticCollection, - pub(crate) mem_docs: FxHashMap, + pub(crate) mem_docs: MemDocs, pub(crate) semantic_tokens_cache: Arc>>, pub(crate) shutdown_requested: bool, pub(crate) last_reported_status: Option, @@ -115,7 +115,7 @@ pub(crate) struct GlobalStateSnapshot { pub(crate) analysis: Analysis, pub(crate) check_fixes: CheckFixes, pub(crate) latest_requests: Arc>, - mem_docs: FxHashMap, + mem_docs: MemDocs, pub(crate) semantic_tokens_cache: Arc>>, vfs: Arc)>>, pub(crate) workspaces: Arc>, @@ -147,7 +147,7 @@ pub(crate) fn new(sender: Sender, config: Config) -> Global config: Arc::new(config.clone()), analysis_host, diagnostics: Default::default(), - mem_docs: FxHashMap::default(), + mem_docs: MemDocs::default(), semantic_tokens_cache: Arc::new(Default::default()), shutdown_requested: false, last_reported_status: None, diff --git a/crates/rust-analyzer/src/lib.rs b/crates/rust-analyzer/src/lib.rs index da7e24becd0..a5997d69d9a 100644 --- a/crates/rust-analyzer/src/lib.rs +++ b/crates/rust-analyzer/src/lib.rs @@ -33,7 +33,7 @@ macro_rules! eprintln { mod request_metrics; mod lsp_utils; mod thread_pool; -mod document; +mod mem_docs; mod diff; mod op_queue; pub mod lsp_ext; diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index 8aaca471603..0518a17f307 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs @@ -17,11 +17,11 @@ use crate::{ config::Config, dispatch::{NotificationDispatcher, RequestDispatcher}, - document::DocumentData, from_proto, global_state::{file_id_to_url, url_to_file_id, GlobalState}, handlers, lsp_ext, lsp_utils::{apply_document_changes, is_cancelled, notification_is, Progress}, + mem_docs::DocumentData, reload::{BuildDataProgress, ProjectWorkspaceProgress}, Result, }; @@ -305,7 +305,7 @@ fn handle_event(&mut self, event: Event) -> Result<()> { let vfs = &mut self.vfs.write().0; for (path, contents) in files { let path = VfsPath::from(path); - if !self.mem_docs.contains_key(&path) { + if !self.mem_docs.contains(&path) { vfs.set_file_contents(path, contents); } } @@ -582,7 +582,7 @@ fn on_notification(&mut self, not: Notification) -> Result<()> { if this .mem_docs .insert(path.clone(), DocumentData::new(params.text_document.version)) - .is_some() + .is_err() { log::error!("duplicate DidOpenTextDocument: {}", path) } @@ -628,7 +628,7 @@ fn on_notification(&mut self, not: Notification) -> Result<()> { })? .on::(|this, params| { if let Ok(path) = from_proto::vfs_path(¶ms.text_document.uri) { - if this.mem_docs.remove(&path).is_none() { + if this.mem_docs.remove(&path).is_err() { log::error!("orphan DidCloseTextDocument: {}", path); } @@ -719,7 +719,7 @@ fn update_file_notifications_on_threadpool(&mut self) { fn maybe_update_diagnostics(&mut self) { let subscriptions = self .mem_docs - .keys() + .iter() .map(|path| self.vfs.read().0.file_id(path).unwrap()) .collect::>(); diff --git a/crates/rust-analyzer/src/mem_docs.rs b/crates/rust-analyzer/src/mem_docs.rs new file mode 100644 index 00000000000..8989d7d9e44 --- /dev/null +++ b/crates/rust-analyzer/src/mem_docs.rs @@ -0,0 +1,56 @@ +//! In-memory document information. + +use rustc_hash::FxHashMap; +use vfs::VfsPath; + +/// Holds the set of in-memory documents. +/// +/// For these document, there true contents is maintained by the client. It +/// might be different from what's on disk. +#[derive(Default, Clone)] +pub(crate) struct MemDocs { + mem_docs: FxHashMap, +} + +impl MemDocs { + pub(crate) fn contains(&self, path: &VfsPath) -> bool { + self.mem_docs.contains_key(path) + } + pub(crate) fn insert(&mut self, path: VfsPath, data: DocumentData) -> Result<(), ()> { + match self.mem_docs.insert(path, data) { + Some(_) => Err(()), + None => Ok(()), + } + } + pub(crate) fn remove(&mut self, path: &VfsPath) -> Result<(), ()> { + match self.mem_docs.remove(path) { + Some(_) => Ok(()), + None => Err(()), + } + } + pub(crate) fn get(&self, path: &VfsPath) -> Option<&DocumentData> { + self.mem_docs.get(path) + } + pub(crate) fn get_mut(&mut self, path: &VfsPath) -> Option<&mut DocumentData> { + self.mem_docs.get_mut(path) + } + + pub(crate) fn iter(&self) -> impl Iterator { + self.mem_docs.keys() + } +} + +/// Information about a document that the Language Client +/// knows about. +/// Its lifetime is driven by the textDocument/didOpen and textDocument/didClose +/// client notifications. +#[derive(Debug, Clone)] +pub(crate) struct DocumentData { + pub(crate) version: i32, +} + +impl DocumentData { + pub(crate) fn new(version: i32) -> Self { + DocumentData { version } + } +} diff --git a/crates/rust-analyzer/src/reload.rs b/crates/rust-analyzer/src/reload.rs index 8144554bcab..0530bf14fc8 100644 --- a/crates/rust-analyzer/src/reload.rs +++ b/crates/rust-analyzer/src/reload.rs @@ -403,7 +403,7 @@ fn eq_ignore_build_data<'a>( let mut load = |path: &AbsPath| { let _p = profile::span("GlobalState::load"); let vfs_path = vfs::VfsPath::from(path.to_path_buf()); - if !mem_docs.contains_key(&vfs_path) { + if !mem_docs.contains(&vfs_path) { let contents = loader.handle.load_sync(path); vfs.set_file_contents(vfs_path.clone(), contents); }