mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-27 12:29:21 +00:00
Add scip/lsif flag to exclude vendored libaries
This commit is contained in:
parent
91aa3f46b3
commit
e257b9880f
5 changed files with 95 additions and 19 deletions
|
@ -119,6 +119,11 @@ fn documentation_for_definition(
|
|||
def.docs(sema.db, famous_defs.as_ref())
|
||||
}
|
||||
|
||||
pub enum VendoredLibrariesConfig<'a> {
|
||||
Included { workspace_root: &'a VfsPath },
|
||||
Excluded,
|
||||
}
|
||||
|
||||
impl StaticIndex<'_> {
|
||||
fn add_file(&mut self, file_id: FileId) {
|
||||
let current_crate = crates_for(self.db, file_id).pop().map(Into::into);
|
||||
|
@ -230,15 +235,22 @@ impl StaticIndex<'_> {
|
|||
self.files.push(result);
|
||||
}
|
||||
|
||||
pub fn compute<'a>(analysis: &'a Analysis, workspace_root: &VfsPath) -> StaticIndex<'a> {
|
||||
pub fn compute<'a>(
|
||||
analysis: &'a Analysis,
|
||||
vendored_libs_config: VendoredLibrariesConfig<'_>,
|
||||
) -> StaticIndex<'a> {
|
||||
let db = &*analysis.db;
|
||||
let work = all_modules(db).into_iter().filter(|module| {
|
||||
let file_id = module.definition_source_file_id(db).original_file(db);
|
||||
let source_root = db.file_source_root(file_id.into());
|
||||
let source_root = db.source_root(source_root);
|
||||
let is_vendored = source_root
|
||||
.path_for_file(&file_id.into())
|
||||
.is_some_and(|module_path| module_path.starts_with(workspace_root));
|
||||
let is_vendored = match vendored_libs_config {
|
||||
VendoredLibrariesConfig::Included { workspace_root } => source_root
|
||||
.path_for_file(&file_id.into())
|
||||
.is_some_and(|module_path| module_path.starts_with(workspace_root)),
|
||||
VendoredLibrariesConfig::Excluded => false,
|
||||
};
|
||||
|
||||
!source_root.is_library || is_vendored
|
||||
});
|
||||
let mut this = StaticIndex {
|
||||
|
@ -268,10 +280,11 @@ mod tests {
|
|||
use ide_db::{base_db::VfsPath, FileRange, FxHashSet};
|
||||
use syntax::TextSize;
|
||||
|
||||
fn check_all_ranges(ra_fixture: &str) {
|
||||
use super::VendoredLibrariesConfig;
|
||||
|
||||
fn check_all_ranges(ra_fixture: &str, vendored_libs_config: VendoredLibrariesConfig<'_>) {
|
||||
let (analysis, ranges) = fixture::annotations_without_marker(ra_fixture);
|
||||
let s =
|
||||
StaticIndex::compute(&analysis, &VfsPath::new_virtual_path("/workspace".to_owned()));
|
||||
let s = StaticIndex::compute(&analysis, vendored_libs_config);
|
||||
let mut range_set: FxHashSet<_> = ranges.iter().map(|it| it.0).collect();
|
||||
for f in s.files {
|
||||
for (range, _) in f.tokens {
|
||||
|
@ -288,10 +301,9 @@ mod tests {
|
|||
}
|
||||
|
||||
#[track_caller]
|
||||
fn check_definitions(ra_fixture: &str) {
|
||||
fn check_definitions(ra_fixture: &str, vendored_libs_config: VendoredLibrariesConfig<'_>) {
|
||||
let (analysis, ranges) = fixture::annotations_without_marker(ra_fixture);
|
||||
let s =
|
||||
StaticIndex::compute(&analysis, &VfsPath::new_virtual_path("/workspace".to_owned()));
|
||||
let s = StaticIndex::compute(&analysis, vendored_libs_config);
|
||||
let mut range_set: FxHashSet<_> = ranges.iter().map(|it| it.0).collect();
|
||||
for (_, t) in s.tokens.iter() {
|
||||
if let Some(t) = t.definition {
|
||||
|
@ -319,6 +331,9 @@ struct Foo;
|
|||
enum E { X(Foo) }
|
||||
//^ ^ ^^^
|
||||
"#,
|
||||
VendoredLibrariesConfig::Included {
|
||||
workspace_root: &VfsPath::new_virtual_path("/workspace".to_owned()),
|
||||
},
|
||||
);
|
||||
check_definitions(
|
||||
r#"
|
||||
|
@ -327,6 +342,9 @@ struct Foo;
|
|||
enum E { X(Foo) }
|
||||
//^ ^
|
||||
"#,
|
||||
VendoredLibrariesConfig::Included {
|
||||
workspace_root: &VfsPath::new_virtual_path("/workspace".to_owned()),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -349,6 +367,9 @@ pub func() {
|
|||
|
||||
}
|
||||
"#,
|
||||
VendoredLibrariesConfig::Included {
|
||||
workspace_root: &VfsPath::new_virtual_path("/workspace".to_owned()),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -367,9 +388,30 @@ struct ExternalLibrary(i32);
|
|||
struct VendoredLibrary(i32);
|
||||
//^^^^^^^^^^^^^^^ ^^^
|
||||
"#,
|
||||
VendoredLibrariesConfig::Included {
|
||||
workspace_root: &VfsPath::new_virtual_path("/workspace".to_owned()),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn vendored_crate_excluded() {
|
||||
check_all_ranges(
|
||||
r#"
|
||||
//- /workspace/main.rs crate:main deps:external,vendored
|
||||
struct Main(i32);
|
||||
//^^^^ ^^^
|
||||
|
||||
//- /external/lib.rs new_source_root:library crate:external@0.1.0,https://a.b/foo.git library
|
||||
struct ExternalLibrary(i32);
|
||||
|
||||
//- /workspace/vendored/lib.rs new_source_root:library crate:vendored@0.1.0,https://a.b/bar.git library
|
||||
struct VendoredLibrary(i32);
|
||||
"#,
|
||||
VendoredLibrariesConfig::Excluded,
|
||||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn derives() {
|
||||
check_all_ranges(
|
||||
|
@ -384,6 +426,9 @@ pub macro Copy {}
|
|||
struct Hello(i32);
|
||||
//^^^^^ ^^^
|
||||
"#,
|
||||
VendoredLibrariesConfig::Included {
|
||||
workspace_root: &VfsPath::new_virtual_path("/workspace".to_owned()),
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue