@@ -130,7 +130,7 @@ fn parse_args<'a>(ecx: &mut ExtCtxt<'a>, sp: Span, tts: TokenStream) -> PResult<
130
130
. emit ( ) ;
131
131
continue ;
132
132
}
133
- args. add ( FormatArgument { kind : FormatArgumentKind :: Named ( ident) , expr } ) ;
133
+ args. add ( FormatArgument { kind : FormatArgumentKind :: Named ( ident) , expr } , None ) ;
134
134
}
135
135
_ => {
136
136
let expr = p. parse_expr ( ) ?;
@@ -150,7 +150,7 @@ fn parse_args<'a>(ecx: &mut ExtCtxt<'a>, sp: Span, tts: TokenStream) -> PResult<
150
150
}
151
151
err. emit ( ) ;
152
152
}
153
- args. add ( FormatArgument { kind : FormatArgumentKind :: Normal , expr } ) ;
153
+ args. add ( FormatArgument { kind : FormatArgumentKind :: Normal , expr } , None ) ;
154
154
}
155
155
}
156
156
}
@@ -283,7 +283,8 @@ fn make_format_args(
283
283
let mut lookup_arg = |arg : ArgRef < ' _ > ,
284
284
span : Option < Span > ,
285
285
used_as : PositionUsedAs ,
286
- kind : FormatArgPositionKind |
286
+ kind : FormatArgPositionKind ,
287
+ fmt_trait : Option < FormatTrait > |
287
288
-> FormatArgPosition {
288
289
let index = match arg {
289
290
Index ( index) => {
@@ -309,6 +310,9 @@ fn make_format_args(
309
310
used[ index] = true ;
310
311
}
311
312
Ok ( index)
313
+ } else if let Some ( tr) = fmt_trait
314
+ && let Some ( ( index, _) ) = args. by_implicit_arg ( name, tr) {
315
+ Ok ( index)
312
316
} else {
313
317
// Name not found in `args`, so we add it as an implicitly captured argument.
314
318
let span = span. unwrap_or ( fmt_span) ;
@@ -324,7 +328,7 @@ fn make_format_args(
324
328
. emit ( ) ;
325
329
DummyResult :: raw_expr ( span, true )
326
330
} ;
327
- Ok ( args. add ( FormatArgument { kind : FormatArgumentKind :: Captured ( ident) , expr } ) )
331
+ Ok ( args. add ( FormatArgument { kind : FormatArgumentKind :: Captured ( ident) , expr } , fmt_trait ) )
328
332
}
329
333
}
330
334
} ;
@@ -350,24 +354,44 @@ fn make_format_args(
350
354
placeholder_index += 1 ;
351
355
352
356
let position_span = to_span ( position_span) ;
357
+
358
+ let format_trait = match format. ty {
359
+ "" => FormatTrait :: Display ,
360
+ "?" => FormatTrait :: Debug ,
361
+ "e" => FormatTrait :: LowerExp ,
362
+ "E" => FormatTrait :: UpperExp ,
363
+ "o" => FormatTrait :: Octal ,
364
+ "p" => FormatTrait :: Pointer ,
365
+ "b" => FormatTrait :: Binary ,
366
+ "x" => FormatTrait :: LowerHex ,
367
+ "X" => FormatTrait :: UpperHex ,
368
+ _ => {
369
+ invalid_placeholder_type_error ( ecx, format. ty , format. ty_span , fmt_span) ;
370
+ FormatTrait :: Display
371
+ }
372
+ } ;
373
+
353
374
let argument = match position {
354
375
parse:: ArgumentImplicitlyIs ( i) => lookup_arg (
355
376
Index ( i) ,
356
377
position_span,
357
378
Placeholder ( span) ,
358
379
FormatArgPositionKind :: Implicit ,
380
+ Some ( format_trait) ,
359
381
) ,
360
382
parse:: ArgumentIs ( i) => lookup_arg (
361
383
Index ( i) ,
362
384
position_span,
363
385
Placeholder ( span) ,
364
386
FormatArgPositionKind :: Number ,
387
+ Some ( format_trait) ,
365
388
) ,
366
389
parse:: ArgumentNamed ( name) => lookup_arg (
367
390
Name ( name, position_span) ,
368
391
position_span,
369
392
Placeholder ( span) ,
370
393
FormatArgPositionKind :: Named ,
394
+ Some ( format_trait) ,
371
395
) ,
372
396
} ;
373
397
@@ -378,22 +402,6 @@ fn make_format_args(
378
402
parse:: AlignCenter => Some ( FormatAlignment :: Center ) ,
379
403
} ;
380
404
381
- let format_trait = match format. ty {
382
- "" => FormatTrait :: Display ,
383
- "?" => FormatTrait :: Debug ,
384
- "e" => FormatTrait :: LowerExp ,
385
- "E" => FormatTrait :: UpperExp ,
386
- "o" => FormatTrait :: Octal ,
387
- "p" => FormatTrait :: Pointer ,
388
- "b" => FormatTrait :: Binary ,
389
- "x" => FormatTrait :: LowerHex ,
390
- "X" => FormatTrait :: UpperHex ,
391
- _ => {
392
- invalid_placeholder_type_error ( ecx, format. ty , format. ty_span , fmt_span) ;
393
- FormatTrait :: Display
394
- }
395
- } ;
396
-
397
405
let precision_span = format. precision_span . and_then ( to_span) ;
398
406
let precision = match format. precision {
399
407
parse:: CountIs ( n) => Some ( FormatCount :: Literal ( n) ) ,
@@ -402,18 +410,21 @@ fn make_format_args(
402
410
precision_span,
403
411
Precision ,
404
412
FormatArgPositionKind :: Named ,
413
+ None ,
405
414
) ) ) ,
406
415
parse:: CountIsParam ( i) => Some ( FormatCount :: Argument ( lookup_arg (
407
416
Index ( i) ,
408
417
precision_span,
409
418
Precision ,
410
419
FormatArgPositionKind :: Number ,
420
+ None ,
411
421
) ) ) ,
412
422
parse:: CountIsStar ( i) => Some ( FormatCount :: Argument ( lookup_arg (
413
423
Index ( i) ,
414
424
precision_span,
415
425
Precision ,
416
426
FormatArgPositionKind :: Implicit ,
427
+ None ,
417
428
) ) ) ,
418
429
parse:: CountImplied => None ,
419
430
} ;
@@ -426,12 +437,14 @@ fn make_format_args(
426
437
width_span,
427
438
Width ,
428
439
FormatArgPositionKind :: Named ,
440
+ None ,
429
441
) ) ) ,
430
442
parse:: CountIsParam ( i) => Some ( FormatCount :: Argument ( lookup_arg (
431
443
Index ( i) ,
432
444
width_span,
433
445
Width ,
434
446
FormatArgPositionKind :: Number ,
447
+ None ,
435
448
) ) ) ,
436
449
parse:: CountIsStar ( _) => unreachable ! ( ) ,
437
450
parse:: CountImplied => None ,
0 commit comments