From deea8f52d9803bb8a93d5dbd935970a20f07a51e Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 6 Aug 2019 13:34:28 +0200 Subject: allow to exclude certain files and directories --- crates/ra_lsp_server/src/config.rs | 11 +++++++++-- crates/ra_lsp_server/src/main_loop.rs | 8 +++++++- crates/ra_lsp_server/src/world.rs | 24 +++++++++++++----------- 3 files changed, 29 insertions(+), 14 deletions(-) (limited to 'crates/ra_lsp_server') diff --git a/crates/ra_lsp_server/src/config.rs b/crates/ra_lsp_server/src/config.rs index a16cc292e..6dcdc695a 100644 --- a/crates/ra_lsp_server/src/config.rs +++ b/crates/ra_lsp_server/src/config.rs @@ -1,7 +1,7 @@ use serde::{Deserialize, Deserializer}; /// Client provided initialization options -#[derive(Deserialize, Clone, Copy, Debug, PartialEq, Eq)] +#[derive(Deserialize, Clone, Debug, PartialEq, Eq)] #[serde(rename_all = "camelCase", default)] pub struct ServerConfig { /// Whether the client supports our custom highlighting publishing decorations. @@ -18,12 +18,19 @@ pub struct ServerConfig { #[serde(deserialize_with = "nullable_bool_true")] pub show_workspace_loaded: bool, + pub exclude_globs: Vec, + pub lru_capacity: Option, } impl Default for ServerConfig { fn default() -> ServerConfig { - ServerConfig { publish_decorations: false, show_workspace_loaded: true, lru_capacity: None } + ServerConfig { + publish_decorations: false, + show_workspace_loaded: true, + exclude_globs: Vec::new(), + lru_capacity: None, + } } } diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index 8ab501828..9d540a87e 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs @@ -56,6 +56,7 @@ pub fn main_loop( msg_receiver: &Receiver, msg_sender: &Sender, ) -> Result<()> { + log::debug!("server_config: {:?}", config); // FIXME: support dynamic workspace loading. let workspaces = { let ws_worker = workspace_loader(); @@ -77,11 +78,16 @@ pub fn main_loop( } loaded_workspaces }; - + let globs = config + .exclude_globs + .iter() + .map(|glob| ra_vfs_glob::Glob::new(glob)) + .collect::, _>>()?; let mut state = WorldState::new( ws_roots, workspaces, config.lru_capacity, + &globs, Options { publish_decorations: config.publish_decorations, show_workspace_loaded: config.show_workspace_loaded, diff --git a/crates/ra_lsp_server/src/world.rs b/crates/ra_lsp_server/src/world.rs index a8aafe5cb..9990ef62e 100644 --- a/crates/ra_lsp_server/src/world.rs +++ b/crates/ra_lsp_server/src/world.rs @@ -10,7 +10,7 @@ use ra_ide_api::{ Analysis, AnalysisChange, AnalysisHost, CrateGraph, FileId, LibraryData, SourceRootId, }; use ra_vfs::{RootEntry, Vfs, VfsChange, VfsFile, VfsRoot}; -use ra_vfs_glob::RustPackageFilterBuilder; +use ra_vfs_glob::{Glob, RustPackageFilterBuilder}; use relative_path::RelativePathBuf; use crate::{ @@ -56,25 +56,27 @@ impl WorldState { folder_roots: Vec, workspaces: Vec, lru_capacity: Option, + exclude_globs: &[Glob], options: Options, ) -> WorldState { let mut change = AnalysisChange::new(); let mut roots = Vec::new(); roots.extend(folder_roots.iter().map(|path| { - RootEntry::new( - path.clone(), - RustPackageFilterBuilder::default().set_member(true).into_vfs_filter(), - ) + let mut filter = RustPackageFilterBuilder::default().set_member(true); + for glob in exclude_globs.iter() { + filter = filter.exclude(glob.clone()); + } + RootEntry::new(path.clone(), filter.into_vfs_filter()) })); for ws in workspaces.iter() { roots.extend(ws.to_roots().into_iter().map(|pkg_root| { - RootEntry::new( - pkg_root.path().clone(), - RustPackageFilterBuilder::default() - .set_member(pkg_root.is_member()) - .into_vfs_filter(), - ) + let mut filter = + RustPackageFilterBuilder::default().set_member(pkg_root.is_member()); + for glob in exclude_globs.iter() { + filter = filter.exclude(glob.clone()); + } + RootEntry::new(pkg_root.path().clone(), filter.into_vfs_filter()) })); } -- cgit v1.2.3