@@ -84,11 +84,13 @@ impl<'a> Converter<'a> {
8484 output. item ( WorldItem :: function_import ( func) ) ;
8585 }
8686 }
87- wit_parser:: WorldItem :: Type ( _) => {
88- todo ! ( ) ;
87+ wit_parser:: WorldItem :: Type ( type_id) => {
88+ let ( target, item, rename) = self . convert_world_item_type ( package_id, * type_id) ;
89+ output. use_type ( target, item, rename)
8990 }
9091 }
9192 }
93+
9294 for ( key, item) in & world. exports {
9395 match item {
9496 wit_parser:: WorldItem :: Interface { id, .. } => {
@@ -110,15 +112,42 @@ impl<'a> Converter<'a> {
110112 output. item ( WorldItem :: function_export ( func) ) ;
111113 }
112114 }
113- wit_parser:: WorldItem :: Type ( _) => {
114- todo ! ( ) ;
115+ wit_parser:: WorldItem :: Type ( type_id) => {
116+ let ( target, item, rename) = self . convert_world_item_type ( package_id, * type_id) ;
117+ output. use_type ( target, item, rename)
115118 }
116119 }
117120 }
118121
122+ output. uses_mut ( ) . sort ( ) ;
123+ output. items_mut ( ) . sort ( ) ;
124+
119125 output
120126 }
121127
128+ fn convert_world_item_type (
129+ & self ,
130+ package_id : PackageId ,
131+ type_id : wit_parser:: TypeId ,
132+ ) -> ( Ident , Ident , Option < Ident > ) {
133+ let type_def = self . resolve . types . get ( type_id) . unwrap ( ) ;
134+ let underlying_type_def = self . underlying_type_def ( & type_def) ;
135+ let interface_ident = self
136+ . type_def_owner_interface_ident ( package_id, underlying_type_def)
137+ . expect ( "Type not part of an interface" ) ;
138+ let local_type_name = type_def. name . clone ( ) . unwrap ( ) ;
139+ let underlying_local_type_name = underlying_type_def. name . clone ( ) . unwrap ( ) ;
140+ if underlying_local_type_name == local_type_name {
141+ ( interface_ident, local_type_name. into ( ) , None )
142+ } else {
143+ (
144+ interface_ident,
145+ underlying_local_type_name. into ( ) ,
146+ Some ( local_type_name. into ( ) ) ,
147+ )
148+ }
149+ }
150+
122151 fn convert_interface (
123152 & self ,
124153 package_id : PackageId ,
@@ -140,31 +169,16 @@ impl<'a> Converter<'a> {
140169 }
141170 for ( _, type_id) in & interface. types {
142171 let type_def = self . resolve . types . get ( * type_id) . unwrap ( ) ;
143-
144- let underlying_type_def = match & type_def. kind {
145- wit_parser:: TypeDefKind :: Type ( type_) => match & type_ {
146- wit_parser:: Type :: Id ( type_id) => {
147- let type_def = self . resolve . types . get ( * type_id) . unwrap ( ) ;
148- type_def
149- }
150- _ => type_def,
151- } ,
152- _ => type_def,
153- } ;
172+ let underlying_type_def = self . underlying_type_def ( & type_def) ;
154173
155174 if underlying_type_def. owner == owner {
156175 if let Some ( type_def) = self . convert_type_def ( type_def, * type_id) {
157176 output. item ( InterfaceItem :: TypeDef ( type_def) ) ;
158177 }
159178 } else {
160- let interface_ident = match underlying_type_def. owner {
161- wit_parser:: TypeOwner :: Interface ( id) => self . interface_ident (
162- package_id,
163- None ,
164- self . resolve . interfaces . get ( id) . unwrap ( ) ,
165- ) ,
166- _ => panic ! ( "Type not part of an interface" ) ,
167- } ;
179+ let interface_ident = self
180+ . type_def_owner_interface_ident ( package_id, underlying_type_def)
181+ . expect ( "Type not part of an interface" ) ;
168182 let local_type_name = type_def. name . clone ( ) . unwrap ( ) ;
169183 let underlying_local_type_name = underlying_type_def. name . clone ( ) . unwrap ( ) ;
170184 if underlying_local_type_name == local_type_name {
@@ -179,6 +193,9 @@ impl<'a> Converter<'a> {
179193 }
180194 }
181195
196+ output. uses_mut ( ) . sort ( ) ;
197+ output. items_mut ( ) . sort ( ) ;
198+
182199 output
183200 }
184201
@@ -521,6 +538,31 @@ impl<'a> Converter<'a> {
521538 } ,
522539 }
523540 }
541+
542+ fn underlying_type_def ( & ' a self , type_def : & ' a wit_parser:: TypeDef ) -> & ' a wit_parser:: TypeDef {
543+ match & type_def. kind {
544+ wit_parser:: TypeDefKind :: Type ( type_) => match & type_ {
545+ wit_parser:: Type :: Id ( type_id) => {
546+ let type_def = self . resolve . types . get ( * type_id) . unwrap ( ) ;
547+ type_def
548+ }
549+ _ => type_def,
550+ } ,
551+ _ => type_def,
552+ }
553+ }
554+
555+ fn type_def_owner_interface_ident (
556+ & self ,
557+ package_id : PackageId ,
558+ type_def : & wit_parser:: TypeDef ,
559+ ) -> Option < Ident > {
560+ if let wit_parser:: TypeOwner :: Interface ( id) = type_def. owner {
561+ Some ( self . interface_ident ( package_id, None , self . resolve . interfaces . get ( id) . unwrap ( ) ) )
562+ } else {
563+ None
564+ }
565+ }
524566}
525567
526568fn clean_func_name ( resource_name : & str , method_name : & str ) -> String {
0 commit comments