From 5ba645c0094c79d9aab527f0396fdad3e99bef3b Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 3 Sep 2018 21:26:59 +0300 Subject: index libraies off the main thread --- crates/libanalysis/src/imp.rs | 5 ++--- crates/libanalysis/src/lib.rs | 16 ++++++++++++++-- crates/libanalysis/src/roots.rs | 3 ++- crates/server/src/main_loop/mod.rs | 15 +++++++++++++-- crates/server/src/server_world.rs | 13 ++++++++----- 5 files changed, 39 insertions(+), 13 deletions(-) (limited to 'crates') diff --git a/crates/libanalysis/src/imp.rs b/crates/libanalysis/src/imp.rs index 3ea27947e..50855551e 100644 --- a/crates/libanalysis/src/imp.rs +++ b/crates/libanalysis/src/imp.rs @@ -57,9 +57,8 @@ impl AnalysisHostImpl { } self.data_mut().crate_graph = graph; } - pub fn add_library(&mut self, files: impl Iterator) { - let libs = ReadonlySourceRoot::new(files); - self.data_mut().libs.push(Arc::new(libs)); + pub fn add_library(&mut self, root: ReadonlySourceRoot) { + self.data_mut().libs.push(Arc::new(root)); } fn data_mut(&mut self) -> &mut WorldData { Arc::make_mut(&mut self.data) diff --git a/crates/libanalysis/src/lib.rs b/crates/libanalysis/src/lib.rs index e9e0c51d5..a8152939b 100644 --- a/crates/libanalysis/src/lib.rs +++ b/crates/libanalysis/src/lib.rs @@ -68,8 +68,8 @@ impl AnalysisHost { pub fn set_crate_graph(&mut self, graph: CrateGraph) { self.imp.set_crate_graph(graph) } - pub fn add_library(&mut self, files: impl Iterator) { - self.imp.add_library(files) + pub fn add_library(&mut self, data: LibraryData) { + self.imp.add_library(data.root) } } @@ -216,3 +216,15 @@ impl Analysis { self.imp.diagnostics(file_id) } } + +#[derive(Debug)] +pub struct LibraryData { + root: roots::ReadonlySourceRoot +} + +impl LibraryData { + pub fn prepare(files: Vec<(FileId, String)>) -> LibraryData { + let root = roots::ReadonlySourceRoot::new(files); + LibraryData { root } + } +} diff --git a/crates/libanalysis/src/roots.rs b/crates/libanalysis/src/roots.rs index a65668c9b..f1bc72e33 100644 --- a/crates/libanalysis/src/roots.rs +++ b/crates/libanalysis/src/roots.rs @@ -136,9 +136,10 @@ pub(crate) struct ReadonlySourceRoot { } impl ReadonlySourceRoot { - pub fn new(files: impl Iterator) -> ReadonlySourceRoot { + pub fn new(files: Vec<(FileId, String)>) -> ReadonlySourceRoot { let mut module_map = ModuleMap::new(); let file_map: HashMap = files + .into_iter() .map(|(id, text)| { module_map.update_file(id, ChangeKind::Insert); (id, FileData::new(text)) diff --git a/crates/server/src/main_loop/mod.rs b/crates/server/src/main_loop/mod.rs index ce61265a2..3d131274f 100644 --- a/crates/server/src/main_loop/mod.rs +++ b/crates/server/src/main_loop/mod.rs @@ -10,7 +10,7 @@ use threadpool::ThreadPool; use serde::{Serialize, de::DeserializeOwned}; use crossbeam_channel::{bounded, Sender, Receiver}; use languageserver_types::{NumberOrString}; -use libanalysis::{FileId, JobHandle, JobToken}; +use libanalysis::{FileId, JobHandle, JobToken, LibraryData}; use gen_lsp_server::{ RawRequest, RawNotification, RawMessage, RawResponse, ErrorCode, handle_shutdown, @@ -94,6 +94,7 @@ fn main_loop_inner( pending_requests: &mut HashMap, subs: &mut Subscriptions, ) -> Result<()> { + let (libdata_sender, libdata_receiver) = bounded(1024); ws_sender.send(ws_root.clone()); fs_sender.send(ws_root.clone()); loop { @@ -103,6 +104,7 @@ fn main_loop_inner( Task(Task), Fs(PathBuf, Vec), Ws(Result), + Lib(LibraryData), } trace!("selecting"); let event = select! { @@ -119,6 +121,7 @@ fn main_loop_inner( None => bail!("workspace watcher died"), Some(ws) => Event::Ws(ws), } + recv(libdata_receiver, data) => Event::Lib(data.unwrap()) }; trace!("selected {:?}", event); let mut state_changed = false; @@ -129,7 +132,12 @@ fn main_loop_inner( if root == ws_root { state.apply_fs_changes(events); } else { - state.add_library(events); + let files = state.events_to_files(events); + let sender = libdata_sender.clone(); + pool.execute(move || { + let data = LibraryData::prepare(files); + sender.send(data); + }); } state_changed = true; } @@ -152,6 +160,9 @@ fn main_loop_inner( Err(e) => warn!("loading workspace failed: {}", e), } } + Event::Lib(lib) => { + state.add_lib(lib); + } Event::Msg(msg) => { match msg { RawMessage::Request(req) => { diff --git a/crates/server/src/server_world.rs b/crates/server/src/server_world.rs index 95c109e10..729418eaa 100644 --- a/crates/server/src/server_world.rs +++ b/crates/server/src/server_world.rs @@ -6,7 +6,7 @@ use std::{ }; use languageserver_types::Url; -use libanalysis::{FileId, AnalysisHost, Analysis, CrateGraph, CrateId}; +use libanalysis::{FileId, AnalysisHost, Analysis, CrateGraph, CrateId, LibraryData}; use { Result, @@ -64,17 +64,20 @@ impl ServerWorldState { self.analysis_host.change_files(changes); } - pub fn add_library(&mut self, events: Vec) { + pub fn events_to_files(&mut self, events: Vec) -> Vec<(FileId, String)> { let pm = &mut self.path_map; - let files = events.into_iter() + events.into_iter() .map(|event| { let text = match event.kind { FileEventKind::Add(text) => text, }; (event.path, text) }) - .map(|(path, text)| (pm.get_or_insert(path), text)); - self.analysis_host.add_library(files); + .map(|(path, text)| (pm.get_or_insert(path), text)) + .collect() + } + pub fn add_lib(&mut self, data: LibraryData) { + self.analysis_host.add_library(data); } pub fn add_mem_file(&mut self, path: PathBuf, text: String) -> FileId { -- cgit v1.2.3