@@ -7,7 +7,7 @@ use cfg::{CfgExpr, CfgOptions};
7
7
use either:: Either ;
8
8
use hir_expand:: { hygiene:: Hygiene , name:: AsName , HirFileId , InFile } ;
9
9
use itertools:: Itertools ;
10
- use la_arena:: ArenaMap ;
10
+ use la_arena:: { ArenaMap , Idx , RawIdx } ;
11
11
use mbe:: { syntax_node_to_token_tree, DelimiterKind , Punct } ;
12
12
use smallvec:: { smallvec, SmallVec } ;
13
13
use syntax:: {
@@ -19,12 +19,12 @@ use tt::Subtree;
19
19
use crate :: {
20
20
db:: DefDatabase ,
21
21
intern:: Interned ,
22
- item_tree:: { ItemTreeId , ItemTreeNode } ,
22
+ item_tree:: { Fields , ItemTreeId , ItemTreeNode } ,
23
23
nameres:: ModuleSource ,
24
24
path:: { ModPath , PathKind } ,
25
25
src:: { HasChildSource , HasSource } ,
26
- AdtId , AttrDefId , EnumId , GenericParamId , HasModule , LocalEnumVariantId , LocalFieldId , Lookup ,
27
- MacroId , VariantId ,
26
+ AdtId , AttrDefId , EnumId , GenericParamId , LocalEnumVariantId , LocalFieldId , Lookup , MacroId ,
27
+ VariantId ,
28
28
} ;
29
29
30
30
/// Holds documentation
@@ -201,15 +201,22 @@ impl Attrs {
201
201
db : & dyn DefDatabase ,
202
202
e : EnumId ,
203
203
) -> Arc < ArenaMap < LocalEnumVariantId , Attrs > > {
204
- let krate = e. lookup ( db) . container . krate ;
205
- let src = e. child_source ( db) ;
206
204
let mut res = ArenaMap :: default ( ) ;
207
205
208
- for ( id, var) in src. value . iter ( ) {
209
- let attrs = RawAttrs :: from_attrs_owner ( db, src. with_value ( var as & dyn ast:: HasAttrs ) )
210
- . filter ( db, krate) ;
211
-
212
- res. insert ( id, attrs)
206
+ let loc = e. lookup ( db) ;
207
+ let krate = loc. container . krate ;
208
+ let item_tree = loc. id . item_tree ( db) ;
209
+ let enum_ = & item_tree[ loc. id . value ] ;
210
+ let crate_graph = db. crate_graph ( ) ;
211
+ let cfg_options = & crate_graph[ krate] . cfg_options ;
212
+
213
+ let mut idx = 0 ;
214
+ for variant in enum_. variants . clone ( ) {
215
+ let attrs = item_tree. attrs ( db, krate, variant. into ( ) ) ;
216
+ if attrs. is_cfg_enabled ( cfg_options) {
217
+ res. insert ( Idx :: from_raw ( RawIdx :: from ( idx) ) , attrs) ;
218
+ idx += 1 ;
219
+ }
213
220
}
214
221
215
222
Arc :: new ( res)
@@ -219,18 +226,63 @@ impl Attrs {
219
226
db : & dyn DefDatabase ,
220
227
v : VariantId ,
221
228
) -> Arc < ArenaMap < LocalFieldId , Attrs > > {
222
- let krate = v. module ( db) . krate ;
223
- let src = v. child_source ( db) ;
224
229
let mut res = ArenaMap :: default ( ) ;
225
230
226
- for ( id, fld) in src. value . iter ( ) {
227
- let owner: & dyn HasAttrs = match fld {
228
- Either :: Left ( tuple) => tuple,
229
- Either :: Right ( record) => record,
230
- } ;
231
- let attrs = RawAttrs :: from_attrs_owner ( db, src. with_value ( owner) ) . filter ( db, krate) ;
231
+ let crate_graph = db. crate_graph ( ) ;
232
+ let ( fields, item_tree, krate) = match v {
233
+ VariantId :: EnumVariantId ( it) => {
234
+ let e = it. parent ;
235
+ let loc = e. lookup ( db) ;
236
+ let krate = loc. container . krate ;
237
+ let item_tree = loc. id . item_tree ( db) ;
238
+ let enum_ = & item_tree[ loc. id . value ] ;
239
+
240
+ let cfg_options = & crate_graph[ krate] . cfg_options ;
241
+ let variant = ' tri: loop {
242
+ let mut idx = 0 ;
243
+ for variant in enum_. variants . clone ( ) {
244
+ let attrs = item_tree. attrs ( db, krate, variant. into ( ) ) ;
245
+ if attrs. is_cfg_enabled ( cfg_options) {
246
+ if it. local_id == Idx :: from_raw ( RawIdx :: from ( idx) ) {
247
+ break ' tri variant;
248
+ }
249
+ idx += 1 ;
250
+ }
251
+ }
252
+ return Arc :: new ( res) ;
253
+ } ;
254
+ ( item_tree[ variant] . fields . clone ( ) , item_tree, krate)
255
+ }
256
+ VariantId :: StructId ( it) => {
257
+ let loc = it. lookup ( db) ;
258
+ let krate = loc. container . krate ;
259
+ let item_tree = loc. id . item_tree ( db) ;
260
+ let struct_ = & item_tree[ loc. id . value ] ;
261
+ ( struct_. fields . clone ( ) , item_tree, krate)
262
+ }
263
+ VariantId :: UnionId ( it) => {
264
+ let loc = it. lookup ( db) ;
265
+ let krate = loc. container . krate ;
266
+ let item_tree = loc. id . item_tree ( db) ;
267
+ let union_ = & item_tree[ loc. id . value ] ;
268
+ ( union_. fields . clone ( ) , item_tree, krate)
269
+ }
270
+ } ;
232
271
233
- res. insert ( id, attrs) ;
272
+ let fields = match fields {
273
+ Fields :: Record ( fields) | Fields :: Tuple ( fields) => fields,
274
+ Fields :: Unit => return Arc :: new ( res) ,
275
+ } ;
276
+
277
+ let cfg_options = & crate_graph[ krate] . cfg_options ;
278
+
279
+ let mut idx = 0 ;
280
+ for field in fields {
281
+ let attrs = item_tree. attrs ( db, krate, field. into ( ) ) ;
282
+ if attrs. is_cfg_enabled ( cfg_options) {
283
+ res. insert ( Idx :: from_raw ( RawIdx :: from ( idx) ) , attrs) ;
284
+ idx += 1 ;
285
+ }
234
286
}
235
287
236
288
Arc :: new ( res)
0 commit comments