1
- use super :: { ParamList , ResultList , WorldOrInterface } ;
1
+ use super :: {
2
+ // AstItem as RootAstItem, Interface as RootInterface,
3
+ Nest ,
4
+ ParamList ,
5
+ ResultList ,
6
+ WorldOrInterface ,
7
+ } ;
2
8
use crate :: ast:: toposort:: toposort;
9
+ use crate :: ast:: InterfaceItem ;
3
10
use crate :: * ;
4
11
use anyhow:: bail;
5
12
use std:: collections:: { HashMap , HashSet } ;
@@ -100,9 +107,11 @@ enum Key {
100
107
101
108
enum TypeItem < ' a , ' b > {
102
109
Use ( & ' b ast:: Use < ' a > ) ,
110
+ Nest ( & ' b ast:: Nest < ' a > ) ,
103
111
Def ( & ' b ast:: TypeDef < ' a > ) ,
104
112
}
105
113
114
+ #[ derive( Debug ) ]
106
115
enum TypeOrItem {
107
116
Type ( TypeId ) ,
108
117
Item ( & ' static str ) ,
@@ -174,6 +183,15 @@ impl<'a> Resolver<'a> {
174
183
for item in decl_list. items . iter ( ) {
175
184
match item {
176
185
ast:: AstItem :: Interface ( iface) => {
186
+ for item in & iface. items {
187
+ if let InterfaceItem :: Nest ( n) = item {
188
+ let id = match self . ast_items [ i] [ n. name . name ] {
189
+ AstItem :: Interface ( id) => id,
190
+ AstItem :: World ( _) => unreachable ! ( ) ,
191
+ } ;
192
+ iface_id_to_ast. insert ( id, ( iface, i) ) ;
193
+ }
194
+ }
177
195
let id = match self . ast_items [ i] [ iface. name . name ] {
178
196
AstItem :: Interface ( id) => id,
179
197
AstItem :: World ( _) => unreachable ! ( ) ,
@@ -292,6 +310,30 @@ impl<'a> Resolver<'a> {
292
310
Ok ( ( ) )
293
311
} )
294
312
. unwrap ( ) ;
313
+ decl_list
314
+ . for_each_nest ( |nest : & Nest | {
315
+ let deps = foreign_deps
316
+ . entry ( nest. id . package_name ( ) )
317
+ . or_insert_with ( || {
318
+ self . foreign_dep_spans . push ( nest. id . span ) ;
319
+ IndexMap :: new ( )
320
+ } ) ;
321
+ let id = * deps. entry ( nest. name . name ) . or_insert_with ( || {
322
+ log:: trace!(
323
+ "creating an interface for foreign dep: {}/{}" ,
324
+ nest. id. package_name( ) ,
325
+ nest. name. name
326
+ ) ;
327
+
328
+ AstItem :: Interface ( self . alloc_interface ( nest. name . span ) )
329
+ } ) ;
330
+ match id {
331
+ AstItem :: Interface ( id) => foreign_interfaces. insert ( id) ,
332
+ AstItem :: World ( _) => unreachable ! ( ) ,
333
+ } ;
334
+ Ok ( ( ) )
335
+ } )
336
+ . unwrap ( ) ;
295
337
}
296
338
self . foreign_deps = foreign_deps;
297
339
self . foreign_interfaces = foreign_interfaces;
@@ -306,6 +348,7 @@ impl<'a> Resolver<'a> {
306
348
} ) ;
307
349
self . interfaces . alloc ( Interface {
308
350
name : None ,
351
+ nested : IndexMap :: new ( ) ,
309
352
types : IndexMap :: new ( ) ,
310
353
docs : Docs :: default ( ) ,
311
354
stability : Default :: default ( ) ,
@@ -364,6 +407,28 @@ impl<'a> Resolver<'a> {
364
407
assert ! ( prev. is_none( ) ) ;
365
408
let prev = names. insert ( i. name . name , item) ;
366
409
assert ! ( prev. is_none( ) ) ;
410
+ for nestitem in i. items . iter ( ) {
411
+ if let InterfaceItem :: Nest ( n) = nestitem {
412
+ if package_items. insert ( n. name . name , n. name . span ) . is_some ( ) {
413
+ bail ! ( Error :: new(
414
+ n. name. span,
415
+ format!( "duplicate item named `{}`" , n. name. name) ,
416
+ ) )
417
+ }
418
+ let prev = decl_list_ns. insert ( n. name . name , ( ) ) ;
419
+ assert ! ( prev. is_none( ) ) ;
420
+ let prev = order. insert ( n. name . name , Vec :: new ( ) ) ;
421
+ assert ! ( prev. is_none( ) ) ;
422
+ // let i = RootAstItem::Interface(RootInterface {
423
+ // docs: Default::default(),
424
+ // attributes: vec![],
425
+ // name: n.name.clone(),
426
+ // items: vec![],
427
+ // });
428
+ // let prev = names.insert(n.name.name, &i);
429
+ // assert!(prev.is_none());
430
+ }
431
+ }
367
432
}
368
433
ast:: AstItem :: World ( w) => {
369
434
if package_items. insert ( w. name . name , w. name . span ) . is_some ( ) {
@@ -380,7 +445,7 @@ impl<'a> Resolver<'a> {
380
445
assert ! ( prev. is_none( ) ) ;
381
446
}
382
447
// These are processed down below.
383
- ast:: AstItem :: Use ( _) => { }
448
+ ast:: AstItem :: Use ( _) => { } // ast::AstItem::Nest(_) => todo!(),
384
449
}
385
450
}
386
451
decl_list_namespaces. push ( decl_list_ns) ;
@@ -458,6 +523,29 @@ impl<'a> Resolver<'a> {
458
523
}
459
524
Ok ( ( ) )
460
525
} ) ?;
526
+ decl_list. for_each_nest ( |nest : & Nest | {
527
+ match decl_list_ns. get ( nest. name . name ) {
528
+ Some ( ( _, ItemSource :: Foreign ) ) => return Ok ( ( ) ) ,
529
+ Some ( ( _, ItemSource :: Local ( id) ) ) => {
530
+ order[ nest. name . name ] . push ( id. clone ( ) ) ;
531
+ }
532
+ None => match package_items. get ( nest. name . name ) {
533
+ Some ( _) => {
534
+ // order[nest.name.name].push(nest.name.clone());
535
+ }
536
+ None => {
537
+ bail ! ( Error :: new(
538
+ nest. name. span,
539
+ format!(
540
+ "interface or world `{name}` not found in package" ,
541
+ name = nest. name. name
542
+ ) ,
543
+ ) )
544
+ }
545
+ } ,
546
+ }
547
+ Ok ( ( ) )
548
+ } ) ?;
461
549
}
462
550
463
551
let order = toposort ( "interface or world" , & order) ?;
@@ -470,22 +558,32 @@ impl<'a> Resolver<'a> {
470
558
let mut iface_id_order = Vec :: new ( ) ;
471
559
let mut world_id_order = Vec :: new ( ) ;
472
560
for name in order {
473
- match names. get ( name) . unwrap ( ) {
474
- ast:: AstItem :: Interface ( _) => {
561
+ match names. get ( name) {
562
+ Some ( ast:: AstItem :: Interface ( i) ) => {
563
+ for item in & i. items {
564
+ if let InterfaceItem :: Nest ( n) = item {
565
+ let id = self . alloc_interface ( package_items[ name] ) ;
566
+ self . interfaces [ id] . name = Some ( name. to_string ( ) ) ;
567
+ let prev = ids. insert ( n. name . name , AstItem :: Interface ( id) ) ;
568
+ assert ! ( prev. is_none( ) ) ;
569
+ iface_id_order. push ( id) ;
570
+ }
571
+ }
475
572
let id = self . alloc_interface ( package_items[ name] ) ;
476
573
self . interfaces [ id] . name = Some ( name. to_string ( ) ) ;
477
574
let prev = ids. insert ( name, AstItem :: Interface ( id) ) ;
478
575
assert ! ( prev. is_none( ) ) ;
479
576
iface_id_order. push ( id) ;
480
577
}
481
- ast:: AstItem :: World ( _) => {
578
+ Some ( ast:: AstItem :: World ( _) ) => {
482
579
let id = self . alloc_world ( package_items[ name] ) ;
483
580
self . worlds [ id] . name = name. to_string ( ) ;
484
581
let prev = ids. insert ( name, AstItem :: World ( id) ) ;
485
582
assert ! ( prev. is_none( ) ) ;
486
583
world_id_order. push ( id) ;
487
584
}
488
- ast:: AstItem :: Use ( _) => unreachable ! ( ) ,
585
+ Some ( ast:: AstItem :: Use ( _) ) => unreachable ! ( ) ,
586
+ None => { }
489
587
} ;
490
588
}
491
589
for decl_list in decl_lists {
@@ -517,6 +615,15 @@ impl<'a> Resolver<'a> {
517
615
( name. name , item)
518
616
}
519
617
ast:: AstItem :: Interface ( i) => {
618
+ for item in & i. items {
619
+ if let InterfaceItem :: Nest ( n) = item {
620
+ let iface_item = ids[ n. name . name ] ;
621
+ let prev = items. insert ( n. name . name , iface_item) ;
622
+ assert ! ( prev. is_none( ) ) ;
623
+ let prev = self . package_items . insert ( n. name . name , iface_item) ;
624
+ assert ! ( prev. is_none( ) ) ;
625
+ }
626
+ }
520
627
let iface_item = ids[ i. name . name ] ;
521
628
assert ! ( matches!( iface_item, AstItem :: Interface ( _) ) ) ;
522
629
( i. name . name , iface_item)
@@ -587,6 +694,12 @@ impl<'a> Resolver<'a> {
587
694
588
695
Ok ( ( ) )
589
696
} ) ?;
697
+ decl_list. for_each_nest ( |nest| {
698
+ let ( item, name, span) = self . resolve_ast_item_nest ( nest) ?;
699
+ let iface = self . extract_iface_from_item ( & item, & name, span) ?;
700
+ let lookup = & mut self . interface_types [ iface. index ( ) ] ;
701
+ Ok ( ( ) )
702
+ } ) ?;
590
703
}
591
704
Ok ( ( ) )
592
705
}
@@ -784,6 +897,7 @@ impl<'a> Resolver<'a> {
784
897
ast:: InterfaceItem :: Use ( u) => Some ( TypeItem :: Use ( u) ) ,
785
898
ast:: InterfaceItem :: TypeDef ( t) => Some ( TypeItem :: Def ( t) ) ,
786
899
ast:: InterfaceItem :: Func ( _) => None ,
900
+ ast:: InterfaceItem :: Nest ( n) => Some ( TypeItem :: Nest ( n) ) ,
787
901
} ) ,
788
902
) ?;
789
903
@@ -830,6 +944,7 @@ impl<'a> Resolver<'a> {
830
944
}
831
945
}
832
946
ast:: InterfaceItem :: TypeDef ( _) => { }
947
+ ast:: InterfaceItem :: Nest ( _) => { }
833
948
}
834
949
}
835
950
for func in funcs {
@@ -861,6 +976,9 @@ impl<'a> Resolver<'a> {
861
976
TypeItem :: Use ( u) => {
862
977
self . resolve_use ( owner, u) ?;
863
978
}
979
+ TypeItem :: Nest ( n) => {
980
+ self . resolve_nest ( owner, n) ?;
981
+ }
864
982
TypeItem :: Def ( _) => { }
865
983
}
866
984
}
@@ -892,6 +1010,7 @@ impl<'a> Resolver<'a> {
892
1010
type_defs. insert ( name. name , None ) ;
893
1011
}
894
1012
}
1013
+ TypeItem :: Nest ( n) => { }
895
1014
}
896
1015
}
897
1016
let order = toposort ( "type" , & type_deps) ?;
@@ -950,6 +1069,16 @@ impl<'a> Resolver<'a> {
950
1069
Ok ( ( ) )
951
1070
}
952
1071
1072
+ fn resolve_nest ( & mut self , owner : TypeOwner , n : & ast:: Nest < ' a > ) -> Result < ( ) > {
1073
+ let ( item, name, span) = self . resolve_ast_item_nest ( & n) ?;
1074
+ let use_from = self . extract_iface_from_item ( & item, & name, span) ?;
1075
+ let extracted = & self . interfaces [ use_from] ;
1076
+
1077
+ let stability = self . stability ( & n. attributes ) ?;
1078
+ let lookup = & self . interface_types [ use_from. index ( ) ] ;
1079
+ Ok ( ( ) )
1080
+ }
1081
+
953
1082
/// For each name in the `include`, resolve the path of the include, add it to the self.includes
954
1083
fn resolve_include ( & mut self , world_id : WorldId , i : & ast:: Include < ' a > ) -> Result < ( ) > {
955
1084
let stability = self . stability ( & i. attributes ) ?;
@@ -1051,6 +1180,21 @@ impl<'a> Resolver<'a> {
1051
1180
}
1052
1181
}
1053
1182
1183
+ fn resolve_ast_item_nest ( & self , nest : & ast:: Nest < ' a > ) -> Result < ( AstItem , String , Span ) > {
1184
+ let item: Option < & AstItem > = self . ast_items [ self . cur_ast_index ]
1185
+ . get ( nest. name . name )
1186
+ . or_else ( || self . package_items . get ( nest. name . name ) ) ;
1187
+ match item {
1188
+ Some ( item) => Ok ( ( * item, nest. name . name . to_string ( ) , nest. id . span ) ) ,
1189
+ None => {
1190
+ bail ! ( Error :: new(
1191
+ nest. id. span,
1192
+ format!( "interface or world `{}` does not exist" , nest. name. name) ,
1193
+ ) )
1194
+ }
1195
+ }
1196
+ }
1197
+
1054
1198
fn extract_iface_from_item (
1055
1199
& self ,
1056
1200
item : & AstItem ,
0 commit comments