@@ -1848,6 +1848,19 @@ package {name} is defined in two different locations:\n\
1848
1848
} )
1849
1849
}
1850
1850
1851
+ /// Convenience wrapper around `include_stability` specialized for types
1852
+ /// with a more targeted error message.
1853
+ fn include_type ( & self , ty : & TypeDef , pkgid : PackageId , span : Span ) -> Result < bool > {
1854
+ self . include_stability ( & ty. stability , & pkgid, Some ( span) )
1855
+ . with_context ( || {
1856
+ format ! (
1857
+ "failed to process feature gate for type [{}] in package [{}]" ,
1858
+ ty. name. as_ref( ) . map( String :: as_str) . unwrap_or( "<unknown>" ) ,
1859
+ self . packages[ pkgid] . name,
1860
+ )
1861
+ } )
1862
+ }
1863
+
1851
1864
/// Performs the "elaboration process" necessary for the `world_id`
1852
1865
/// specified to ensure that all of its transitive imports are listed.
1853
1866
///
@@ -2625,12 +2638,6 @@ impl Remap {
2625
2638
resolve : & mut Resolve ,
2626
2639
unresolved : UnresolvedPackage ,
2627
2640
) -> Result < PackageId > {
2628
- self . process_foreign_deps ( resolve, & unresolved) ?;
2629
-
2630
- let foreign_types = self . types . len ( ) ;
2631
- let foreign_interfaces = self . interfaces . len ( ) ;
2632
- let foreign_worlds = self . worlds . len ( ) ;
2633
-
2634
2641
let pkgid = resolve. packages . alloc ( Package {
2635
2642
name : unresolved. name . clone ( ) ,
2636
2643
docs : unresolved. docs . clone ( ) ,
@@ -2640,6 +2647,12 @@ impl Remap {
2640
2647
let prev = resolve. package_names . insert ( unresolved. name . clone ( ) , pkgid) ;
2641
2648
assert ! ( prev. is_none( ) ) ;
2642
2649
2650
+ self . process_foreign_deps ( resolve, pkgid, & unresolved) ?;
2651
+
2652
+ let foreign_types = self . types . len ( ) ;
2653
+ let foreign_interfaces = self . interfaces . len ( ) ;
2654
+ let foreign_worlds = self . worlds . len ( ) ;
2655
+
2643
2656
// Copy over all types first, updating any intra-type references. Note
2644
2657
// that types are sorted topologically which means this iteration
2645
2658
// order should be sufficient. Also note though that the interface
@@ -2652,16 +2665,7 @@ impl Remap {
2652
2665
. zip ( & unresolved. type_spans )
2653
2666
. skip ( foreign_types)
2654
2667
{
2655
- if !resolve
2656
- . include_stability ( & ty. stability , & pkgid, Some ( * span) )
2657
- . with_context ( || {
2658
- format ! (
2659
- "failed to process feature gate for type [{}] in package [{}]" ,
2660
- ty. name. as_ref( ) . map( String :: as_str) . unwrap_or( "<unknown>" ) ,
2661
- resolve. packages[ pkgid] . name,
2662
- )
2663
- } ) ?
2664
- {
2668
+ if !resolve. include_type ( & ty, pkgid, * span) ? {
2665
2669
self . types . push ( None ) ;
2666
2670
continue ;
2667
2671
}
@@ -2838,6 +2842,7 @@ impl Remap {
2838
2842
fn process_foreign_deps (
2839
2843
& mut self ,
2840
2844
resolve : & mut Resolve ,
2845
+ pkgid : PackageId ,
2841
2846
unresolved : & UnresolvedPackage ,
2842
2847
) -> Result < ( ) > {
2843
2848
// Invert the `foreign_deps` map to be keyed by world id to get
@@ -2877,7 +2882,7 @@ impl Remap {
2877
2882
2878
2883
// Finally, iterate over all foreign-defined types and determine
2879
2884
// what they map to.
2880
- self . process_foreign_types ( unresolved, resolve) ?;
2885
+ self . process_foreign_types ( unresolved, pkgid , resolve) ?;
2881
2886
2882
2887
for ( id, span) in unresolved. required_resource_types . iter ( ) {
2883
2888
let mut id = self . map_type ( * id, Some ( * span) ) ?;
@@ -2988,16 +2993,25 @@ impl Remap {
2988
2993
fn process_foreign_types (
2989
2994
& mut self ,
2990
2995
unresolved : & UnresolvedPackage ,
2996
+ pkgid : PackageId ,
2991
2997
resolve : & mut Resolve ,
2992
2998
) -> Result < ( ) , anyhow:: Error > {
2993
- for ( unresolved_type_id, unresolved_ty) in unresolved. types . iter ( ) {
2999
+ for ( ( unresolved_type_id, unresolved_ty) , span) in
3000
+ unresolved. types . iter ( ) . zip ( & unresolved. type_spans )
3001
+ {
2994
3002
// All "Unknown" types should appear first so once we're no longer
2995
3003
// in unknown territory it's package-defined types so break out of
2996
3004
// this loop.
2997
3005
match unresolved_ty. kind {
2998
3006
TypeDefKind :: Unknown => { }
2999
3007
_ => break ,
3000
3008
}
3009
+
3010
+ if !resolve. include_type ( unresolved_ty, pkgid, * span) ? {
3011
+ self . types . push ( None ) ;
3012
+ continue ;
3013
+ }
3014
+
3001
3015
let unresolved_iface_id = match unresolved_ty. owner {
3002
3016
TypeOwner :: Interface ( id) => id,
3003
3017
_ => unreachable ! ( ) ,
0 commit comments