diff options
author | Aleksey Kladov <[email protected]> | 2018-11-27 23:22:25 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2018-11-27 23:22:25 +0000 |
commit | 65c064b2a99fb9c0589672ae6c9848aaa9e0efcf (patch) | |
tree | 5327715b5c1ada71b1b7411922444e63dabf7bf7 /crates/ra_analysis | |
parent | 201aa7ea2ae75f9599dc74ad2f4d3f41c1540e73 (diff) |
introduce SymbolsDatabase
Diffstat (limited to 'crates/ra_analysis')
-rw-r--r-- | crates/ra_analysis/src/db.rs | 28 | ||||
-rw-r--r-- | crates/ra_analysis/src/imp.rs | 4 | ||||
-rw-r--r-- | crates/ra_analysis/src/input.rs | 6 | ||||
-rw-r--r-- | crates/ra_analysis/src/symbol_index.rs | 29 |
4 files changed, 40 insertions, 27 deletions
diff --git a/crates/ra_analysis/src/db.rs b/crates/ra_analysis/src/db.rs index 4c9c84e4f..0901c2bba 100644 --- a/crates/ra_analysis/src/db.rs +++ b/crates/ra_analysis/src/db.rs | |||
@@ -7,7 +7,7 @@ use salsa::{self, Database}; | |||
7 | 7 | ||
8 | use crate::{ | 8 | use crate::{ |
9 | hir, | 9 | hir, |
10 | symbol_index::SymbolIndex, | 10 | symbol_index, |
11 | loc2id::{IdMaps}, | 11 | loc2id::{IdMaps}, |
12 | Cancelable, Canceled, FileId, | 12 | Cancelable, Canceled, FileId, |
13 | }; | 13 | }; |
@@ -114,23 +114,25 @@ salsa::database_storage! { | |||
114 | fn file_source_root() for crate::input::FileSourceRootQuery; | 114 | fn file_source_root() for crate::input::FileSourceRootQuery; |
115 | fn source_root() for crate::input::SourceRootQuery; | 115 | fn source_root() for crate::input::SourceRootQuery; |
116 | fn libraries() for crate::input::LibrariesQuery; | 116 | fn libraries() for crate::input::LibrariesQuery; |
117 | fn library_symbols() for crate::input::LibrarySymbolsQuery; | ||
118 | fn crate_graph() for crate::input::CrateGraphQuery; | 117 | fn crate_graph() for crate::input::CrateGraphQuery; |
119 | } | 118 | } |
120 | impl SyntaxDatabase { | 119 | impl SyntaxDatabase { |
121 | fn file_syntax() for FileSyntaxQuery; | 120 | fn file_syntax() for FileSyntaxQuery; |
122 | fn file_lines() for FileLinesQuery; | 121 | fn file_lines() for FileLinesQuery; |
123 | fn file_symbols() for FileSymbolsQuery; | 122 | } |
123 | impl symbol_index::SymbolsDatabase { | ||
124 | fn file_symbols() for symbol_index::FileSymbolsQuery; | ||
125 | fn library_symbols() for symbol_index::LibrarySymbolsQuery; | ||
124 | } | 126 | } |
125 | impl hir::db::HirDatabase { | 127 | impl hir::db::HirDatabase { |
126 | fn module_tree() for hir::db::ModuleTreeQuery; | 128 | fn module_tree() for hir::db::ModuleTreeQuery; |
127 | fn fn_scopes() for hir::db::FnScopesQuery; | 129 | fn fn_scopes() for hir::db::FnScopesQuery; |
128 | fn _file_items() for hir::db::SourceFileItemsQuery; | 130 | fn file_items() for hir::db::SourceFileItemsQuery; |
129 | fn _file_item() for hir::db::FileItemQuery; | 131 | fn file_item() for hir::db::FileItemQuery; |
130 | fn _input_module_items() for hir::db::InputModuleItemsQuery; | 132 | fn input_module_items() for hir::db::InputModuleItemsQuery; |
131 | fn _item_map() for hir::db::ItemMapQuery; | 133 | fn item_map() for hir::db::ItemMapQuery; |
132 | fn _fn_syntax() for hir::db::FnSyntaxQuery; | 134 | fn fn_syntax() for hir::db::FnSyntaxQuery; |
133 | fn _submodules() for hir::db::SubmodulesQuery; | 135 | fn submodules() for hir::db::SubmodulesQuery; |
134 | } | 136 | } |
135 | } | 137 | } |
136 | } | 138 | } |
@@ -143,9 +145,6 @@ salsa::query_group! { | |||
143 | fn file_lines(file_id: FileId) -> Arc<LineIndex> { | 145 | fn file_lines(file_id: FileId) -> Arc<LineIndex> { |
144 | type FileLinesQuery; | 146 | type FileLinesQuery; |
145 | } | 147 | } |
146 | fn file_symbols(file_id: FileId) -> Cancelable<Arc<SymbolIndex>> { | ||
147 | type FileSymbolsQuery; | ||
148 | } | ||
149 | } | 148 | } |
150 | } | 149 | } |
151 | 150 | ||
@@ -157,8 +156,3 @@ fn file_lines(db: &impl SyntaxDatabase, file_id: FileId) -> Arc<LineIndex> { | |||
157 | let text = db.file_text(file_id); | 156 | let text = db.file_text(file_id); |
158 | Arc::new(LineIndex::new(&*text)) | 157 | Arc::new(LineIndex::new(&*text)) |
159 | } | 158 | } |
160 | fn file_symbols(db: &impl SyntaxDatabase, file_id: FileId) -> Cancelable<Arc<SymbolIndex>> { | ||
161 | db.check_canceled()?; | ||
162 | let syntax = db.file_syntax(file_id); | ||
163 | Ok(Arc::new(SymbolIndex::for_file(file_id, syntax))) | ||
164 | } | ||
diff --git a/crates/ra_analysis/src/imp.rs b/crates/ra_analysis/src/imp.rs index 2e5853949..e3b78bb1a 100644 --- a/crates/ra_analysis/src/imp.rs +++ b/crates/ra_analysis/src/imp.rs | |||
@@ -25,7 +25,7 @@ use crate::{ | |||
25 | Problem, | 25 | Problem, |
26 | }, | 26 | }, |
27 | input::{FilesDatabase, SourceRoot, SourceRootId, WORKSPACE}, | 27 | input::{FilesDatabase, SourceRoot, SourceRootId, WORKSPACE}, |
28 | symbol_index::SymbolIndex, | 28 | symbol_index::{SymbolIndex, SymbolsDatabase}, |
29 | AnalysisChange, Cancelable, CrateGraph, CrateId, Diagnostic, FileId, FileResolver, | 29 | AnalysisChange, Cancelable, CrateGraph, CrateId, Diagnostic, FileId, FileResolver, |
30 | FileSystemEdit, FilePosition, Query, SourceChange, SourceFileNodeEdit, | 30 | FileSystemEdit, FilePosition, Query, SourceChange, SourceFileNodeEdit, |
31 | }; | 31 | }; |
@@ -161,7 +161,7 @@ impl AnalysisHostImpl { | |||
161 | .query_mut(crate::input::SourceRootQuery) | 161 | .query_mut(crate::input::SourceRootQuery) |
162 | .set(source_root_id, Arc::new(source_root)); | 162 | .set(source_root_id, Arc::new(source_root)); |
163 | self.db | 163 | self.db |
164 | .query_mut(crate::input::LibrarySymbolsQuery) | 164 | .query_mut(crate::symbol_index::LibrarySymbolsQuery) |
165 | .set(source_root_id, Arc::new(library.symbol_index)); | 165 | .set(source_root_id, Arc::new(library.symbol_index)); |
166 | } | 166 | } |
167 | self.db | 167 | self.db |
diff --git a/crates/ra_analysis/src/input.rs b/crates/ra_analysis/src/input.rs index 60086d1ae..e601cd58a 100644 --- a/crates/ra_analysis/src/input.rs +++ b/crates/ra_analysis/src/input.rs | |||
@@ -5,7 +5,7 @@ use rustc_hash::FxHashMap; | |||
5 | use rustc_hash::FxHashSet; | 5 | use rustc_hash::FxHashSet; |
6 | use salsa; | 6 | use salsa; |
7 | 7 | ||
8 | use crate::{symbol_index::SymbolIndex, FileResolverImp}; | 8 | use crate::FileResolverImp; |
9 | 9 | ||
10 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] | 10 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] |
11 | pub struct FileId(pub u32); | 11 | pub struct FileId(pub u32); |
@@ -56,10 +56,6 @@ salsa::query_group! { | |||
56 | type LibrariesQuery; | 56 | type LibrariesQuery; |
57 | storage input; | 57 | storage input; |
58 | } | 58 | } |
59 | fn library_symbols(id: SourceRootId) -> Arc<SymbolIndex> { | ||
60 | type LibrarySymbolsQuery; | ||
61 | storage input; | ||
62 | } | ||
63 | fn crate_graph() -> Arc<CrateGraph> { | 59 | fn crate_graph() -> Arc<CrateGraph> { |
64 | type CrateGraphQuery; | 60 | type CrateGraphQuery; |
65 | storage input; | 61 | storage input; |
diff --git a/crates/ra_analysis/src/symbol_index.rs b/crates/ra_analysis/src/symbol_index.rs index 3a0667ecd..a6937d7f2 100644 --- a/crates/ra_analysis/src/symbol_index.rs +++ b/crates/ra_analysis/src/symbol_index.rs | |||
@@ -4,14 +4,37 @@ use std::{ | |||
4 | }; | 4 | }; |
5 | 5 | ||
6 | use fst::{self, Streamer}; | 6 | use fst::{self, Streamer}; |
7 | use ra_editor::{file_symbols, FileSymbol}; | 7 | use ra_editor::{self, FileSymbol}; |
8 | use ra_syntax::{ | 8 | use ra_syntax::{ |
9 | SourceFileNode, | 9 | SourceFileNode, |
10 | SyntaxKind::{self, *}, | 10 | SyntaxKind::{self, *}, |
11 | }; | 11 | }; |
12 | use rayon::prelude::*; | 12 | use rayon::prelude::*; |
13 | 13 | ||
14 | use crate::{FileId, Query}; | 14 | use crate::{ |
15 | Cancelable, | ||
16 | FileId, Query, | ||
17 | db::SyntaxDatabase, | ||
18 | input::SourceRootId, | ||
19 | }; | ||
20 | |||
21 | salsa::query_group! { | ||
22 | pub(crate) trait SymbolsDatabase: SyntaxDatabase { | ||
23 | fn file_symbols(file_id: FileId) -> Cancelable<Arc<SymbolIndex>> { | ||
24 | type FileSymbolsQuery; | ||
25 | } | ||
26 | fn library_symbols(id: SourceRootId) -> Arc<SymbolIndex> { | ||
27 | type LibrarySymbolsQuery; | ||
28 | storage input; | ||
29 | } | ||
30 | } | ||
31 | } | ||
32 | |||
33 | fn file_symbols(db: &impl SyntaxDatabase, file_id: FileId) -> Cancelable<Arc<SymbolIndex>> { | ||
34 | db.check_canceled()?; | ||
35 | let syntax = db.file_syntax(file_id); | ||
36 | Ok(Arc::new(SymbolIndex::for_file(file_id, syntax))) | ||
37 | } | ||
15 | 38 | ||
16 | #[derive(Default, Debug)] | 39 | #[derive(Default, Debug)] |
17 | pub(crate) struct SymbolIndex { | 40 | pub(crate) struct SymbolIndex { |
@@ -39,7 +62,7 @@ impl SymbolIndex { | |||
39 | ) -> SymbolIndex { | 62 | ) -> SymbolIndex { |
40 | let mut symbols = files | 63 | let mut symbols = files |
41 | .flat_map(|(file_id, file)| { | 64 | .flat_map(|(file_id, file)| { |
42 | file_symbols(&file) | 65 | ra_editor::file_symbols(&file) |
43 | .into_iter() | 66 | .into_iter() |
44 | .map(move |symbol| (symbol.name.as_str().to_lowercase(), (file_id, symbol))) | 67 | .map(move |symbol| (symbol.name.as_str().to_lowercase(), (file_id, symbol))) |
45 | .collect::<Vec<_>>() | 68 | .collect::<Vec<_>>() |