1
- use super :: { Nest , ParamList , ResultList , WorldOrInterface } ;
1
+ use super :: { ParamList , ResultList , WorldOrInterface } ;
2
2
use crate :: ast:: toposort:: toposort;
3
- use crate :: ast:: InterfaceItem ;
3
+ use crate :: ast:: { InterfaceItem , UsePath } ;
4
4
use crate :: * ;
5
5
use anyhow:: bail;
6
6
use std:: collections:: { HashMap , HashSet } ;
@@ -176,8 +176,12 @@ impl<'a> Resolver<'a> {
176
176
match item {
177
177
ast:: AstItem :: Interface ( iface) => {
178
178
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 { name, .. } ,
181
+ ..
182
+ } ) = item
183
+ {
184
+ let id = match self . ast_items [ i] [ name. name ] {
181
185
AstItem :: Interface ( id) => id,
182
186
AstItem :: World ( _) => unreachable ! ( ) ,
183
187
} ;
@@ -302,30 +306,6 @@ impl<'a> Resolver<'a> {
302
306
Ok ( ( ) )
303
307
} )
304
308
. 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 ( ) ;
329
309
}
330
310
self . foreign_deps = foreign_deps;
331
311
self . foreign_interfaces = foreign_interfaces;
@@ -400,16 +380,20 @@ impl<'a> Resolver<'a> {
400
380
let prev = names. insert ( i. name . name , item) ;
401
381
assert ! ( prev. is_none( ) ) ;
402
382
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 { name, .. } ,
385
+ ..
386
+ } ) = nest_item
387
+ {
388
+ if package_items. insert ( name. name , name. span ) . is_some ( ) {
405
389
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) ,
408
392
) )
409
393
}
410
- let prev = decl_list_ns. insert ( n . name . name , ( ) ) ;
394
+ let prev = decl_list_ns. insert ( name. name , ( ) ) ;
411
395
assert ! ( prev. is_none( ) ) ;
412
- let prev = order. insert ( n . name . name , Vec :: new ( ) ) ;
396
+ let prev = order. insert ( name. name , Vec :: new ( ) ) ;
413
397
assert ! ( prev. is_none( ) ) ;
414
398
}
415
399
}
@@ -507,27 +491,6 @@ impl<'a> Resolver<'a> {
507
491
}
508
492
Ok ( ( ) )
509
493
} ) ?;
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
- } ) ?;
531
494
}
532
495
533
496
let order = toposort ( "interface or world" , & order) ?;
@@ -545,51 +508,60 @@ impl<'a> Resolver<'a> {
545
508
let id = self . alloc_interface ( package_items[ name] ) ;
546
509
self . interfaces [ id] . name = Some ( name. to_string ( ) ) ;
547
510
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
+ {
549
521
let nest = self
550
522
. foreign_deps
551
523
. 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 ) ,
555
527
} )
556
528
. unwrap ( )
557
- . get ( & n . name . name )
529
+ . get ( & name. name )
558
530
. unwrap ( ) ;
559
531
let nested_id = if let AstItem :: Interface ( id) = nest {
560
532
id
561
533
} else {
562
534
bail ! ( "Expected interface item" )
563
535
} ;
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 {
567
539
format ! (
568
540
"{}:{}/{}@{}" ,
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,
572
544
v. 1 . to_string( )
573
545
)
574
546
} else {
575
- format ! ( "{}/{}" , n . id . package_name( ) , n . name. name)
547
+ format ! ( "{}/{}" , package_id . package_name( ) , name. name)
576
548
} ;
549
+
577
550
self . interfaces [ id] . nested . insert (
578
- // format!("{}/{}", n.id.package_name(), n.name.name.to_string()),
579
- name,
551
+ full_name. clone ( ) ,
580
552
crate :: Nest {
581
553
id : * nested_id,
582
554
docs,
583
555
stability,
584
556
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 ( ) ) ,
588
560
} ,
589
- iface_name : n . name . name . to_string ( ) ,
561
+ iface_name : name. name . to_string ( ) ,
590
562
} ,
591
563
) ;
592
- let prev = ids. insert ( n . name . name , AstItem :: Interface ( id) ) ;
564
+ let prev = ids. insert ( name. name , AstItem :: Interface ( id) ) ;
593
565
assert ! ( prev. is_none( ) ) ;
594
566
}
595
567
}
@@ -638,11 +610,15 @@ impl<'a> Resolver<'a> {
638
610
}
639
611
ast:: AstItem :: Interface ( i) => {
640
612
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) ;
644
620
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) ;
646
622
assert ! ( prev. is_none( ) ) ;
647
623
}
648
624
}
@@ -716,7 +692,6 @@ impl<'a> Resolver<'a> {
716
692
717
693
Ok ( ( ) )
718
694
} ) ?;
719
- decl_list. for_each_nest ( |_nest| Ok ( ( ) ) ) ?;
720
695
}
721
696
Ok ( ( ) )
722
697
}
0 commit comments