@@ -31,7 +31,7 @@ pub struct PerNsGlobImports {
31
31
32
32
#[ derive( Debug , Copy , Clone , PartialEq , Eq , Hash ) ]
33
33
pub enum ImportOrExternCrate {
34
- Glob ( UseId ) ,
34
+ Glob ( GlobId ) ,
35
35
Import ( ImportId ) ,
36
36
ExternCrate ( ExternCrateId ) ,
37
37
}
@@ -45,29 +45,41 @@ impl From<ImportOrGlob> for ImportOrExternCrate {
45
45
}
46
46
}
47
47
48
- impl From < ImportType > for ImportOrExternCrate {
49
- fn from ( value : ImportType ) -> Self {
50
- match value {
51
- ImportType :: Glob ( it) => ImportOrExternCrate :: Glob ( it) ,
52
- ImportType :: Import ( it) => ImportOrExternCrate :: Import ( it) ,
53
- ImportType :: ExternCrate ( it) => ImportOrExternCrate :: ExternCrate ( it) ,
54
- }
55
- }
56
- }
57
-
58
48
impl ImportOrExternCrate {
59
- pub fn into_import ( self ) -> Option < ImportOrGlob > {
49
+ pub fn import_or_glob ( self ) -> Option < ImportOrGlob > {
60
50
match self {
61
51
ImportOrExternCrate :: Import ( it) => Some ( ImportOrGlob :: Import ( it) ) ,
62
52
ImportOrExternCrate :: Glob ( it) => Some ( ImportOrGlob :: Glob ( it) ) ,
63
53
_ => None ,
64
54
}
65
55
}
56
+
57
+ pub fn import ( self ) -> Option < ImportId > {
58
+ match self {
59
+ ImportOrExternCrate :: Import ( it) => Some ( it) ,
60
+ _ => None ,
61
+ }
62
+ }
63
+
64
+ pub fn glob ( self ) -> Option < GlobId > {
65
+ match self {
66
+ ImportOrExternCrate :: Glob ( id) => Some ( id) ,
67
+ _ => None ,
68
+ }
69
+ }
70
+
71
+ pub fn use_ ( self ) -> Option < UseId > {
72
+ match self {
73
+ ImportOrExternCrate :: Glob ( id) => Some ( id. use_ ) ,
74
+ ImportOrExternCrate :: Import ( id) => Some ( id. use_ ) ,
75
+ _ => None ,
76
+ }
77
+ }
66
78
}
67
79
68
80
#[ derive( Debug , Copy , Clone , PartialEq , Eq , Hash ) ]
69
81
pub enum ImportOrGlob {
70
- Glob ( UseId ) ,
82
+ Glob ( GlobId ) ,
71
83
Import ( ImportId ) ,
72
84
}
73
85
@@ -79,17 +91,11 @@ impl ImportOrGlob {
79
91
}
80
92
}
81
93
}
82
- #[ derive( Debug , Copy , Clone , PartialEq , Eq , Hash ) ]
83
- pub ( crate ) enum ImportType {
84
- Import ( ImportId ) ,
85
- Glob ( UseId ) ,
86
- ExternCrate ( ExternCrateId ) ,
87
- }
88
94
89
95
#[ derive( Debug , Copy , Clone , PartialEq , Eq , Hash ) ]
90
96
pub enum ImportOrDef {
91
97
Import ( ImportId ) ,
92
- Glob ( UseId ) ,
98
+ Glob ( GlobId ) ,
93
99
ExternCrate ( ExternCrateId ) ,
94
100
Def ( ModuleDefId ) ,
95
101
}
@@ -115,7 +121,13 @@ impl From<ImportOrGlob> for ImportOrDef {
115
121
116
122
#[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash , Ord , PartialOrd ) ]
117
123
pub struct ImportId {
118
- pub import : UseId ,
124
+ pub use_ : UseId ,
125
+ pub idx : Idx < ast:: UseTree > ,
126
+ }
127
+
128
+ #[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash , Ord , PartialOrd ) ]
129
+ pub struct GlobId {
130
+ pub use_ : UseId ,
119
131
pub idx : Idx < ast:: UseTree > ,
120
132
}
121
133
@@ -236,7 +248,7 @@ impl ItemScope {
236
248
self . use_imports_types
237
249
. keys ( )
238
250
. copied ( )
239
- . filter_map ( ImportOrExternCrate :: into_import )
251
+ . filter_map ( ImportOrExternCrate :: import_or_glob )
240
252
. chain ( self . use_imports_values . keys ( ) . copied ( ) )
241
253
. chain ( self . use_imports_macros . keys ( ) . copied ( ) )
242
254
. filter_map ( ImportOrGlob :: into_import)
@@ -252,7 +264,7 @@ impl ItemScope {
252
264
while let Some ( & m) = scope. use_imports_macros . get ( & ImportOrGlob :: Import ( import) ) {
253
265
match m {
254
266
ImportOrDef :: Import ( i) => {
255
- let module_id = i. import . lookup ( db) . container ;
267
+ let module_id = i. use_ . lookup ( db) . container ;
256
268
def_map = module_id. def_map ( db) ;
257
269
scope = & def_map[ module_id. local_id ] . scope ;
258
270
import = i;
@@ -268,7 +280,7 @@ impl ItemScope {
268
280
while let Some ( & m) = scope. use_imports_types . get ( & ImportOrExternCrate :: Import ( import) ) {
269
281
match m {
270
282
ImportOrDef :: Import ( i) => {
271
- let module_id = i. import . lookup ( db) . container ;
283
+ let module_id = i. use_ . lookup ( db) . container ;
272
284
def_map = module_id. def_map ( db) ;
273
285
scope = & def_map[ module_id. local_id ] . scope ;
274
286
import = i;
@@ -284,7 +296,7 @@ impl ItemScope {
284
296
while let Some ( & m) = scope. use_imports_values . get ( & ImportOrGlob :: Import ( import) ) {
285
297
match m {
286
298
ImportOrDef :: Import ( i) => {
287
- let module_id = i. import . lookup ( db) . container ;
299
+ let module_id = i. use_ . lookup ( db) . container ;
288
300
def_map = module_id. def_map ( db) ;
289
301
scope = & def_map[ module_id. local_id ] . scope ;
290
302
import = i;
@@ -545,17 +557,21 @@ impl ItemScope {
545
557
self . unnamed_trait_imports . get ( & tr) . map ( |trait_| trait_. vis )
546
558
}
547
559
548
- pub ( crate ) fn push_unnamed_trait ( & mut self , tr : TraitId , vis : Visibility ) {
549
- // FIXME: import
550
- self . unnamed_trait_imports . insert ( tr, Item { def : ( ) , vis, import : None } ) ;
560
+ pub ( crate ) fn push_unnamed_trait (
561
+ & mut self ,
562
+ tr : TraitId ,
563
+ vis : Visibility ,
564
+ import : Option < ImportId > ,
565
+ ) {
566
+ self . unnamed_trait_imports . insert ( tr, Item { def : ( ) , vis, import } ) ;
551
567
}
552
568
553
569
pub ( crate ) fn push_res_with_import (
554
570
& mut self ,
555
571
glob_imports : & mut PerNsGlobImports ,
556
572
lookup : ( LocalModuleId , Name ) ,
557
573
def : PerNs ,
558
- import : Option < ImportType > ,
574
+ import : Option < ImportOrExternCrate > ,
559
575
) -> bool {
560
576
let mut changed = false ;
561
577
@@ -566,12 +582,11 @@ impl ItemScope {
566
582
match existing {
567
583
Entry :: Vacant ( entry) => {
568
584
match import {
569
- Some ( ImportType :: Glob ( _) ) => {
585
+ Some ( ImportOrExternCrate :: Glob ( _) ) => {
570
586
glob_imports. types . insert ( lookup. clone ( ) ) ;
571
587
}
572
588
_ => _ = glob_imports. types . remove ( & lookup) ,
573
589
}
574
- let import = import. map ( Into :: into) ;
575
590
let prev = std:: mem:: replace ( & mut fld. import , import) ;
576
591
if let Some ( import) = import {
577
592
self . use_imports_types
@@ -582,7 +597,7 @@ impl ItemScope {
582
597
}
583
598
Entry :: Occupied ( mut entry) => {
584
599
match import {
585
- Some ( ImportType :: Glob ( ..) ) => {
600
+ Some ( ImportOrExternCrate :: Glob ( ..) ) => {
586
601
// Multiple globs may import the same item and they may
587
602
// override visibility from previously resolved globs. This is
588
603
// currently handled by `DefCollector`, because we need to
@@ -591,7 +606,6 @@ impl ItemScope {
591
606
}
592
607
_ => {
593
608
if glob_imports. types . remove ( & lookup) {
594
- let import = import. map ( Into :: into) ;
595
609
let prev = std:: mem:: replace ( & mut fld. import , import) ;
596
610
if let Some ( import) = import {
597
611
self . use_imports_types . insert (
@@ -614,16 +628,12 @@ impl ItemScope {
614
628
match existing {
615
629
Entry :: Vacant ( entry) => {
616
630
match import {
617
- Some ( ImportType :: Glob ( _) ) => {
631
+ Some ( ImportOrExternCrate :: Glob ( _) ) => {
618
632
glob_imports. values . insert ( lookup. clone ( ) ) ;
619
633
}
620
634
_ => _ = glob_imports. values . remove ( & lookup) ,
621
635
}
622
- let import = match import {
623
- Some ( ImportType :: Import ( import) ) => Some ( ImportOrGlob :: Import ( import) ) ,
624
- Some ( ImportType :: Glob ( u) ) => Some ( ImportOrGlob :: Glob ( u) ) ,
625
- _ => None ,
626
- } ;
636
+ let import = import. and_then ( ImportOrExternCrate :: import_or_glob) ;
627
637
let prev = std:: mem:: replace ( & mut fld. import , import) ;
628
638
if let Some ( import) = import {
629
639
self . use_imports_values
@@ -632,15 +642,13 @@ impl ItemScope {
632
642
entry. insert ( fld) ;
633
643
changed = true ;
634
644
}
635
- Entry :: Occupied ( mut entry) if !matches ! ( import, Some ( ImportType :: Glob ( ..) ) ) => {
645
+ Entry :: Occupied ( mut entry)
646
+ if !matches ! ( import, Some ( ImportOrExternCrate :: Glob ( ..) ) ) =>
647
+ {
636
648
if glob_imports. values . remove ( & lookup) {
637
649
cov_mark:: hit!( import_shadowed) ;
638
650
639
- let import = match import {
640
- Some ( ImportType :: Import ( import) ) => Some ( ImportOrGlob :: Import ( import) ) ,
641
- Some ( ImportType :: Glob ( u) ) => Some ( ImportOrGlob :: Glob ( u) ) ,
642
- _ => None ,
643
- } ;
651
+ let import = import. and_then ( ImportOrExternCrate :: import_or_glob) ;
644
652
let prev = std:: mem:: replace ( & mut fld. import , import) ;
645
653
if let Some ( import) = import {
646
654
self . use_imports_values
@@ -659,16 +667,12 @@ impl ItemScope {
659
667
match existing {
660
668
Entry :: Vacant ( entry) => {
661
669
match import {
662
- Some ( ImportType :: Glob ( _) ) => {
670
+ Some ( ImportOrExternCrate :: Glob ( _) ) => {
663
671
glob_imports. macros . insert ( lookup. clone ( ) ) ;
664
672
}
665
673
_ => _ = glob_imports. macros . remove ( & lookup) ,
666
674
}
667
- let import = match import {
668
- Some ( ImportType :: Import ( import) ) => Some ( ImportOrGlob :: Import ( import) ) ,
669
- Some ( ImportType :: Glob ( u) ) => Some ( ImportOrGlob :: Glob ( u) ) ,
670
- _ => None ,
671
- } ;
675
+ let import = import. and_then ( ImportOrExternCrate :: import_or_glob) ;
672
676
let prev = std:: mem:: replace ( & mut fld. import , import) ;
673
677
if let Some ( import) = import {
674
678
self . use_imports_macros . insert (
@@ -679,14 +683,12 @@ impl ItemScope {
679
683
entry. insert ( fld) ;
680
684
changed = true ;
681
685
}
682
- Entry :: Occupied ( mut entry) if !matches ! ( import, Some ( ImportType :: Glob ( ..) ) ) => {
686
+ Entry :: Occupied ( mut entry)
687
+ if !matches ! ( import, Some ( ImportOrExternCrate :: Glob ( ..) ) ) =>
688
+ {
683
689
if glob_imports. macros . remove ( & lookup) {
684
690
cov_mark:: hit!( import_shadowed) ;
685
- let import = match import {
686
- Some ( ImportType :: Import ( import) ) => Some ( ImportOrGlob :: Import ( import) ) ,
687
- Some ( ImportType :: Glob ( u) ) => Some ( ImportOrGlob :: Glob ( u) ) ,
688
- _ => None ,
689
- } ;
691
+ let import = import. and_then ( ImportOrExternCrate :: import_or_glob) ;
690
692
let prev = std:: mem:: replace ( & mut fld. import , import) ;
691
693
if let Some ( import) = import {
692
694
self . use_imports_macros . insert (
@@ -856,7 +858,7 @@ impl PerNs {
856
858
match def {
857
859
ModuleDefId :: ModuleId ( _) => PerNs :: types ( def, v, import) ,
858
860
ModuleDefId :: FunctionId ( _) => {
859
- PerNs :: values ( def, v, import. and_then ( ImportOrExternCrate :: into_import ) )
861
+ PerNs :: values ( def, v, import. and_then ( ImportOrExternCrate :: import_or_glob ) )
860
862
}
861
863
ModuleDefId :: AdtId ( adt) => match adt {
862
864
AdtId :: UnionId ( _) => PerNs :: types ( def, v, import) ,
@@ -871,14 +873,14 @@ impl PerNs {
871
873
} ,
872
874
ModuleDefId :: EnumVariantId ( _) => PerNs :: both ( def, def, v, import) ,
873
875
ModuleDefId :: ConstId ( _) | ModuleDefId :: StaticId ( _) => {
874
- PerNs :: values ( def, v, import. and_then ( ImportOrExternCrate :: into_import ) )
876
+ PerNs :: values ( def, v, import. and_then ( ImportOrExternCrate :: import_or_glob ) )
875
877
}
876
878
ModuleDefId :: TraitId ( _) => PerNs :: types ( def, v, import) ,
877
879
ModuleDefId :: TraitAliasId ( _) => PerNs :: types ( def, v, import) ,
878
880
ModuleDefId :: TypeAliasId ( _) => PerNs :: types ( def, v, import) ,
879
881
ModuleDefId :: BuiltinType ( _) => PerNs :: types ( def, v, import) ,
880
882
ModuleDefId :: MacroId ( mac) => {
881
- PerNs :: macros ( mac, v, import. and_then ( ImportOrExternCrate :: into_import ) )
883
+ PerNs :: macros ( mac, v, import. and_then ( ImportOrExternCrate :: import_or_glob ) )
882
884
}
883
885
}
884
886
}
0 commit comments