mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
internal: Use itemtree for variant and field attribute collection
This commit is contained in:
parent
10c7ee7068
commit
1aadd9da92
@ -136,9 +136,9 @@ impl EnumData {
|
|||||||
|
|
||||||
let enum_ = &item_tree[loc.id.value];
|
let enum_ = &item_tree[loc.id.value];
|
||||||
let mut variants = Arena::new();
|
let mut variants = Arena::new();
|
||||||
for var_id in enum_.variants.clone() {
|
for tree_id in enum_.variants.clone() {
|
||||||
if item_tree.attrs(db, krate, var_id.into()).is_cfg_enabled(&cfg_options) {
|
if item_tree.attrs(db, krate, tree_id.into()).is_cfg_enabled(&cfg_options) {
|
||||||
let var = &item_tree[var_id];
|
let var = &item_tree[tree_id];
|
||||||
let var_data = lower_fields(
|
let var_data = lower_fields(
|
||||||
db,
|
db,
|
||||||
krate,
|
krate,
|
||||||
|
@ -7,7 +7,7 @@ use cfg::{CfgExpr, CfgOptions};
|
|||||||
use either::Either;
|
use either::Either;
|
||||||
use hir_expand::{hygiene::Hygiene, name::AsName, HirFileId, InFile};
|
use hir_expand::{hygiene::Hygiene, name::AsName, HirFileId, InFile};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use la_arena::ArenaMap;
|
use la_arena::{ArenaMap, Idx, RawIdx};
|
||||||
use mbe::{syntax_node_to_token_tree, DelimiterKind, Punct};
|
use mbe::{syntax_node_to_token_tree, DelimiterKind, Punct};
|
||||||
use smallvec::{smallvec, SmallVec};
|
use smallvec::{smallvec, SmallVec};
|
||||||
use syntax::{
|
use syntax::{
|
||||||
@ -19,12 +19,12 @@ use tt::Subtree;
|
|||||||
use crate::{
|
use crate::{
|
||||||
db::DefDatabase,
|
db::DefDatabase,
|
||||||
intern::Interned,
|
intern::Interned,
|
||||||
item_tree::{ItemTreeId, ItemTreeNode},
|
item_tree::{Fields, ItemTreeId, ItemTreeNode},
|
||||||
nameres::ModuleSource,
|
nameres::ModuleSource,
|
||||||
path::{ModPath, PathKind},
|
path::{ModPath, PathKind},
|
||||||
src::{HasChildSource, HasSource},
|
src::{HasChildSource, HasSource},
|
||||||
AdtId, AttrDefId, EnumId, GenericParamId, HasModule, LocalEnumVariantId, LocalFieldId, Lookup,
|
AdtId, AttrDefId, EnumId, GenericParamId, LocalEnumVariantId, LocalFieldId, Lookup, MacroId,
|
||||||
MacroId, VariantId,
|
VariantId,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Holds documentation
|
/// Holds documentation
|
||||||
@ -201,15 +201,22 @@ impl Attrs {
|
|||||||
db: &dyn DefDatabase,
|
db: &dyn DefDatabase,
|
||||||
e: EnumId,
|
e: EnumId,
|
||||||
) -> Arc<ArenaMap<LocalEnumVariantId, Attrs>> {
|
) -> Arc<ArenaMap<LocalEnumVariantId, Attrs>> {
|
||||||
let krate = e.lookup(db).container.krate;
|
|
||||||
let src = e.child_source(db);
|
|
||||||
let mut res = ArenaMap::default();
|
let mut res = ArenaMap::default();
|
||||||
|
|
||||||
for (id, var) in src.value.iter() {
|
let loc = e.lookup(db);
|
||||||
let attrs = RawAttrs::from_attrs_owner(db, src.with_value(var as &dyn ast::HasAttrs))
|
let krate = loc.container.krate;
|
||||||
.filter(db, krate);
|
let item_tree = loc.id.item_tree(db);
|
||||||
|
let enum_ = &item_tree[loc.id.value];
|
||||||
|
let crate_graph = db.crate_graph();
|
||||||
|
let cfg_options = &crate_graph[krate].cfg_options;
|
||||||
|
|
||||||
res.insert(id, attrs)
|
let mut idx = 0;
|
||||||
|
for variant in enum_.variants.clone() {
|
||||||
|
let attrs = item_tree.attrs(db, krate, variant.into());
|
||||||
|
if attrs.is_cfg_enabled(cfg_options) {
|
||||||
|
res.insert(Idx::from_raw(RawIdx::from(idx)), attrs);
|
||||||
|
idx += 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Arc::new(res)
|
Arc::new(res)
|
||||||
@ -219,18 +226,63 @@ impl Attrs {
|
|||||||
db: &dyn DefDatabase,
|
db: &dyn DefDatabase,
|
||||||
v: VariantId,
|
v: VariantId,
|
||||||
) -> Arc<ArenaMap<LocalFieldId, Attrs>> {
|
) -> Arc<ArenaMap<LocalFieldId, Attrs>> {
|
||||||
let krate = v.module(db).krate;
|
|
||||||
let src = v.child_source(db);
|
|
||||||
let mut res = ArenaMap::default();
|
let mut res = ArenaMap::default();
|
||||||
|
|
||||||
for (id, fld) in src.value.iter() {
|
let crate_graph = db.crate_graph();
|
||||||
let owner: &dyn HasAttrs = match fld {
|
let (fields, item_tree, krate) = match v {
|
||||||
Either::Left(tuple) => tuple,
|
VariantId::EnumVariantId(it) => {
|
||||||
Either::Right(record) => record,
|
let e = it.parent;
|
||||||
};
|
let loc = e.lookup(db);
|
||||||
let attrs = RawAttrs::from_attrs_owner(db, src.with_value(owner)).filter(db, krate);
|
let krate = loc.container.krate;
|
||||||
|
let item_tree = loc.id.item_tree(db);
|
||||||
|
let enum_ = &item_tree[loc.id.value];
|
||||||
|
|
||||||
res.insert(id, attrs);
|
let cfg_options = &crate_graph[krate].cfg_options;
|
||||||
|
let variant = 'tri: loop {
|
||||||
|
let mut idx = 0;
|
||||||
|
for variant in enum_.variants.clone() {
|
||||||
|
let attrs = item_tree.attrs(db, krate, variant.into());
|
||||||
|
if attrs.is_cfg_enabled(cfg_options) {
|
||||||
|
if it.local_id == Idx::from_raw(RawIdx::from(idx)) {
|
||||||
|
break 'tri variant;
|
||||||
|
}
|
||||||
|
idx += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Arc::new(res);
|
||||||
|
};
|
||||||
|
(item_tree[variant].fields.clone(), item_tree, krate)
|
||||||
|
}
|
||||||
|
VariantId::StructId(it) => {
|
||||||
|
let loc = it.lookup(db);
|
||||||
|
let krate = loc.container.krate;
|
||||||
|
let item_tree = loc.id.item_tree(db);
|
||||||
|
let struct_ = &item_tree[loc.id.value];
|
||||||
|
(struct_.fields.clone(), item_tree, krate)
|
||||||
|
}
|
||||||
|
VariantId::UnionId(it) => {
|
||||||
|
let loc = it.lookup(db);
|
||||||
|
let krate = loc.container.krate;
|
||||||
|
let item_tree = loc.id.item_tree(db);
|
||||||
|
let union_ = &item_tree[loc.id.value];
|
||||||
|
(union_.fields.clone(), item_tree, krate)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let fields = match fields {
|
||||||
|
Fields::Record(fields) | Fields::Tuple(fields) => fields,
|
||||||
|
Fields::Unit => return Arc::new(res),
|
||||||
|
};
|
||||||
|
|
||||||
|
let cfg_options = &crate_graph[krate].cfg_options;
|
||||||
|
|
||||||
|
let mut idx = 0;
|
||||||
|
for field in fields {
|
||||||
|
let attrs = item_tree.attrs(db, krate, field.into());
|
||||||
|
if attrs.is_cfg_enabled(cfg_options) {
|
||||||
|
res.insert(Idx::from_raw(RawIdx::from(idx)), attrs);
|
||||||
|
idx += 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Arc::new(res)
|
Arc::new(res)
|
||||||
|
Loading…
Reference in New Issue
Block a user