@@ -160,7 +160,8 @@ use std::panic;
160
160
#[ proc_macro]
161
161
pub fn paste ( input : TokenStream ) -> TokenStream {
162
162
let mut contains_paste = false ;
163
- match expand ( input, & mut contains_paste) {
163
+ let flatten_single_interpolation = true ;
164
+ match expand ( input, & mut contains_paste, flatten_single_interpolation) {
164
165
Ok ( expanded) => expanded,
165
166
Err ( err) => err. to_compile_error ( ) ,
166
167
}
@@ -178,7 +179,11 @@ pub fn expr(input: TokenStream) -> TokenStream {
178
179
paste ( input)
179
180
}
180
181
181
- fn expand ( input : TokenStream , contains_paste : & mut bool ) -> Result < TokenStream > {
182
+ fn expand (
183
+ input : TokenStream ,
184
+ contains_paste : & mut bool ,
185
+ flatten_single_interpolation : bool ,
186
+ ) -> Result < TokenStream > {
182
187
let mut expanded = TokenStream :: new ( ) ;
183
188
let mut lookbehind = Lookbehind :: Other ;
184
189
let mut prev_none_group = None :: < Group > ;
@@ -209,15 +214,22 @@ fn expand(input: TokenStream, contains_paste: &mut bool) -> Result<TokenStream>
209
214
let tokens = pasted_to_tokens ( pasted, span) ?;
210
215
expanded. extend ( tokens) ;
211
216
* contains_paste = true ;
212
- } else if delimiter == Delimiter :: None && is_flat_group ( & content) {
217
+ } else if flatten_single_interpolation
218
+ && delimiter == Delimiter :: None
219
+ && is_single_interpolation_group ( & content)
220
+ {
213
221
expanded. extend ( content) ;
214
222
* contains_paste = true ;
215
223
} else {
216
224
let mut group_contains_paste = false ;
217
- let mut nested = expand ( content, & mut group_contains_paste) ?;
218
- if delimiter == Delimiter :: Bracket
219
- && ( lookbehind == Lookbehind :: Pound || lookbehind == Lookbehind :: PoundBang )
220
- {
225
+ let is_attribute = delimiter == Delimiter :: Bracket
226
+ && ( lookbehind == Lookbehind :: Pound || lookbehind == Lookbehind :: PoundBang ) ;
227
+ let mut nested = expand (
228
+ content,
229
+ & mut group_contains_paste,
230
+ flatten_single_interpolation && !is_attribute,
231
+ ) ?;
232
+ if is_attribute {
221
233
nested = expand_attr ( nested, span, & mut group_contains_paste) ?
222
234
}
223
235
let group = if group_contains_paste {
@@ -268,7 +280,7 @@ enum Lookbehind {
268
280
}
269
281
270
282
// https://github.com/dtolnay/paste/issues/26
271
- fn is_flat_group ( input : & TokenStream ) -> bool {
283
+ fn is_single_interpolation_group ( input : & TokenStream ) -> bool {
272
284
#[ derive( PartialEq ) ]
273
285
enum State {
274
286
Init ,
0 commit comments