mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-29 10:13:54 +00:00
Auto merge of #23028 - Munksgaard:get_attrs_opt, r=eddyb
This is more flexible and less error-prone. `get_attrs` and `get_attrs_opt` can be used on many more items than the old `get_attrs` could. This is all courtesy of @huonw, and directly taken from here: https://github.com/rust-lang/rust/pull/22348/files#diff-0f85fcb07fb739876892e633fa0e2be6R5575 Also thanks to @Manishearth for pointing it out to me.
This commit is contained in:
commit
698c1008d6
@ -5606,8 +5606,7 @@ pub fn predicates<'tcx>(
|
||||
pub fn get_attrs<'tcx>(tcx: &'tcx ctxt, did: DefId)
|
||||
-> Cow<'tcx, [ast::Attribute]> {
|
||||
if is_local(did) {
|
||||
let item = tcx.map.expect_item(did.node);
|
||||
Cow::Borrowed(&item.attrs)
|
||||
Cow::Borrowed(tcx.map.attrs(did.node))
|
||||
} else {
|
||||
Cow::Owned(csearch::get_item_attrs(&tcx.sess.cstore, did))
|
||||
}
|
||||
|
@ -457,35 +457,32 @@ impl<'ast> Map<'ast> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Given a node ID and a closure, apply the closure to the array
|
||||
/// of attributes associated with the AST corresponding to the Node ID
|
||||
pub fn with_attrs<T, F>(&self, id: NodeId, f: F) -> T where
|
||||
F: FnOnce(Option<&[Attribute]>) -> T,
|
||||
{
|
||||
let attrs = match self.get(id) {
|
||||
NodeItem(i) => Some(&i.attrs[..]),
|
||||
NodeForeignItem(fi) => Some(&fi.attrs[..]),
|
||||
NodeTraitItem(ref tm) => match **tm {
|
||||
/// Given a node ID, get a list of of attributes associated with the AST
|
||||
/// corresponding to the Node ID
|
||||
pub fn attrs(&self, id: NodeId) -> &[Attribute] {
|
||||
let attrs = match self.find(id) {
|
||||
Some(NodeItem(i)) => Some(&i.attrs[..]),
|
||||
Some(NodeForeignItem(fi)) => Some(&fi.attrs[..]),
|
||||
Some(NodeTraitItem(ref tm)) => match **tm {
|
||||
RequiredMethod(ref type_m) => Some(&type_m.attrs[..]),
|
||||
ProvidedMethod(ref m) => Some(&m.attrs[..]),
|
||||
TypeTraitItem(ref typ) => Some(&typ.attrs[..]),
|
||||
},
|
||||
NodeImplItem(ref ii) => {
|
||||
Some(NodeImplItem(ref ii)) => {
|
||||
match **ii {
|
||||
MethodImplItem(ref m) => Some(&m.attrs[..]),
|
||||
TypeImplItem(ref t) => Some(&t.attrs[..]),
|
||||
}
|
||||
}
|
||||
NodeVariant(ref v) => Some(&v.node.attrs[..]),
|
||||
Some(NodeVariant(ref v)) => Some(&v.node.attrs[..]),
|
||||
// unit/tuple structs take the attributes straight from
|
||||
// the struct definition.
|
||||
// FIXME(eddyb) make this work again (requires access to the map).
|
||||
NodeStructCtor(_) => {
|
||||
return self.with_attrs(self.get_parent(id), f);
|
||||
Some(NodeStructCtor(_)) => {
|
||||
return self.attrs(self.get_parent(id));
|
||||
}
|
||||
_ => None
|
||||
};
|
||||
f(attrs)
|
||||
attrs.unwrap_or(&[])
|
||||
}
|
||||
|
||||
/// Returns an iterator that yields the node id's with paths that
|
||||
|
Loading…
Reference in New Issue
Block a user