From d61707b4e1f0bdfc7f62b1abf78fdc45c0128699 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 3 Jan 2019 21:28:35 +0300 Subject: index stuff produced by macros --- crates/ra_analysis/src/symbol_index.rs | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) (limited to 'crates/ra_analysis/src/symbol_index.rs') diff --git a/crates/ra_analysis/src/symbol_index.rs b/crates/ra_analysis/src/symbol_index.rs index 55caae5c2..e2b1c88fe 100644 --- a/crates/ra_analysis/src/symbol_index.rs +++ b/crates/ra_analysis/src/symbol_index.rs @@ -28,11 +28,11 @@ use std::{ use fst::{self, Streamer}; use ra_syntax::{ SyntaxNodeRef, SourceFileNode, SmolStr, - algo::visit::{visitor, Visitor}, + algo::{visit::{visitor, Visitor}, find_covering_node}, SyntaxKind::{self, *}, ast::{self, NameOwner}, }; -use ra_db::{SyntaxDatabase, SourceRootId, FilesDatabase, LocalSyntaxPtr}; +use ra_db::{SourceRootId, FilesDatabase, LocalSyntaxPtr}; use salsa::ParallelDatabase; use rayon::prelude::*; @@ -42,7 +42,7 @@ use crate::{ }; salsa::query_group! { - pub(crate) trait SymbolsDatabase: SyntaxDatabase { + pub(crate) trait SymbolsDatabase: hir::db::HirDatabase { fn file_symbols(file_id: FileId) -> Cancelable> { type FileSymbolsQuery; } @@ -53,10 +53,23 @@ salsa::query_group! { } } -fn file_symbols(db: &impl SyntaxDatabase, file_id: FileId) -> Cancelable> { +fn file_symbols(db: &impl SymbolsDatabase, file_id: FileId) -> Cancelable> { db.check_canceled()?; - let syntax = db.source_file(file_id); - Ok(Arc::new(SymbolIndex::for_file(file_id, syntax))) + let source_file = db.source_file(file_id); + let mut symbols = source_file + .syntax() + .descendants() + .filter_map(to_symbol) + .map(move |(name, ptr)| FileSymbol { name, ptr, file_id }) + .collect::>(); + + for (name, text_range) in hir::source_binder::macro_symbols(db, file_id)? { + let node = find_covering_node(source_file.syntax(), text_range); + let ptr = LocalSyntaxPtr::new(node); + symbols.push(FileSymbol { file_id, name, ptr }) + } + + Ok(Arc::new(SymbolIndex::new(symbols))) } pub(crate) fn world_symbols(db: &RootDatabase, query: Query) -> Cancelable> { @@ -141,10 +154,6 @@ impl SymbolIndex { .collect::>(); SymbolIndex::new(symbols) } - - fn for_file(file_id: FileId, file: SourceFileNode) -> SymbolIndex { - SymbolIndex::for_files(rayon::iter::once((file_id, file))) - } } impl Query { -- cgit v1.2.3