diff options
Diffstat (limited to 'crates/hir_def/src/item_tree')
-rw-r--r-- | crates/hir_def/src/item_tree/lower.rs | 17 | ||||
-rw-r--r-- | crates/hir_def/src/item_tree/pretty.rs | 2 | ||||
-rw-r--r-- | crates/hir_def/src/item_tree/tests.rs | 38 |
3 files changed, 48 insertions, 9 deletions
diff --git a/crates/hir_def/src/item_tree/lower.rs b/crates/hir_def/src/item_tree/lower.rs index 6208facd5..3f90bda74 100644 --- a/crates/hir_def/src/item_tree/lower.rs +++ b/crates/hir_def/src/item_tree/lower.rs | |||
@@ -130,7 +130,7 @@ impl<'a> Ctx<'a> { | |||
130 | ast::Item::ExternBlock(ast) => self.lower_extern_block(ast).into(), | 130 | ast::Item::ExternBlock(ast) => self.lower_extern_block(ast).into(), |
131 | }; | 131 | }; |
132 | 132 | ||
133 | self.add_attrs(item.into(), attrs.clone()); | 133 | self.add_attrs(item.into(), attrs); |
134 | 134 | ||
135 | Some(item) | 135 | Some(item) |
136 | } | 136 | } |
@@ -276,10 +276,11 @@ impl<'a> Ctx<'a> { | |||
276 | let visibility = self.lower_visibility(enum_); | 276 | let visibility = self.lower_visibility(enum_); |
277 | let name = enum_.name()?.as_name(); | 277 | let name = enum_.name()?.as_name(); |
278 | let generic_params = self.lower_generic_params(GenericsOwner::Enum, enum_); | 278 | let generic_params = self.lower_generic_params(GenericsOwner::Enum, enum_); |
279 | let variants = match &enum_.variant_list() { | 279 | let variants = |
280 | Some(variant_list) => self.lower_variants(variant_list), | 280 | self.with_inherited_visibility(visibility, |this| match &enum_.variant_list() { |
281 | None => IdRange::new(self.next_variant_idx()..self.next_variant_idx()), | 281 | Some(variant_list) => this.lower_variants(variant_list), |
282 | }; | 282 | None => IdRange::new(this.next_variant_idx()..this.next_variant_idx()), |
283 | }); | ||
283 | let ast_id = self.source_ast_id_map.ast_id(enum_); | 284 | let ast_id = self.source_ast_id_map.ast_id(enum_); |
284 | let res = Enum { name, visibility, generic_params, variants, ast_id }; | 285 | let res = Enum { name, visibility, generic_params, variants, ast_id }; |
285 | Some(id(self.data().enums.alloc(res))) | 286 | Some(id(self.data().enums.alloc(res))) |
@@ -822,7 +823,7 @@ fn is_intrinsic_fn_unsafe(name: &Name) -> bool { | |||
822 | known::type_name, | 823 | known::type_name, |
823 | known::variant_count, | 824 | known::variant_count, |
824 | ] | 825 | ] |
825 | .contains(&name) | 826 | .contains(name) |
826 | } | 827 | } |
827 | 828 | ||
828 | fn lower_abi(abi: ast::Abi) -> Interned<str> { | 829 | fn lower_abi(abi: ast::Abi) -> Interned<str> { |
@@ -854,7 +855,7 @@ impl UseTreeLowering<'_> { | |||
854 | // E.g. `use something::{inner}` (prefix is `None`, path is `something`) | 855 | // E.g. `use something::{inner}` (prefix is `None`, path is `something`) |
855 | // or `use something::{path::{inner::{innerer}}}` (prefix is `something::path`, path is `inner`) | 856 | // or `use something::{path::{inner::{innerer}}}` (prefix is `something::path`, path is `inner`) |
856 | Some(path) => { | 857 | Some(path) => { |
857 | match ModPath::from_src(self.db, path, &self.hygiene) { | 858 | match ModPath::from_src(self.db, path, self.hygiene) { |
858 | Some(it) => Some(it), | 859 | Some(it) => Some(it), |
859 | None => return None, // FIXME: report errors somewhere | 860 | None => return None, // FIXME: report errors somewhere |
860 | } | 861 | } |
@@ -873,7 +874,7 @@ impl UseTreeLowering<'_> { | |||
873 | } else { | 874 | } else { |
874 | let is_glob = tree.star_token().is_some(); | 875 | let is_glob = tree.star_token().is_some(); |
875 | let path = match tree.path() { | 876 | let path = match tree.path() { |
876 | Some(path) => Some(ModPath::from_src(self.db, path, &self.hygiene)?), | 877 | Some(path) => Some(ModPath::from_src(self.db, path, self.hygiene)?), |
877 | None => None, | 878 | None => None, |
878 | }; | 879 | }; |
879 | let alias = tree.rename().map(|a| { | 880 | let alias = tree.rename().map(|a| { |
diff --git a/crates/hir_def/src/item_tree/pretty.rs b/crates/hir_def/src/item_tree/pretty.rs index cc9944a22..b1e1b70d0 100644 --- a/crates/hir_def/src/item_tree/pretty.rs +++ b/crates/hir_def/src/item_tree/pretty.rs | |||
@@ -426,7 +426,7 @@ impl<'a> Printer<'a> { | |||
426 | w!(self, " {{"); | 426 | w!(self, " {{"); |
427 | self.indented(|this| { | 427 | self.indented(|this| { |
428 | for item in &**items { | 428 | for item in &**items { |
429 | this.print_mod_item((*item).into()); | 429 | this.print_mod_item(*item); |
430 | } | 430 | } |
431 | }); | 431 | }); |
432 | wln!(self, "}}"); | 432 | wln!(self, "}}"); |
diff --git a/crates/hir_def/src/item_tree/tests.rs b/crates/hir_def/src/item_tree/tests.rs index b362add5c..57686dc6e 100644 --- a/crates/hir_def/src/item_tree/tests.rs +++ b/crates/hir_def/src/item_tree/tests.rs | |||
@@ -359,3 +359,41 @@ trait Tr<'a, T: 'a>: Super {} | |||
359 | "#]], | 359 | "#]], |
360 | ) | 360 | ) |
361 | } | 361 | } |
362 | |||
363 | #[test] | ||
364 | fn inherit_visibility() { | ||
365 | check( | ||
366 | r#" | ||
367 | pub(crate) enum En { | ||
368 | Var1(u8), | ||
369 | Var2 { | ||
370 | fld: u8, | ||
371 | }, | ||
372 | } | ||
373 | |||
374 | pub(crate) trait Tr { | ||
375 | fn f(); | ||
376 | fn method(&self) {} | ||
377 | } | ||
378 | "#, | ||
379 | expect![[r#" | ||
380 | pub(crate) enum En { | ||
381 | Var1( | ||
382 | pub(crate) 0: u8, | ||
383 | ), | ||
384 | Var2 { | ||
385 | pub(crate) fld: u8, | ||
386 | }, | ||
387 | } | ||
388 | |||
389 | pub(crate) trait Tr<Self> { | ||
390 | pub(crate) fn f() -> (); | ||
391 | |||
392 | // flags = 0x3 | ||
393 | pub(crate) fn method( | ||
394 | _: &Self, | ||
395 | ) -> (); | ||
396 | } | ||
397 | "#]], | ||
398 | ) | ||
399 | } | ||