@@ -177,6 +177,10 @@ impl TypeNames {
177177 Ok ( ( ) )
178178 }
179179
180+ fn unknown_type ( & self , ident : & Ident ) -> syn:: Error {
181+ syn:: Error :: new_spanned ( ident, format ! ( "Undeclared type: `{ident}`!" ) )
182+ }
183+
180184 /// For a given rust ident return the CXX name with its namespace
181185 ///
182186 /// Ideally we'd want this type name to always be **fully** qualified, starting with `::`.
@@ -187,35 +191,28 @@ impl TypeNames {
187191 /// This needs to be considered in many places (properties, signals, invokables, etc.)
188192 /// Therefore, for now we'll use the qualified, but not fully qualified version of `namespace::type`.
189193 /// This should work in most cases, but it's not perfect.
190- pub fn cxx_qualified ( & self , ident : & Ident ) -> String {
194+ pub fn cxx_qualified ( & self , ident : & Ident ) -> Result < String > {
191195 // Check if there is a cxx_name or namespace to handle
192- let name = self . names . get ( ident) ;
193-
194- if name. is_none ( ) {
195- return ident. to_string ( ) ;
196- }
197- let name = name. unwrap ( ) ;
196+ let name = self
197+ . names
198+ . get ( ident)
199+ . ok_or_else ( || self . unknown_type ( ident) ) ?;
198200
199- let cxx_name = name. cxx . clone ( ) . unwrap_or_else ( || name . rust . to_string ( ) ) ;
201+ let cxx_name = name. cxx_unqualified ( ) ;
200202
201203 if let Some ( namespace) = & name. namespace {
202- format ! ( "{namespace}::{cxx_name}" )
204+ Ok ( format ! ( "{namespace}::{cxx_name}" ) )
203205 } else {
204- cxx_name
206+ Ok ( cxx_name)
205207 }
206208 }
207209
208- fn unknown_type ( & self , ident : & Ident ) -> syn:: Error {
209- syn:: Error :: new_spanned ( ident, format ! ( "Undeclared type: `{ident}`!" ) )
210- }
211-
212210 /// For a given rust ident return the CXX name **without** its namespace
213211 pub fn cxx_unqualified ( & self , ident : & Ident ) -> Result < String > {
214- if let Some ( name) = self . names . get ( ident) {
215- Ok ( name. cxx . clone ( ) . unwrap_or_else ( || ident. to_string ( ) ) )
216- } else {
217- Err ( self . unknown_type ( ident) )
218- }
212+ self . names
213+ . get ( ident)
214+ . ok_or_else ( || self . unknown_type ( ident) )
215+ . map ( Name :: cxx_unqualified)
219216 }
220217
221218 /// For a given rust ident return the namespace if it's not empty
@@ -249,6 +246,7 @@ impl TypeNames {
249246 module_ident : & Ident ,
250247 ) -> Result < ( ) > {
251248 let name = Name :: from_ident_and_attrs ( ident, attrs, parent_namespace, module_ident) ?;
249+ // TODO: Check for duplicates
252250 self . names . insert ( name. rust . clone ( ) , name) ;
253251 Ok ( ( ) )
254252 }
@@ -306,8 +304,8 @@ mod tests {
306304 assert_eq ! ( types. num_types( ) , 0 ) ;
307305
308306 assert ! ( types. cxx_unqualified( & format_ident!( "A" ) ) . is_err( ) ) ;
307+ assert ! ( types. cxx_qualified( & format_ident!( "A" ) ) . is_err( ) ) ;
309308 assert ! ( types. namespace( & format_ident!( "A" ) ) . is_err( ) ) ;
310- // assert!(types.cxx_qualified(&format_ident!("A")).is_err());
311309 }
312310
313311 #[ test]
@@ -320,7 +318,7 @@ mod tests {
320318
321319 assert_eq ! ( types. num_types( ) , 1 ) ;
322320 assert_eq ! ( types. rust_qualified( & ident) , parse_quote! { ffi:: A } ) ;
323- assert_eq ! ( types. cxx_qualified( & ident) , "A" ) ;
321+ assert_eq ! ( types. cxx_qualified( & ident) . unwrap ( ) , "A" ) ;
324322 assert ! ( types. namespace( & ident) . unwrap( ) . is_none( ) ) ;
325323 }
326324
@@ -338,7 +336,7 @@ mod tests {
338336 . is_ok( ) ) ;
339337
340338 assert_eq ! ( types. num_types( ) , 1 ) ;
341- assert_eq ! ( types. cxx_qualified( & ident) , "B" ) ;
339+ assert_eq ! ( types. cxx_qualified( & ident) . unwrap ( ) , "B" ) ;
342340 assert ! ( types. namespace( & ident) . unwrap( ) . is_none( ) ) ;
343341 assert_eq ! ( types. rust_qualified( & ident) , parse_quote! { ffi:: A } ) ;
344342 }
@@ -397,7 +395,7 @@ mod tests {
397395 . populate( & ident, & [ ] , Some ( "bridge_namespace" ) , & format_ident!( "ffi" ) )
398396 . is_ok( ) ) ;
399397
400- assert_eq ! ( types. cxx_qualified( & ident) , "bridge_namespace::A" ) ;
398+ assert_eq ! ( types. cxx_qualified( & ident) . unwrap ( ) , "bridge_namespace::A" ) ;
401399 assert_eq ! (
402400 types. namespace( & ident) . unwrap( ) . unwrap( ) ,
403401 "bridge_namespace"
@@ -443,7 +441,7 @@ mod tests {
443441 let type_names = parse_cxx_item ( item) ;
444442 let ident = format_ident ! ( "A" ) ;
445443 assert_eq ! ( type_names. num_types( ) , 1 ) ;
446- assert_eq ! ( type_names. cxx_qualified( & ident) , "B" ) ;
444+ assert_eq ! ( type_names. cxx_qualified( & ident) . unwrap ( ) , "B" ) ;
447445
448446 assert_eq ! ( type_names. rust_qualified( & ident) , parse_quote! { ffi:: A } ) ;
449447 }
@@ -476,15 +474,15 @@ mod tests {
476474 assert_eq ! ( types. num_types( ) , 3 ) ;
477475
478476 assert_eq ! (
479- & types. cxx_qualified( & format_ident!( "A" ) ) ,
477+ types. cxx_qualified( & format_ident!( "A" ) ) . unwrap ( ) ,
480478 "type_namespace::B"
481479 ) ;
482480 assert_eq ! (
483- & types. cxx_qualified( & format_ident!( "C" ) ) ,
481+ types. cxx_qualified( & format_ident!( "C" ) ) . unwrap ( ) ,
484482 "extern_namespace::D"
485483 ) ;
486484 assert_eq ! (
487- & types. cxx_qualified( & format_ident!( "E" ) ) ,
485+ types. cxx_qualified( & format_ident!( "E" ) ) . unwrap ( ) ,
488486 "bridge_namespace::E"
489487 ) ;
490488
@@ -534,7 +532,10 @@ mod tests {
534532 type_names. namespace( & ident) . unwrap( ) . unwrap( ) ,
535533 "enum_namespace"
536534 ) ;
537- assert_eq ! ( type_names. cxx_qualified( & ident) , "enum_namespace::EnumB" ) ;
535+ assert_eq ! (
536+ type_names. cxx_qualified( & ident) . unwrap( ) ,
537+ "enum_namespace::EnumB"
538+ ) ;
538539 assert_eq ! (
539540 type_names. rust_qualified( & ident) ,
540541 parse_quote! { ffi:: EnumA }
@@ -556,7 +557,10 @@ mod tests {
556557
557558 assert_eq ! ( types. num_types( ) , 1 ) ;
558559 assert_eq ! ( types. cxx_unqualified( & ident) . unwrap( ) , "StructB" ) ;
559- assert_eq ! ( types. cxx_qualified( & ident) , "struct_namespace::StructB" ) ;
560+ assert_eq ! (
561+ types. cxx_qualified( & ident) . unwrap( ) ,
562+ "struct_namespace::StructB"
563+ ) ;
560564 assert_eq ! (
561565 types. namespace( & ident) . unwrap( ) . unwrap( ) ,
562566 "struct_namespace"
0 commit comments