@@ -13,7 +13,7 @@ use flux_syntax::{
13
13
walk_list,
14
14
} ;
15
15
use hir:: { def:: DefKind , ItemKind } ;
16
- use rustc_data_structures:: { fx:: FxIndexSet , unord :: UnordMap } ;
16
+ use rustc_data_structures:: fx:: FxIndexSet ;
17
17
use rustc_errors:: { Diagnostic , ErrorGuaranteed } ;
18
18
use rustc_hash:: FxHashSet ;
19
19
use rustc_hir:: { self as hir, OwnerId } ;
@@ -104,7 +104,7 @@ pub(crate) struct RustItemCtxt<'a, 'genv, 'tcx> {
104
104
owner : MaybeExternId < OwnerId > ,
105
105
fn_sig_scope : Option < NodeId > ,
106
106
resolver_output : & ' genv ResolverOutput ,
107
- opaque_tys : Option < & ' a mut UnordMap < LocalDefId , fhir:: Item < ' genv > > > ,
107
+ opaque_tys : Option < & ' a mut Vec < & ' genv fhir:: OpaqueTy < ' genv > > > ,
108
108
}
109
109
110
110
struct FluxItemCtxt < ' genv , ' tcx > {
@@ -119,7 +119,7 @@ impl<'a, 'genv, 'tcx: 'genv> RustItemCtxt<'a, 'genv, 'tcx> {
119
119
genv : GlobalEnv < ' genv , ' tcx > ,
120
120
owner : MaybeExternId < OwnerId > ,
121
121
resolver_output : & ' genv ResolverOutput ,
122
- opaque_tys : Option < & ' a mut UnordMap < LocalDefId , fhir:: Item < ' genv > > > ,
122
+ opaque_tys : Option < & ' a mut Vec < & ' genv fhir:: OpaqueTy < ' genv > > > ,
123
123
) -> Self {
124
124
RustItemCtxt {
125
125
genv,
@@ -131,13 +131,6 @@ impl<'a, 'genv, 'tcx: 'genv> RustItemCtxt<'a, 'genv, 'tcx> {
131
131
}
132
132
}
133
133
134
- fn with_new_owner < ' b > (
135
- & ' b mut self ,
136
- owner : MaybeExternId < OwnerId > ,
137
- ) -> RustItemCtxt < ' b , ' genv , ' tcx > {
138
- RustItemCtxt :: new ( self . genv , owner, self . resolver_output , self . opaque_tys . as_deref_mut ( ) )
139
- }
140
-
141
134
fn as_lift_cx < ' b > ( & ' b mut self ) -> LiftCtxt < ' b , ' genv , ' tcx > {
142
135
LiftCtxt :: new ( self . genv , self . owner , & self . local_id_gen , self . opaque_tys . as_deref_mut ( ) )
143
136
}
@@ -248,10 +241,7 @@ impl<'a, 'genv, 'tcx: 'genv> RustItemCtxt<'a, 'genv, 'tcx> {
248
241
bounds : & [ surface:: TraitRef ] ,
249
242
) -> Result < fhir:: GenericBounds < ' genv > > {
250
243
try_alloc_slice ! ( self . genv, bounds, |bound| {
251
- Ok ( fhir:: GenericBound :: Trait (
252
- self . desugar_trait_ref( bound) ?,
253
- fhir:: TraitBoundModifier :: None ,
254
- ) )
244
+ Ok ( fhir:: GenericBound :: Trait ( self . desugar_trait_ref( bound) ?) )
255
245
} )
256
246
}
257
247
@@ -263,7 +253,12 @@ impl<'a, 'genv, 'tcx: 'genv> RustItemCtxt<'a, 'genv, 'tcx> {
263
253
span_bug ! ( trait_ref. path. span, "desugar_alias_reft: unexpected qpath" )
264
254
} ;
265
255
let span = path. span ;
266
- Ok ( fhir:: PolyTraitRef { bound_generic_params : & [ ] , trait_ref : path, span } )
256
+ Ok ( fhir:: PolyTraitRef {
257
+ bound_generic_params : & [ ] ,
258
+ modifiers : fhir:: TraitBoundModifier :: None ,
259
+ trait_ref : path,
260
+ span,
261
+ } )
267
262
}
268
263
269
264
fn desugar_refined_by (
@@ -638,21 +633,13 @@ impl<'a, 'genv, 'tcx: 'genv> RustItemCtxt<'a, 'genv, 'tcx> {
638
633
) -> Result < fhir:: Ty < ' genv > > {
639
634
match asyncness {
640
635
surface:: Async :: Yes { node_id, span } => {
641
- let item_id = self . resolver_output . impl_trait_res_map [ & node_id] ;
642
- let def_id = item_id. owner_id . def_id ;
643
- let res = Res :: Def ( DefKind :: OpaqueTy , def_id. to_def_id ( ) ) ;
644
-
636
+ let def_id = self . resolver_output . impl_trait_res_map [ & node_id] ;
645
637
// FIXME(nilehmann) since we can only pass local ids for opaque types it means we
646
638
// can't support extern specs with opaque types.
647
- let opaque_ty = self
648
- . with_new_owner ( MaybeExternId :: Local ( item_id. owner_id ) )
649
- . desugar_opaque_ty_for_async ( returns) ?;
650
- self . insert_opaque_ty ( item_id. owner_id . def_id , opaque_ty) ;
651
-
652
- let ( args, _) = self . desugar_generic_args ( res, & [ ] ) ?;
653
- let item_id = hir:: ItemId { owner_id : hir:: OwnerId { def_id } } ;
654
- let refine_args = self . implicit_params_to_args ( self . fn_sig_scope . unwrap ( ) ) ;
655
- let kind = fhir:: TyKind :: OpaqueDef ( item_id, args, refine_args, false ) ;
639
+ let opaque_ty = self . desugar_opaque_ty_for_async ( def_id, returns) ?;
640
+ let opaque_ty = self . insert_opaque_ty ( opaque_ty) ;
641
+
642
+ let kind = fhir:: TyKind :: OpaqueDef ( opaque_ty) ;
656
643
Ok ( fhir:: Ty { kind, span } )
657
644
}
658
645
surface:: Async :: No => Ok ( self . desugar_fn_ret_ty ( returns) ?) ,
@@ -661,11 +648,10 @@ impl<'a, 'genv, 'tcx: 'genv> RustItemCtxt<'a, 'genv, 'tcx> {
661
648
662
649
fn desugar_opaque_ty_for_async (
663
650
& mut self ,
651
+ def_id : LocalDefId ,
664
652
returns : & surface:: FnRetTy ,
665
- ) -> Result < fhir:: Item < ' genv > > {
653
+ ) -> Result < fhir:: OpaqueTy < ' genv > > {
666
654
let output = self . desugar_fn_ret_ty ( returns) ?;
667
- // Does this opaque type have any generics?
668
- let generics = self . as_lift_cx ( ) . lift_generics ( ) ?;
669
655
let trait_ref = self . make_lang_item_path (
670
656
hir:: LangItem :: Future ,
671
657
DUMMY_SP ,
@@ -675,13 +661,17 @@ impl<'a, 'genv, 'tcx: 'genv> RustItemCtxt<'a, 'genv, 'tcx> {
675
661
kind : fhir:: AssocItemConstraintKind :: Equality { term : output } ,
676
662
} ] ) ,
677
663
) ;
678
- let bound = fhir:: GenericBound :: Trait (
679
- fhir:: PolyTraitRef { bound_generic_params : & [ ] , trait_ref, span : trait_ref. span } ,
680
- fhir:: TraitBoundModifier :: None ,
681
- ) ;
682
- let opaque_ty = fhir:: OpaqueTy { bounds : self . genv . alloc_slice ( & [ bound] ) } ;
683
-
684
- Ok ( fhir:: Item { generics, kind : fhir:: ItemKind :: OpaqueTy ( opaque_ty) , owner_id : self . owner } )
664
+ let bound = fhir:: GenericBound :: Trait ( fhir:: PolyTraitRef {
665
+ bound_generic_params : & [ ] ,
666
+ modifiers : fhir:: TraitBoundModifier :: None ,
667
+ trait_ref,
668
+ span : trait_ref. span ,
669
+ } ) ;
670
+ let opaque_ty = fhir:: OpaqueTy {
671
+ def_id : MaybeExternId :: Local ( def_id) ,
672
+ bounds : self . genv . alloc_slice ( & [ bound] ) ,
673
+ } ;
674
+ Ok ( opaque_ty)
685
675
}
686
676
687
677
fn make_lang_item_path (
@@ -719,12 +709,12 @@ impl<'a, 'genv, 'tcx: 'genv> RustItemCtxt<'a, 'genv, 'tcx> {
719
709
720
710
fn desugar_opaque_ty_for_impl_trait (
721
711
& mut self ,
712
+ def_id : LocalDefId ,
722
713
bounds : & [ surface:: TraitRef ] ,
723
- ) -> Result < fhir:: Item < ' genv > > {
724
- let generics = self . as_lift_cx ( ) . lift_generics ( ) ?;
714
+ ) -> Result < fhir:: OpaqueTy < ' genv > > {
725
715
let bounds = self . desugar_generic_bounds ( bounds) ?;
726
- let opaque_ty = fhir:: OpaqueTy { bounds } ;
727
- Ok ( fhir :: Item { generics , kind : fhir :: ItemKind :: OpaqueTy ( opaque_ty) , owner_id : self . owner } )
716
+ let opaque_ty = fhir:: OpaqueTy { def_id : MaybeExternId :: Local ( def_id ) , bounds } ;
717
+ Ok ( opaque_ty)
728
718
}
729
719
730
720
fn desugar_variant_ret (
@@ -772,11 +762,16 @@ impl<'a, 'genv, 'tcx: 'genv> RustItemCtxt<'a, 'genv, 'tcx> {
772
762
Some ( resolved_id)
773
763
}
774
764
775
- fn insert_opaque_ty ( & mut self , def_id : LocalDefId , opaque_ty : fhir:: Item < ' genv > ) {
765
+ fn insert_opaque_ty (
766
+ & mut self ,
767
+ opaque_ty : fhir:: OpaqueTy < ' genv > ,
768
+ ) -> & ' genv fhir:: OpaqueTy < ' genv > {
769
+ let opaque_ty = self . genv . alloc ( opaque_ty) ;
776
770
self . opaque_tys
777
771
. as_mut ( )
778
- . unwrap_or_else ( || bug ! ( "`impl Trait` not supported in this item {def_id:?}" ) )
779
- . insert ( def_id, opaque_ty) ;
772
+ . unwrap_or_else ( || bug ! ( "`impl Trait` not supported in this item `{:?}`" , self . owner) )
773
+ . push ( opaque_ty) ;
774
+ opaque_ty
780
775
}
781
776
782
777
#[ track_caller]
@@ -897,27 +892,6 @@ trait DesugarCtxt<'genv, 'tcx: 'genv> {
897
892
} )
898
893
}
899
894
900
- fn implicit_params_to_args ( & self , scope : NodeId ) -> & ' genv [ fhir:: Expr < ' genv > ] {
901
- self . genv ( )
902
- . alloc_slice_fill_iter (
903
- self . resolve_implicit_params ( scope)
904
- . map ( |( ident, id, kind) | {
905
- let span = ident. span ;
906
- let path = fhir:: PathExpr {
907
- segments : self . genv ( ) . alloc_slice ( & [ ident] ) ,
908
- res : ExprRes :: Param ( kind, id) ,
909
- fhir_id : self . next_fhir_id ( ) ,
910
- span : ident. span ,
911
- } ;
912
- fhir:: Expr {
913
- kind : fhir:: ExprKind :: Var ( path, Some ( kind) ) ,
914
- fhir_id : self . next_fhir_id ( ) ,
915
- span,
916
- }
917
- } ) ,
918
- )
919
- }
920
-
921
895
fn desugar_refine_params (
922
896
& self ,
923
897
params : & [ surface:: RefineParam ] ,
@@ -1512,7 +1486,7 @@ fn desugar_base_sort<'genv>(
1512
1486
}
1513
1487
}
1514
1488
1515
- impl < ' a , ' genv , ' tcx > DesugarCtxt < ' genv , ' tcx > for RustItemCtxt < ' a , ' genv , ' tcx > {
1489
+ impl < ' genv , ' tcx > DesugarCtxt < ' genv , ' tcx > for RustItemCtxt < ' _ , ' genv , ' tcx > {
1516
1490
fn next_fhir_id ( & self ) -> FhirId {
1517
1491
FhirId {
1518
1492
owner : FluxOwnerId :: Rust ( self . owner . local_id ( ) ) ,
@@ -1533,20 +1507,14 @@ impl<'a, 'genv, 'tcx> DesugarCtxt<'genv, 'tcx> for RustItemCtxt<'a, 'genv, 'tcx>
1533
1507
node_id : NodeId ,
1534
1508
bounds : & [ surface:: TraitRef ] ,
1535
1509
) -> Result < fhir:: TyKind < ' genv > > {
1536
- let item_id = self . resolver_output ( ) . impl_trait_res_map [ & node_id] ;
1537
- let def_id = item_id. owner_id . def_id ;
1538
- let res = Res :: Def ( DefKind :: OpaqueTy , def_id. to_def_id ( ) ) ;
1510
+ let def_id = self . resolver_output ( ) . impl_trait_res_map [ & node_id] ;
1539
1511
1540
1512
// FIXME(nilehmann) since we can only pass local ids for opaque types it means we can't
1541
1513
// support extern specs with opaque types.
1542
- let opaque_ty = self
1543
- . with_new_owner ( MaybeExternId :: Local ( item_id. owner_id ) )
1544
- . desugar_opaque_ty_for_impl_trait ( bounds) ?;
1545
- self . insert_opaque_ty ( def_id, opaque_ty) ;
1546
-
1547
- let ( args, _) = self . desugar_generic_args ( res, & [ ] ) ?;
1548
- let refine_args = self . implicit_params_to_args ( self . fn_sig_scope . unwrap ( ) ) ;
1549
- Ok ( fhir:: TyKind :: OpaqueDef ( item_id, args, refine_args, false ) )
1514
+ let opaque_ty = self . desugar_opaque_ty_for_impl_trait ( def_id, bounds) ?;
1515
+ let opaque_ty = self . insert_opaque_ty ( opaque_ty) ;
1516
+
1517
+ Ok ( fhir:: TyKind :: OpaqueDef ( opaque_ty) )
1550
1518
}
1551
1519
}
1552
1520
0 commit comments