aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/nameres.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-03-23 15:35:14 +0000
committerAleksey Kladov <[email protected]>2019-03-25 07:52:50 +0000
commit3fb88e95aa5e122a521beec766d5b1264ca4de3b (patch)
tree17e5815f78f81f04fd462605288e09e82c8caee8 /crates/ra_hir/src/nameres.rs
parentfcca35969dd7c63a83ee34c4ce7d54cefdb72bbe (diff)
switch modules to new diagnostics
Diffstat (limited to 'crates/ra_hir/src/nameres.rs')
-rw-r--r--crates/ra_hir/src/nameres.rs65
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;
56use std::sync::Arc; 56use std::sync::Arc;
57 57
58use rustc_hash::FxHashMap; 58use rustc_hash::FxHashMap;
59use relative_path::RelativePathBuf;
59use ra_arena::{Arena, RawId, impl_arena_id}; 60use ra_arena::{Arena, RawId, impl_arena_id};
60use ra_db::{FileId, Edition}; 61use ra_db::{FileId, Edition};
62use ra_syntax::{AstNode, AstPtr, ast};
61use test_utils::tested_by; 63use test_utils::tested_by;
62 64
63use crate::{ 65use 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
69pub(crate) use self::raw::{RawItems, ImportId, ImportSourceMap}; 72pub(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
91impl std::ops::Index<CrateModuleId> for CrateDefMap { 94impl 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)]
129pub(crate) struct CrateDefMapProblems {
130 problems: Vec<(SourceItemId, Problem)>,
131}
132
133impl 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)]
144pub struct ModuleScope { 132pub 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)]
450enum DefDiagnostic {
451 UnresolvedModule {
452 module: CrateModuleId,
453 declaration: SourceItemId,
454 candidate: RelativePathBuf,
455 },
456}
457
458impl 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}