@@ -103,6 +103,7 @@ struct Cpp {
103103 world : String ,
104104 world_id : Option < WorldId > ,
105105 imported_interfaces : HashSet < InterfaceId > ,
106+ instance_names : HashMap < InterfaceId , String > ,
106107 user_class_files : HashMap < String , String > ,
107108 defined_types : HashSet < ( Vec < String > , String ) > ,
108109 types : Types ,
@@ -283,6 +284,17 @@ impl Cpp {
283284 Cpp :: default ( )
284285 }
285286
287+ fn update_instance_name ( & mut self , resolve : & Resolve , name : & WorldKey , id : InterfaceId ) {
288+ match name {
289+ WorldKey :: Name ( instance) if resolve. interfaces [ id] . name . is_some ( ) => {
290+ self . instance_names . insert ( id, instance. clone ( ) ) ;
291+ }
292+ _ => {
293+ self . instance_names . remove ( & id) ;
294+ }
295+ }
296+ }
297+
286298 pub fn is_first_definition ( & mut self , ns : & Vec < String > , name : & str ) -> bool {
287299 let owned = ( ns. to_owned ( ) , name. to_owned ( ) ) ;
288300 if !self . defined_types . contains ( & owned) {
@@ -522,6 +534,7 @@ impl WorldGenerator for Cpp {
522534 _files : & mut Files ,
523535 ) -> anyhow:: Result < ( ) > {
524536 self . imported_interfaces . insert ( id) ;
537+ self . update_instance_name ( resolve, name, id) ;
525538
526539 let full_name = resolve. name_world_key ( name) ;
527540 match self . opts . with . iter ( ) . find ( |e| e. 0 == full_name) {
@@ -538,8 +551,7 @@ impl WorldGenerator for Cpp {
538551 let binding = Some ( name) ;
539552 let mut r#gen = self . interface ( resolve, binding, true , Some ( wasm_import_module) ) ;
540553 r#gen. interface = Some ( id) ;
541- let namespace =
542- namespace ( resolve, & TypeOwner :: Interface ( id) , false , & r#gen. r#gen . opts ) ;
554+ let namespace = namespace ( resolve, & TypeOwner :: Interface ( id) , false , & * r#gen. r#gen ) ;
543555 let docs = resolve. interfaces [ id] . docs . contents . as_deref ( ) ;
544556 r#gen
545557 . r#gen
@@ -590,11 +602,12 @@ impl WorldGenerator for Cpp {
590602 . src
591603 . push_str ( & format ! ( "// export_interface {name:?}\n " ) ) ;
592604 self . imported_interfaces . remove ( & id) ;
605+ self . update_instance_name ( resolve, name, id) ;
593606 let wasm_import_module = resolve. name_world_key ( name) ;
594607 let binding = Some ( name) ;
595608 let mut r#gen = self . interface ( resolve, binding, false , Some ( wasm_import_module) ) ;
596609 r#gen. interface = Some ( id) ;
597- let namespace = namespace ( resolve, & TypeOwner :: Interface ( id) , true , & r#gen. r#gen . opts ) ;
610+ let namespace = namespace ( resolve, & TypeOwner :: Interface ( id) , true , & * r#gen. r#gen ) ;
598611 let docs = resolve. interfaces [ id] . docs . contents . as_deref ( ) ;
599612 r#gen
600613 . r#gen
@@ -624,7 +637,7 @@ impl WorldGenerator for Cpp {
624637 let wasm_import_module = resolve. name_world_key ( & name) ;
625638 let binding = Some ( name) ;
626639 let mut r#gen = self . interface ( resolve, binding. as_ref ( ) , true , Some ( wasm_import_module) ) ;
627- let namespace = namespace ( resolve, & TypeOwner :: World ( world) , false , & r#gen. r#gen . opts ) ;
640+ let namespace = namespace ( resolve, & TypeOwner :: World ( world) , false , & * r#gen. r#gen ) ;
628641
629642 for ( _name, func) in funcs. iter ( ) {
630643 if matches ! ( func. kind, FunctionKind :: Freestanding ) {
@@ -644,7 +657,7 @@ impl WorldGenerator for Cpp {
644657 let name = WorldKey :: Name ( resolve. worlds [ world] . name . clone ( ) ) ;
645658 let binding = Some ( name) ;
646659 let mut r#gen = self . interface ( resolve, binding. as_ref ( ) , false , None ) ;
647- let namespace = namespace ( resolve, & TypeOwner :: World ( world) , true , & r#gen. r#gen . opts ) ;
660+ let namespace = namespace ( resolve, & TypeOwner :: World ( world) , true , & * r#gen. r#gen ) ;
648661
649662 for ( _name, func) in funcs. iter ( ) {
650663 if matches ! ( func. kind, FunctionKind :: Freestanding ) {
@@ -779,9 +792,9 @@ impl WorldGenerator for Cpp {
779792}
780793
781794// determine namespace (for the lifted C++ function)
782- fn namespace ( resolve : & Resolve , owner : & TypeOwner , guest_export : bool , opts : & Opts ) -> Vec < String > {
795+ fn namespace ( resolve : & Resolve , owner : & TypeOwner , guest_export : bool , r#gen : & Cpp ) -> Vec < String > {
783796 let mut result = Vec :: default ( ) ;
784- if let Some ( prefix) = & opts. internal_prefix {
797+ if let Some ( prefix) = & r#gen . opts . internal_prefix {
785798 result. push ( prefix. clone ( ) ) ;
786799 }
787800 if guest_export {
@@ -790,14 +803,18 @@ fn namespace(resolve: &Resolve, owner: &TypeOwner, guest_export: bool, opts: &Op
790803 match owner {
791804 TypeOwner :: World ( w) => result. push ( to_c_ident ( & resolve. worlds [ * w] . name ) ) ,
792805 TypeOwner :: Interface ( i) => {
793- let iface = & resolve. interfaces [ * i] ;
794- let pkg_id = iface. package . unwrap ( ) ;
795- let pkg = & resolve. packages [ pkg_id] ;
796- result. push ( to_c_ident ( & pkg. name . namespace ) ) ;
797- // Use name_package_module to get version-specific package names
798- result. push ( to_c_ident ( & name_package_module ( resolve, pkg_id) ) ) ;
799- if let Some ( name) = & iface. name {
800- result. push ( to_c_ident ( name) ) ;
806+ if let Some ( instance) = r#gen. instance_names . get ( i) {
807+ result. push ( to_c_ident ( instance) ) ;
808+ } else {
809+ let iface = & resolve. interfaces [ * i] ;
810+ let pkg_id = iface. package . unwrap ( ) ;
811+ let pkg = & resolve. packages [ pkg_id] ;
812+ result. push ( to_c_ident ( & pkg. name . namespace ) ) ;
813+ // Use name_package_module to get version-specific package names
814+ result. push ( to_c_ident ( & name_package_module ( resolve, pkg_id) ) ) ;
815+ if let Some ( name) = & iface. name {
816+ result. push ( to_c_ident ( name) ) ;
817+ }
801818 }
802819 }
803820 TypeOwner :: None => ( ) ,
@@ -941,7 +958,7 @@ impl CppInterfaceGenerator<'_> {
941958 . map ( TypeOwner :: Interface )
942959 . unwrap_or ( TypeOwner :: World ( self . r#gen . world_id . unwrap ( ) ) ) ,
943960 ) ) ;
944- let mut namespace = namespace ( self . resolve , & owner, guest_export, & self . r#gen . opts ) ;
961+ let mut namespace = namespace ( self . resolve , & owner, guest_export, & * self . r#gen ) ;
945962 let is_drop = is_special_method ( func) ;
946963 let func_name_h = if !matches ! ( & func. kind, FunctionKind :: Freestanding ) {
947964 namespace. push ( object. clone ( ) ) ;
@@ -1294,7 +1311,7 @@ impl CppInterfaceGenerator<'_> {
12941311 cifg. resolve ,
12951312 & owner. owner ,
12961313 matches ! ( variant, AbiVariant :: GuestExport ) ,
1297- & cifg. r#gen . opts ,
1314+ & * cifg. r#gen ,
12981315 ) ;
12991316 namespace. push ( owner. name . as_ref ( ) . unwrap ( ) . to_upper_camel_case ( ) ) ;
13001317 namespace
@@ -1403,7 +1420,7 @@ impl CppInterfaceGenerator<'_> {
14031420 self . resolve ,
14041421 owner,
14051422 matches ! ( variant, AbiVariant :: GuestExport ) ,
1406- & self . r#gen . opts ,
1423+ & * self . r#gen ,
14071424 )
14081425 } else {
14091426 let owner = & self . resolve . types [ match & func. kind {
@@ -1420,7 +1437,7 @@ impl CppInterfaceGenerator<'_> {
14201437 self . resolve ,
14211438 & owner. owner ,
14221439 matches ! ( variant, AbiVariant :: GuestExport ) ,
1423- & self . r#gen . opts ,
1440+ & * self . r#gen ,
14241441 ) ;
14251442 namespace. push ( owner. name . as_ref ( ) . unwrap ( ) . to_upper_camel_case ( ) ) ;
14261443 namespace
@@ -1534,7 +1551,7 @@ impl CppInterfaceGenerator<'_> {
15341551 guest_export : bool ,
15351552 ) -> String {
15361553 let ty = & self . resolve . types [ id] ;
1537- let namespc = namespace ( self . resolve , & ty. owner , guest_export, & self . r#gen . opts ) ;
1554+ let namespc = namespace ( self . resolve , & ty. owner , guest_export, & * self . r#gen ) ;
15381555 let mut relative = SourceWithState {
15391556 namespace : Vec :: from ( from_namespace) ,
15401557 ..Default :: default ( )
@@ -1882,7 +1899,7 @@ impl<'a> wit_bindgen_core::InterfaceGenerator<'a> for CppInterfaceGenerator<'a>
18821899 ) {
18831900 let ty = & self . resolve . types [ id] ;
18841901 let guest_export = self . is_exported_type ( ty) ;
1885- let namespc = namespace ( self . resolve , & ty. owner , guest_export, & self . r#gen . opts ) ;
1902+ let namespc = namespace ( self . resolve , & ty. owner , guest_export, & * self . r#gen ) ;
18861903
18871904 if self . r#gen . is_first_definition ( & namespc, name) {
18881905 self . r#gen . h_src . change_namespace ( & namespc) ;
@@ -1914,7 +1931,7 @@ impl<'a> wit_bindgen_core::InterfaceGenerator<'a> for CppInterfaceGenerator<'a>
19141931 let store = self . r#gen . start_new_file ( Some ( definition) ) ;
19151932 let mut world_name = to_c_ident ( & self . r#gen . world ) ;
19161933 world_name. push_str ( "::" ) ;
1917- let namespc = namespace ( self . resolve , & type_. owner , !guest_import, & self . r#gen . opts ) ;
1934+ let namespc = namespace ( self . resolve , & type_. owner , !guest_import, & * self . r#gen ) ;
19181935 let pascal = name. to_upper_camel_case ( ) ;
19191936 let mut user_filename = namespc. clone ( ) ;
19201937 user_filename. push ( pascal. clone ( ) ) ;
@@ -2087,7 +2104,7 @@ impl<'a> wit_bindgen_core::InterfaceGenerator<'a> for CppInterfaceGenerator<'a>
20872104 } else if matches ! ( type_. owner, TypeOwner :: World ( _) ) {
20882105 // Handle world-level resources - treat as imported resources
20892106 let guest_export = false ; // World-level resources are treated as imports
2090- let namespc = namespace ( self . resolve , & type_. owner , guest_export, & self . r#gen . opts ) ;
2107+ let namespc = namespace ( self . resolve , & type_. owner , guest_export, & * self . r#gen ) ;
20912108 self . r#gen . h_src . change_namespace ( & namespc) ;
20922109
20932110 let pascal = name. to_upper_camel_case ( ) ;
@@ -2123,7 +2140,7 @@ impl<'a> wit_bindgen_core::InterfaceGenerator<'a> for CppInterfaceGenerator<'a>
21232140 ) {
21242141 let ty = & self . resolve . types [ id] ;
21252142 let guest_export = self . is_exported_type ( ty) ;
2126- let namespc = namespace ( self . resolve , & ty. owner , guest_export, & self . r#gen . opts ) ;
2143+ let namespc = namespace ( self . resolve , & ty. owner , guest_export, & * self . r#gen ) ;
21272144 if self . r#gen . is_first_definition ( & namespc, name) {
21282145 self . r#gen . h_src . change_namespace ( & namespc) ;
21292146 Self :: docs ( & mut self . r#gen . h_src . src , docs) ;
@@ -2164,7 +2181,7 @@ impl<'a> wit_bindgen_core::InterfaceGenerator<'a> for CppInterfaceGenerator<'a>
21642181 ) {
21652182 let ty = & self . resolve . types [ id] ;
21662183 let guest_export = self . is_exported_type ( ty) ;
2167- let namespc = namespace ( self . resolve , & ty. owner , guest_export, & self . r#gen . opts ) ;
2184+ let namespc = namespace ( self . resolve , & ty. owner , guest_export, & * self . r#gen ) ;
21682185 if self . r#gen . is_first_definition ( & namespc, name) {
21692186 self . r#gen . h_src . change_namespace ( & namespc) ;
21702187 Self :: docs ( & mut self . r#gen . h_src . src , docs) ;
@@ -2225,7 +2242,7 @@ impl<'a> wit_bindgen_core::InterfaceGenerator<'a> for CppInterfaceGenerator<'a>
22252242 ) {
22262243 let ty = & self . resolve . types [ id] ;
22272244 let guest_export = self . is_exported_type ( ty) ;
2228- let namespc = namespace ( self . resolve , & ty. owner , guest_export, & self . r#gen . opts ) ;
2245+ let namespc = namespace ( self . resolve , & ty. owner , guest_export, & * self . r#gen ) ;
22292246 if self . r#gen . is_first_definition ( & namespc, name) {
22302247 self . r#gen . h_src . change_namespace ( & namespc) ;
22312248 let pascal = name. to_pascal_case ( ) ;
@@ -2253,7 +2270,7 @@ impl<'a> wit_bindgen_core::InterfaceGenerator<'a> for CppInterfaceGenerator<'a>
22532270 ) {
22542271 let ty = & self . resolve . types [ id] ;
22552272 let guest_export = self . is_exported_type ( ty) ;
2256- let namespc = namespace ( self . resolve , & ty. owner , guest_export, & self . r#gen . opts ) ;
2273+ let namespc = namespace ( self . resolve , & ty. owner , guest_export, & * self . r#gen ) ;
22572274 self . r#gen . h_src . change_namespace ( & namespc) ;
22582275 let pascal = name. to_pascal_case ( ) ;
22592276 Self :: docs ( & mut self . r#gen . h_src . src , docs) ;
0 commit comments