diff --git a/crates/base_db/src/fixture.rs b/crates/base_db/src/fixture.rs index 2b091f37a0..3751f44cf4 100644 --- a/crates/base_db/src/fixture.rs +++ b/crates/base_db/src/fixture.rs @@ -18,8 +18,8 @@ use crate::{ pub const WORKSPACE: SourceRootId = SourceRootId(0); pub trait WithFixture: Default + SourceDatabaseExt + 'static { - fn with_single_file(text: &str) -> (Self, FileId) { - let fixture = ChangeFixture::parse(text); + fn with_single_file(ra_fixture: &str) -> (Self, FileId) { + let fixture = ChangeFixture::parse(ra_fixture); let mut db = Self::default(); fixture.change.apply(&mut db); assert_eq!(fixture.files.len(), 1); diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index a23d77d2cc..becef49564 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -103,7 +103,6 @@ pub use { hir_def::{ adt::StructKind, attr::{Attr, Attrs, AttrsWithOwner, Documentation}, - data::TraitData, find_path::PrefixKind, import_map, item_scope::ItemScope, diff --git a/crates/ide_db/src/symbol_index.rs b/crates/ide_db/src/symbol_index.rs index b1546dd4d0..d264c083d7 100644 --- a/crates/ide_db/src/symbol_index.rs +++ b/crates/ide_db/src/symbol_index.rs @@ -710,3 +710,67 @@ impl<'a> SymbolCollector<'a> { } } } + +#[cfg(test)] +mod tests { + + use base_db::fixture::WithFixture; + use expect_test::expect_file; + + use super::*; + + #[test] + fn test_symbol_index_collection() { + let (db, _) = RootDatabase::with_many_files( + r#" +//- /main.rs + +macro_rules! macro_rules_macro { + () => {} +}; + +macro Macro { } + +struct Struct; +enum Enum { + A, B +} +union Union {} + +impl Struct { + fn impl_fn() {} +} + +trait Trait { + fn trait_fn(&self); +} + +fn main() { + struct StructInFn; +} + +const CONST: u32 = 1; +static STATIC: &'static str = "2"; +type Alias = Struct; + +mod a_mod { + struct StructInModA; +} + +mod b_mod; + +//- /b_mod.rs +struct StructInModB; + "#, + ); + + let symbols: Vec<_> = module_ids_for_crate(db.upcast(), db.test_crate()) + .into_iter() + .map(|module_id| { + (module_id, SymbolCollector::collect(&db as &dyn SymbolsDatabase, module_id)) + }) + .collect(); + + expect_file!["./test_data/test_symbol_index_collection.txt"].assert_debug_eq(&symbols); + } +} diff --git a/crates/ide_db/src/test_data/test_symbol_index_collection.txt b/crates/ide_db/src/test_data/test_symbol_index_collection.txt new file mode 100644 index 0000000000..33f2f2dc7f --- /dev/null +++ b/crates/ide_db/src/test_data/test_symbol_index_collection.txt @@ -0,0 +1,457 @@ +[ + ( + ModuleId { + krate: CrateId( + 0, + ), + block: None, + local_id: Idx::(0), + }, + [ + FileSymbol { + name: "Struct", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 0, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 68..82, + kind: STRUCT, + }, + name_ptr: SyntaxNodePtr { + range: 75..81, + kind: NAME, + }, + }, + kind: Struct, + container_name: None, + }, + FileSymbol { + name: "Enum", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 0, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 83..105, + kind: ENUM, + }, + name_ptr: SyntaxNodePtr { + range: 88..92, + kind: NAME, + }, + }, + kind: Enum, + container_name: None, + }, + FileSymbol { + name: "Union", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 0, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 106..120, + kind: UNION, + }, + name_ptr: SyntaxNodePtr { + range: 112..117, + kind: NAME, + }, + }, + kind: Union, + container_name: None, + }, + FileSymbol { + name: "Trait", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 0, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 159..198, + kind: TRAIT, + }, + name_ptr: SyntaxNodePtr { + range: 165..170, + kind: NAME, + }, + }, + kind: Trait, + container_name: None, + }, + FileSymbol { + name: "trait_fn", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 0, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 177..196, + kind: FN, + }, + name_ptr: SyntaxNodePtr { + range: 180..188, + kind: NAME, + }, + }, + kind: Function, + container_name: Some( + "Trait", + ), + }, + FileSymbol { + name: "main", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 0, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 200..236, + kind: FN, + }, + name_ptr: SyntaxNodePtr { + range: 203..207, + kind: NAME, + }, + }, + kind: Function, + container_name: None, + }, + FileSymbol { + name: "proc_macro", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 0, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 238..270, + kind: FN, + }, + name_ptr: SyntaxNodePtr { + range: 255..265, + kind: NAME, + }, + }, + kind: Function, + container_name: None, + }, + FileSymbol { + name: "CONST", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 0, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 272..293, + kind: CONST, + }, + name_ptr: SyntaxNodePtr { + range: 278..283, + kind: NAME, + }, + }, + kind: Const, + container_name: None, + }, + FileSymbol { + name: "STATIC", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 0, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 294..328, + kind: STATIC, + }, + name_ptr: SyntaxNodePtr { + range: 301..307, + kind: NAME, + }, + }, + kind: Static, + container_name: None, + }, + FileSymbol { + name: "Alias", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 0, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 329..349, + kind: TYPE_ALIAS, + }, + name_ptr: SyntaxNodePtr { + range: 334..339, + kind: NAME, + }, + }, + kind: TypeAlias, + container_name: None, + }, + FileSymbol { + name: "a_mod", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 0, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 351..389, + kind: MODULE, + }, + name_ptr: SyntaxNodePtr { + range: 355..360, + kind: NAME, + }, + }, + kind: Module, + container_name: None, + }, + FileSymbol { + name: "b_mod", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 0, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 391..401, + kind: MODULE, + }, + name_ptr: SyntaxNodePtr { + range: 395..400, + kind: NAME, + }, + }, + kind: Module, + container_name: None, + }, + FileSymbol { + name: "impl_fn", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 0, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 140..155, + kind: FN, + }, + name_ptr: SyntaxNodePtr { + range: 143..150, + kind: NAME, + }, + }, + kind: Function, + container_name: None, + }, + FileSymbol { + name: "macro_rules_macro", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 0, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 1..48, + kind: MACRO_RULES, + }, + name_ptr: SyntaxNodePtr { + range: 14..31, + kind: NAME, + }, + }, + kind: Macro, + container_name: None, + }, + FileSymbol { + name: "Macro", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 0, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 51..66, + kind: MACRO_DEF, + }, + name_ptr: SyntaxNodePtr { + range: 57..62, + kind: NAME, + }, + }, + kind: Macro, + container_name: None, + }, + FileSymbol { + name: "proc_macro", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 0, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 238..270, + kind: FN, + }, + name_ptr: SyntaxNodePtr { + range: 255..265, + kind: NAME, + }, + }, + kind: Macro, + container_name: None, + }, + FileSymbol { + name: "StructInFn", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 0, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 216..234, + kind: STRUCT, + }, + name_ptr: SyntaxNodePtr { + range: 223..233, + kind: NAME, + }, + }, + kind: Struct, + container_name: Some( + "main", + ), + }, + ], + ), + ( + ModuleId { + krate: CrateId( + 0, + ), + block: None, + local_id: Idx::(1), + }, + [ + FileSymbol { + name: "StructInModA", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 0, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 367..387, + kind: STRUCT, + }, + name_ptr: SyntaxNodePtr { + range: 374..386, + kind: NAME, + }, + }, + kind: Struct, + container_name: None, + }, + ], + ), + ( + ModuleId { + krate: CrateId( + 0, + ), + block: None, + local_id: Idx::(2), + }, + [ + FileSymbol { + name: "StructInModB", + loc: DeclarationLocation { + hir_file_id: HirFileId( + FileId( + FileId( + 1, + ), + ), + ), + ptr: SyntaxNodePtr { + range: 0..20, + kind: STRUCT, + }, + name_ptr: SyntaxNodePtr { + range: 7..19, + kind: NAME, + }, + }, + kind: Struct, + container_name: None, + }, + ], + ), +]