aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src/nameres/path_resolution.rs
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2019-12-24 22:45:14 +0000
committerFlorian Diebold <[email protected]>2019-12-26 15:23:40 +0000
commit79c90b5641d2934864c587380e4f050ab63ac029 (patch)
treeb87f4cdb1f6a2b477e111bf611db797f8360e6de /crates/ra_hir_def/src/nameres/path_resolution.rs
parentc31dae2aca8f0847df23b6976c3475cea57ada27 (diff)
Collect visibility of items during nameres
Diffstat (limited to 'crates/ra_hir_def/src/nameres/path_resolution.rs')
-rw-r--r--crates/ra_hir_def/src/nameres/path_resolution.rs27
1 files changed, 27 insertions, 0 deletions
diff --git a/crates/ra_hir_def/src/nameres/path_resolution.rs b/crates/ra_hir_def/src/nameres/path_resolution.rs
index 695014c7b..d88076aa7 100644
--- a/crates/ra_hir_def/src/nameres/path_resolution.rs
+++ b/crates/ra_hir_def/src/nameres/path_resolution.rs
@@ -21,6 +21,7 @@ use crate::{
21 nameres::{BuiltinShadowMode, CrateDefMap}, 21 nameres::{BuiltinShadowMode, CrateDefMap},
22 path::{ModPath, PathKind}, 22 path::{ModPath, PathKind},
23 per_ns::PerNs, 23 per_ns::PerNs,
24 visibility::{ResolvedVisibility, Visibility},
24 AdtId, CrateId, EnumVariantId, LocalModuleId, ModuleDefId, ModuleId, 25 AdtId, CrateId, EnumVariantId, LocalModuleId, ModuleDefId, ModuleId,
25}; 26};
26 27
@@ -64,6 +65,32 @@ impl CrateDefMap {
64 self.extern_prelude.get(name).map_or(PerNs::none(), |&it| PerNs::types(it)) 65 self.extern_prelude.get(name).map_or(PerNs::none(), |&it| PerNs::types(it))
65 } 66 }
66 67
68 pub(crate) fn resolve_visibility(
69 &self,
70 db: &impl DefDatabase,
71 original_module: LocalModuleId,
72 visibility: &Visibility,
73 ) -> Option<ResolvedVisibility> {
74 match visibility {
75 Visibility::Module(path) => {
76 let (result, remaining) =
77 self.resolve_path(db, original_module, &path, BuiltinShadowMode::Module);
78 if remaining.is_some() {
79 return None;
80 }
81 let types = result.take_types()?;
82 match types {
83 ModuleDefId::ModuleId(m) => Some(ResolvedVisibility::Module(m)),
84 _ => {
85 // error: visibility needs to refer to module
86 None
87 }
88 }
89 }
90 Visibility::Public => Some(ResolvedVisibility::Public),
91 }
92 }
93
67 // Returns Yes if we are sure that additions to `ItemMap` wouldn't change 94 // Returns Yes if we are sure that additions to `ItemMap` wouldn't change
68 // the result. 95 // the result.
69 pub(super) fn resolve_path_fp_with_macro( 96 pub(super) fn resolve_path_fp_with_macro(