@@ -43,7 +43,7 @@ macro_rules! register_builtin {
43
43
db: & dyn AstDatabase ,
44
44
arg_id: EagerMacroId ,
45
45
tt: & tt:: Subtree ,
46
- ) -> ExpandResult <Option <( tt :: Subtree , FragmentKind ) >> {
46
+ ) -> ExpandResult <Option <ExpandedEager >> {
47
47
let expander = match * self {
48
48
$( EagerExpander :: $e_kind => $e_expand, ) *
49
49
} ;
@@ -61,6 +61,20 @@ macro_rules! register_builtin {
61
61
} ;
62
62
}
63
63
64
+ #[ derive( Debug ) ]
65
+ pub struct ExpandedEager {
66
+ pub ( crate ) subtree : tt:: Subtree ,
67
+ pub ( crate ) fragment : FragmentKind ,
68
+ /// The included file ID of the include macro.
69
+ pub ( crate ) included_file : Option < FileId > ,
70
+ }
71
+
72
+ impl ExpandedEager {
73
+ fn new ( subtree : tt:: Subtree , fragment : FragmentKind ) -> Self {
74
+ ExpandedEager { subtree, fragment, included_file : None }
75
+ }
76
+ }
77
+
64
78
pub fn find_builtin_macro (
65
79
ident : & name:: Name ,
66
80
krate : CrateId ,
@@ -280,7 +294,7 @@ fn compile_error_expand(
280
294
_db : & dyn AstDatabase ,
281
295
_id : EagerMacroId ,
282
296
tt : & tt:: Subtree ,
283
- ) -> ExpandResult < Option < ( tt :: Subtree , FragmentKind ) > > {
297
+ ) -> ExpandResult < Option < ExpandedEager > > {
284
298
let err = match & * tt. token_trees {
285
299
[ tt:: TokenTree :: Leaf ( tt:: Leaf :: Literal ( it) ) ] => {
286
300
let text = it. text . as_str ( ) ;
@@ -294,14 +308,14 @@ fn compile_error_expand(
294
308
_ => mbe:: ExpandError :: BindingError ( "`compile_error!` argument must be a string" . into ( ) ) ,
295
309
} ;
296
310
297
- ExpandResult { value : Some ( ( quote ! { } , FragmentKind :: Items ) ) , err : Some ( err) }
311
+ ExpandResult { value : Some ( ExpandedEager :: new ( quote ! { } , FragmentKind :: Items ) ) , err : Some ( err) }
298
312
}
299
313
300
314
fn concat_expand (
301
315
_db : & dyn AstDatabase ,
302
316
_arg_id : EagerMacroId ,
303
317
tt : & tt:: Subtree ,
304
- ) -> ExpandResult < Option < ( tt :: Subtree , FragmentKind ) > > {
318
+ ) -> ExpandResult < Option < ExpandedEager > > {
305
319
let mut err = None ;
306
320
let mut text = String :: new ( ) ;
307
321
for ( i, t) in tt. token_trees . iter ( ) . enumerate ( ) {
@@ -325,7 +339,7 @@ fn concat_expand(
325
339
}
326
340
}
327
341
}
328
- ExpandResult { value : Some ( ( quote ! ( #text) , FragmentKind :: Expr ) ) , err }
342
+ ExpandResult { value : Some ( ExpandedEager :: new ( quote ! ( #text) , FragmentKind :: Expr ) ) , err }
329
343
}
330
344
331
345
fn relative_file (
@@ -361,21 +375,27 @@ fn include_expand(
361
375
db : & dyn AstDatabase ,
362
376
arg_id : EagerMacroId ,
363
377
tt : & tt:: Subtree ,
364
- ) -> ExpandResult < Option < ( tt :: Subtree , FragmentKind ) > > {
378
+ ) -> ExpandResult < Option < ExpandedEager > > {
365
379
let res = ( || {
366
380
let path = parse_string ( tt) ?;
367
381
let file_id = relative_file ( db, arg_id. into ( ) , & path, false ) ?;
368
382
369
- Ok ( parse_to_token_tree ( & db. file_text ( file_id) )
383
+ let subtree = parse_to_token_tree ( & db. file_text ( file_id) )
370
384
. ok_or_else ( || mbe:: ExpandError :: ConversionError ) ?
371
- . 0 )
385
+ . 0 ;
386
+ Ok ( ( subtree, file_id) )
372
387
} ) ( ) ;
373
388
374
389
match res {
375
- Ok ( res ) => {
390
+ Ok ( ( subtree , file_id ) ) => {
376
391
// FIXME:
377
392
// Handle include as expression
378
- ExpandResult :: ok ( Some ( ( res, FragmentKind :: Items ) ) )
393
+
394
+ ExpandResult :: ok ( Some ( ExpandedEager {
395
+ subtree,
396
+ fragment : FragmentKind :: Items ,
397
+ included_file : Some ( file_id) ,
398
+ } ) )
379
399
}
380
400
Err ( e) => ExpandResult :: only_err ( e) ,
381
401
}
@@ -385,7 +405,7 @@ fn include_bytes_expand(
385
405
_db : & dyn AstDatabase ,
386
406
_arg_id : EagerMacroId ,
387
407
tt : & tt:: Subtree ,
388
- ) -> ExpandResult < Option < ( tt :: Subtree , FragmentKind ) > > {
408
+ ) -> ExpandResult < Option < ExpandedEager > > {
389
409
if let Err ( e) = parse_string ( tt) {
390
410
return ExpandResult :: only_err ( e) ;
391
411
}
@@ -398,14 +418,14 @@ fn include_bytes_expand(
398
418
id: tt:: TokenId :: unspecified( ) ,
399
419
} ) ) ] ,
400
420
} ;
401
- ExpandResult :: ok ( Some ( ( res, FragmentKind :: Expr ) ) )
421
+ ExpandResult :: ok ( Some ( ExpandedEager :: new ( res, FragmentKind :: Expr ) ) )
402
422
}
403
423
404
424
fn include_str_expand (
405
425
db : & dyn AstDatabase ,
406
426
arg_id : EagerMacroId ,
407
427
tt : & tt:: Subtree ,
408
- ) -> ExpandResult < Option < ( tt :: Subtree , FragmentKind ) > > {
428
+ ) -> ExpandResult < Option < ExpandedEager > > {
409
429
let path = match parse_string ( tt) {
410
430
Ok ( it) => it,
411
431
Err ( e) => return ExpandResult :: only_err ( e) ,
@@ -418,14 +438,14 @@ fn include_str_expand(
418
438
let file_id = match relative_file ( db, arg_id. into ( ) , & path, true ) {
419
439
Ok ( file_id) => file_id,
420
440
Err ( _) => {
421
- return ExpandResult :: ok ( Some ( ( quote ! ( "" ) , FragmentKind :: Expr ) ) ) ;
441
+ return ExpandResult :: ok ( Some ( ExpandedEager :: new ( quote ! ( "" ) , FragmentKind :: Expr ) ) ) ;
422
442
}
423
443
} ;
424
444
425
445
let text = db. file_text ( file_id) ;
426
446
let text = & * text;
427
447
428
- ExpandResult :: ok ( Some ( ( quote ! ( #text) , FragmentKind :: Expr ) ) )
448
+ ExpandResult :: ok ( Some ( ExpandedEager :: new ( quote ! ( #text) , FragmentKind :: Expr ) ) )
429
449
}
430
450
431
451
fn get_env_inner ( db : & dyn AstDatabase , arg_id : EagerMacroId , key : & str ) -> Option < String > {
@@ -437,7 +457,7 @@ fn env_expand(
437
457
db : & dyn AstDatabase ,
438
458
arg_id : EagerMacroId ,
439
459
tt : & tt:: Subtree ,
440
- ) -> ExpandResult < Option < ( tt :: Subtree , FragmentKind ) > > {
460
+ ) -> ExpandResult < Option < ExpandedEager > > {
441
461
let key = match parse_string ( tt) {
442
462
Ok ( it) => it,
443
463
Err ( e) => return ExpandResult :: only_err ( e) ,
@@ -461,14 +481,14 @@ fn env_expand(
461
481
} ) ;
462
482
let expanded = quote ! { #s } ;
463
483
464
- ExpandResult { value : Some ( ( expanded, FragmentKind :: Expr ) ) , err }
484
+ ExpandResult { value : Some ( ExpandedEager :: new ( expanded, FragmentKind :: Expr ) ) , err }
465
485
}
466
486
467
487
fn option_env_expand (
468
488
db : & dyn AstDatabase ,
469
489
arg_id : EagerMacroId ,
470
490
tt : & tt:: Subtree ,
471
- ) -> ExpandResult < Option < ( tt :: Subtree , FragmentKind ) > > {
491
+ ) -> ExpandResult < Option < ExpandedEager > > {
472
492
let key = match parse_string ( tt) {
473
493
Ok ( it) => it,
474
494
Err ( e) => return ExpandResult :: only_err ( e) ,
@@ -479,7 +499,7 @@ fn option_env_expand(
479
499
Some ( s) => quote ! { std:: option:: Some ( #s) } ,
480
500
} ;
481
501
482
- ExpandResult :: ok ( Some ( ( expanded, FragmentKind :: Expr ) ) )
502
+ ExpandResult :: ok ( Some ( ExpandedEager :: new ( expanded, FragmentKind :: Expr ) ) )
483
503
}
484
504
485
505
#[ cfg( test) ]
@@ -553,16 +573,18 @@ mod tests {
553
573
subtree : Arc :: new ( parsed_args. clone ( ) ) ,
554
574
krate,
555
575
call : call_id,
576
+ included_file : None ,
556
577
}
557
578
} ) ;
558
579
559
- let ( subtree , fragment ) = expander. expand ( & db, arg_id, & parsed_args) . value . unwrap ( ) ;
580
+ let expanded = expander. expand ( & db, arg_id, & parsed_args) . value . unwrap ( ) ;
560
581
let eager = EagerCallLoc {
561
582
def,
562
- fragment,
563
- subtree : Arc :: new ( subtree) ,
583
+ fragment : expanded . fragment ,
584
+ subtree : Arc :: new ( expanded . subtree ) ,
564
585
krate,
565
586
call : call_id,
587
+ included_file : expanded. included_file ,
566
588
} ;
567
589
568
590
let id: MacroCallId = db. intern_eager_expansion ( eager) . into ( ) ;
0 commit comments