@@ -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