diff options
Diffstat (limited to 'crates/ra_hir_def/src/adt.rs')
-rw-r--r-- | crates/ra_hir_def/src/adt.rs | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/crates/ra_hir_def/src/adt.rs b/crates/ra_hir_def/src/adt.rs index 753becc3d..2bc34d449 100644 --- a/crates/ra_hir_def/src/adt.rs +++ b/crates/ra_hir_def/src/adt.rs | |||
@@ -12,9 +12,15 @@ use ra_prof::profile; | |||
12 | use ra_syntax::ast::{self, NameOwner, TypeAscriptionOwner, VisibilityOwner}; | 12 | use ra_syntax::ast::{self, NameOwner, TypeAscriptionOwner, VisibilityOwner}; |
13 | 13 | ||
14 | use crate::{ | 14 | use crate::{ |
15 | body::CfgExpander, db::DefDatabase, src::HasChildSource, src::HasSource, trace::Trace, | 15 | body::{CfgExpander, LowerCtx}, |
16 | type_ref::TypeRef, visibility::RawVisibility, EnumId, HasModule, LocalEnumVariantId, | 16 | db::DefDatabase, |
17 | LocalFieldId, Lookup, ModuleId, StructId, UnionId, VariantId, | 17 | src::HasChildSource, |
18 | src::HasSource, | ||
19 | trace::Trace, | ||
20 | type_ref::TypeRef, | ||
21 | visibility::RawVisibility, | ||
22 | EnumId, HasModule, LocalEnumVariantId, LocalFieldId, Lookup, ModuleId, StructId, UnionId, | ||
23 | VariantId, | ||
18 | }; | 24 | }; |
19 | 25 | ||
20 | /// Note that we use `StructData` for unions as well! | 26 | /// Note that we use `StructData` for unions as well! |
@@ -111,7 +117,14 @@ fn lower_enum( | |||
111 | ast: &InFile<ast::EnumDef>, | 117 | ast: &InFile<ast::EnumDef>, |
112 | module_id: ModuleId, | 118 | module_id: ModuleId, |
113 | ) { | 119 | ) { |
114 | 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 { | ||
115 | trace.alloc( | 128 | trace.alloc( |
116 | || var.clone(), | 129 | || var.clone(), |
117 | || EnumVariantData { | 130 | || EnumVariantData { |
@@ -198,11 +211,12 @@ fn lower_struct( | |||
198 | trace: &mut Trace<FieldData, Either<ast::TupleFieldDef, ast::RecordFieldDef>>, | 211 | trace: &mut Trace<FieldData, Either<ast::TupleFieldDef, ast::RecordFieldDef>>, |
199 | ast: &InFile<ast::StructKind>, | 212 | ast: &InFile<ast::StructKind>, |
200 | ) -> StructKind { | 213 | ) -> StructKind { |
214 | let ctx = LowerCtx::new(db, ast.file_id); | ||
215 | |||
201 | match &ast.value { | 216 | match &ast.value { |
202 | ast::StructKind::Tuple(fl) => { | 217 | ast::StructKind::Tuple(fl) => { |
203 | for (i, fd) in fl.fields().enumerate() { | 218 | for (i, fd) in fl.fields().enumerate() { |
204 | let attrs = expander.parse_attrs(&fd); | 219 | if !expander.is_cfg_enabled(&fd) { |
205 | if !expander.is_cfg_enabled(&attrs) { | ||
206 | continue; | 220 | continue; |
207 | } | 221 | } |
208 | 222 | ||
@@ -210,7 +224,7 @@ fn lower_struct( | |||
210 | || Either::Left(fd.clone()), | 224 | || Either::Left(fd.clone()), |
211 | || FieldData { | 225 | || FieldData { |
212 | name: Name::new_tuple_field(i), | 226 | name: Name::new_tuple_field(i), |
213 | type_ref: TypeRef::from_ast_opt(fd.type_ref()), | 227 | type_ref: TypeRef::from_ast_opt(&ctx, fd.type_ref()), |
214 | visibility: RawVisibility::from_ast(db, ast.with_value(fd.visibility())), | 228 | visibility: RawVisibility::from_ast(db, ast.with_value(fd.visibility())), |
215 | }, | 229 | }, |
216 | ); | 230 | ); |
@@ -219,8 +233,7 @@ fn lower_struct( | |||
219 | } | 233 | } |
220 | ast::StructKind::Record(fl) => { | 234 | ast::StructKind::Record(fl) => { |
221 | for fd in fl.fields() { | 235 | for fd in fl.fields() { |
222 | let attrs = expander.parse_attrs(&fd); | 236 | if !expander.is_cfg_enabled(&fd) { |
223 | if !expander.is_cfg_enabled(&attrs) { | ||
224 | continue; | 237 | continue; |
225 | } | 238 | } |
226 | 239 | ||
@@ -228,7 +241,7 @@ fn lower_struct( | |||
228 | || Either::Right(fd.clone()), | 241 | || Either::Right(fd.clone()), |
229 | || FieldData { | 242 | || FieldData { |
230 | name: fd.name().map(|n| n.as_name()).unwrap_or_else(Name::missing), | 243 | name: fd.name().map(|n| n.as_name()).unwrap_or_else(Name::missing), |
231 | type_ref: TypeRef::from_ast_opt(fd.ascribed_type()), | 244 | type_ref: TypeRef::from_ast_opt(&ctx, fd.ascribed_type()), |
232 | visibility: RawVisibility::from_ast(db, ast.with_value(fd.visibility())), | 245 | visibility: RawVisibility::from_ast(db, ast.with_value(fd.visibility())), |
233 | }, | 246 | }, |
234 | ); | 247 | ); |