@@ -47,16 +47,30 @@ impl Types {
4747 }
4848 for ( _, iface) in resolve. interfaces . iter ( ) {
4949 for ( _, f) in iface. functions . iter ( ) {
50- for ( _, ty) in f. params . iter ( ) {
51- self . set_param_result_ty ( resolve, ty, true , false , false ) ;
52- }
53- for ty in f. results . iter_types ( ) {
54- self . set_param_result_ty ( resolve, ty, false , true , false ) ;
50+ self . type_info_func ( resolve, f) ;
51+ }
52+ }
53+ for ( _, world) in resolve. worlds . iter ( ) {
54+ for ( _, item) in world. imports . iter ( ) . chain ( & world. exports ) {
55+ match item {
56+ WorldItem :: Function ( f) => {
57+ self . type_info_func ( resolve, f) ;
58+ }
59+ WorldItem :: Interface ( _) | WorldItem :: Type ( _) => { }
5560 }
5661 }
5762 }
5863 }
5964
65+ fn type_info_func ( & mut self , resolve : & Resolve , f : & Function ) {
66+ for ( _, ty) in f. params . iter ( ) {
67+ self . set_param_result_ty ( resolve, ty, true , false , false ) ;
68+ }
69+ for ty in f. results . iter_types ( ) {
70+ self . set_param_result_ty ( resolve, ty, false , true , false ) ;
71+ }
72+ }
73+
6074 pub fn get ( & self , id : TypeId ) -> TypeInfo {
6175 self . type_info [ & id]
6276 }
@@ -434,18 +448,25 @@ pub trait WorldGenerator {
434448 match import {
435449 WorldItem :: Function ( f) => funcs. push ( ( name. as_str ( ) , f) ) ,
436450 WorldItem :: Interface ( id) => self . import_interface ( resolve, name, * id, files) ,
451+ WorldItem :: Type ( _) => unreachable ! ( ) ,
437452 }
438453 }
439454 if !funcs. is_empty ( ) {
440455 self . import_funcs ( resolve, id, & funcs, files) ;
441456 }
442457 funcs. clear ( ) ;
458+
459+ let mut types = Vec :: new ( ) ;
443460 for ( name, export) in world. exports . iter ( ) {
444461 match export {
445462 WorldItem :: Function ( f) => funcs. push ( ( name. as_str ( ) , f) ) ,
446463 WorldItem :: Interface ( id) => self . export_interface ( resolve, name, * id, files) ,
464+ WorldItem :: Type ( id) => types. push ( ( name. as_str ( ) , * id) ) ,
447465 }
448466 }
467+ if !types. is_empty ( ) {
468+ self . export_types ( resolve, id, & types, files) ;
469+ }
449470 if !funcs. is_empty ( ) {
450471 self . export_funcs ( resolve, id, & funcs, files) ;
451472 }
@@ -485,6 +506,13 @@ pub trait WorldGenerator {
485506 funcs : & [ ( & str , & Function ) ] ,
486507 files : & mut Files ,
487508 ) ;
509+ fn export_types (
510+ & mut self ,
511+ resolve : & Resolve ,
512+ world : WorldId ,
513+ types : & [ ( & str , TypeId ) ] ,
514+ files : & mut Files ,
515+ ) ;
488516 fn finish ( & mut self , resolve : & Resolve , world : WorldId , files : & mut Files ) ;
489517}
490518
@@ -514,23 +542,26 @@ pub trait InterfaceGenerator<'a> {
514542 fn types ( & mut self , iface : InterfaceId ) {
515543 let iface = & self . resolve ( ) . interfaces [ iface] ;
516544 for ( name, id) in iface. types . iter ( ) {
517- let id = * id;
518- let ty = & self . resolve ( ) . types [ id] ;
519- match & ty. kind {
520- TypeDefKind :: Record ( record) => self . type_record ( id, name, record, & ty. docs ) ,
521- TypeDefKind :: Flags ( flags) => self . type_flags ( id, name, flags, & ty. docs ) ,
522- TypeDefKind :: Tuple ( tuple) => self . type_tuple ( id, name, tuple, & ty. docs ) ,
523- TypeDefKind :: Enum ( enum_) => self . type_enum ( id, name, enum_, & ty. docs ) ,
524- TypeDefKind :: Variant ( variant) => self . type_variant ( id, name, variant, & ty. docs ) ,
525- TypeDefKind :: Option ( t) => self . type_option ( id, name, t, & ty. docs ) ,
526- TypeDefKind :: Result ( r) => self . type_result ( id, name, r, & ty. docs ) ,
527- TypeDefKind :: Union ( u) => self . type_union ( id, name, u, & ty. docs ) ,
528- TypeDefKind :: List ( t) => self . type_list ( id, name, t, & ty. docs ) ,
529- TypeDefKind :: Type ( t) => self . type_alias ( id, name, t, & ty. docs ) ,
530- TypeDefKind :: Future ( _) => todo ! ( "generate for future" ) ,
531- TypeDefKind :: Stream ( _) => todo ! ( "generate for stream" ) ,
532- TypeDefKind :: Unknown => unreachable ! ( ) ,
533- }
545+ self . define_type ( name, * id) ;
546+ }
547+ }
548+
549+ fn define_type ( & mut self , name : & str , id : TypeId ) {
550+ let ty = & self . resolve ( ) . types [ id] ;
551+ match & ty. kind {
552+ TypeDefKind :: Record ( record) => self . type_record ( id, name, record, & ty. docs ) ,
553+ TypeDefKind :: Flags ( flags) => self . type_flags ( id, name, flags, & ty. docs ) ,
554+ TypeDefKind :: Tuple ( tuple) => self . type_tuple ( id, name, tuple, & ty. docs ) ,
555+ TypeDefKind :: Enum ( enum_) => self . type_enum ( id, name, enum_, & ty. docs ) ,
556+ TypeDefKind :: Variant ( variant) => self . type_variant ( id, name, variant, & ty. docs ) ,
557+ TypeDefKind :: Option ( t) => self . type_option ( id, name, t, & ty. docs ) ,
558+ TypeDefKind :: Result ( r) => self . type_result ( id, name, r, & ty. docs ) ,
559+ TypeDefKind :: Union ( u) => self . type_union ( id, name, u, & ty. docs ) ,
560+ TypeDefKind :: List ( t) => self . type_list ( id, name, t, & ty. docs ) ,
561+ TypeDefKind :: Type ( t) => self . type_alias ( id, name, t, & ty. docs ) ,
562+ TypeDefKind :: Future ( _) => todo ! ( "generate for future" ) ,
563+ TypeDefKind :: Stream ( _) => todo ! ( "generate for stream" ) ,
564+ TypeDefKind :: Unknown => unreachable ! ( ) ,
534565 }
535566 }
536567}
0 commit comments