@@ -45,7 +45,7 @@ use hir;
45
45
use hir:: HirVec ;
46
46
use hir:: map:: { DefKey , DefPathData , Definitions } ;
47
47
use hir:: def_id:: { DefId , DefIndex , DefIndexAddressSpace , CRATE_DEF_INDEX } ;
48
- use hir:: def:: { Def , PathResolution } ;
48
+ use hir:: def:: { Def , PathResolution , PerNS } ;
49
49
use lint:: builtin:: { self , PARENTHESIZED_PARAMS_IN_TYPES_AND_MODULES } ;
50
50
use middle:: cstore:: CrateStore ;
51
51
use rustc_data_structures:: indexed_vec:: IndexVec ;
@@ -152,6 +152,9 @@ pub trait Resolver {
152
152
/// Obtain the resolution for a node id
153
153
fn get_resolution ( & mut self , id : NodeId ) -> Option < PathResolution > ;
154
154
155
+ /// Obtain the possible resolutions for the given `use` statement.
156
+ fn get_import ( & mut self , id : NodeId ) -> PerNS < Option < PathResolution > > ;
157
+
155
158
/// We must keep the set of definitions up to date as we add nodes that weren't in the AST.
156
159
/// This should only return `None` during testing.
157
160
fn definitions ( & mut self ) -> & mut Definitions ;
@@ -571,6 +574,21 @@ impl<'a> LoweringContext<'a> {
571
574
} )
572
575
}
573
576
577
+ fn expect_full_def_from_use ( & mut self , id : NodeId ) -> Vec < Def > {
578
+ let mut ret = self . resolver . get_import ( id) . present_items ( ) . map ( |pr| {
579
+ if pr. unresolved_segments ( ) != 0 {
580
+ bug ! ( "path not fully resolved: {:?}" , pr) ;
581
+ }
582
+ pr. base_def ( )
583
+ } ) . collect :: < Vec < _ > > ( ) ;
584
+
585
+ if ret. is_empty ( ) {
586
+ ret. push ( Def :: Err ) ;
587
+ }
588
+
589
+ ret
590
+ }
591
+
574
592
fn diagnostic ( & self ) -> & errors:: Handler {
575
593
self . sess . diagnostic ( )
576
594
}
@@ -1532,13 +1550,13 @@ impl<'a> LoweringContext<'a> {
1532
1550
1533
1551
fn lower_path_extra (
1534
1552
& mut self ,
1535
- id : NodeId ,
1553
+ def : Def ,
1536
1554
p : & Path ,
1537
1555
name : Option < Name > ,
1538
1556
param_mode : ParamMode ,
1539
1557
) -> hir:: Path {
1540
1558
hir:: Path {
1541
- def : self . expect_full_def ( id ) ,
1559
+ def,
1542
1560
segments : p. segments
1543
1561
. iter ( )
1544
1562
. map ( |segment| {
@@ -1558,7 +1576,8 @@ impl<'a> LoweringContext<'a> {
1558
1576
}
1559
1577
1560
1578
fn lower_path ( & mut self , id : NodeId , p : & Path , param_mode : ParamMode ) -> hir:: Path {
1561
- self . lower_path_extra ( id, p, None , param_mode)
1579
+ let def = self . expect_full_def ( id) ;
1580
+ self . lower_path_extra ( def, p, None , param_mode)
1562
1581
}
1563
1582
1564
1583
fn lower_path_segment (
@@ -2363,7 +2382,7 @@ impl<'a> LoweringContext<'a> {
2363
2382
let path = & tree. prefix ;
2364
2383
2365
2384
match tree. kind {
2366
- UseTreeKind :: Simple ( rename) => {
2385
+ UseTreeKind :: Simple ( rename, id1 , id2 ) => {
2367
2386
* name = tree. ident ( ) . name ;
2368
2387
2369
2388
// First apply the prefix to the path
@@ -2387,7 +2406,58 @@ impl<'a> LoweringContext<'a> {
2387
2406
}
2388
2407
}
2389
2408
2390
- let path = P ( self . lower_path ( id, & path, ParamMode :: Explicit ) ) ;
2409
+ let parent_def_index = self . current_hir_id_owner . last ( ) . unwrap ( ) . 0 ;
2410
+ let mut defs = self . expect_full_def_from_use ( id) . into_iter ( ) ;
2411
+ // we want to return *something* from this function, so hang onto the first item
2412
+ // for later
2413
+ let mut ret_def = defs. next ( ) . unwrap_or ( Def :: Err ) ;
2414
+
2415
+ for ( def, & new_node_id) in defs. zip ( [ id1, id2] . iter ( ) ) {
2416
+ let vis = vis. clone ( ) ;
2417
+ let name = name. clone ( ) ;
2418
+ let span = path. span ;
2419
+ self . resolver . definitions ( ) . create_def_with_parent (
2420
+ parent_def_index,
2421
+ new_node_id,
2422
+ DefPathData :: Misc ,
2423
+ DefIndexAddressSpace :: High ,
2424
+ Mark :: root ( ) ,
2425
+ span) ;
2426
+ self . allocate_hir_id_counter ( new_node_id, & path) ;
2427
+
2428
+ self . with_hir_id_owner ( new_node_id, |this| {
2429
+ let new_id = this. lower_node_id ( new_node_id) ;
2430
+ let path = this. lower_path_extra ( def, & path, None , ParamMode :: Explicit ) ;
2431
+ let item = hir:: ItemUse ( P ( path) , hir:: UseKind :: Single ) ;
2432
+ let vis = match vis {
2433
+ hir:: Visibility :: Public => hir:: Visibility :: Public ,
2434
+ hir:: Visibility :: Crate ( sugar) => hir:: Visibility :: Crate ( sugar) ,
2435
+ hir:: Visibility :: Inherited => hir:: Visibility :: Inherited ,
2436
+ hir:: Visibility :: Restricted { ref path, id : _ } => {
2437
+ hir:: Visibility :: Restricted {
2438
+ path : path. clone ( ) ,
2439
+ // We are allocating a new NodeId here
2440
+ id : this. next_id ( ) . node_id ,
2441
+ }
2442
+ }
2443
+ } ;
2444
+
2445
+ this. items . insert (
2446
+ new_id. node_id ,
2447
+ hir:: Item {
2448
+ id : new_id. node_id ,
2449
+ hir_id : new_id. hir_id ,
2450
+ name : name,
2451
+ attrs : attrs. clone ( ) ,
2452
+ node : item,
2453
+ vis,
2454
+ span,
2455
+ } ,
2456
+ ) ;
2457
+ } ) ;
2458
+ }
2459
+
2460
+ let path = P ( self . lower_path_extra ( ret_def, & path, None , ParamMode :: Explicit ) ) ;
2391
2461
hir:: ItemUse ( path, hir:: UseKind :: Single )
2392
2462
}
2393
2463
UseTreeKind :: Glob => {
@@ -2654,7 +2724,7 @@ impl<'a> LoweringContext<'a> {
2654
2724
match i. node {
2655
2725
ItemKind :: Use ( ref use_tree) => {
2656
2726
let mut vec = SmallVector :: one ( hir:: ItemId { id : i. id } ) ;
2657
- self . lower_item_id_use_tree ( use_tree, & mut vec) ;
2727
+ self . lower_item_id_use_tree ( use_tree, i . id , & mut vec) ;
2658
2728
return vec;
2659
2729
}
2660
2730
ItemKind :: MacroDef ( ..) => return SmallVector :: new ( ) ,
@@ -2663,14 +2733,26 @@ impl<'a> LoweringContext<'a> {
2663
2733
SmallVector :: one ( hir:: ItemId { id : i. id } )
2664
2734
}
2665
2735
2666
- fn lower_item_id_use_tree ( & self , tree : & UseTree , vec : & mut SmallVector < hir:: ItemId > ) {
2736
+ fn lower_item_id_use_tree ( & mut self ,
2737
+ tree : & UseTree ,
2738
+ base_id : NodeId ,
2739
+ vec : & mut SmallVector < hir:: ItemId > )
2740
+ {
2667
2741
match tree. kind {
2668
2742
UseTreeKind :: Nested ( ref nested_vec) => for & ( ref nested, id) in nested_vec {
2669
2743
vec. push ( hir:: ItemId { id } ) ;
2670
- self . lower_item_id_use_tree ( nested, vec) ;
2744
+ self . lower_item_id_use_tree ( nested, id , vec) ;
2671
2745
} ,
2672
2746
UseTreeKind :: Glob => { }
2673
- UseTreeKind :: Simple ( ..) => { }
2747
+ UseTreeKind :: Simple ( _, id1, id2) => {
2748
+ for ( _, & id) in self . expect_full_def_from_use ( base_id)
2749
+ . into_iter ( )
2750
+ . skip ( 1 )
2751
+ . zip ( [ id1, id2] . iter ( ) )
2752
+ {
2753
+ vec. push ( hir:: ItemId { id } ) ;
2754
+ }
2755
+ } ,
2674
2756
}
2675
2757
}
2676
2758
0 commit comments