@@ -1848,6 +1848,19 @@ package {name} is defined in two different locations:\n\
18481848 } )
18491849 }
18501850
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+
18511864 /// Performs the "elaboration process" necessary for the `world_id`
18521865 /// specified to ensure that all of its transitive imports are listed.
18531866 ///
@@ -2625,12 +2638,6 @@ impl Remap {
26252638 resolve : & mut Resolve ,
26262639 unresolved : UnresolvedPackage ,
26272640 ) -> 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-
26342641 let pkgid = resolve. packages . alloc ( Package {
26352642 name : unresolved. name . clone ( ) ,
26362643 docs : unresolved. docs . clone ( ) ,
@@ -2640,6 +2647,12 @@ impl Remap {
26402647 let prev = resolve. package_names . insert ( unresolved. name . clone ( ) , pkgid) ;
26412648 assert ! ( prev. is_none( ) ) ;
26422649
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+
26432656 // Copy over all types first, updating any intra-type references. Note
26442657 // that types are sorted topologically which means this iteration
26452658 // order should be sufficient. Also note though that the interface
@@ -2652,16 +2665,7 @@ impl Remap {
26522665 . zip ( & unresolved. type_spans )
26532666 . skip ( foreign_types)
26542667 {
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) ? {
26652669 self . types . push ( None ) ;
26662670 continue ;
26672671 }
@@ -2838,6 +2842,7 @@ impl Remap {
28382842 fn process_foreign_deps (
28392843 & mut self ,
28402844 resolve : & mut Resolve ,
2845+ pkgid : PackageId ,
28412846 unresolved : & UnresolvedPackage ,
28422847 ) -> Result < ( ) > {
28432848 // Invert the `foreign_deps` map to be keyed by world id to get
@@ -2877,7 +2882,7 @@ impl Remap {
28772882
28782883 // Finally, iterate over all foreign-defined types and determine
28792884 // what they map to.
2880- self . process_foreign_types ( unresolved, resolve) ?;
2885+ self . process_foreign_types ( unresolved, pkgid , resolve) ?;
28812886
28822887 for ( id, span) in unresolved. required_resource_types . iter ( ) {
28832888 let mut id = self . map_type ( * id, Some ( * span) ) ?;
@@ -2988,16 +2993,25 @@ impl Remap {
29882993 fn process_foreign_types (
29892994 & mut self ,
29902995 unresolved : & UnresolvedPackage ,
2996+ pkgid : PackageId ,
29912997 resolve : & mut Resolve ,
29922998 ) -> 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+ {
29943002 // All "Unknown" types should appear first so once we're no longer
29953003 // in unknown territory it's package-defined types so break out of
29963004 // this loop.
29973005 match unresolved_ty. kind {
29983006 TypeDefKind :: Unknown => { }
29993007 _ => break ,
30003008 }
3009+
3010+ if !resolve. include_type ( unresolved_ty, pkgid, * span) ? {
3011+ self . types . push ( None ) ;
3012+ continue ;
3013+ }
3014+
30013015 let unresolved_iface_id = match unresolved_ty. owner {
30023016 TypeOwner :: Interface ( id) => id,
30033017 _ => unreachable ! ( ) ,
0 commit comments