11511: internal: Wrap MacroCallKind::Attr attr_args field in an Arc r=Veykril a=Veykril

This is stored in `MacroCallLoc` which is returned from a query, so cloning should be made cheap.
bors r+

Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
This commit is contained in:
bors[bot] 2022-02-20 21:54:12 +00:00 committed by GitHub
commit e534702e3a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 7 deletions

View file

@ -787,7 +787,7 @@ fn attr_macro_as_call_id(
MacroCallKind::Attr {
ast_id: item_attr.ast_id,
attr_name: last_segment.to_string().into_boxed_str(),
attr_args: arg,
attr_args: Arc::new(arg),
invoc_attr_index: macro_attr.id.ast_index,
},
);

View file

@ -135,7 +135,7 @@ pub enum MacroCallKind {
Attr {
ast_id: AstId<ast::Item>,
attr_name: Box<str>,
attr_args: (tt::Subtree, mbe::TokenMap),
attr_args: Arc<(tt::Subtree, mbe::TokenMap)>,
/// Syntactical index of the invoking `#[attribute]`.
///
/// Outer attributes are counted first, then inner attributes. This does not support
@ -472,7 +472,7 @@ impl ExpansionInfo {
let token_range = token.value.text_range();
match &loc.kind {
MacroCallKind::Attr { attr_args: (_, map), invoc_attr_index, .. } => {
MacroCallKind::Attr { attr_args, invoc_attr_index, .. } => {
let attr = item
.doc_comments_and_attrs()
.nth(*invoc_attr_index as usize)
@ -486,8 +486,9 @@ impl ExpansionInfo {
let relative_range =
token.value.text_range().checked_sub(attr_input_start)?;
// shift by the item's tree's max id
let token_id =
self.macro_arg_shift.shift(map.token_by_range(relative_range)?);
let token_id = self
.macro_arg_shift
.shift(attr_args.1.token_by_range(relative_range)?);
Some(token_id)
}
_ => None,
@ -535,13 +536,13 @@ impl ExpansionInfo {
// Attributes are a bit special for us, they have two inputs, the input tokentree and the annotated item.
let (token_map, tt) = match &loc.kind {
MacroCallKind::Attr { attr_args: (_, arg_token_map), .. } => {
MacroCallKind::Attr { attr_args, .. } => {
// try unshifting the the token id, if unshifting fails, the token resides in the non-item attribute input
// note that the `TokenExpander::map_id_up` earlier only unshifts for declarative macros, so we don't double unshift with this
match self.macro_arg_shift.unshift(token_id) {
Some(unshifted) => {
token_id = unshifted;
(arg_token_map, self.attr_input_or_mac_def.clone()?.syntax().cloned())
(&attr_args.1, self.attr_input_or_mac_def.clone()?.syntax().cloned())
}
None => (&self.macro_arg.1, self.arg.clone()),
}