diff options
Diffstat (limited to 'src/tools/rust-analyzer/crates/ide-db')
13 files changed, 68 insertions, 80 deletions
diff --git a/src/tools/rust-analyzer/crates/ide-db/src/active_parameter.rs b/src/tools/rust-analyzer/crates/ide-db/src/active_parameter.rs index 98d2e817546..088d2ec5e3f 100644 --- a/src/tools/rust-analyzer/crates/ide-db/src/active_parameter.rs +++ b/src/tools/rust-analyzer/crates/ide-db/src/active_parameter.rs @@ -28,7 +28,7 @@ impl ActiveParameter { return None; } let param = params.swap_remove(idx); - Some(ActiveParameter { ty: param.ty().clone(), src: param.source(sema.db) }) + Some(ActiveParameter { ty: param.ty().clone(), src: sema.source(param) }) } pub fn ident(&self) -> Option<ast::Name> { diff --git a/src/tools/rust-analyzer/crates/ide-db/src/apply_change.rs b/src/tools/rust-analyzer/crates/ide-db/src/apply_change.rs index ce9a5f0dd29..74c8fc96d4a 100644 --- a/src/tools/rust-analyzer/crates/ide-db/src/apply_change.rs +++ b/src/tools/rust-analyzer/crates/ide-db/src/apply_change.rs @@ -15,13 +15,12 @@ use crate::{symbol_index::SymbolsDatabase, ChangeWithProcMacros, RootDatabase}; impl RootDatabase { pub fn request_cancellation(&mut self) { - let _p = - tracing::span!(tracing::Level::INFO, "RootDatabase::request_cancellation").entered(); + let _p = tracing::info_span!("RootDatabase::request_cancellation").entered(); self.synthetic_write(Durability::LOW); } pub fn apply_change(&mut self, change: ChangeWithProcMacros) { - let _p = tracing::span!(tracing::Level::INFO, "RootDatabase::apply_change").entered(); + let _p = tracing::info_span!("RootDatabase::apply_change").entered(); self.request_cancellation(); tracing::trace!("apply_change {:?}", change); if let Some(roots) = &change.source_change.roots { diff --git a/src/tools/rust-analyzer/crates/ide-db/src/defs.rs b/src/tools/rust-analyzer/crates/ide-db/src/defs.rs index 634277e8698..a75a708d956 100644 --- a/src/tools/rust-analyzer/crates/ide-db/src/defs.rs +++ b/src/tools/rust-analyzer/crates/ide-db/src/defs.rs @@ -413,7 +413,7 @@ impl NameClass { } pub fn classify(sema: &Semantics<'_, RootDatabase>, name: &ast::Name) -> Option<NameClass> { - let _p = tracing::span!(tracing::Level::INFO, "NameClass::classify").entered(); + let _p = tracing::info_span!("NameClass::classify").entered(); let parent = name.syntax().parent()?; @@ -505,8 +505,7 @@ impl NameClass { sema: &Semantics<'_, RootDatabase>, lifetime: &ast::Lifetime, ) -> Option<NameClass> { - let _p = tracing::span!(tracing::Level::INFO, "NameClass::classify_lifetime", ?lifetime) - .entered(); + let _p = tracing::info_span!("NameClass::classify_lifetime", ?lifetime).entered(); let parent = lifetime.syntax().parent()?; if let Some(it) = ast::LifetimeParam::cast(parent.clone()) { @@ -597,8 +596,7 @@ impl NameRefClass { sema: &Semantics<'_, RootDatabase>, name_ref: &ast::NameRef, ) -> Option<NameRefClass> { - let _p = - tracing::span!(tracing::Level::INFO, "NameRefClass::classify", ?name_ref).entered(); + let _p = tracing::info_span!("NameRefClass::classify", ?name_ref).entered(); let parent = name_ref.syntax().parent()?; @@ -697,8 +695,7 @@ impl NameRefClass { sema: &Semantics<'_, RootDatabase>, lifetime: &ast::Lifetime, ) -> Option<NameRefClass> { - let _p = tracing::span!(tracing::Level::INFO, "NameRefClass::classify_lifetime", ?lifetime) - .entered(); + let _p = tracing::info_span!("NameRefClass::classify_lifetime", ?lifetime).entered(); if lifetime.text() == "'static" { return Some(NameRefClass::Definition(Definition::BuiltinLifetime(StaticLifetime))); } diff --git a/src/tools/rust-analyzer/crates/ide-db/src/famous_defs.rs b/src/tools/rust-analyzer/crates/ide-db/src/famous_defs.rs index e445e9fb68d..51ac0b71911 100644 --- a/src/tools/rust-analyzer/crates/ide-db/src/famous_defs.rs +++ b/src/tools/rust-analyzer/crates/ide-db/src/famous_defs.rs @@ -15,7 +15,7 @@ use crate::RootDatabase; /// you'd want to include minicore (see `test_utils::MiniCore`) declaration at /// the start of your tests: /// -/// ``` +/// ```text /// //- minicore: iterator, ord, derive /// ``` pub struct FamousDefs<'a, 'b>(pub &'a Semantics<'b, RootDatabase>, pub Crate); diff --git a/src/tools/rust-analyzer/crates/ide-db/src/helpers.rs b/src/tools/rust-analyzer/crates/ide-db/src/helpers.rs index db44b1e7232..c069e1c25b6 100644 --- a/src/tools/rust-analyzer/crates/ide-db/src/helpers.rs +++ b/src/tools/rust-analyzer/crates/ide-db/src/helpers.rs @@ -35,13 +35,13 @@ pub fn pick_token<T: AstToken>(mut tokens: TokenAtOffset<SyntaxToken>) -> Option /// Converts the mod path struct into its ast representation. pub fn mod_path_to_ast(path: &hir::ModPath) -> ast::Path { - let _p = tracing::span!(tracing::Level::INFO, "mod_path_to_ast").entered(); + let _p = tracing::info_span!("mod_path_to_ast").entered(); let mut segments = Vec::new(); let mut is_abs = false; match path.kind { hir::PathKind::Plain => {} - hir::PathKind::Super(0) => segments.push(make::path_segment_self()), + hir::PathKind::SELF => segments.push(make::path_segment_self()), hir::PathKind::Super(n) => segments.extend((0..n).map(|_| make::path_segment_super())), hir::PathKind::DollarCrate(_) | hir::PathKind::Crate => { segments.push(make::path_segment_crate()) diff --git a/src/tools/rust-analyzer/crates/ide-db/src/imports/import_assets.rs b/src/tools/rust-analyzer/crates/ide-db/src/imports/import_assets.rs index 4caecb3f2fe..088717a66e5 100644 --- a/src/tools/rust-analyzer/crates/ide-db/src/imports/import_assets.rs +++ b/src/tools/rust-analyzer/crates/ide-db/src/imports/import_assets.rs @@ -208,7 +208,7 @@ impl ImportAssets { cfg: ImportPathConfig, prefix_kind: PrefixKind, ) -> impl Iterator<Item = LocatedImport> { - let _p = tracing::span!(tracing::Level::INFO, "ImportAssets::search_for_imports").entered(); + let _p = tracing::info_span!("ImportAssets::search_for_imports").entered(); self.search_for(sema, Some(prefix_kind), cfg) } @@ -218,8 +218,7 @@ impl ImportAssets { sema: &Semantics<'_, RootDatabase>, cfg: ImportPathConfig, ) -> impl Iterator<Item = LocatedImport> { - let _p = tracing::span!(tracing::Level::INFO, "ImportAssets::search_for_relative_paths") - .entered(); + let _p = tracing::info_span!("ImportAssets::search_for_relative_paths").entered(); self.search_for(sema, None, cfg) } @@ -259,7 +258,7 @@ impl ImportAssets { prefixed: Option<PrefixKind>, cfg: ImportPathConfig, ) -> impl Iterator<Item = LocatedImport> { - let _p = tracing::span!(tracing::Level::INFO, "ImportAssets::search_for").entered(); + let _p = tracing::info_span!("ImportAssets::search_for").entered(); let scope = match sema.scope(&self.candidate_node) { Some(it) => it, @@ -303,7 +302,7 @@ impl ImportAssets { } fn scope_definitions(&self, sema: &Semantics<'_, RootDatabase>) -> FxHashSet<ScopeDef> { - let _p = tracing::span!(tracing::Level::INFO, "ImportAssets::scope_definitions").entered(); + let _p = tracing::info_span!("ImportAssets::scope_definitions").entered(); let mut scope_definitions = FxHashSet::default(); if let Some(scope) = sema.scope(&self.candidate_node) { scope.process_all_names(&mut |_, scope_def| { @@ -321,8 +320,7 @@ fn path_applicable_imports( mod_path: impl Fn(ItemInNs) -> Option<ModPath> + Copy, scope_filter: impl Fn(ItemInNs) -> bool + Copy, ) -> FxHashSet<LocatedImport> { - let _p = - tracing::span!(tracing::Level::INFO, "ImportAssets::path_applicable_imports").entered(); + let _p = tracing::info_span!("ImportAssets::path_applicable_imports").entered(); match &path_candidate.qualifier { None => { @@ -369,7 +367,7 @@ fn import_for_item( original_item: ItemInNs, scope_filter: impl Fn(ItemInNs) -> bool, ) -> Option<LocatedImport> { - let _p = tracing::span!(tracing::Level::INFO, "ImportAssets::import_for_item").entered(); + let _p = tracing::info_span!("ImportAssets::import_for_item").entered(); let [first_segment, ..] = unresolved_qualifier else { return None }; let item_as_assoc = item_as_assoc(db, original_item); @@ -503,7 +501,7 @@ fn trait_applicable_items( mod_path: impl Fn(ItemInNs) -> Option<ModPath>, scope_filter: impl Fn(hir::Trait) -> bool, ) -> FxHashSet<LocatedImport> { - let _p = tracing::span!(tracing::Level::INFO, "ImportAssets::trait_applicable_items").entered(); + let _p = tracing::info_span!("ImportAssets::trait_applicable_items").entered(); let db = sema.db; diff --git a/src/tools/rust-analyzer/crates/ide-db/src/imports/insert_use.rs b/src/tools/rust-analyzer/crates/ide-db/src/imports/insert_use.rs index 026d4e36f97..9102980677c 100644 --- a/src/tools/rust-analyzer/crates/ide-db/src/imports/insert_use.rs +++ b/src/tools/rust-analyzer/crates/ide-db/src/imports/insert_use.rs @@ -194,7 +194,7 @@ fn insert_use_with_alias_option( cfg: &InsertUseConfig, alias: Option<ast::Rename>, ) { - let _p = tracing::span!(tracing::Level::INFO, "insert_use_with_alias_option").entered(); + let _p = tracing::info_span!("insert_use_with_alias_option").entered(); let mut mb = match cfg.granularity { ImportGranularity::Crate => Some(MergeBehavior::Crate), ImportGranularity::Module => Some(MergeBehavior::Module), diff --git a/src/tools/rust-analyzer/crates/ide-db/src/items_locator.rs b/src/tools/rust-analyzer/crates/ide-db/src/items_locator.rs index 1b6f650768b..47549a1d008 100644 --- a/src/tools/rust-analyzer/crates/ide-db/src/items_locator.rs +++ b/src/tools/rust-analyzer/crates/ide-db/src/items_locator.rs @@ -21,7 +21,7 @@ pub fn items_with_name<'a>( assoc_item_search: AssocSearchMode, ) -> impl Iterator<Item = ItemInNs> + 'a { let krate_name = krate.display_name(sema.db).map(|name| name.to_string()); - let _p = tracing::span!(tracing::Level::INFO, "items_with_name", name = name.text(), assoc_item_search = ?assoc_item_search, crate = ?krate_name) + let _p = tracing::info_span!("items_with_name", name = name.text(), assoc_item_search = ?assoc_item_search, crate = ?krate_name) .entered(); let prefix = matches!(name, NameToImport::Prefix(..)); @@ -72,7 +72,7 @@ fn find_items<'a>( local_query: symbol_index::Query, external_query: import_map::Query, ) -> impl Iterator<Item = ItemInNs> + 'a { - let _p = tracing::span!(tracing::Level::INFO, "find_items").entered(); + let _p = tracing::info_span!("find_items").entered(); let db = sema.db; // NOTE: `external_query` includes `assoc_item_search`, so we don't need to diff --git a/src/tools/rust-analyzer/crates/ide-db/src/prime_caches.rs b/src/tools/rust-analyzer/crates/ide-db/src/prime_caches.rs index 58077f636b6..62104fb7dce 100644 --- a/src/tools/rust-analyzer/crates/ide-db/src/prime_caches.rs +++ b/src/tools/rust-analyzer/crates/ide-db/src/prime_caches.rs @@ -11,9 +11,9 @@ use hir::db::DefDatabase; use crate::{ base_db::{ salsa::{Database, ParallelDatabase, Snapshot}, - Cancelled, CrateGraph, CrateId, SourceDatabase, SourceDatabaseExt, + Cancelled, CrateId, SourceDatabase, SourceDatabaseExt, }, - FxHashSet, FxIndexMap, RootDatabase, + FxIndexMap, RootDatabase, }; /// We're indexing many crates. @@ -29,26 +29,17 @@ pub struct ParallelPrimeCachesProgress { pub fn parallel_prime_caches( db: &RootDatabase, - num_worker_threads: u8, + num_worker_threads: usize, cb: &(dyn Fn(ParallelPrimeCachesProgress) + Sync), ) { - let _p = tracing::span!(tracing::Level::INFO, "parallel_prime_caches").entered(); + let _p = tracing::info_span!("parallel_prime_caches").entered(); let graph = db.crate_graph(); let mut crates_to_prime = { - let crate_ids = compute_crates_to_prime(db, &graph); - let mut builder = topologic_sort::TopologicalSortIter::builder(); - for &crate_id in &crate_ids { - let crate_data = &graph[crate_id]; - let dependencies = crate_data - .dependencies - .iter() - .map(|d| d.crate_id) - .filter(|i| crate_ids.contains(i)); - - builder.add(crate_id, dependencies); + for crate_id in graph.iter() { + builder.add(crate_id, graph[crate_id].dependencies.iter().map(|d| d.crate_id)); } builder.build() @@ -62,13 +53,20 @@ pub fn parallel_prime_caches( let (work_sender, progress_receiver) = { let (progress_sender, progress_receiver) = crossbeam_channel::unbounded(); let (work_sender, work_receiver) = crossbeam_channel::unbounded(); + let graph = graph.clone(); let prime_caches_worker = move |db: Snapshot<RootDatabase>| { while let Ok((crate_id, crate_name)) = work_receiver.recv() { progress_sender .send(ParallelPrimeCacheWorkerProgress::BeginCrate { crate_id, crate_name })?; - // This also computes the DefMap - db.import_map(crate_id); + let file_id = graph[crate_id].root_file_id; + let root_id = db.file_source_root(file_id); + if db.source_root(root_id).is_library { + db.crate_def_map(crate_id); + } else { + // This also computes the DefMap + db.import_map(crate_id); + } progress_sender.send(ParallelPrimeCacheWorkerProgress::EndCrate { crate_id })?; } @@ -76,13 +74,13 @@ pub fn parallel_prime_caches( Ok::<_, crossbeam_channel::SendError<_>>(()) }; - for _ in 0..num_worker_threads { + for id in 0..num_worker_threads { let worker = prime_caches_worker.clone(); let db = db.snapshot(); stdx::thread::Builder::new(stdx::thread::ThreadIntent::Worker) .allow_leak(true) - .name("PrimeCaches".to_owned()) + .name(format!("PrimeCaches#{id}")) .spawn(move || Cancelled::catch(|| worker(db))) .expect("failed to spawn thread"); } @@ -96,7 +94,7 @@ pub fn parallel_prime_caches( // an index map is used to preserve ordering so we can sort the progress report in order of // "longest crate to index" first let mut crates_currently_indexing = - FxIndexMap::with_capacity_and_hasher(num_worker_threads as _, Default::default()); + FxIndexMap::with_capacity_and_hasher(num_worker_threads, Default::default()); while crates_done < crates_total { db.unwind_if_cancelled(); @@ -144,19 +142,3 @@ pub fn parallel_prime_caches( cb(progress); } } - -fn compute_crates_to_prime(db: &RootDatabase, graph: &CrateGraph) -> FxHashSet<CrateId> { - // We're only interested in the workspace crates and the `ImportMap`s of their direct - // dependencies, though in practice the latter also compute the `DefMap`s. - // We don't prime transitive dependencies because they're generally not visible in - // the current workspace. - graph - .iter() - .filter(|&id| { - let file_id = graph[id].root_file_id; - let root_id = db.file_source_root(file_id); - !db.source_root(root_id).is_library - }) - .flat_map(|id| graph[id].dependencies.iter().map(|krate| krate.crate_id)) - .collect() -} diff --git a/src/tools/rust-analyzer/crates/ide-db/src/rename.rs b/src/tools/rust-analyzer/crates/ide-db/src/rename.rs index 288d56b534e..484c65c2b01 100644 --- a/src/tools/rust-analyzer/crates/ide-db/src/rename.rs +++ b/src/tools/rust-analyzer/crates/ide-db/src/rename.rs @@ -24,7 +24,7 @@ use std::fmt; use base_db::{AnchoredPathBuf, FileId, FileRange}; use either::Either; -use hir::{FieldSource, HasSource, HirFileIdExt, InFile, ModuleSource, Semantics}; +use hir::{FieldSource, HirFileIdExt, InFile, ModuleSource, Semantics}; use span::SyntaxContextId; use stdx::{never, TupleExt}; use syntax::{ @@ -109,7 +109,7 @@ impl Definition { let syn_ctx_is_root = |(range, ctx): (_, SyntaxContextId)| ctx.is_root().then_some(range); let res = match self { Definition::Macro(mac) => { - let src = mac.source(sema.db)?; + let src = sema.source(mac)?; let name = match &src.value { Either::Left(it) => it.name()?, Either::Right(it) => it.name()?, @@ -119,7 +119,7 @@ impl Definition { .and_then(syn_ctx_is_root) } Definition::Field(field) => { - let src = field.source(sema.db)?; + let src = sema.source(field)?; match &src.value { FieldSource::Named(record_field) => { let name = record_field.name()?; @@ -154,18 +154,18 @@ impl Definition { } Definition::GenericParam(generic_param) => match generic_param { hir::GenericParam::LifetimeParam(lifetime_param) => { - let src = lifetime_param.source(sema.db)?; + let src = sema.source(lifetime_param)?; src.with_value(src.value.lifetime()?.syntax()) .original_file_range_opt(sema.db) .and_then(syn_ctx_is_root) } _ => { - let x = match generic_param { + let param = match generic_param { hir::GenericParam::TypeParam(it) => it.merge(), hir::GenericParam::ConstParam(it) => it.merge(), hir::GenericParam::LifetimeParam(_) => return None, }; - let src = x.source(sema.db)?; + let src = sema.source(param)?; let name = match &src.value { Either::Left(x) => x.name()?, Either::Right(_) => return None, @@ -176,14 +176,14 @@ impl Definition { } }, Definition::Label(label) => { - let src = label.source(sema.db); + let src = sema.source(label)?; let lifetime = src.value.lifetime()?; src.with_value(lifetime.syntax()) .original_file_range_opt(sema.db) .and_then(syn_ctx_is_root) } Definition::ExternCrateDecl(it) => { - let src = it.source(sema.db)?; + let src = sema.source(it)?; if let Some(rename) = src.value.rename() { let name = rename.name()?; src.with_value(name.syntax()) @@ -212,10 +212,10 @@ impl Definition { sema: &Semantics<'_, RootDatabase>, ) -> Option<(FileRange, SyntaxContextId)> where - D: HasSource, + D: hir::HasSource, D::Ast: ast::HasName, { - let src = def.source(sema.db)?; + let src = sema.source(def)?; let name = src.value.name()?; src.with_value(name.syntax()).original_file_range_opt(sema.db) } diff --git a/src/tools/rust-analyzer/crates/ide-db/src/search.rs b/src/tools/rust-analyzer/crates/ide-db/src/search.rs index 8f633065f3c..b62f34f4157 100644 --- a/src/tools/rust-analyzer/crates/ide-db/src/search.rs +++ b/src/tools/rust-analyzer/crates/ide-db/src/search.rs @@ -266,7 +266,7 @@ impl IntoIterator for SearchScope { impl Definition { fn search_scope(&self, db: &RootDatabase) -> SearchScope { - let _p = tracing::span!(tracing::Level::INFO, "search_scope").entered(); + let _p = tracing::info_span!("search_scope").entered(); if let Definition::BuiltinType(_) = self { return SearchScope::crate_graph(db); @@ -434,7 +434,7 @@ impl<'a> FindUsages<'a> { } pub fn search(&self, sink: &mut dyn FnMut(FileId, FileReference) -> bool) { - let _p = tracing::span!(tracing::Level::INFO, "FindUsages:search").entered(); + let _p = tracing::info_span!("FindUsages:search").entered(); let sema = self.sema; let search_scope = { diff --git a/src/tools/rust-analyzer/crates/ide-db/src/source_change.rs b/src/tools/rust-analyzer/crates/ide-db/src/source_change.rs index f59d8d08c89..7ef7b7ae1d0 100644 --- a/src/tools/rust-analyzer/crates/ide-db/src/source_change.rs +++ b/src/tools/rust-analyzer/crates/ide-db/src/source_change.rs @@ -338,6 +338,12 @@ impl SourceChangeBuilder { self.add_snippet(PlaceSnippet::Over(node.syntax().clone().into())) } + /// Adds a snippet to move the cursor selected over `token` + pub fn add_placeholder_snippet_token(&mut self, _cap: SnippetCap, token: SyntaxToken) { + assert!(token.parent().is_some()); + self.add_snippet(PlaceSnippet::Over(token.into())) + } + /// Adds a snippet to move the cursor selected over `nodes` /// /// This allows for renaming newly generated items without having to go diff --git a/src/tools/rust-analyzer/crates/ide-db/src/symbol_index.rs b/src/tools/rust-analyzer/crates/ide-db/src/symbol_index.rs index 12085f9ebd2..c70aed4c43b 100644 --- a/src/tools/rust-analyzer/crates/ide-db/src/symbol_index.rs +++ b/src/tools/rust-analyzer/crates/ide-db/src/symbol_index.rs @@ -124,7 +124,7 @@ pub trait SymbolsDatabase: HirDatabase + SourceDatabaseExt + Upcast<dyn HirDatab } fn library_symbols(db: &dyn SymbolsDatabase, source_root_id: SourceRootId) -> Arc<SymbolIndex> { - let _p = tracing::span!(tracing::Level::INFO, "library_symbols").entered(); + let _p = tracing::info_span!("library_symbols").entered(); let mut symbol_collector = SymbolCollector::new(db.upcast()); @@ -142,14 +142,14 @@ fn library_symbols(db: &dyn SymbolsDatabase, source_root_id: SourceRootId) -> Ar } fn module_symbols(db: &dyn SymbolsDatabase, module: Module) -> Arc<SymbolIndex> { - let _p = tracing::span!(tracing::Level::INFO, "module_symbols").entered(); + let _p = tracing::info_span!("module_symbols").entered(); let symbols = SymbolCollector::collect_module(db.upcast(), module); Arc::new(SymbolIndex::new(symbols)) } pub fn crate_symbols(db: &dyn SymbolsDatabase, krate: Crate) -> Box<[Arc<SymbolIndex>]> { - let _p = tracing::span!(tracing::Level::INFO, "crate_symbols").entered(); + let _p = tracing::info_span!("crate_symbols").entered(); krate.modules(db.upcast()).into_iter().map(|module| db.module_symbols(module)).collect() } @@ -192,7 +192,8 @@ impl<DB> std::ops::Deref for Snap<DB> { // Note that filtering does not currently work in VSCode due to the editor never // sending the special symbols to the language server. Instead, you can configure // the filtering via the `rust-analyzer.workspace.symbol.search.scope` and -// `rust-analyzer.workspace.symbol.search.kind` settings. +// `rust-analyzer.workspace.symbol.search.kind` settings. Symbols prefixed +// with `__` are hidden from the search results unless configured otherwise. // // |=== // | Editor | Shortcut @@ -200,7 +201,7 @@ impl<DB> std::ops::Deref for Snap<DB> { // | VS Code | kbd:[Ctrl+T] // |=== pub fn world_symbols(db: &RootDatabase, query: Query) -> Vec<FileSymbol> { - let _p = tracing::span!(tracing::Level::INFO, "world_symbols", query = ?query.query).entered(); + let _p = tracing::info_span!("world_symbols", query = ?query.query).entered(); let indices: Vec<_> = if query.libs { db.library_roots() @@ -320,7 +321,7 @@ impl Query { indices: &'sym [Arc<SymbolIndex>], cb: impl FnMut(&'sym FileSymbol), ) { - let _p = tracing::span!(tracing::Level::INFO, "symbol_index::Query::search").entered(); + let _p = tracing::info_span!("symbol_index::Query::search").entered(); let mut op = fst::map::OpBuilder::new(); match self.mode { SearchMode::Exact => { @@ -356,6 +357,7 @@ impl Query { mut stream: fst::map::Union<'_>, mut cb: impl FnMut(&'sym FileSymbol), ) { + let ignore_underscore_prefixed = !self.query.starts_with("__"); while let Some((_, indexed_values)) = stream.next() { for &IndexedValue { index, value } in indexed_values { let symbol_index = &indices[index]; @@ -374,6 +376,10 @@ impl Query { if non_type_for_type_only_query || !self.matches_assoc_mode(symbol.is_assoc) { continue; } + // Hide symbols that start with `__` unless the query starts with `__` + if ignore_underscore_prefixed && symbol.name.starts_with("__") { + continue; + } if self.mode.check(&self.query, self.case_sensitive, &symbol.name) { cb(symbol); } |
