diff options
author | Zac Pullar-Strecker <[email protected]> | 2020-08-24 10:19:53 +0100 |
---|---|---|
committer | Zac Pullar-Strecker <[email protected]> | 2020-08-24 10:20:13 +0100 |
commit | 7bbca7a1b3f9293d2f5cc5745199bc5f8396f2f0 (patch) | |
tree | bdb47765991cb973b2cd5481a088fac636bd326c /crates/ide_db/src/lib.rs | |
parent | ca464650eeaca6195891199a93f4f76cf3e7e697 (diff) | |
parent | e65d48d1fb3d4d91d9dc1148a7a836ff5c9a3c87 (diff) |
Merge remote-tracking branch 'upstream/master' into 503-hover-doc-links
Diffstat (limited to 'crates/ide_db/src/lib.rs')
-rw-r--r-- | crates/ide_db/src/lib.rs | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/crates/ide_db/src/lib.rs b/crates/ide_db/src/lib.rs new file mode 100644 index 000000000..70ada02f3 --- /dev/null +++ b/crates/ide_db/src/lib.rs | |||
@@ -0,0 +1,140 @@ | |||
1 | //! This crate defines the core datastructure representing IDE state -- `RootDatabase`. | ||
2 | //! | ||
3 | //! It is mainly a `HirDatabase` for semantic analysis, plus a `SymbolsDatabase`, for fuzzy search. | ||
4 | |||
5 | pub mod label; | ||
6 | pub mod line_index; | ||
7 | pub mod symbol_index; | ||
8 | pub mod change; | ||
9 | pub mod defs; | ||
10 | pub mod search; | ||
11 | pub mod imports_locator; | ||
12 | pub mod source_change; | ||
13 | mod wasm_shims; | ||
14 | |||
15 | use std::{fmt, sync::Arc}; | ||
16 | |||
17 | use base_db::{ | ||
18 | salsa::{self, Durability}, | ||
19 | Canceled, CheckCanceled, CrateId, FileId, FileLoader, FileLoaderDelegate, SourceDatabase, | ||
20 | Upcast, | ||
21 | }; | ||
22 | use hir::db::{AstDatabase, DefDatabase, HirDatabase}; | ||
23 | use rustc_hash::FxHashSet; | ||
24 | |||
25 | use crate::{line_index::LineIndex, symbol_index::SymbolsDatabase}; | ||
26 | |||
27 | #[salsa::database( | ||
28 | base_db::SourceDatabaseStorage, | ||
29 | base_db::SourceDatabaseExtStorage, | ||
30 | LineIndexDatabaseStorage, | ||
31 | symbol_index::SymbolsDatabaseStorage, | ||
32 | hir::db::InternDatabaseStorage, | ||
33 | hir::db::AstDatabaseStorage, | ||
34 | hir::db::DefDatabaseStorage, | ||
35 | hir::db::HirDatabaseStorage | ||
36 | )] | ||
37 | pub struct RootDatabase { | ||
38 | storage: salsa::Storage<RootDatabase>, | ||
39 | pub last_gc: crate::wasm_shims::Instant, | ||
40 | pub last_gc_check: crate::wasm_shims::Instant, | ||
41 | } | ||
42 | |||
43 | impl fmt::Debug for RootDatabase { | ||
44 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | ||
45 | f.debug_struct("RootDatabase").finish() | ||
46 | } | ||
47 | } | ||
48 | |||
49 | impl Upcast<dyn AstDatabase> for RootDatabase { | ||
50 | fn upcast(&self) -> &(dyn AstDatabase + 'static) { | ||
51 | &*self | ||
52 | } | ||
53 | } | ||
54 | |||
55 | impl Upcast<dyn DefDatabase> for RootDatabase { | ||
56 | fn upcast(&self) -> &(dyn DefDatabase + 'static) { | ||
57 | &*self | ||
58 | } | ||
59 | } | ||
60 | |||
61 | impl Upcast<dyn HirDatabase> for RootDatabase { | ||
62 | fn upcast(&self) -> &(dyn HirDatabase + 'static) { | ||
63 | &*self | ||
64 | } | ||
65 | } | ||
66 | |||
67 | impl FileLoader for RootDatabase { | ||
68 | fn file_text(&self, file_id: FileId) -> Arc<String> { | ||
69 | FileLoaderDelegate(self).file_text(file_id) | ||
70 | } | ||
71 | fn resolve_path(&self, anchor: FileId, path: &str) -> Option<FileId> { | ||
72 | FileLoaderDelegate(self).resolve_path(anchor, path) | ||
73 | } | ||
74 | fn relevant_crates(&self, file_id: FileId) -> Arc<FxHashSet<CrateId>> { | ||
75 | FileLoaderDelegate(self).relevant_crates(file_id) | ||
76 | } | ||
77 | } | ||
78 | |||
79 | impl salsa::Database for RootDatabase { | ||
80 | fn on_propagated_panic(&self) -> ! { | ||
81 | Canceled::throw() | ||
82 | } | ||
83 | fn salsa_event(&self, event: salsa::Event) { | ||
84 | match event.kind { | ||
85 | salsa::EventKind::DidValidateMemoizedValue { .. } | ||
86 | | salsa::EventKind::WillExecute { .. } => { | ||
87 | self.check_canceled(); | ||
88 | } | ||
89 | _ => (), | ||
90 | } | ||
91 | } | ||
92 | } | ||
93 | |||
94 | impl Default for RootDatabase { | ||
95 | fn default() -> RootDatabase { | ||
96 | RootDatabase::new(None) | ||
97 | } | ||
98 | } | ||
99 | |||
100 | impl RootDatabase { | ||
101 | pub fn new(lru_capacity: Option<usize>) -> RootDatabase { | ||
102 | let mut db = RootDatabase { | ||
103 | storage: salsa::Storage::default(), | ||
104 | last_gc: crate::wasm_shims::Instant::now(), | ||
105 | last_gc_check: crate::wasm_shims::Instant::now(), | ||
106 | }; | ||
107 | db.set_crate_graph_with_durability(Default::default(), Durability::HIGH); | ||
108 | db.set_local_roots_with_durability(Default::default(), Durability::HIGH); | ||
109 | db.set_library_roots_with_durability(Default::default(), Durability::HIGH); | ||
110 | db.update_lru_capacity(lru_capacity); | ||
111 | db | ||
112 | } | ||
113 | |||
114 | pub fn update_lru_capacity(&mut self, lru_capacity: Option<usize>) { | ||
115 | let lru_capacity = lru_capacity.unwrap_or(base_db::DEFAULT_LRU_CAP); | ||
116 | base_db::ParseQuery.in_db_mut(self).set_lru_capacity(lru_capacity); | ||
117 | hir::db::ParseMacroQuery.in_db_mut(self).set_lru_capacity(lru_capacity); | ||
118 | hir::db::MacroExpandQuery.in_db_mut(self).set_lru_capacity(lru_capacity); | ||
119 | } | ||
120 | } | ||
121 | |||
122 | impl salsa::ParallelDatabase for RootDatabase { | ||
123 | fn snapshot(&self) -> salsa::Snapshot<RootDatabase> { | ||
124 | salsa::Snapshot::new(RootDatabase { | ||
125 | storage: self.storage.snapshot(), | ||
126 | last_gc: self.last_gc, | ||
127 | last_gc_check: self.last_gc_check, | ||
128 | }) | ||
129 | } | ||
130 | } | ||
131 | |||
132 | #[salsa::query_group(LineIndexDatabaseStorage)] | ||
133 | pub trait LineIndexDatabase: base_db::SourceDatabase + CheckCanceled { | ||
134 | fn line_index(&self, file_id: FileId) -> Arc<LineIndex>; | ||
135 | } | ||
136 | |||
137 | fn line_index(db: &dyn LineIndexDatabase, file_id: FileId) -> Arc<LineIndex> { | ||
138 | let text = db.file_text(file_id); | ||
139 | Arc::new(LineIndex::new(&*text)) | ||
140 | } | ||