diff options
| author | Jana Dönszelmann <jana@donsz.nl> | 2025-02-09 22:50:08 +0100 |
|---|---|---|
| committer | Jana Dönszelmann <jana@donsz.nl> | 2025-02-24 14:31:19 +0100 |
| commit | d8ea2a230f2a0aa77a544bc609baf6a3caab060e (patch) | |
| tree | dbc8057393a0d60addc98a5ed586d20c31280e9f /compiler | |
| parent | 95b52d51eac77be1fcc624c2278dcaafa6989b0b (diff) | |
| download | rust-d8ea2a230f2a0aa77a544bc609baf6a3caab060e.tar.gz rust-d8ea2a230f2a0aa77a544bc609baf6a3caab060e.zip | |
change smir attributes getters to only support tool attributes
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_smir/src/rustc_smir/context.rs | 39 | ||||
| -rw-r--r-- | compiler/stable_mir/src/compiler_interface.rs | 13 | ||||
| -rw-r--r-- | compiler/stable_mir/src/crate_def.rs | 17 |
3 files changed, 43 insertions, 26 deletions
diff --git a/compiler/rustc_smir/src/rustc_smir/context.rs b/compiler/rustc_smir/src/rustc_smir/context.rs index 8202fc81aca..acd3b758351 100644 --- a/compiler/rustc_smir/src/rustc_smir/context.rs +++ b/compiler/rustc_smir/src/rustc_smir/context.rs @@ -9,7 +9,7 @@ use std::cell::RefCell; use std::iter; use rustc_abi::HasDataLayout; -use rustc_hir::LangItem; +use rustc_hir::{Attribute, LangItem}; use rustc_middle::ty::layout::{ FnAbiOf, FnAbiOfHelpers, HasTyCtxt, HasTypingEnv, LayoutOf, LayoutOfHelpers, }; @@ -243,7 +243,7 @@ impl<'tcx> Context for TablesWrapper<'tcx> { } } - fn get_attrs_by_path( + fn tool_attrs( &self, def_id: stable_mir::DefId, attr: &[stable_mir::Symbol], @@ -253,29 +253,40 @@ impl<'tcx> Context for TablesWrapper<'tcx> { let did = tables[def_id]; let attr_name: Vec<_> = attr.iter().map(|seg| rustc_span::Symbol::intern(&seg)).collect(); tcx.get_attrs_by_path(did, &attr_name) - .map(|attribute| { - let attr_str = rustc_hir_pretty::attribute_to_string(&tcx, attribute); - let span = attribute.span(); - stable_mir::crate_def::Attribute::new(attr_str, span.stable(&mut *tables)) + .filter_map(|attribute| { + if let Attribute::Unparsed(u) = attribute { + let attr_str = rustc_hir_pretty::attribute_to_string(&tcx, attribute); + Some(stable_mir::crate_def::Attribute::new( + attr_str, + u.span.stable(&mut *tables), + )) + } else { + None + } }) .collect() } - fn get_all_attrs(&self, def_id: stable_mir::DefId) -> Vec<stable_mir::crate_def::Attribute> { + fn all_tool_attrs(&self, def_id: stable_mir::DefId) -> Vec<stable_mir::crate_def::Attribute> { let mut tables = self.0.borrow_mut(); let tcx = tables.tcx; let did = tables[def_id]; - let filter_fn = move |a: &&rustc_hir::Attribute| !a.is_doc_comment(); let attrs_iter = if let Some(did) = did.as_local() { - tcx.hir().attrs(tcx.local_def_id_to_hir_id(did)).iter().filter(filter_fn) + tcx.hir().attrs(tcx.local_def_id_to_hir_id(did)).iter() } else { - tcx.attrs_for_def(did).iter().filter(filter_fn) + tcx.attrs_for_def(did).iter() }; attrs_iter - .map(|attribute| { - let attr_str = rustc_hir_pretty::attribute_to_string(&tcx, attribute); - let span = attribute.span(); - stable_mir::crate_def::Attribute::new(attr_str, span.stable(&mut *tables)) + .filter_map(|attribute| { + if let Attribute::Unparsed(u) = attribute { + let attr_str = rustc_hir_pretty::attribute_to_string(&tcx, attribute); + Some(stable_mir::crate_def::Attribute::new( + attr_str, + u.span.stable(&mut *tables), + )) + } else { + None + } }) .collect() } diff --git a/compiler/stable_mir/src/compiler_interface.rs b/compiler/stable_mir/src/compiler_interface.rs index a6f7c254583..e82c957c34e 100644 --- a/compiler/stable_mir/src/compiler_interface.rs +++ b/compiler/stable_mir/src/compiler_interface.rs @@ -62,14 +62,17 @@ pub trait Context { /// Returns the name of given `DefId` fn def_name(&self, def_id: DefId, trimmed: bool) -> Symbol; - /// Return attributes with the given attribute name. + /// Return registered tool attributes with the given attribute name. /// - /// Single segmented name like `#[inline]` is specified as `&["inline".to_string()]`. + /// FIXME(jdonszelmann): may panic on non-tool attributes. After more attribute work, non-tool + /// attributes will simply return an empty list. + /// + /// Single segmented name like `#[clippy]` is specified as `&["clippy".to_string()]`. /// Multi-segmented name like `#[rustfmt::skip]` is specified as `&["rustfmt".to_string(), "skip".to_string()]`. - fn get_attrs_by_path(&self, def_id: DefId, attr: &[Symbol]) -> Vec<Attribute>; + fn tool_attrs(&self, def_id: DefId, attr: &[Symbol]) -> Vec<Attribute>; - /// Get all attributes of a definition. - fn get_all_attrs(&self, def_id: DefId) -> Vec<Attribute>; + /// Get all tool attributes of a definition. + fn all_tool_attrs(&self, def_id: DefId) -> Vec<Attribute>; /// Returns printable, human readable form of `Span` fn span_to_string(&self, span: Span) -> String; diff --git a/compiler/stable_mir/src/crate_def.rs b/compiler/stable_mir/src/crate_def.rs index cf29176dbbd..8c6fd99f98a 100644 --- a/compiler/stable_mir/src/crate_def.rs +++ b/compiler/stable_mir/src/crate_def.rs @@ -53,19 +53,22 @@ pub trait CrateDef { with(|cx| cx.span_of_an_item(def_id)) } - /// Return attributes with the given attribute name. + /// Return registered tool attributes with the given attribute name. /// - /// Single segmented name like `#[inline]` is specified as `&["inline".to_string()]`. + /// FIXME(jdonszelmann): may panic on non-tool attributes. After more attribute work, non-tool + /// attributes will simply return an empty list. + /// + /// Single segmented name like `#[clippy]` is specified as `&["clippy".to_string()]`. /// Multi-segmented name like `#[rustfmt::skip]` is specified as `&["rustfmt".to_string(), "skip".to_string()]`. - fn attrs_by_path(&self, attr: &[Symbol]) -> Vec<Attribute> { + fn tool_attrs(&self, attr: &[Symbol]) -> Vec<Attribute> { let def_id = self.def_id(); - with(|cx| cx.get_attrs_by_path(def_id, attr)) + with(|cx| cx.tool_attrs(def_id, attr)) } - /// Return all attributes of this definition. - fn all_attrs(&self) -> Vec<Attribute> { + /// Return all tool attributes of this definition. + fn all_tool_attrs(&self) -> Vec<Attribute> { let def_id = self.def_id(); - with(|cx| cx.get_all_attrs(def_id)) + with(|cx| cx.all_tool_attrs(def_id)) } } |
