@@ -1298,16 +1298,16 @@ impl InterfaceGenerator<'_> {
1298
1298
}
1299
1299
TypeDefKind :: Option ( base_ty) => {
1300
1300
self . gen . needs_option = true ;
1301
- if let Some ( _name) = & ty. name {
1302
- format ! (
1303
- "Option<{}>" ,
1304
- self . type_name_with_qualifier( base_ty, qualifier)
1305
- )
1301
+ let nesting = if let Type :: Id ( id) = base_ty {
1302
+ matches ! ( & self . resolve. types[ * id] . kind, TypeDefKind :: Option ( _) )
1306
1303
} else {
1307
- format ! (
1308
- "Option<{}>" ,
1309
- self . type_name_with_qualifier( base_ty, qualifier)
1310
- )
1304
+ false
1305
+ } ;
1306
+ let base_ty = self . type_name_with_qualifier ( base_ty, qualifier) ;
1307
+ if nesting {
1308
+ format ! ( "Option<{base_ty}>" )
1309
+ } else {
1310
+ format ! ( "{base_ty}?" )
1311
1311
}
1312
1312
}
1313
1313
TypeDefKind :: Result ( result) => {
@@ -2300,9 +2300,20 @@ impl Bindgen for FunctionBindgen<'_, '_> {
2300
2300
2301
2301
let op = & operands[ 0 ] ;
2302
2302
2303
- let block = |ty : Option < & Type > , Block { body, results, .. } , payload| {
2304
- let payload = if let Some ( _ty) = self . gen . non_empty_type ( ty) {
2305
- format ! ( "var {payload} = {op}.Value;" )
2303
+ let nesting = if let Type :: Id ( id) = payload {
2304
+ matches ! ( & self . gen . resolve. types[ * id] . kind, TypeDefKind :: Option ( _) )
2305
+ } else {
2306
+ false
2307
+ } ;
2308
+
2309
+ let mut block = |ty : Option < & Type > , Block { body, results, .. } , payload, nesting| {
2310
+ let payload = if let Some ( ty) = self . gen . non_empty_type ( ty) {
2311
+ let ty = self . gen . type_name_with_qualifier ( ty, true ) ;
2312
+ if nesting {
2313
+ format ! ( "var {payload} = {op}.Value;" )
2314
+ } else {
2315
+ format ! ( "var {payload} = ({ty}) {op};" )
2316
+ }
2306
2317
} else {
2307
2318
String :: new ( )
2308
2319
} ;
@@ -2321,15 +2332,21 @@ impl Bindgen for FunctionBindgen<'_, '_> {
2321
2332
)
2322
2333
} ;
2323
2334
2324
- let none = block ( None , none, none_payload) ;
2325
- let some = block ( Some ( payload) , some, some_payload) ;
2335
+ let none = block ( None , none, none_payload, nesting) ;
2336
+ let some = block ( Some ( payload) , some, some_payload, nesting) ;
2337
+
2338
+ let test = if nesting {
2339
+ ".HasValue"
2340
+ } else {
2341
+ " != null"
2342
+ } ;
2326
2343
2327
2344
uwrite ! (
2328
2345
self . src,
2329
2346
r#"
2330
2347
{declarations}
2331
2348
2332
- if ({op}.HasValue ) {{
2349
+ if ({op}{test} ) {{
2333
2350
{some}
2334
2351
}} else {{
2335
2352
{none}
@@ -2346,6 +2363,12 @@ impl Bindgen for FunctionBindgen<'_, '_> {
2346
2363
let lifted = self . locals . tmp ( "lifted" ) ;
2347
2364
let op = & operands[ 0 ] ;
2348
2365
2366
+ let nesting = if let Type :: Id ( id) = payload {
2367
+ matches ! ( & self . gen . resolve. types[ * id] . kind, TypeDefKind :: Option ( _) )
2368
+ } else {
2369
+ false
2370
+ } ;
2371
+
2349
2372
let payload = if self . gen . non_empty_type ( Some ( * payload) ) . is_some ( ) {
2350
2373
some. results . into_iter ( ) . next ( ) . unwrap ( )
2351
2374
} else {
@@ -2354,20 +2377,26 @@ impl Bindgen for FunctionBindgen<'_, '_> {
2354
2377
2355
2378
let some = some. body ;
2356
2379
2380
+ let ( none_value, some_value) = if nesting {
2381
+ ( format ! ( "{ty}.None" ) , format ! ( "new ({payload})" ) )
2382
+ } else {
2383
+ ( "null" . into ( ) , payload)
2384
+ } ;
2385
+
2357
2386
uwrite ! (
2358
2387
self . src,
2359
2388
r#"
2360
2389
{ty} {lifted};
2361
2390
2362
2391
switch ({op}) {{
2363
2392
case 0: {{
2364
- {lifted} = {ty}.None ;
2393
+ {lifted} = {none_value} ;
2365
2394
break;
2366
2395
}}
2367
2396
2368
2397
case 1: {{
2369
2398
{some}
2370
- {lifted} = new ({payload}) ;
2399
+ {lifted} = {some_value} ;
2371
2400
break;
2372
2401
}}
2373
2402
0 commit comments