diff options
Diffstat (limited to 'crates/ra_hir_def/src')
-rw-r--r-- | crates/ra_hir_def/src/adt.rs | 15 | ||||
-rw-r--r-- | crates/ra_hir_def/src/body.rs | 11 | ||||
-rw-r--r-- | crates/ra_hir_def/src/body/lower.rs | 19 | ||||
-rw-r--r-- | crates/ra_hir_def/src/data.rs | 163 | ||||
-rw-r--r-- | crates/ra_hir_def/src/item_scope.rs | 11 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/collector.rs | 13 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/raw.rs | 18 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/tests.rs | 2 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/tests/macros.rs | 32 |
9 files changed, 145 insertions, 139 deletions
diff --git a/crates/ra_hir_def/src/adt.rs b/crates/ra_hir_def/src/adt.rs index 8eef51828..2bc34d449 100644 --- a/crates/ra_hir_def/src/adt.rs +++ b/crates/ra_hir_def/src/adt.rs | |||
@@ -117,7 +117,14 @@ fn lower_enum( | |||
117 | ast: &InFile<ast::EnumDef>, | 117 | ast: &InFile<ast::EnumDef>, |
118 | module_id: ModuleId, | 118 | module_id: ModuleId, |
119 | ) { | 119 | ) { |
120 | for var in ast.value.variant_list().into_iter().flat_map(|it| it.variants()) { | 120 | let expander = CfgExpander::new(db, ast.file_id, module_id.krate); |
121 | let variants = ast | ||
122 | .value | ||
123 | .variant_list() | ||
124 | .into_iter() | ||
125 | .flat_map(|it| it.variants()) | ||
126 | .filter(|var| expander.is_cfg_enabled(var)); | ||
127 | for var in variants { | ||
121 | trace.alloc( | 128 | trace.alloc( |
122 | || var.clone(), | 129 | || var.clone(), |
123 | || EnumVariantData { | 130 | || EnumVariantData { |
@@ -209,8 +216,7 @@ fn lower_struct( | |||
209 | match &ast.value { | 216 | match &ast.value { |
210 | ast::StructKind::Tuple(fl) => { | 217 | ast::StructKind::Tuple(fl) => { |
211 | for (i, fd) in fl.fields().enumerate() { | 218 | for (i, fd) in fl.fields().enumerate() { |
212 | let attrs = expander.parse_attrs(&fd); | 219 | if !expander.is_cfg_enabled(&fd) { |
213 | if !expander.is_cfg_enabled(&attrs) { | ||
214 | continue; | 220 | continue; |
215 | } | 221 | } |
216 | 222 | ||
@@ -227,8 +233,7 @@ fn lower_struct( | |||
227 | } | 233 | } |
228 | ast::StructKind::Record(fl) => { | 234 | ast::StructKind::Record(fl) => { |
229 | for fd in fl.fields() { | 235 | for fd in fl.fields() { |
230 | let attrs = expander.parse_attrs(&fd); | 236 | if !expander.is_cfg_enabled(&fd) { |
231 | if !expander.is_cfg_enabled(&attrs) { | ||
232 | continue; | 237 | continue; |
233 | } | 238 | } |
234 | 239 | ||
diff --git a/crates/ra_hir_def/src/body.rs b/crates/ra_hir_def/src/body.rs index 4edaad960..f5a7305dc 100644 --- a/crates/ra_hir_def/src/body.rs +++ b/crates/ra_hir_def/src/body.rs | |||
@@ -60,7 +60,8 @@ impl CfgExpander { | |||
60 | Attrs::new(owner, &self.hygiene) | 60 | Attrs::new(owner, &self.hygiene) |
61 | } | 61 | } |
62 | 62 | ||
63 | pub(crate) fn is_cfg_enabled(&self, attrs: &Attrs) -> bool { | 63 | pub(crate) fn is_cfg_enabled(&self, owner: &dyn ast::AttrsOwner) -> bool { |
64 | let attrs = self.parse_attrs(owner); | ||
64 | attrs.is_cfg_enabled(&self.cfg_options) | 65 | attrs.is_cfg_enabled(&self.cfg_options) |
65 | } | 66 | } |
66 | } | 67 | } |
@@ -141,12 +142,8 @@ impl Expander { | |||
141 | InFile { file_id: self.current_file_id, value } | 142 | InFile { file_id: self.current_file_id, value } |
142 | } | 143 | } |
143 | 144 | ||
144 | pub(crate) fn parse_attrs(&self, owner: &dyn ast::AttrsOwner) -> Attrs { | 145 | pub(crate) fn is_cfg_enabled(&self, owner: &dyn ast::AttrsOwner) -> bool { |
145 | self.cfg_expander.parse_attrs(owner) | 146 | self.cfg_expander.is_cfg_enabled(owner) |
146 | } | ||
147 | |||
148 | pub(crate) fn is_cfg_enabled(&self, attrs: &Attrs) -> bool { | ||
149 | self.cfg_expander.is_cfg_enabled(attrs) | ||
150 | } | 147 | } |
151 | 148 | ||
152 | fn parse_path(&mut self, path: ast::Path) -> Option<Path> { | 149 | fn parse_path(&mut self, path: ast::Path) -> Option<Path> { |
diff --git a/crates/ra_hir_def/src/body/lower.rs b/crates/ra_hir_def/src/body/lower.rs index 687216dc3..443b057ab 100644 --- a/crates/ra_hir_def/src/body/lower.rs +++ b/crates/ra_hir_def/src/body/lower.rs | |||
@@ -162,8 +162,7 @@ impl ExprCollector<'_> { | |||
162 | 162 | ||
163 | fn collect_expr(&mut self, expr: ast::Expr) -> ExprId { | 163 | fn collect_expr(&mut self, expr: ast::Expr) -> ExprId { |
164 | let syntax_ptr = AstPtr::new(&expr); | 164 | let syntax_ptr = AstPtr::new(&expr); |
165 | let attrs = self.expander.parse_attrs(&expr); | 165 | if !self.expander.is_cfg_enabled(&expr) { |
166 | if !self.expander.is_cfg_enabled(&attrs) { | ||
167 | return self.missing_expr(); | 166 | return self.missing_expr(); |
168 | } | 167 | } |
169 | match expr { | 168 | match expr { |
@@ -329,8 +328,7 @@ impl ExprCollector<'_> { | |||
329 | .fields() | 328 | .fields() |
330 | .inspect(|field| field_ptrs.push(AstPtr::new(field))) | 329 | .inspect(|field| field_ptrs.push(AstPtr::new(field))) |
331 | .filter_map(|field| { | 330 | .filter_map(|field| { |
332 | let attrs = self.expander.parse_attrs(&field); | 331 | if !self.expander.is_cfg_enabled(&field) { |
333 | if !self.expander.is_cfg_enabled(&attrs) { | ||
334 | return None; | 332 | return None; |
335 | } | 333 | } |
336 | let name = field.field_name()?.as_name(); | 334 | let name = field.field_name()?.as_name(); |
@@ -575,9 +573,16 @@ impl ExprCollector<'_> { | |||
575 | self.body.item_scope.define_def(def); | 573 | self.body.item_scope.define_def(def); |
576 | if let Some(name) = name { | 574 | if let Some(name) = name { |
577 | let vis = crate::visibility::Visibility::Public; // FIXME determine correctly | 575 | let vis = crate::visibility::Visibility::Public; // FIXME determine correctly |
578 | self.body | 576 | let has_constructor = match def { |
579 | .item_scope | 577 | ModuleDefId::AdtId(AdtId::StructId(s)) => { |
580 | .push_res(name.as_name(), crate::per_ns::PerNs::from_def(def, vis)); | 578 | self.db.struct_data(s).variant_data.kind() != StructKind::Record |
579 | } | ||
580 | _ => true, | ||
581 | }; | ||
582 | self.body.item_scope.push_res( | ||
583 | name.as_name(), | ||
584 | crate::per_ns::PerNs::from_def(def, vis, has_constructor), | ||
585 | ); | ||
581 | } | 586 | } |
582 | } | 587 | } |
583 | } | 588 | } |
diff --git a/crates/ra_hir_def/src/data.rs b/crates/ra_hir_def/src/data.rs index 7a2067e49..e7eb2bb11 100644 --- a/crates/ra_hir_def/src/data.rs +++ b/crates/ra_hir_def/src/data.rs | |||
@@ -9,7 +9,7 @@ use hir_expand::{ | |||
9 | }; | 9 | }; |
10 | use ra_prof::profile; | 10 | use ra_prof::profile; |
11 | use ra_syntax::ast::{ | 11 | use ra_syntax::ast::{ |
12 | self, AstNode, ImplItem, ModuleItemOwner, NameOwner, TypeAscriptionOwner, TypeBoundsOwner, | 12 | self, AssocItem, AstNode, ModuleItemOwner, NameOwner, TypeAscriptionOwner, TypeBoundsOwner, |
13 | VisibilityOwner, | 13 | VisibilityOwner, |
14 | }; | 14 | }; |
15 | 15 | ||
@@ -150,51 +150,31 @@ pub struct TraitData { | |||
150 | 150 | ||
151 | impl TraitData { | 151 | impl TraitData { |
152 | pub(crate) fn trait_data_query(db: &dyn DefDatabase, tr: TraitId) -> Arc<TraitData> { | 152 | pub(crate) fn trait_data_query(db: &dyn DefDatabase, tr: TraitId) -> Arc<TraitData> { |
153 | let src = tr.lookup(db).source(db); | 153 | let tr_loc = tr.lookup(db); |
154 | let src = tr_loc.source(db); | ||
154 | let name = src.value.name().map_or_else(Name::missing, |n| n.as_name()); | 155 | let name = src.value.name().map_or_else(Name::missing, |n| n.as_name()); |
155 | let auto = src.value.auto_token().is_some(); | 156 | let auto = src.value.auto_token().is_some(); |
156 | let ast_id_map = db.ast_id_map(src.file_id); | 157 | let module_id = tr_loc.container.module(db); |
157 | 158 | ||
158 | let container = AssocContainerId::TraitId(tr); | 159 | let container = AssocContainerId::TraitId(tr); |
159 | let items = if let Some(item_list) = src.value.item_list() { | 160 | let mut items = Vec::new(); |
160 | item_list | 161 | |
161 | .impl_items() | 162 | if let Some(item_list) = src.value.item_list() { |
162 | .map(|item_node| match item_node { | 163 | let mut expander = Expander::new(db, tr_loc.ast_id.file_id, module_id); |
163 | ast::ImplItem::FnDef(it) => { | 164 | items.extend(collect_items( |
164 | let name = it.name().map_or_else(Name::missing, |it| it.as_name()); | 165 | db, |
165 | let def = FunctionLoc { | 166 | &mut expander, |
166 | container, | 167 | item_list.assoc_items(), |
167 | ast_id: AstId::new(src.file_id, ast_id_map.ast_id(&it)), | 168 | src.file_id, |
168 | } | 169 | container, |
169 | .intern(db) | 170 | )); |
170 | .into(); | 171 | items.extend(collect_items_in_macros( |
171 | (name, def) | 172 | db, |
172 | } | 173 | &mut expander, |
173 | ast::ImplItem::ConstDef(it) => { | 174 | &src.with_value(item_list), |
174 | let name = it.name().map_or_else(Name::missing, |it| it.as_name()); | 175 | container, |
175 | let def = ConstLoc { | 176 | )); |
176 | container, | 177 | } |
177 | ast_id: AstId::new(src.file_id, ast_id_map.ast_id(&it)), | ||
178 | } | ||
179 | .intern(db) | ||
180 | .into(); | ||
181 | (name, def) | ||
182 | } | ||
183 | ast::ImplItem::TypeAliasDef(it) => { | ||
184 | let name = it.name().map_or_else(Name::missing, |it| it.as_name()); | ||
185 | let def = TypeAliasLoc { | ||
186 | container, | ||
187 | ast_id: AstId::new(src.file_id, ast_id_map.ast_id(&it)), | ||
188 | } | ||
189 | .intern(db) | ||
190 | .into(); | ||
191 | (name, def) | ||
192 | } | ||
193 | }) | ||
194 | .collect() | ||
195 | } else { | ||
196 | Vec::new() | ||
197 | }; | ||
198 | Arc::new(TraitData { name, items, auto }) | 178 | Arc::new(TraitData { name, items, auto }) |
199 | } | 179 | } |
200 | 180 | ||
@@ -232,24 +212,22 @@ impl ImplData { | |||
232 | let target_type = TypeRef::from_ast_opt(&lower_ctx, src.value.target_type()); | 212 | let target_type = TypeRef::from_ast_opt(&lower_ctx, src.value.target_type()); |
233 | let is_negative = src.value.excl_token().is_some(); | 213 | let is_negative = src.value.excl_token().is_some(); |
234 | let module_id = impl_loc.container.module(db); | 214 | let module_id = impl_loc.container.module(db); |
215 | let container = AssocContainerId::ImplId(id); | ||
235 | 216 | ||
236 | let mut items = Vec::new(); | 217 | let mut items: Vec<AssocItemId> = Vec::new(); |
237 | 218 | ||
238 | if let Some(item_list) = src.value.item_list() { | 219 | if let Some(item_list) = src.value.item_list() { |
239 | let mut expander = Expander::new(db, impl_loc.ast_id.file_id, module_id); | 220 | let mut expander = Expander::new(db, impl_loc.ast_id.file_id, module_id); |
240 | items.extend(collect_impl_items( | 221 | items.extend( |
241 | db, | 222 | collect_items(db, &mut expander, item_list.assoc_items(), src.file_id, container) |
242 | &mut expander, | 223 | .into_iter() |
243 | item_list.impl_items(), | 224 | .map(|(_, item)| item), |
244 | src.file_id, | 225 | ); |
245 | id, | 226 | items.extend( |
246 | )); | 227 | collect_items_in_macros(db, &mut expander, &src.with_value(item_list), container) |
247 | items.extend(collect_impl_items_in_macros( | 228 | .into_iter() |
248 | db, | 229 | .map(|(_, item)| item), |
249 | &mut expander, | 230 | ); |
250 | &src.with_value(item_list), | ||
251 | id, | ||
252 | )); | ||
253 | } | 231 | } |
254 | 232 | ||
255 | let res = ImplData { target_trait, target_type, items, is_negative }; | 233 | let res = ImplData { target_trait, target_type, items, is_negative }; |
@@ -292,49 +270,50 @@ impl ConstData { | |||
292 | } | 270 | } |
293 | } | 271 | } |
294 | 272 | ||
295 | fn collect_impl_items_in_macros( | 273 | fn collect_items_in_macros( |
296 | db: &dyn DefDatabase, | 274 | db: &dyn DefDatabase, |
297 | expander: &mut Expander, | 275 | expander: &mut Expander, |
298 | impl_def: &InFile<ast::ItemList>, | 276 | impl_def: &InFile<ast::ItemList>, |
299 | id: ImplId, | 277 | container: AssocContainerId, |
300 | ) -> Vec<AssocItemId> { | 278 | ) -> Vec<(Name, AssocItemId)> { |
301 | let mut res = Vec::new(); | 279 | let mut res = Vec::new(); |
302 | 280 | ||
303 | // We set a limit to protect against infinite recursion | 281 | // We set a limit to protect against infinite recursion |
304 | let limit = 100; | 282 | let limit = 100; |
305 | 283 | ||
306 | for m in impl_def.value.syntax().children().filter_map(ast::MacroCall::cast) { | 284 | for m in impl_def.value.syntax().children().filter_map(ast::MacroCall::cast) { |
307 | res.extend(collect_impl_items_in_macro(db, expander, m, id, limit)) | 285 | res.extend(collect_items_in_macro(db, expander, m, container, limit)) |
308 | } | 286 | } |
309 | 287 | ||
310 | res | 288 | res |
311 | } | 289 | } |
312 | 290 | ||
313 | fn collect_impl_items_in_macro( | 291 | fn collect_items_in_macro( |
314 | db: &dyn DefDatabase, | 292 | db: &dyn DefDatabase, |
315 | expander: &mut Expander, | 293 | expander: &mut Expander, |
316 | m: ast::MacroCall, | 294 | m: ast::MacroCall, |
317 | id: ImplId, | 295 | container: AssocContainerId, |
318 | limit: usize, | 296 | limit: usize, |
319 | ) -> Vec<AssocItemId> { | 297 | ) -> Vec<(Name, AssocItemId)> { |
320 | if limit == 0 { | 298 | if limit == 0 { |
321 | return Vec::new(); | 299 | return Vec::new(); |
322 | } | 300 | } |
323 | 301 | ||
324 | if let Some((mark, items)) = expander.enter_expand(db, None, m) { | 302 | if let Some((mark, items)) = expander.enter_expand(db, None, m) { |
325 | let items: InFile<ast::MacroItems> = expander.to_source(items); | 303 | let items: InFile<ast::MacroItems> = expander.to_source(items); |
326 | let mut res = collect_impl_items( | 304 | let mut res = collect_items( |
327 | db, | 305 | db, |
328 | expander, | 306 | expander, |
329 | items.value.items().filter_map(|it| ImplItem::cast(it.syntax().clone())), | 307 | items.value.items().filter_map(|it| AssocItem::cast(it.syntax().clone())), |
330 | items.file_id, | 308 | items.file_id, |
331 | id, | 309 | container, |
332 | ); | 310 | ); |
311 | |||
333 | // Recursive collect macros | 312 | // Recursive collect macros |
334 | // Note that ast::ModuleItem do not include ast::MacroCall | 313 | // Note that ast::ModuleItem do not include ast::MacroCall |
335 | // We cannot use ModuleItemOwner::items here | 314 | // We cannot use ModuleItemOwner::items here |
336 | for it in items.value.syntax().children().filter_map(ast::MacroCall::cast) { | 315 | for it in items.value.syntax().children().filter_map(ast::MacroCall::cast) { |
337 | res.extend(collect_impl_items_in_macro(db, expander, it, id, limit - 1)) | 316 | res.extend(collect_items_in_macro(db, expander, it, container, limit - 1)) |
338 | } | 317 | } |
339 | expander.exit(db, mark); | 318 | expander.exit(db, mark); |
340 | res | 319 | res |
@@ -343,44 +322,38 @@ fn collect_impl_items_in_macro( | |||
343 | } | 322 | } |
344 | } | 323 | } |
345 | 324 | ||
346 | fn collect_impl_items( | 325 | fn collect_items( |
347 | db: &dyn DefDatabase, | 326 | db: &dyn DefDatabase, |
348 | expander: &mut Expander, | 327 | expander: &mut Expander, |
349 | impl_items: impl Iterator<Item = ImplItem>, | 328 | assoc_items: impl Iterator<Item = AssocItem>, |
350 | file_id: crate::HirFileId, | 329 | file_id: crate::HirFileId, |
351 | id: ImplId, | 330 | container: AssocContainerId, |
352 | ) -> Vec<AssocItemId> { | 331 | ) -> Vec<(Name, AssocItemId)> { |
353 | let items = db.ast_id_map(file_id); | 332 | let items = db.ast_id_map(file_id); |
354 | 333 | ||
355 | impl_items | 334 | assoc_items |
356 | .filter_map(|item_node| match item_node { | 335 | .filter_map(|item_node| match item_node { |
357 | ast::ImplItem::FnDef(it) => { | 336 | ast::AssocItem::FnDef(it) => { |
358 | let attrs = expander.parse_attrs(&it); | 337 | let name = it.name().map_or_else(Name::missing, |it| it.as_name()); |
359 | if !expander.is_cfg_enabled(&attrs) { | 338 | if !expander.is_cfg_enabled(&it) { |
360 | return None; | 339 | return None; |
361 | } | 340 | } |
362 | let def = FunctionLoc { | 341 | let def = FunctionLoc { container, ast_id: AstId::new(file_id, items.ast_id(&it)) } |
363 | container: AssocContainerId::ImplId(id), | 342 | .intern(db); |
364 | ast_id: AstId::new(file_id, items.ast_id(&it)), | 343 | Some((name, def.into())) |
365 | } | ||
366 | .intern(db); | ||
367 | Some(def.into()) | ||
368 | } | 344 | } |
369 | ast::ImplItem::ConstDef(it) => { | 345 | ast::AssocItem::ConstDef(it) => { |
370 | let def = ConstLoc { | 346 | let name = it.name().map_or_else(Name::missing, |it| it.as_name()); |
371 | container: AssocContainerId::ImplId(id), | 347 | let def = ConstLoc { container, ast_id: AstId::new(file_id, items.ast_id(&it)) } |
372 | ast_id: AstId::new(file_id, items.ast_id(&it)), | 348 | .intern(db); |
373 | } | 349 | Some((name, def.into())) |
374 | .intern(db); | ||
375 | Some(def.into()) | ||
376 | } | 350 | } |
377 | ast::ImplItem::TypeAliasDef(it) => { | 351 | ast::AssocItem::TypeAliasDef(it) => { |
378 | let def = TypeAliasLoc { | 352 | let name = it.name().map_or_else(Name::missing, |it| it.as_name()); |
379 | container: AssocContainerId::ImplId(id), | 353 | let def = |
380 | ast_id: AstId::new(file_id, items.ast_id(&it)), | 354 | TypeAliasLoc { container, ast_id: AstId::new(file_id, items.ast_id(&it)) } |
381 | } | 355 | .intern(db); |
382 | .intern(db); | 356 | Some((name, def.into())) |
383 | Some(def.into()) | ||
384 | } | 357 | } |
385 | }) | 358 | }) |
386 | .collect() | 359 | .collect() |
diff --git a/crates/ra_hir_def/src/item_scope.rs b/crates/ra_hir_def/src/item_scope.rs index 259b9ff03..fc15948ad 100644 --- a/crates/ra_hir_def/src/item_scope.rs +++ b/crates/ra_hir_def/src/item_scope.rs | |||
@@ -151,13 +151,20 @@ impl ItemScope { | |||
151 | } | 151 | } |
152 | 152 | ||
153 | impl PerNs { | 153 | impl PerNs { |
154 | pub(crate) fn from_def(def: ModuleDefId, v: Visibility) -> PerNs { | 154 | pub(crate) fn from_def(def: ModuleDefId, v: Visibility, has_constructor: bool) -> PerNs { |
155 | match def { | 155 | match def { |
156 | ModuleDefId::ModuleId(_) => PerNs::types(def, v), | 156 | ModuleDefId::ModuleId(_) => PerNs::types(def, v), |
157 | ModuleDefId::FunctionId(_) => PerNs::values(def, v), | 157 | ModuleDefId::FunctionId(_) => PerNs::values(def, v), |
158 | ModuleDefId::AdtId(adt) => match adt { | 158 | ModuleDefId::AdtId(adt) => match adt { |
159 | AdtId::StructId(_) | AdtId::UnionId(_) => PerNs::both(def, def, v), | 159 | AdtId::UnionId(_) => PerNs::types(def, v), |
160 | AdtId::EnumId(_) => PerNs::types(def, v), | 160 | AdtId::EnumId(_) => PerNs::types(def, v), |
161 | AdtId::StructId(_) => { | ||
162 | if has_constructor { | ||
163 | PerNs::both(def, def, v) | ||
164 | } else { | ||
165 | PerNs::types(def, v) | ||
166 | } | ||
167 | } | ||
161 | }, | 168 | }, |
162 | ModuleDefId::EnumVariantId(_) => PerNs::both(def, def, v), | 169 | ModuleDefId::EnumVariantId(_) => PerNs::both(def, def, v), |
163 | ModuleDefId::ConstId(_) | ModuleDefId::StaticId(_) => PerNs::values(def, v), | 170 | ModuleDefId::ConstId(_) | ModuleDefId::StaticId(_) => PerNs::values(def, v), |
diff --git a/crates/ra_hir_def/src/nameres/collector.rs b/crates/ra_hir_def/src/nameres/collector.rs index bf3968bd6..db994122a 100644 --- a/crates/ra_hir_def/src/nameres/collector.rs +++ b/crates/ra_hir_def/src/nameres/collector.rs | |||
@@ -830,7 +830,7 @@ impl ModCollector<'_, '_> { | |||
830 | let module = ModuleId { krate: self.def_collector.def_map.krate, local_id: res }; | 830 | let module = ModuleId { krate: self.def_collector.def_map.krate, local_id: res }; |
831 | let def: ModuleDefId = module.into(); | 831 | let def: ModuleDefId = module.into(); |
832 | self.def_collector.def_map.modules[self.module_id].scope.define_def(def); | 832 | self.def_collector.def_map.modules[self.module_id].scope.define_def(def); |
833 | self.def_collector.update(self.module_id, &[(name, PerNs::from_def(def, vis))], vis); | 833 | self.def_collector.update(self.module_id, &[(name, PerNs::from_def(def, vis, false))], vis); |
834 | res | 834 | res |
835 | } | 835 | } |
836 | 836 | ||
@@ -844,6 +844,8 @@ impl ModCollector<'_, '_> { | |||
844 | let name = def.name.clone(); | 844 | let name = def.name.clone(); |
845 | let container = ContainerId::ModuleId(module); | 845 | let container = ContainerId::ModuleId(module); |
846 | let vis = &def.visibility; | 846 | let vis = &def.visibility; |
847 | let mut has_constructor = false; | ||
848 | |||
847 | let def: ModuleDefId = match def.kind { | 849 | let def: ModuleDefId = match def.kind { |
848 | raw::DefKind::Function(ast_id) => FunctionLoc { | 850 | raw::DefKind::Function(ast_id) => FunctionLoc { |
849 | container: container.into(), | 851 | container: container.into(), |
@@ -851,7 +853,8 @@ impl ModCollector<'_, '_> { | |||
851 | } | 853 | } |
852 | .intern(self.def_collector.db) | 854 | .intern(self.def_collector.db) |
853 | .into(), | 855 | .into(), |
854 | raw::DefKind::Struct(ast_id) => { | 856 | raw::DefKind::Struct(ast_id, mode) => { |
857 | has_constructor = mode != raw::StructDefKind::Record; | ||
855 | StructLoc { container, ast_id: AstId::new(self.file_id, ast_id) } | 858 | StructLoc { container, ast_id: AstId::new(self.file_id, ast_id) } |
856 | .intern(self.def_collector.db) | 859 | .intern(self.def_collector.db) |
857 | .into() | 860 | .into() |
@@ -894,7 +897,11 @@ impl ModCollector<'_, '_> { | |||
894 | .def_map | 897 | .def_map |
895 | .resolve_visibility(self.def_collector.db, self.module_id, vis) | 898 | .resolve_visibility(self.def_collector.db, self.module_id, vis) |
896 | .unwrap_or(Visibility::Public); | 899 | .unwrap_or(Visibility::Public); |
897 | self.def_collector.update(self.module_id, &[(name, PerNs::from_def(def, vis))], vis) | 900 | self.def_collector.update( |
901 | self.module_id, | ||
902 | &[(name, PerNs::from_def(def, vis, has_constructor))], | ||
903 | vis, | ||
904 | ) | ||
898 | } | 905 | } |
899 | 906 | ||
900 | fn collect_derives(&mut self, attrs: &Attrs, def: &raw::DefData) { | 907 | fn collect_derives(&mut self, attrs: &Attrs, def: &raw::DefData) { |
diff --git a/crates/ra_hir_def/src/nameres/raw.rs b/crates/ra_hir_def/src/nameres/raw.rs index a71503c76..f2716a295 100644 --- a/crates/ra_hir_def/src/nameres/raw.rs +++ b/crates/ra_hir_def/src/nameres/raw.rs | |||
@@ -156,9 +156,16 @@ pub(super) struct DefData { | |||
156 | } | 156 | } |
157 | 157 | ||
158 | #[derive(Debug, PartialEq, Eq, Clone, Copy)] | 158 | #[derive(Debug, PartialEq, Eq, Clone, Copy)] |
159 | pub(super) enum StructDefKind { | ||
160 | Record, | ||
161 | Tuple, | ||
162 | Unit, | ||
163 | } | ||
164 | |||
165 | #[derive(Debug, PartialEq, Eq, Clone, Copy)] | ||
159 | pub(super) enum DefKind { | 166 | pub(super) enum DefKind { |
160 | Function(FileAstId<ast::FnDef>), | 167 | Function(FileAstId<ast::FnDef>), |
161 | Struct(FileAstId<ast::StructDef>), | 168 | Struct(FileAstId<ast::StructDef>, StructDefKind), |
162 | Union(FileAstId<ast::UnionDef>), | 169 | Union(FileAstId<ast::UnionDef>), |
163 | Enum(FileAstId<ast::EnumDef>), | 170 | Enum(FileAstId<ast::EnumDef>), |
164 | Const(FileAstId<ast::ConstDef>), | 171 | Const(FileAstId<ast::ConstDef>), |
@@ -171,7 +178,7 @@ impl DefKind { | |||
171 | pub fn ast_id(&self) -> FileAstId<ast::ModuleItem> { | 178 | pub fn ast_id(&self) -> FileAstId<ast::ModuleItem> { |
172 | match self { | 179 | match self { |
173 | DefKind::Function(it) => it.upcast(), | 180 | DefKind::Function(it) => it.upcast(), |
174 | DefKind::Struct(it) => it.upcast(), | 181 | DefKind::Struct(it, _) => it.upcast(), |
175 | DefKind::Union(it) => it.upcast(), | 182 | DefKind::Union(it) => it.upcast(), |
176 | DefKind::Enum(it) => it.upcast(), | 183 | DefKind::Enum(it) => it.upcast(), |
177 | DefKind::Const(it) => it.upcast(), | 184 | DefKind::Const(it) => it.upcast(), |
@@ -236,9 +243,14 @@ impl RawItemsCollector { | |||
236 | return; | 243 | return; |
237 | } | 244 | } |
238 | ast::ModuleItem::StructDef(it) => { | 245 | ast::ModuleItem::StructDef(it) => { |
246 | let kind = match it.kind() { | ||
247 | ast::StructKind::Record(_) => StructDefKind::Record, | ||
248 | ast::StructKind::Tuple(_) => StructDefKind::Tuple, | ||
249 | ast::StructKind::Unit => StructDefKind::Unit, | ||
250 | }; | ||
239 | let id = self.source_ast_id_map.ast_id(&it); | 251 | let id = self.source_ast_id_map.ast_id(&it); |
240 | let name = it.name(); | 252 | let name = it.name(); |
241 | (DefKind::Struct(id), name) | 253 | (DefKind::Struct(id, kind), name) |
242 | } | 254 | } |
243 | ast::ModuleItem::UnionDef(it) => { | 255 | ast::ModuleItem::UnionDef(it) => { |
244 | let id = self.source_ast_id_map.ast_id(&it); | 256 | let id = self.source_ast_id_map.ast_id(&it); |
diff --git a/crates/ra_hir_def/src/nameres/tests.rs b/crates/ra_hir_def/src/nameres/tests.rs index 83120fa36..1b66c1aac 100644 --- a/crates/ra_hir_def/src/nameres/tests.rs +++ b/crates/ra_hir_def/src/nameres/tests.rs | |||
@@ -67,7 +67,7 @@ fn crate_def_map_smoke_test() { | |||
67 | ⋮Baz: t v | 67 | ⋮Baz: t v |
68 | ⋮E: t | 68 | ⋮E: t |
69 | ⋮EXT: v | 69 | ⋮EXT: v |
70 | ⋮U: t v | 70 | ⋮U: t |
71 | ⋮ext: v | 71 | ⋮ext: v |
72 | "###) | 72 | "###) |
73 | } | 73 | } |
diff --git a/crates/ra_hir_def/src/nameres/tests/macros.rs b/crates/ra_hir_def/src/nameres/tests/macros.rs index 9bc0e6287..40289e3ca 100644 --- a/crates/ra_hir_def/src/nameres/tests/macros.rs +++ b/crates/ra_hir_def/src/nameres/tests/macros.rs | |||
@@ -19,12 +19,12 @@ fn macro_rules_are_globally_visible() { | |||
19 | ); | 19 | ); |
20 | assert_snapshot!(map, @r###" | 20 | assert_snapshot!(map, @r###" |
21 | ⋮crate | 21 | ⋮crate |
22 | ⋮Foo: t v | 22 | ⋮Foo: t |
23 | ⋮nested: t | 23 | ⋮nested: t |
24 | ⋮ | 24 | ⋮ |
25 | ⋮crate::nested | 25 | ⋮crate::nested |
26 | ⋮Bar: t v | 26 | ⋮Bar: t |
27 | ⋮Baz: t v | 27 | ⋮Baz: t |
28 | "###); | 28 | "###); |
29 | } | 29 | } |
30 | 30 | ||
@@ -91,13 +91,13 @@ fn macro_rules_from_other_crates_are_visible() { | |||
91 | ); | 91 | ); |
92 | assert_snapshot!(map, @r###" | 92 | assert_snapshot!(map, @r###" |
93 | ⋮crate | 93 | ⋮crate |
94 | ⋮Bar: t v | 94 | ⋮Bar: t |
95 | ⋮Foo: t v | 95 | ⋮Foo: t |
96 | ⋮bar: t | 96 | ⋮bar: t |
97 | ⋮ | 97 | ⋮ |
98 | ⋮crate::bar | 98 | ⋮crate::bar |
99 | ⋮Bar: t v | 99 | ⋮Bar: t |
100 | ⋮Foo: t v | 100 | ⋮Foo: t |
101 | ⋮bar: t | 101 | ⋮bar: t |
102 | "###); | 102 | "###); |
103 | } | 103 | } |
@@ -124,13 +124,13 @@ fn macro_rules_export_with_local_inner_macros_are_visible() { | |||
124 | ); | 124 | ); |
125 | assert_snapshot!(map, @r###" | 125 | assert_snapshot!(map, @r###" |
126 | ⋮crate | 126 | ⋮crate |
127 | ⋮Bar: t v | 127 | ⋮Bar: t |
128 | ⋮Foo: t v | 128 | ⋮Foo: t |
129 | ⋮bar: t | 129 | ⋮bar: t |
130 | ⋮ | 130 | ⋮ |
131 | ⋮crate::bar | 131 | ⋮crate::bar |
132 | ⋮Bar: t v | 132 | ⋮Bar: t |
133 | ⋮Foo: t v | 133 | ⋮Foo: t |
134 | ⋮bar: t | 134 | ⋮bar: t |
135 | "###); | 135 | "###); |
136 | } | 136 | } |
@@ -161,13 +161,13 @@ fn local_inner_macros_makes_local_macros_usable() { | |||
161 | ); | 161 | ); |
162 | assert_snapshot!(map, @r###" | 162 | assert_snapshot!(map, @r###" |
163 | ⋮crate | 163 | ⋮crate |
164 | ⋮Bar: t v | 164 | ⋮Bar: t |
165 | ⋮Foo: t v | 165 | ⋮Foo: t |
166 | ⋮bar: t | 166 | ⋮bar: t |
167 | ⋮ | 167 | ⋮ |
168 | ⋮crate::bar | 168 | ⋮crate::bar |
169 | ⋮Bar: t v | 169 | ⋮Bar: t |
170 | ⋮Foo: t v | 170 | ⋮Foo: t |
171 | ⋮bar: t | 171 | ⋮bar: t |
172 | "###); | 172 | "###); |
173 | } | 173 | } |
@@ -204,7 +204,7 @@ fn unexpanded_macro_should_expand_by_fixedpoint_loop() { | |||
204 | ); | 204 | ); |
205 | assert_snapshot!(map, @r###" | 205 | assert_snapshot!(map, @r###" |
206 | ⋮crate | 206 | ⋮crate |
207 | ⋮Foo: t v | 207 | ⋮Foo: t |
208 | ⋮bar: m | 208 | ⋮bar: m |
209 | ⋮foo: m | 209 | ⋮foo: m |
210 | "###); | 210 | "###); |