diff options
author | Aleksey Kladov <[email protected]> | 2019-03-23 15:35:14 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-03-25 07:52:50 +0000 |
commit | 3fb88e95aa5e122a521beec766d5b1264ca4de3b (patch) | |
tree | 17e5815f78f81f04fd462605288e09e82c8caee8 /crates/ra_hir/src/nameres.rs | |
parent | fcca35969dd7c63a83ee34c4ce7d54cefdb72bbe (diff) |
switch modules to new diagnostics
Diffstat (limited to 'crates/ra_hir/src/nameres.rs')
-rw-r--r-- | crates/ra_hir/src/nameres.rs | 65 |
1 files changed, 43 insertions, 22 deletions
diff --git a/crates/ra_hir/src/nameres.rs b/crates/ra_hir/src/nameres.rs index d361cf9e6..416f114b4 100644 --- a/crates/ra_hir/src/nameres.rs +++ b/crates/ra_hir/src/nameres.rs | |||
@@ -56,14 +56,17 @@ mod tests; | |||
56 | use std::sync::Arc; | 56 | use std::sync::Arc; |
57 | 57 | ||
58 | use rustc_hash::FxHashMap; | 58 | use rustc_hash::FxHashMap; |
59 | use relative_path::RelativePathBuf; | ||
59 | use ra_arena::{Arena, RawId, impl_arena_id}; | 60 | use ra_arena::{Arena, RawId, impl_arena_id}; |
60 | use ra_db::{FileId, Edition}; | 61 | use ra_db::{FileId, Edition}; |
62 | use ra_syntax::{AstNode, AstPtr, ast}; | ||
61 | use test_utils::tested_by; | 63 | use test_utils::tested_by; |
62 | 64 | ||
63 | use crate::{ | 65 | use crate::{ |
64 | ModuleDef, Name, Crate, Module, Problem, | 66 | ModuleDef, Name, Crate, Module, |
65 | DefDatabase, Path, PathKind, HirFileId, | 67 | DefDatabase, Path, PathKind, HirFileId, |
66 | ids::{SourceItemId, SourceFileItemId, MacroCallId}, | 68 | ids::{SourceItemId, SourceFileItemId, MacroCallId}, |
69 | diagnostics::{Diagnostics, UnresolvedModule}, | ||
67 | }; | 70 | }; |
68 | 71 | ||
69 | pub(crate) use self::raw::{RawItems, ImportId, ImportSourceMap}; | 72 | pub(crate) use self::raw::{RawItems, ImportId, ImportSourceMap}; |
@@ -85,7 +88,7 @@ pub struct CrateDefMap { | |||
85 | macros: Arena<CrateMacroId, mbe::MacroRules>, | 88 | macros: Arena<CrateMacroId, mbe::MacroRules>, |
86 | public_macros: FxHashMap<Name, CrateMacroId>, | 89 | public_macros: FxHashMap<Name, CrateMacroId>, |
87 | macro_resolutions: FxHashMap<MacroCallId, (Crate, CrateMacroId)>, | 90 | macro_resolutions: FxHashMap<MacroCallId, (Crate, CrateMacroId)>, |
88 | problems: CrateDefMapProblems, | 91 | diagnostics: Vec<DefDiagnostic>, |
89 | } | 92 | } |
90 | 93 | ||
91 | impl std::ops::Index<CrateModuleId> for CrateDefMap { | 94 | impl std::ops::Index<CrateModuleId> for CrateDefMap { |
@@ -125,21 +128,6 @@ pub(crate) struct ModuleData { | |||
125 | pub(crate) definition: Option<FileId>, | 128 | pub(crate) definition: Option<FileId>, |
126 | } | 129 | } |
127 | 130 | ||
128 | #[derive(Default, Debug, PartialEq, Eq)] | ||
129 | pub(crate) struct CrateDefMapProblems { | ||
130 | problems: Vec<(SourceItemId, Problem)>, | ||
131 | } | ||
132 | |||
133 | impl CrateDefMapProblems { | ||
134 | fn add(&mut self, source_item_id: SourceItemId, problem: Problem) { | ||
135 | self.problems.push((source_item_id, problem)) | ||
136 | } | ||
137 | |||
138 | pub(crate) fn iter<'a>(&'a self) -> impl Iterator<Item = (&'a SourceItemId, &'a Problem)> + 'a { | ||
139 | self.problems.iter().map(|(s, p)| (s, p)) | ||
140 | } | ||
141 | } | ||
142 | |||
143 | #[derive(Debug, Default, PartialEq, Eq, Clone)] | 131 | #[derive(Debug, Default, PartialEq, Eq, Clone)] |
144 | pub struct ModuleScope { | 132 | pub struct ModuleScope { |
145 | items: FxHashMap<Name, Resolution>, | 133 | items: FxHashMap<Name, Resolution>, |
@@ -212,7 +200,7 @@ impl CrateDefMap { | |||
212 | macros: Arena::default(), | 200 | macros: Arena::default(), |
213 | public_macros: FxHashMap::default(), | 201 | public_macros: FxHashMap::default(), |
214 | macro_resolutions: FxHashMap::default(), | 202 | macro_resolutions: FxHashMap::default(), |
215 | problems: CrateDefMapProblems::default(), | 203 | diagnostics: Vec::new(), |
216 | } | 204 | } |
217 | }; | 205 | }; |
218 | let def_map = collector::collect_defs(db, def_map); | 206 | let def_map = collector::collect_defs(db, def_map); |
@@ -224,10 +212,6 @@ impl CrateDefMap { | |||
224 | self.root | 212 | self.root |
225 | } | 213 | } |
226 | 214 | ||
227 | pub(crate) fn problems(&self) -> &CrateDefMapProblems { | ||
228 | &self.problems | ||
229 | } | ||
230 | |||
231 | pub(crate) fn mk_module(&self, module_id: CrateModuleId) -> Module { | 215 | pub(crate) fn mk_module(&self, module_id: CrateModuleId) -> Module { |
232 | Module { krate: self.krate, module_id } | 216 | Module { krate: self.krate, module_id } |
233 | } | 217 | } |
@@ -240,6 +224,15 @@ impl CrateDefMap { | |||
240 | &self.extern_prelude | 224 | &self.extern_prelude |
241 | } | 225 | } |
242 | 226 | ||
227 | pub(crate) fn add_diagnostics( | ||
228 | &self, | ||
229 | db: &impl DefDatabase, | ||
230 | module: CrateModuleId, | ||
231 | sink: &mut Diagnostics, | ||
232 | ) { | ||
233 | self.diagnostics.iter().for_each(|it| it.add_to(db, module, sink)) | ||
234 | } | ||
235 | |||
243 | pub(crate) fn resolve_macro( | 236 | pub(crate) fn resolve_macro( |
244 | &self, | 237 | &self, |
245 | macro_call_id: MacroCallId, | 238 | macro_call_id: MacroCallId, |
@@ -452,3 +445,31 @@ impl CrateDefMap { | |||
452 | } | 445 | } |
453 | } | 446 | } |
454 | } | 447 | } |
448 | |||
449 | #[derive(Debug, PartialEq, Eq)] | ||
450 | enum DefDiagnostic { | ||
451 | UnresolvedModule { | ||
452 | module: CrateModuleId, | ||
453 | declaration: SourceItemId, | ||
454 | candidate: RelativePathBuf, | ||
455 | }, | ||
456 | } | ||
457 | |||
458 | impl DefDiagnostic { | ||
459 | fn add_to(&self, db: &impl DefDatabase, target_module: CrateModuleId, sink: &mut Diagnostics) { | ||
460 | match self { | ||
461 | DefDiagnostic::UnresolvedModule { module, declaration, candidate } => { | ||
462 | if *module != target_module { | ||
463 | return; | ||
464 | } | ||
465 | let syntax = db.file_item(*declaration); | ||
466 | let decl = ast::Module::cast(&syntax).unwrap(); | ||
467 | sink.push(UnresolvedModule { | ||
468 | file: declaration.file_id, | ||
469 | decl: AstPtr::new(&decl), | ||
470 | candidate: candidate.clone(), | ||
471 | }) | ||
472 | } | ||
473 | } | ||
474 | } | ||
475 | } | ||