@@ -90,7 +90,7 @@ impl<'a> Parser<'a> {
90
90
debug ! ( "parse_attribute_with_inner_parse_policy: inner_parse_policy={:?} self.token={:?}" ,
91
91
inner_parse_policy,
92
92
self . token) ;
93
- let ( span, path , tokens , style) = match self . token . kind {
93
+ let ( span, item , style) = match self . token . kind {
94
94
token:: Pound => {
95
95
let lo = self . token . span ;
96
96
self . bump ( ) ;
@@ -107,7 +107,7 @@ impl<'a> Parser<'a> {
107
107
} ;
108
108
109
109
self . expect ( & token:: OpenDelim ( token:: Bracket ) ) ?;
110
- let ( path , tokens ) = self . parse_meta_item_unrestricted ( ) ?;
110
+ let item = self . parse_attr_item ( ) ?;
111
111
self . expect ( & token:: CloseDelim ( token:: Bracket ) ) ?;
112
112
let hi = self . prev_span ;
113
113
@@ -142,7 +142,7 @@ impl<'a> Parser<'a> {
142
142
}
143
143
}
144
144
145
- ( attr_sp, path , tokens , style)
145
+ ( attr_sp, item , style)
146
146
}
147
147
_ => {
148
148
let token_str = self . this_token_to_string ( ) ;
@@ -151,7 +151,7 @@ impl<'a> Parser<'a> {
151
151
} ;
152
152
153
153
Ok ( ast:: Attribute {
154
- item : ast :: AttrItem { path , tokens } ,
154
+ item,
155
155
id : attr:: mk_attr_id ( ) ,
156
156
style,
157
157
is_sugared_doc : false ,
@@ -168,17 +168,17 @@ impl<'a> Parser<'a> {
168
168
/// PATH
169
169
/// PATH `=` TOKEN_TREE
170
170
/// The delimiters or `=` are still put into the resulting token stream.
171
- pub fn parse_meta_item_unrestricted ( & mut self ) -> PResult < ' a , ( ast:: Path , TokenStream ) > {
172
- let meta = match self . token . kind {
171
+ pub fn parse_attr_item ( & mut self ) -> PResult < ' a , ast:: AttrItem > {
172
+ let item = match self . token . kind {
173
173
token:: Interpolated ( ref nt) => match * * nt {
174
- Nonterminal :: NtMeta ( ref meta ) => Some ( meta . clone ( ) ) ,
174
+ Nonterminal :: NtMeta ( ref item ) => Some ( item . clone ( ) ) ,
175
175
_ => None ,
176
176
} ,
177
177
_ => None ,
178
178
} ;
179
- Ok ( if let Some ( meta ) = meta {
179
+ Ok ( if let Some ( item ) = item {
180
180
self . bump ( ) ;
181
- ( meta . path , meta . kind . tokens ( meta . span ) )
181
+ item
182
182
} else {
183
183
let path = self . parse_path ( PathStyle :: Mod ) ?;
184
184
let tokens = if self . check ( & token:: OpenDelim ( DelimToken :: Paren ) ) ||
@@ -205,7 +205,7 @@ impl<'a> Parser<'a> {
205
205
} else {
206
206
TokenStream :: empty ( )
207
207
} ;
208
- ( path, tokens)
208
+ ast :: AttrItem { path, tokens }
209
209
} )
210
210
}
211
211
@@ -273,9 +273,14 @@ impl<'a> Parser<'a> {
273
273
_ => None ,
274
274
} ;
275
275
276
- if let Some ( meta) = nt_meta {
277
- self . bump ( ) ;
278
- return Ok ( meta) ;
276
+ if let Some ( item) = nt_meta {
277
+ return match item. meta ( item. path . span ) {
278
+ Some ( meta) => {
279
+ self . bump ( ) ;
280
+ Ok ( meta)
281
+ }
282
+ None => self . unexpected ( ) ,
283
+ }
279
284
}
280
285
281
286
let lo = self . token . span ;
0 commit comments