mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-30 22:01:37 +00:00
introduce ra_vfs_glob crate
It manages exclusion rules for the vfs crate
This commit is contained in:
parent
c971869104
commit
34203256bf
12 changed files with 173 additions and 143 deletions
93
crates/ra_vfs_glob/src/lib.rs
Normal file
93
crates/ra_vfs_glob/src/lib.rs
Normal file
|
@ -0,0 +1,93 @@
|
|||
//! `ra_vfs_glob` crate implements exclusion rules for vfs.
|
||||
//!
|
||||
//! By default, we include only `.rs` files, and skip some know offenders like
|
||||
//! `/target` or `/node_modules` altogether.
|
||||
//!
|
||||
//! It's also possible to add custom exclusion globs.
|
||||
|
||||
use globset::{Glob, GlobSet, GlobSetBuilder};
|
||||
use ra_vfs::{Filter, RelativePath};
|
||||
|
||||
const ALWAYS_IGNORED: &[&str] = &["target/**", "**/node_modules/**", "**/.git/**"];
|
||||
const IGNORED_FOR_NON_MEMBERS: &[&str] = &["examples/**", "tests/**", "benches/**"];
|
||||
|
||||
pub struct RustPackageFilterBuilder {
|
||||
is_member: bool,
|
||||
exclude: GlobSetBuilder,
|
||||
}
|
||||
|
||||
impl Default for RustPackageFilterBuilder {
|
||||
fn default() -> RustPackageFilterBuilder {
|
||||
RustPackageFilterBuilder { is_member: false, exclude: GlobSetBuilder::new() }
|
||||
}
|
||||
}
|
||||
|
||||
impl RustPackageFilterBuilder {
|
||||
pub fn set_member(mut self, is_member: bool) -> RustPackageFilterBuilder {
|
||||
self.is_member = is_member;
|
||||
self
|
||||
}
|
||||
pub fn exclude(mut self, glob: &str) -> Result<RustPackageFilterBuilder, globset::Error> {
|
||||
self.exclude.add(Glob::new(glob)?);
|
||||
Ok(self)
|
||||
}
|
||||
pub fn into_vfs_filter(self) -> Box<dyn Filter> {
|
||||
let RustPackageFilterBuilder { is_member, mut exclude } = self;
|
||||
for &glob in ALWAYS_IGNORED {
|
||||
exclude.add(Glob::new(glob).unwrap());
|
||||
}
|
||||
if !is_member {
|
||||
for &glob in IGNORED_FOR_NON_MEMBERS {
|
||||
exclude.add(Glob::new(glob).unwrap());
|
||||
}
|
||||
}
|
||||
Box::new(RustPackageFilter { exclude: exclude.build().unwrap() })
|
||||
}
|
||||
}
|
||||
|
||||
struct RustPackageFilter {
|
||||
exclude: GlobSet,
|
||||
}
|
||||
|
||||
impl Filter for RustPackageFilter {
|
||||
fn include_dir(&self, dir_path: &RelativePath) -> bool {
|
||||
!self.exclude.is_match(dir_path.as_str())
|
||||
}
|
||||
|
||||
fn include_file(&self, file_path: &RelativePath) -> bool {
|
||||
file_path.extension() == Some("rs")
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_globs() {
|
||||
let filter = RustPackageFilterBuilder::default().set_member(true).into_vfs_filter();
|
||||
|
||||
assert!(filter.include_dir(RelativePath::new("src/tests")));
|
||||
assert!(filter.include_dir(RelativePath::new("src/target")));
|
||||
assert!(filter.include_dir(RelativePath::new("tests")));
|
||||
assert!(filter.include_dir(RelativePath::new("benches")));
|
||||
|
||||
assert!(!filter.include_dir(RelativePath::new("target")));
|
||||
assert!(!filter.include_dir(RelativePath::new("src/foo/.git")));
|
||||
assert!(!filter.include_dir(RelativePath::new("foo/node_modules")));
|
||||
|
||||
let filter = RustPackageFilterBuilder::default().set_member(false).into_vfs_filter();
|
||||
|
||||
assert!(filter.include_dir(RelativePath::new("src/tests")));
|
||||
assert!(filter.include_dir(RelativePath::new("src/target")));
|
||||
|
||||
assert!(!filter.include_dir(RelativePath::new("target")));
|
||||
assert!(!filter.include_dir(RelativePath::new("src/foo/.git")));
|
||||
assert!(!filter.include_dir(RelativePath::new("foo/node_modules")));
|
||||
assert!(!filter.include_dir(RelativePath::new("tests")));
|
||||
assert!(!filter.include_dir(RelativePath::new("benches")));
|
||||
|
||||
let filter = RustPackageFilterBuilder::default()
|
||||
.set_member(true)
|
||||
.exclude("src/llvm-project/**")
|
||||
.unwrap()
|
||||
.into_vfs_filter();
|
||||
|
||||
assert!(!filter.include_dir(RelativePath::new("src/llvm-project/clang")));
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue