diff options
Diffstat (limited to 'crates/ra_hir_def/src/visibility.rs')
-rw-r--r-- | crates/ra_hir_def/src/visibility.rs | 60 |
1 files changed, 6 insertions, 54 deletions
diff --git a/crates/ra_hir_def/src/visibility.rs b/crates/ra_hir_def/src/visibility.rs index e4c25ab7d..dccf2776e 100644 --- a/crates/ra_hir_def/src/visibility.rs +++ b/crates/ra_hir_def/src/visibility.rs | |||
@@ -2,16 +2,13 @@ | |||
2 | 2 | ||
3 | use std::sync::Arc; | 3 | use std::sync::Arc; |
4 | 4 | ||
5 | use either::Either; | ||
6 | |||
7 | use hir_expand::{hygiene::Hygiene, InFile}; | 5 | use hir_expand::{hygiene::Hygiene, InFile}; |
8 | use ra_syntax::ast::{self, VisibilityOwner}; | 6 | use ra_syntax::ast; |
9 | 7 | ||
10 | use crate::{ | 8 | use crate::{ |
11 | db::DefDatabase, | 9 | db::DefDatabase, |
12 | path::{ModPath, PathKind}, | 10 | path::{ModPath, PathKind}, |
13 | src::{HasChildSource, HasSource}, | 11 | ModuleId, |
14 | AdtId, Lookup, ModuleId, VisibilityDefId, | ||
15 | }; | 12 | }; |
16 | 13 | ||
17 | /// Visibility of an item, not yet resolved. | 14 | /// Visibility of an item, not yet resolved. |
@@ -28,51 +25,15 @@ pub enum RawVisibility { | |||
28 | } | 25 | } |
29 | 26 | ||
30 | impl RawVisibility { | 27 | impl RawVisibility { |
31 | pub(crate) fn visibility_query(db: &impl DefDatabase, def: VisibilityDefId) -> RawVisibility { | ||
32 | match def { | ||
33 | VisibilityDefId::ModuleId(module) => { | ||
34 | let def_map = db.crate_def_map(module.krate); | ||
35 | let src = match def_map[module.local_id].declaration_source(db) { | ||
36 | Some(it) => it, | ||
37 | None => return RawVisibility::private(), | ||
38 | }; | ||
39 | RawVisibility::from_ast(db, src.map(|it| it.visibility())) | ||
40 | } | ||
41 | VisibilityDefId::StructFieldId(it) => { | ||
42 | let src = it.parent.child_source(db); | ||
43 | let is_enum = match it.parent { | ||
44 | crate::VariantId::EnumVariantId(_) => true, | ||
45 | _ => false, | ||
46 | }; | ||
47 | let vis_node = src.map(|m| match &m[it.local_id] { | ||
48 | Either::Left(tuple) => tuple.visibility(), | ||
49 | Either::Right(record) => record.visibility(), | ||
50 | }); | ||
51 | if vis_node.value.is_none() && is_enum { | ||
52 | RawVisibility::Public | ||
53 | } else { | ||
54 | RawVisibility::from_ast(db, vis_node) | ||
55 | } | ||
56 | } | ||
57 | VisibilityDefId::AdtId(it) => match it { | ||
58 | AdtId::StructId(it) => visibility_from_loc(it.lookup(db), db), | ||
59 | AdtId::EnumId(it) => visibility_from_loc(it.lookup(db), db), | ||
60 | AdtId::UnionId(it) => visibility_from_loc(it.lookup(db), db), | ||
61 | }, | ||
62 | VisibilityDefId::TraitId(it) => visibility_from_loc(it.lookup(db), db), | ||
63 | VisibilityDefId::ConstId(it) => visibility_from_loc(it.lookup(db), db), | ||
64 | VisibilityDefId::StaticId(it) => visibility_from_loc(it.lookup(db), db), | ||
65 | VisibilityDefId::FunctionId(it) => visibility_from_loc(it.lookup(db), db), | ||
66 | VisibilityDefId::TypeAliasId(it) => visibility_from_loc(it.lookup(db), db), | ||
67 | } | ||
68 | } | ||
69 | |||
70 | fn private() -> RawVisibility { | 28 | fn private() -> RawVisibility { |
71 | let path = ModPath { kind: PathKind::Super(0), segments: Vec::new() }; | 29 | let path = ModPath { kind: PathKind::Super(0), segments: Vec::new() }; |
72 | RawVisibility::Module(Arc::new(path)) | 30 | RawVisibility::Module(Arc::new(path)) |
73 | } | 31 | } |
74 | 32 | ||
75 | fn from_ast(db: &impl DefDatabase, node: InFile<Option<ast::Visibility>>) -> RawVisibility { | 33 | pub(crate) fn from_ast( |
34 | db: &impl DefDatabase, | ||
35 | node: InFile<Option<ast::Visibility>>, | ||
36 | ) -> RawVisibility { | ||
76 | Self::from_ast_with_hygiene(node.value, &Hygiene::new(db, node.file_id)) | 37 | Self::from_ast_with_hygiene(node.value, &Hygiene::new(db, node.file_id)) |
77 | } | 38 | } |
78 | 39 | ||
@@ -155,12 +116,3 @@ impl Visibility { | |||
155 | ancestors.any(|m| m == to_module.local_id) | 116 | ancestors.any(|m| m == to_module.local_id) |
156 | } | 117 | } |
157 | } | 118 | } |
158 | |||
159 | fn visibility_from_loc<T>(node: T, db: &impl DefDatabase) -> RawVisibility | ||
160 | where | ||
161 | T: HasSource, | ||
162 | T::Value: ast::VisibilityOwner, | ||
163 | { | ||
164 | let src = node.source(db); | ||
165 | RawVisibility::from_ast(db, src.map(|n| n.visibility())) | ||
166 | } | ||