@@ -1731,12 +1731,12 @@ pub enum AttrArgs {
17311731 /// Delimited arguments: `#[attr()/[]/{}]`.
17321732 Delimited(DelimArgs),
17331733 /// Arguments of a key-value attribute: `#[attr = "value"]`.
1734- Eq(
1734+ Eq {
17351735 /// Span of the `=` token.
1736- Span,
1737- /// The "value".
1738- AttrArgsEq,
1739- ) ,
1736+ eq_span: Span,
1737+
1738+ value: AttrArgsEq,
1739+ } ,
17401740}
17411741
17421742// The RHS of an `AttrArgs::Eq` starts out as an expression. Once macro
@@ -1748,15 +1748,39 @@ pub enum AttrArgsEq {
17481748 Hir(MetaItemLit),
17491749}
17501750
1751+ impl AttrArgsEq {
1752+ pub fn span(&self) -> Span {
1753+ match self {
1754+ AttrArgsEq::Ast(p) => p.span,
1755+ AttrArgsEq::Hir(lit) => lit.span,
1756+ }
1757+ }
1758+
1759+ pub fn unwrap_ast(&self) -> &Expr {
1760+ match self {
1761+ AttrArgsEq::Ast(p) => p,
1762+ AttrArgsEq::Hir(lit) => {
1763+ unreachable!("in literal form when getting inner tokens: {lit:?}")
1764+ }
1765+ }
1766+ }
1767+
1768+ pub fn unwrap_ast_mut(&mut self) -> &mut P<Expr> {
1769+ match self {
1770+ AttrArgsEq::Ast(p) => p,
1771+ AttrArgsEq::Hir(lit) => {
1772+ unreachable!("in literal form when getting inner tokens: {lit:?}")
1773+ }
1774+ }
1775+ }
1776+ }
1777+
17511778impl AttrArgs {
17521779 pub fn span(&self) -> Option<Span> {
17531780 match self {
17541781 AttrArgs::Empty => None,
17551782 AttrArgs::Delimited(args) => Some(args.dspan.entire()),
1756- AttrArgs::Eq(eq_span, AttrArgsEq::Ast(expr)) => Some(eq_span.to(expr.span)),
1757- AttrArgs::Eq(_, AttrArgsEq::Hir(lit)) => {
1758- unreachable!("in literal form when getting span: {:?}", lit);
1759- }
1783+ AttrArgs::Eq { eq_span, value } => Some(eq_span.to(value.span())),
17601784 }
17611785 }
17621786
@@ -1766,10 +1790,7 @@ impl AttrArgs {
17661790 match self {
17671791 AttrArgs::Empty => TokenStream::default(),
17681792 AttrArgs::Delimited(args) => args.tokens.clone(),
1769- AttrArgs::Eq(_, AttrArgsEq::Ast(expr)) => TokenStream::from_ast(expr),
1770- AttrArgs::Eq(_, AttrArgsEq::Hir(lit)) => {
1771- unreachable!("in literal form when getting inner tokens: {:?}", lit)
1772- }
1793+ AttrArgs::Eq { value, .. } => TokenStream::from_ast(value.unwrap_ast()),
17731794 }
17741795 }
17751796}
@@ -1783,10 +1804,10 @@ where
17831804 match self {
17841805 AttrArgs::Empty => {}
17851806 AttrArgs::Delimited(args) => args.hash_stable(ctx, hasher),
1786- AttrArgs::Eq(_eq_span, AttrArgsEq::Ast(expr)) => {
1807+ AttrArgs::Eq { value: AttrArgsEq::Ast(expr), .. } => {
17871808 unreachable!("hash_stable {:?}", expr);
17881809 }
1789- AttrArgs::Eq( eq_span, AttrArgsEq::Hir(lit)) => {
1810+ AttrArgs::Eq { eq_span, value: AttrArgsEq::Hir(lit) } => {
17901811 eq_span.hash_stable(ctx, hasher);
17911812 lit.hash_stable(ctx, hasher);
17921813 }
0 commit comments