@@ -54,7 +54,7 @@ use rustc_hir::def_id::{DefId, DefIdMap, LocalDefId, CRATE_DEF_INDEX};
54
54
use rustc_hir:: definitions:: { DefKey , DefPathData , Definitions } ;
55
55
use rustc_hir:: intravisit;
56
56
use rustc_hir:: { ConstArg , GenericArg , ParamName } ;
57
- use rustc_index:: vec:: IndexVec ;
57
+ use rustc_index:: vec:: { Idx , IndexVec } ;
58
58
use rustc_session:: config:: nightly_options;
59
59
use rustc_session:: lint:: { builtin:: BARE_TRAIT_OBJECTS , BuiltinLintDiagnostics , LintBuffer } ;
60
60
use rustc_session:: parse:: ParseSess ;
@@ -205,6 +205,19 @@ pub trait Resolver {
205
205
fn next_node_id ( & mut self ) -> NodeId ;
206
206
207
207
fn trait_map ( & self ) -> & NodeMap < Vec < hir:: TraitCandidate > > ;
208
+
209
+ fn opt_local_def_id ( & self , node : NodeId ) -> Option < LocalDefId > ;
210
+
211
+ fn local_def_id ( & self , node : NodeId ) -> LocalDefId ;
212
+
213
+ fn create_def (
214
+ & mut self ,
215
+ parent : LocalDefId ,
216
+ node_id : ast:: NodeId ,
217
+ data : DefPathData ,
218
+ expn_id : ExpnId ,
219
+ span : Span ,
220
+ ) -> LocalDefId ;
208
221
}
209
222
210
223
type NtToTokenstream = fn ( & Nonterminal , & ParseSess , Span ) -> TokenStream ;
@@ -436,7 +449,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
436
449
match tree. kind {
437
450
UseTreeKind :: Simple ( _, id1, id2) => {
438
451
for & id in & [ id1, id2] {
439
- self . lctx . resolver . definitions ( ) . create_def_with_parent (
452
+ self . lctx . resolver . create_def (
440
453
owner,
441
454
id,
442
455
DefPathData :: Misc ,
@@ -488,7 +501,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
488
501
| ItemKind :: Enum ( _, ref generics)
489
502
| ItemKind :: TyAlias ( _, ref generics, ..)
490
503
| ItemKind :: Trait ( _, _, ref generics, ..) => {
491
- let def_id = self . lctx . resolver . definitions ( ) . local_def_id ( item. id ) ;
504
+ let def_id = self . lctx . resolver . local_def_id ( item. id ) ;
492
505
let count = generics
493
506
. params
494
507
. iter ( )
@@ -564,7 +577,18 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
564
577
. map ( |( & k, v) | ( self . node_id_to_hir_id [ k] . unwrap ( ) , v. clone ( ) ) )
565
578
. collect ( ) ;
566
579
567
- self . resolver . definitions ( ) . init_node_id_to_hir_id_mapping ( self . node_id_to_hir_id ) ;
580
+ let mut def_id_to_hir_id = IndexVec :: default ( ) ;
581
+
582
+ for ( node_id, hir_id) in self . node_id_to_hir_id . into_iter_enumerated ( ) {
583
+ if let Some ( def_id) = self . resolver . opt_local_def_id ( node_id) {
584
+ if def_id_to_hir_id. len ( ) <= def_id. index ( ) {
585
+ def_id_to_hir_id. resize ( def_id. index ( ) + 1 , None ) ;
586
+ }
587
+ def_id_to_hir_id[ def_id] = hir_id;
588
+ }
589
+ }
590
+
591
+ self . resolver . definitions ( ) . init_def_id_to_hir_id_mapping ( def_id_to_hir_id) ;
568
592
569
593
hir:: Crate {
570
594
item : hir:: CrateItem { module, attrs, span : c. span } ,
@@ -628,7 +652,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
628
652
. item_local_id_counters
629
653
. insert ( owner, HIR_ID_COUNTER_LOCKED )
630
654
. unwrap_or_else ( || panic ! ( "no `item_local_id_counters` entry for {:?}" , owner) ) ;
631
- let def_id = self . resolver . definitions ( ) . local_def_id ( owner) ;
655
+ let def_id = self . resolver . local_def_id ( owner) ;
632
656
self . current_hir_id_owner . push ( ( def_id, counter) ) ;
633
657
let ret = f ( self ) ;
634
658
let ( new_def_id, new_counter) = self . current_hir_id_owner . pop ( ) . unwrap ( ) ;
@@ -671,8 +695,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
671
695
debug_assert ! ( local_id != HIR_ID_COUNTER_LOCKED ) ;
672
696
673
697
* local_id_counter += 1 ;
674
- let owner = this. resolver . definitions ( ) . opt_local_def_id ( owner) . expect (
675
- "you forgot to call `create_def_with_parent ` or are lowering node-IDs \
698
+ let owner = this. resolver . opt_local_def_id ( owner) . expect (
699
+ "you forgot to call `create_def ` or are lowering node-IDs \
676
700
that do not belong to the current owner",
677
701
) ;
678
702
@@ -800,7 +824,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
800
824
} ;
801
825
802
826
// Add a definition for the in-band lifetime def.
803
- self . resolver . definitions ( ) . create_def_with_parent (
827
+ self . resolver . create_def (
804
828
parent_def_id,
805
829
node_id,
806
830
DefPathData :: LifetimeNs ( str_name) ,
@@ -1088,7 +1112,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1088
1112
1089
1113
let impl_trait_node_id = self . resolver . next_node_id ( ) ;
1090
1114
let parent_def_id = self . current_hir_id_owner . last ( ) . unwrap ( ) . 0 ;
1091
- self . resolver . definitions ( ) . create_def_with_parent (
1115
+ self . resolver . create_def (
1092
1116
parent_def_id,
1093
1117
impl_trait_node_id,
1094
1118
DefPathData :: ImplTrait ,
@@ -1154,7 +1178,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1154
1178
let node_id = self . resolver . next_node_id ( ) ;
1155
1179
1156
1180
// Add a definition for the in-band const def.
1157
- self . resolver . definitions ( ) . create_def_with_parent (
1181
+ self . resolver . create_def (
1158
1182
parent_def_id,
1159
1183
node_id,
1160
1184
DefPathData :: AnonConst ,
@@ -1339,7 +1363,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1339
1363
}
1340
1364
ImplTraitContext :: Universal ( in_band_ty_params) => {
1341
1365
// Add a definition for the in-band `Param`.
1342
- let def_id = self . resolver . definitions ( ) . local_def_id ( def_node_id) ;
1366
+ let def_id = self . resolver . local_def_id ( def_node_id) ;
1343
1367
1344
1368
let hir_bounds = self . lower_param_bounds (
1345
1369
bounds,
@@ -1428,7 +1452,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1428
1452
// frequently opened issues show.
1429
1453
let opaque_ty_span = self . mark_span_with_reason ( DesugaringKind :: OpaqueTy , span, None ) ;
1430
1454
1431
- let opaque_ty_def_id = self . resolver . definitions ( ) . local_def_id ( opaque_ty_node_id) ;
1455
+ let opaque_ty_def_id = self . resolver . local_def_id ( opaque_ty_node_id) ;
1432
1456
1433
1457
self . allocate_hir_id_counter ( opaque_ty_node_id) ;
1434
1458
@@ -1620,7 +1644,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1620
1644
let def_node_id = self . context . resolver . next_node_id ( ) ;
1621
1645
let hir_id =
1622
1646
self . context . lower_node_id_with_owner ( def_node_id, self . opaque_ty_id ) ;
1623
- self . context . resolver . definitions ( ) . create_def_with_parent (
1647
+ self . context . resolver . create_def (
1624
1648
self . parent ,
1625
1649
def_node_id,
1626
1650
DefPathData :: LifetimeNs ( name. ident ( ) . name ) ,
@@ -1870,7 +1894,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1870
1894
1871
1895
let opaque_ty_span = self . mark_span_with_reason ( DesugaringKind :: Async , span, None ) ;
1872
1896
1873
- let opaque_ty_def_id = self . resolver . definitions ( ) . local_def_id ( opaque_ty_node_id) ;
1897
+ let opaque_ty_def_id = self . resolver . local_def_id ( opaque_ty_node_id) ;
1874
1898
1875
1899
self . allocate_hir_id_counter ( opaque_ty_node_id) ;
1876
1900
0 commit comments