aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2019-12-26 15:22:15 +0000
committerFlorian Diebold <[email protected]>2019-12-26 15:23:40 +0000
commit78111620a33c57b58b07ebf044a7d53dc56176ef (patch)
tree8d5d2f89db0db56f8abfbda59b4391a7b0dff9db /crates
parent50ebff257dafe6e820f002241466ff4a98aa1f32 (diff)
Remove visibility query, instead add struct field visibility to data
Methods should be handled the same, and for items the visibility will be in the def map.
Diffstat (limited to 'crates')
-rw-r--r--crates/ra_hir/src/code_model.rs4
-rw-r--r--crates/ra_hir_def/src/adt.rs44
-rw-r--r--crates/ra_hir_def/src/db.rs6
-rw-r--r--crates/ra_hir_def/src/lib.rs23
-rw-r--r--crates/ra_hir_def/src/visibility.rs60
5 files changed, 35 insertions, 102 deletions
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index fdf316745..9612c86da 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -257,8 +257,8 @@ impl StructField {
257 257
258impl HasVisibility for StructField { 258impl HasVisibility for StructField {
259 fn visibility(&self, db: &impl HirDatabase) -> Visibility { 259 fn visibility(&self, db: &impl HirDatabase) -> Visibility {
260 let struct_field_id: hir_def::StructFieldId = (*self).into(); 260 let variant_data = self.parent.variant_data(db);
261 let visibility = db.visibility(struct_field_id.into()); 261 let visibility = &variant_data.fields()[self.id].visibility;
262 let parent_id: hir_def::VariantId = self.parent.into(); 262 let parent_id: hir_def::VariantId = self.parent.into();
263 visibility.resolve(db, &parent_id.resolver(db)) 263 visibility.resolve(db, &parent_id.resolver(db))
264 } 264 }
diff --git a/crates/ra_hir_def/src/adt.rs b/crates/ra_hir_def/src/adt.rs
index d9ea693e3..aac5f3e15 100644
--- a/crates/ra_hir_def/src/adt.rs
+++ b/crates/ra_hir_def/src/adt.rs
@@ -9,11 +9,12 @@ use hir_expand::{
9}; 9};
10use ra_arena::{map::ArenaMap, Arena}; 10use ra_arena::{map::ArenaMap, Arena};
11use ra_prof::profile; 11use ra_prof::profile;
12use ra_syntax::ast::{self, NameOwner, TypeAscriptionOwner}; 12use ra_syntax::ast::{self, NameOwner, TypeAscriptionOwner, VisibilityOwner};
13 13
14use crate::{ 14use crate::{
15 db::DefDatabase, src::HasChildSource, src::HasSource, trace::Trace, type_ref::TypeRef, EnumId, 15 db::DefDatabase, src::HasChildSource, src::HasSource, trace::Trace, type_ref::TypeRef,
16 LocalEnumVariantId, LocalStructFieldId, Lookup, StructId, UnionId, VariantId, 16 visibility::RawVisibility, EnumId, LocalEnumVariantId, LocalStructFieldId, Lookup, StructId,
17 UnionId, VariantId,
17}; 18};
18 19
19/// Note that we use `StructData` for unions as well! 20/// Note that we use `StructData` for unions as well!
@@ -47,13 +48,14 @@ pub enum VariantData {
47pub struct StructFieldData { 48pub struct StructFieldData {
48 pub name: Name, 49 pub name: Name,
49 pub type_ref: TypeRef, 50 pub type_ref: TypeRef,
51 pub visibility: RawVisibility,
50} 52}
51 53
52impl StructData { 54impl StructData {
53 pub(crate) fn struct_data_query(db: &impl DefDatabase, id: StructId) -> Arc<StructData> { 55 pub(crate) fn struct_data_query(db: &impl DefDatabase, id: StructId) -> Arc<StructData> {
54 let src = id.lookup(db).source(db); 56 let src = id.lookup(db).source(db);
55 let name = src.value.name().map_or_else(Name::missing, |n| n.as_name()); 57 let name = src.value.name().map_or_else(Name::missing, |n| n.as_name());
56 let variant_data = VariantData::new(src.value.kind()); 58 let variant_data = VariantData::new(db, src.map(|s| s.kind()));
57 let variant_data = Arc::new(variant_data); 59 let variant_data = Arc::new(variant_data);
58 Arc::new(StructData { name, variant_data }) 60 Arc::new(StructData { name, variant_data })
59 } 61 }
@@ -61,10 +63,12 @@ impl StructData {
61 let src = id.lookup(db).source(db); 63 let src = id.lookup(db).source(db);
62 let name = src.value.name().map_or_else(Name::missing, |n| n.as_name()); 64 let name = src.value.name().map_or_else(Name::missing, |n| n.as_name());
63 let variant_data = VariantData::new( 65 let variant_data = VariantData::new(
64 src.value 66 db,
65 .record_field_def_list() 67 src.map(|s| {
66 .map(ast::StructKind::Record) 68 s.record_field_def_list()
67 .unwrap_or(ast::StructKind::Unit), 69 .map(ast::StructKind::Record)
70 .unwrap_or(ast::StructKind::Unit)
71 }),
68 ); 72 );
69 let variant_data = Arc::new(variant_data); 73 let variant_data = Arc::new(variant_data);
70 Arc::new(StructData { name, variant_data }) 74 Arc::new(StructData { name, variant_data })
@@ -77,7 +81,7 @@ impl EnumData {
77 let src = e.lookup(db).source(db); 81 let src = e.lookup(db).source(db);
78 let name = src.value.name().map_or_else(Name::missing, |n| n.as_name()); 82 let name = src.value.name().map_or_else(Name::missing, |n| n.as_name());
79 let mut trace = Trace::new_for_arena(); 83 let mut trace = Trace::new_for_arena();
80 lower_enum(&mut trace, &src.value); 84 lower_enum(db, &mut trace, &src);
81 Arc::new(EnumData { name, variants: trace.into_arena() }) 85 Arc::new(EnumData { name, variants: trace.into_arena() })
82 } 86 }
83 87
@@ -93,30 +97,31 @@ impl HasChildSource for EnumId {
93 fn child_source(&self, db: &impl DefDatabase) -> InFile<ArenaMap<Self::ChildId, Self::Value>> { 97 fn child_source(&self, db: &impl DefDatabase) -> InFile<ArenaMap<Self::ChildId, Self::Value>> {
94 let src = self.lookup(db).source(db); 98 let src = self.lookup(db).source(db);
95 let mut trace = Trace::new_for_map(); 99 let mut trace = Trace::new_for_map();
96 lower_enum(&mut trace, &src.value); 100 lower_enum(db, &mut trace, &src);
97 src.with_value(trace.into_map()) 101 src.with_value(trace.into_map())
98 } 102 }
99} 103}
100 104
101fn lower_enum( 105fn lower_enum(
106 db: &impl DefDatabase,
102 trace: &mut Trace<LocalEnumVariantId, EnumVariantData, ast::EnumVariant>, 107 trace: &mut Trace<LocalEnumVariantId, EnumVariantData, ast::EnumVariant>,
103 ast: &ast::EnumDef, 108 ast: &InFile<ast::EnumDef>,
104) { 109) {
105 for var in ast.variant_list().into_iter().flat_map(|it| it.variants()) { 110 for var in ast.value.variant_list().into_iter().flat_map(|it| it.variants()) {
106 trace.alloc( 111 trace.alloc(
107 || var.clone(), 112 || var.clone(),
108 || EnumVariantData { 113 || EnumVariantData {
109 name: var.name().map_or_else(Name::missing, |it| it.as_name()), 114 name: var.name().map_or_else(Name::missing, |it| it.as_name()),
110 variant_data: Arc::new(VariantData::new(var.kind())), 115 variant_data: Arc::new(VariantData::new(db, ast.with_value(var.kind()))),
111 }, 116 },
112 ); 117 );
113 } 118 }
114} 119}
115 120
116impl VariantData { 121impl VariantData {
117 fn new(flavor: ast::StructKind) -> Self { 122 fn new(db: &impl DefDatabase, flavor: InFile<ast::StructKind>) -> Self {
118 let mut trace = Trace::new_for_arena(); 123 let mut trace = Trace::new_for_arena();
119 match lower_struct(&mut trace, &flavor) { 124 match lower_struct(db, &mut trace, &flavor) {
120 StructKind::Tuple => VariantData::Tuple(trace.into_arena()), 125 StructKind::Tuple => VariantData::Tuple(trace.into_arena()),
121 StructKind::Record => VariantData::Record(trace.into_arena()), 126 StructKind::Record => VariantData::Record(trace.into_arena()),
122 StructKind::Unit => VariantData::Unit, 127 StructKind::Unit => VariantData::Unit,
@@ -163,7 +168,7 @@ impl HasChildSource for VariantId {
163 }), 168 }),
164 }; 169 };
165 let mut trace = Trace::new_for_map(); 170 let mut trace = Trace::new_for_map();
166 lower_struct(&mut trace, &src.value); 171 lower_struct(db, &mut trace, &src);
167 src.with_value(trace.into_map()) 172 src.with_value(trace.into_map())
168 } 173 }
169} 174}
@@ -175,14 +180,15 @@ enum StructKind {
175} 180}
176 181
177fn lower_struct( 182fn lower_struct(
183 db: &impl DefDatabase,
178 trace: &mut Trace< 184 trace: &mut Trace<
179 LocalStructFieldId, 185 LocalStructFieldId,
180 StructFieldData, 186 StructFieldData,
181 Either<ast::TupleFieldDef, ast::RecordFieldDef>, 187 Either<ast::TupleFieldDef, ast::RecordFieldDef>,
182 >, 188 >,
183 ast: &ast::StructKind, 189 ast: &InFile<ast::StructKind>,
184) -> StructKind { 190) -> StructKind {
185 match ast { 191 match &ast.value {
186 ast::StructKind::Tuple(fl) => { 192 ast::StructKind::Tuple(fl) => {
187 for (i, fd) in fl.fields().enumerate() { 193 for (i, fd) in fl.fields().enumerate() {
188 trace.alloc( 194 trace.alloc(
@@ -190,6 +196,7 @@ fn lower_struct(
190 || StructFieldData { 196 || StructFieldData {
191 name: Name::new_tuple_field(i), 197 name: Name::new_tuple_field(i),
192 type_ref: TypeRef::from_ast_opt(fd.type_ref()), 198 type_ref: TypeRef::from_ast_opt(fd.type_ref()),
199 visibility: RawVisibility::from_ast(db, ast.with_value(fd.visibility())),
193 }, 200 },
194 ); 201 );
195 } 202 }
@@ -202,6 +209,7 @@ fn lower_struct(
202 || StructFieldData { 209 || StructFieldData {
203 name: fd.name().map(|n| n.as_name()).unwrap_or_else(Name::missing), 210 name: fd.name().map(|n| n.as_name()).unwrap_or_else(Name::missing),
204 type_ref: TypeRef::from_ast_opt(fd.ascribed_type()), 211 type_ref: TypeRef::from_ast_opt(fd.ascribed_type()),
212 visibility: RawVisibility::from_ast(db, ast.with_value(fd.visibility())),
205 }, 213 },
206 ); 214 );
207 } 215 }
diff --git a/crates/ra_hir_def/src/db.rs b/crates/ra_hir_def/src/db.rs
index 6bc0a8486..c55fd4111 100644
--- a/crates/ra_hir_def/src/db.rs
+++ b/crates/ra_hir_def/src/db.rs
@@ -14,10 +14,9 @@ use crate::{
14 generics::GenericParams, 14 generics::GenericParams,
15 lang_item::{LangItemTarget, LangItems}, 15 lang_item::{LangItemTarget, LangItems},
16 nameres::{raw::RawItems, CrateDefMap}, 16 nameres::{raw::RawItems, CrateDefMap},
17 visibility::RawVisibility,
18 AttrDefId, ConstId, ConstLoc, DefWithBodyId, EnumId, EnumLoc, FunctionId, FunctionLoc, 17 AttrDefId, ConstId, ConstLoc, DefWithBodyId, EnumId, EnumLoc, FunctionId, FunctionLoc,
19 GenericDefId, ImplId, ImplLoc, ModuleId, StaticId, StaticLoc, StructId, StructLoc, TraitId, 18 GenericDefId, ImplId, ImplLoc, ModuleId, StaticId, StaticLoc, StructId, StructLoc, TraitId,
20 TraitLoc, TypeAliasId, TypeAliasLoc, UnionId, UnionLoc, VisibilityDefId, 19 TraitLoc, TypeAliasId, TypeAliasLoc, UnionId, UnionLoc,
21}; 20};
22 21
23#[salsa::query_group(InternDatabaseStorage)] 22#[salsa::query_group(InternDatabaseStorage)]
@@ -91,9 +90,6 @@ pub trait DefDatabase: InternDatabase + AstDatabase {
91 #[salsa::invoke(Attrs::attrs_query)] 90 #[salsa::invoke(Attrs::attrs_query)]
92 fn attrs(&self, def: AttrDefId) -> Attrs; 91 fn attrs(&self, def: AttrDefId) -> Attrs;
93 92
94 #[salsa::invoke(RawVisibility::visibility_query)]
95 fn visibility(&self, def: VisibilityDefId) -> RawVisibility;
96
97 #[salsa::invoke(LangItems::module_lang_items_query)] 93 #[salsa::invoke(LangItems::module_lang_items_query)]
98 fn module_lang_items(&self, module: ModuleId) -> Option<Arc<LangItems>>; 94 fn module_lang_items(&self, module: ModuleId) -> Option<Arc<LangItems>>;
99 95
diff --git a/crates/ra_hir_def/src/lib.rs b/crates/ra_hir_def/src/lib.rs
index 72a59d867..61f044ecf 100644
--- a/crates/ra_hir_def/src/lib.rs
+++ b/crates/ra_hir_def/src/lib.rs
@@ -325,29 +325,6 @@ impl_froms!(
325 ImplId 325 ImplId
326); 326);
327 327
328#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
329pub enum VisibilityDefId {
330 ModuleId(ModuleId),
331 StructFieldId(StructFieldId),
332 AdtId(AdtId),
333 FunctionId(FunctionId),
334 StaticId(StaticId),
335 ConstId(ConstId),
336 TraitId(TraitId),
337 TypeAliasId(TypeAliasId),
338}
339
340impl_froms!(
341 VisibilityDefId: ModuleId,
342 StructFieldId,
343 AdtId(StructId, EnumId, UnionId),
344 StaticId,
345 ConstId,
346 FunctionId,
347 TraitId,
348 TypeAliasId
349);
350
351#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 328#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
352pub enum VariantId { 329pub enum VariantId {
353 EnumVariantId(EnumVariantId), 330 EnumVariantId(EnumVariantId),
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
3use std::sync::Arc; 3use std::sync::Arc;
4 4
5use either::Either;
6
7use hir_expand::{hygiene::Hygiene, InFile}; 5use hir_expand::{hygiene::Hygiene, InFile};
8use ra_syntax::ast::{self, VisibilityOwner}; 6use ra_syntax::ast;
9 7
10use crate::{ 8use 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
30impl RawVisibility { 27impl 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
159fn visibility_from_loc<T>(node: T, db: &impl DefDatabase) -> RawVisibility
160where
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}