1- use super :: { Nest , ParamList , ResultList , WorldOrInterface } ;
1+ use super :: { ParamList , ResultList , WorldOrInterface } ;
22use crate :: ast:: toposort:: toposort;
3- use crate :: ast:: InterfaceItem ;
3+ use crate :: ast:: { InterfaceItem , UsePath } ;
44use crate :: * ;
55use anyhow:: bail;
66use std:: collections:: { HashMap , HashSet } ;
@@ -176,8 +176,12 @@ impl<'a> Resolver<'a> {
176176 match item {
177177 ast:: AstItem :: Interface ( iface) => {
178178 for item in & iface. items {
179- if let InterfaceItem :: Nest ( n) = item {
180- let id = match self . ast_items [ i] [ n. name . name ] {
179+ if let InterfaceItem :: Nest ( ast:: Nest {
180+ from : UsePath :: Package { id, name } ,
181+ ..
182+ } ) = item
183+ {
184+ let id = match self . ast_items [ i] [ name. name ] {
181185 AstItem :: Interface ( id) => id,
182186 AstItem :: World ( _) => unreachable ! ( ) ,
183187 } ;
@@ -302,30 +306,6 @@ impl<'a> Resolver<'a> {
302306 Ok ( ( ) )
303307 } )
304308 . unwrap ( ) ;
305- decl_list
306- . for_each_nest ( |nest : & Nest | {
307- let deps = foreign_deps
308- . entry ( nest. id . package_name ( ) )
309- . or_insert_with ( || {
310- self . foreign_dep_spans . push ( nest. id . span ) ;
311- IndexMap :: new ( )
312- } ) ;
313- let id = * deps. entry ( nest. name . name ) . or_insert_with ( || {
314- log:: trace!(
315- "creating an interface for foreign dep: {}/{}" ,
316- nest. id. package_name( ) ,
317- nest. name. name
318- ) ;
319-
320- AstItem :: Interface ( self . alloc_interface ( nest. name . span ) )
321- } ) ;
322- match id {
323- AstItem :: Interface ( id) => foreign_interfaces. insert ( id) ,
324- AstItem :: World ( _) => unreachable ! ( ) ,
325- } ;
326- Ok ( ( ) )
327- } )
328- . unwrap ( ) ;
329309 }
330310 self . foreign_deps = foreign_deps;
331311 self . foreign_interfaces = foreign_interfaces;
@@ -400,16 +380,20 @@ impl<'a> Resolver<'a> {
400380 let prev = names. insert ( i. name . name , item) ;
401381 assert ! ( prev. is_none( ) ) ;
402382 for nest_item in i. items . iter ( ) {
403- if let InterfaceItem :: Nest ( n) = nest_item {
404- if package_items. insert ( n. name . name , n. name . span ) . is_some ( ) {
383+ if let InterfaceItem :: Nest ( ast:: Nest {
384+ from : UsePath :: Package { id, name } ,
385+ ..
386+ } ) = nest_item
387+ {
388+ if package_items. insert ( name. name , name. span ) . is_some ( ) {
405389 bail ! ( Error :: new(
406- n . name. span,
407- format!( "duplicate item named `{}`" , n . name. name) ,
390+ name. span,
391+ format!( "duplicate item named `{}`" , name. name) ,
408392 ) )
409393 }
410- let prev = decl_list_ns. insert ( n . name . name , ( ) ) ;
394+ let prev = decl_list_ns. insert ( name. name , ( ) ) ;
411395 assert ! ( prev. is_none( ) ) ;
412- let prev = order. insert ( n . name . name , Vec :: new ( ) ) ;
396+ let prev = order. insert ( name. name , Vec :: new ( ) ) ;
413397 assert ! ( prev. is_none( ) ) ;
414398 }
415399 }
@@ -507,27 +491,6 @@ impl<'a> Resolver<'a> {
507491 }
508492 Ok ( ( ) )
509493 } ) ?;
510- decl_list. for_each_nest ( |nest : & Nest | {
511- match decl_list_ns. get ( nest. name . name ) {
512- Some ( ( _, ItemSource :: Foreign ) ) => return Ok ( ( ) ) ,
513- Some ( ( _, ItemSource :: Local ( id) ) ) => {
514- order[ nest. name . name ] . push ( id. clone ( ) ) ;
515- }
516- None => match package_items. get ( nest. name . name ) {
517- Some ( _) => { }
518- None => {
519- bail ! ( Error :: new(
520- nest. name. span,
521- format!(
522- "interface or world `{name}` not found in package" ,
523- name = nest. name. name
524- ) ,
525- ) )
526- }
527- } ,
528- }
529- Ok ( ( ) )
530- } ) ?;
531494 }
532495
533496 let order = toposort ( "interface or world" , & order) ?;
@@ -545,51 +508,60 @@ impl<'a> Resolver<'a> {
545508 let id = self . alloc_interface ( package_items[ name] ) ;
546509 self . interfaces [ id] . name = Some ( name. to_string ( ) ) ;
547510 for item in & i. items {
548- if let InterfaceItem :: Nest ( n) = item {
511+ if let InterfaceItem :: Nest ( ast:: Nest {
512+ from :
513+ UsePath :: Package {
514+ id : package_id,
515+ name,
516+ } ,
517+ attributes,
518+ docs,
519+ } ) = item
520+ {
549521 let nest = self
550522 . foreign_deps
551523 . get ( & PackageName {
552- namespace : n . id . namespace . name . to_string ( ) ,
553- name : n . id . name . name . to_string ( ) ,
554- version : n . id . clone ( ) . version . map ( |v| v. 1 ) ,
524+ namespace : package_id . namespace . name . to_string ( ) ,
525+ name : package_id . name . name . to_string ( ) ,
526+ version : package_id . clone ( ) . version . map ( |v| v. 1 ) ,
555527 } )
556528 . unwrap ( )
557- . get ( & n . name . name )
529+ . get ( & name. name )
558530 . unwrap ( ) ;
559531 let nested_id = if let AstItem :: Interface ( id) = nest {
560532 id
561533 } else {
562534 bail ! ( "Expected interface item" )
563535 } ;
564- let stability = self . stability ( & n . attributes ) ?;
565- let docs = self . docs ( & n . docs ) ;
566- let name = if let Some ( v) = & n . id . version {
536+ let stability = self . stability ( attributes) ?;
537+ let docs = self . docs ( & docs) ;
538+ let full_name = if let Some ( v) = & package_id . version {
567539 format ! (
568540 "{}:{}/{}@{}" ,
569- n . id . namespace. name,
570- n . id . name. name,
571- n . name. name,
541+ package_id . namespace. name,
542+ package_id . name. name,
543+ name. name,
572544 v. 1 . to_string( )
573545 )
574546 } else {
575- format ! ( "{}/{}" , n . id . package_name( ) , n . name. name)
547+ format ! ( "{}/{}" , package_id . package_name( ) , name. name)
576548 } ;
549+
577550 self . interfaces [ id] . nested . insert (
578- // format!("{}/{}", n.id.package_name(), n.name.name.to_string()),
579- name,
551+ full_name. clone ( ) ,
580552 crate :: Nest {
581553 id : * nested_id,
582554 docs,
583555 stability,
584556 package_name : PackageName {
585- namespace : n . id . namespace . name . to_string ( ) ,
586- name : n . id . name . name . to_string ( ) ,
587- version : n . id . version . as_ref ( ) . map ( |v| v. 1 . clone ( ) ) ,
557+ namespace : package_id . namespace . name . to_string ( ) ,
558+ name : package_id . name . name . to_string ( ) ,
559+ version : package_id . version . as_ref ( ) . map ( |v| v. 1 . clone ( ) ) ,
588560 } ,
589- iface_name : n . name . name . to_string ( ) ,
561+ iface_name : name. name . to_string ( ) ,
590562 } ,
591563 ) ;
592- let prev = ids. insert ( n . name . name , AstItem :: Interface ( id) ) ;
564+ let prev = ids. insert ( name. name , AstItem :: Interface ( id) ) ;
593565 assert ! ( prev. is_none( ) ) ;
594566 }
595567 }
@@ -638,11 +610,15 @@ impl<'a> Resolver<'a> {
638610 }
639611 ast:: AstItem :: Interface ( i) => {
640612 for item in & i. items {
641- if let InterfaceItem :: Nest ( n) = item {
642- let iface_item = ids[ n. name . name ] ;
643- let prev = items. insert ( n. name . name , iface_item) ;
613+ if let InterfaceItem :: Nest ( ast:: Nest {
614+ from : UsePath :: Package { name, .. } ,
615+ ..
616+ } ) = item
617+ {
618+ let iface_item = ids[ name. name ] ;
619+ let prev = items. insert ( name. name , iface_item) ;
644620 assert ! ( prev. is_none( ) ) ;
645- let prev = self . package_items . insert ( n . name . name , iface_item) ;
621+ let prev = self . package_items . insert ( name. name , iface_item) ;
646622 assert ! ( prev. is_none( ) ) ;
647623 }
648624 }
@@ -716,7 +692,6 @@ impl<'a> Resolver<'a> {
716692
717693 Ok ( ( ) )
718694 } ) ?;
719- decl_list. for_each_nest ( |_nest| Ok ( ( ) ) ) ?;
720695 }
721696 Ok ( ( ) )
722697 }
0 commit comments