Auto merge of #77255 - Aaron1011:feature/collect-attr-tokens, r=petrochenkov
Unconditionally capture tokens for attributes. This allows us to avoid synthesizing tokens in `prepend_attr`, since we have the original tokens available. We still need to synthesize tokens when expanding `cfg_attr`, but this is an unavoidable consequence of the syntax of `cfg_attr` - the user does not supply the `#` and `[]` tokens that a `cfg_attr` expands to. This is based on PR https://github.com/rust-lang/rust/pull/77250 - this PR exposes a bug in the current `collect_tokens` implementation, which is fixed by the rewrite.
This commit is contained in:
commit
ffa2e7ae8f
19 changed files with 251 additions and 138 deletions
|
@ -210,9 +210,9 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
ex.span = e.span;
|
||||
}
|
||||
// Merge attributes into the inner expression.
|
||||
let mut attrs = e.attrs.clone();
|
||||
let mut attrs: Vec<_> = e.attrs.iter().map(|a| self.lower_attr(a)).collect();
|
||||
attrs.extend::<Vec<_>>(ex.attrs.into());
|
||||
ex.attrs = attrs;
|
||||
ex.attrs = attrs.into();
|
||||
return ex;
|
||||
}
|
||||
|
||||
|
@ -1471,13 +1471,15 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
hir::MatchSource::ForLoopDesugar,
|
||||
));
|
||||
|
||||
let attrs: Vec<_> = e.attrs.iter().map(|a| self.lower_attr(a)).collect();
|
||||
|
||||
// This is effectively `{ let _result = ...; _result }`.
|
||||
// The construct was introduced in #21984 and is necessary to make sure that
|
||||
// temporaries in the `head` expression are dropped and do not leak to the
|
||||
// surrounding scope of the `match` since the `match` is not a terminating scope.
|
||||
//
|
||||
// Also, add the attributes to the outer returned expr node.
|
||||
self.expr_drop_temps_mut(desugared_span, match_expr, e.attrs.clone())
|
||||
self.expr_drop_temps_mut(desugared_span, match_expr, attrs.into())
|
||||
}
|
||||
|
||||
/// Desugar `ExprKind::Try` from: `<expr>?` into:
|
||||
|
|
|
@ -972,7 +972,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
AttrKind::DocComment(comment_kind, data) => AttrKind::DocComment(comment_kind, data),
|
||||
};
|
||||
|
||||
Attribute { kind, id: attr.id, style: attr.style, span: attr.span }
|
||||
// Tokens aren't needed after macro expansion and parsing
|
||||
Attribute { kind, id: attr.id, style: attr.style, span: attr.span, tokens: None }
|
||||
}
|
||||
|
||||
fn lower_mac_args(&mut self, args: &MacArgs) -> MacArgs {
|
||||
|
@ -1713,7 +1714,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
pat: self.lower_pat(&l.pat),
|
||||
init,
|
||||
span: l.span,
|
||||
attrs: l.attrs.clone(),
|
||||
attrs: l.attrs.iter().map(|a| self.lower_attr(a)).collect::<Vec<_>>().into(),
|
||||
source: hir::LocalSource::Normal,
|
||||
},
|
||||
ids,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue