@@ -414,129 +414,128 @@ impl<'tu, 'ge> Class<'tu, 'ge> {
414
414
' ge : ' f ,
415
415
{
416
416
match self {
417
- & Self :: Clang { .. } => {
418
- let mut out = Vec :: with_capacity ( fields. size_hint ( ) . 1 . map_or ( 8 , |x| x * 2 ) ) ;
419
- out. extend ( fields. flat_map ( |fld| {
420
- iter:: from_fn ( {
421
- let doc_comment = Rc :: from ( fld. doc_comment ( ) ) ;
422
- let def_loc = fld. file_line_name ( ) . location ;
423
- let rust_module = fld. rust_module ( ) ;
424
- let mut fld_type_ref = fld. type_ref ( ) ;
425
- let fld_type_kind = fld_type_ref. kind ( ) ;
426
- if fld_type_kind
427
- . as_pointer ( )
428
- . map_or ( false , |inner| inner. kind ( ) . as_primitive ( ) . is_some ( ) )
429
- && !fld_type_kind. is_char_ptr_string ( fld_type_ref. type_hint ( ) )
430
- {
431
- fld_type_ref. to_mut ( ) . set_type_hint ( TypeRefTypeHint :: PrimitivePtrAsRaw ) ;
432
- } else if fld_type_kind. as_class ( ) . map_or ( false , |cls| cls. kind ( ) . is_trait ( ) ) {
433
- fld_type_ref. to_mut ( ) . set_type_hint ( TypeRefTypeHint :: TraitClassConcrete ) ;
434
- }
435
- let fld_type_kind = fld_type_ref. kind ( ) ;
436
- let fld_type_ref_return_as_naked = fld_type_kind. return_as_naked ( fld_type_ref. type_hint ( ) ) ;
437
- let return_kind = ReturnKind :: infallible ( fld_type_ref_return_as_naked) ;
438
- let fld_const = fld. constness ( ) ;
439
- let passed_by_ref = fld_type_kind. can_return_as_direct_reference ( ) ;
440
- let ( mut read_const_yield, mut read_mut_yield) = if passed_by_ref && fld_const. is_mut ( ) {
441
- let read_const_func = if constness_filter. map_or ( true , |c| c. is_const ( ) ) {
442
- Some ( Func :: new_desc (
443
- FuncDesc :: new (
444
- FuncKind :: FieldAccessor ( self . clone ( ) , fld. clone ( ) ) ,
445
- Constness :: Const ,
446
- return_kind,
447
- fld. cpp_name ( CppNameStyle :: Reference ) ,
448
- rust_module. clone ( ) ,
449
- [ ] ,
450
- fld_type_ref. as_ref ( ) . clone ( ) . with_inherent_constness ( Constness :: Const ) ,
451
- )
452
- . def_loc ( def_loc. clone ( ) )
453
- . doc_comment ( Rc :: clone ( & doc_comment) )
454
- . cpp_body ( FuncCppBody :: ManualCall ( "{{name}}" . into ( ) ) ) ,
455
- ) )
456
- } else {
457
- None
458
- } ;
459
- let read_mut_func = if constness_filter. map_or ( true , |c| c. is_mut ( ) ) {
460
- let cpp_name = fld. cpp_name ( CppNameStyle :: Declaration ) ;
461
- Some ( Func :: new_desc (
462
- FuncDesc :: new (
463
- FuncKind :: FieldAccessor ( self . clone ( ) , fld. clone ( ) ) ,
464
- Constness :: Mut ,
465
- return_kind,
466
- format ! ( "{cpp_name}Mut" ) ,
467
- rust_module. clone ( ) ,
468
- [ ] ,
469
- fld_type_ref. as_ref ( ) . clone ( ) . with_inherent_constness ( Constness :: Mut ) ,
470
- )
471
- . def_loc ( def_loc. clone ( ) )
472
- . doc_comment ( Rc :: clone ( & doc_comment) )
473
- . cpp_body ( FuncCppBody :: ManualCall ( "{{name}}" . into ( ) ) ) ,
474
- ) )
475
- } else {
476
- None
477
- } ;
478
- ( read_const_func, read_mut_func)
417
+ & Self :: Clang { gen_env, .. } => {
418
+ let accessor_generator = |fld : & Field < ' tu , ' ge > | {
419
+ let doc_comment = Rc :: from ( fld. doc_comment ( ) ) ;
420
+ let def_loc = fld. file_line_name ( ) . location ;
421
+ let rust_module = Rc :: from ( fld. rust_module ( ) ) ;
422
+ let mut fld_type_ref = fld. type_ref ( ) ;
423
+ let fld_type_kind = fld_type_ref. kind ( ) ;
424
+ if fld_type_kind
425
+ . as_pointer ( )
426
+ . map_or ( false , |inner| inner. kind ( ) . as_primitive ( ) . is_some ( ) )
427
+ && !fld_type_kind. is_char_ptr_string ( fld_type_ref. type_hint ( ) )
428
+ {
429
+ fld_type_ref. to_mut ( ) . set_type_hint ( TypeRefTypeHint :: PrimitivePtrAsRaw ) ;
430
+ } else if fld_type_kind. as_class ( ) . map_or ( false , |cls| cls. kind ( ) . is_trait ( ) ) {
431
+ fld_type_ref. to_mut ( ) . set_type_hint ( TypeRefTypeHint :: TraitClassConcrete ) ;
432
+ }
433
+ let fld_type_kind = fld_type_ref. kind ( ) ;
434
+ let return_kind = ReturnKind :: infallible ( fld_type_kind. return_as_naked ( fld_type_ref. type_hint ( ) ) ) ;
435
+ let fld_const = fld. constness ( ) ;
436
+ let passed_by_ref = fld_type_kind. can_return_as_direct_reference ( ) ;
437
+ let fld_refname = fld. cpp_name ( CppNameStyle :: Reference ) ;
438
+ let rust_custom_leafname = gen_env. settings . property_rename . get ( fld_refname. as_ref ( ) ) . copied ( ) ;
439
+ let fld_declname = fld. cpp_name ( CppNameStyle :: Declaration ) ;
440
+ let ( mut read_const_yield, mut read_mut_yield) = if fld_const. is_mut ( ) && passed_by_ref {
441
+ let read_const_func = if constness_filter. map_or ( true , |c| c. is_const ( ) ) {
442
+ Some ( Func :: new_desc (
443
+ FuncDesc :: new (
444
+ FuncKind :: FieldAccessor ( self . clone ( ) , fld. clone ( ) ) ,
445
+ Constness :: Const ,
446
+ return_kind,
447
+ fld_declname. clone ( ) ,
448
+ Rc :: clone ( & rust_module) ,
449
+ [ ] ,
450
+ fld_type_ref. as_ref ( ) . clone ( ) . with_inherent_constness ( Constness :: Const ) ,
451
+ )
452
+ . def_loc ( def_loc. clone ( ) )
453
+ . doc_comment ( Rc :: clone ( & doc_comment) )
454
+ . cpp_body ( FuncCppBody :: ManualCall ( "{{name}}" . into ( ) ) )
455
+ . maybe_rust_custom_leafname ( rust_custom_leafname) ,
456
+ ) )
479
457
} else {
480
- let read_const_func = if constness_filter. map_or ( true , |c| c == fld_const) {
481
- Some ( Func :: new_desc (
482
- FuncDesc :: new (
483
- FuncKind :: FieldAccessor ( self . clone ( ) , fld. clone ( ) ) ,
484
- fld_const,
485
- return_kind,
486
- fld. cpp_name ( CppNameStyle :: Reference ) ,
487
- rust_module. clone ( ) ,
488
- [ ] ,
489
- fld_type_ref. as_ref ( ) . clone ( ) ,
490
- )
491
- . def_loc ( def_loc. clone ( ) )
492
- . doc_comment ( Rc :: clone ( & doc_comment) )
493
- . cpp_body ( FuncCppBody :: ManualCall ( "{{name}}" . into ( ) ) ) ,
494
- ) )
495
- } else {
496
- None
497
- } ;
498
- ( read_const_func, None )
458
+ None
499
459
} ;
500
- let mut write_yield = if constness_filter. map_or ( true , |c| c. is_mut ( ) )
501
- && !fld_type_ref. constness ( ) . is_const ( )
502
- && !fld_type_kind. as_fixed_array ( ) . is_some ( )
503
- {
504
- let cpp_name = fld. cpp_name ( CppNameStyle :: Declaration ) ;
505
- let ( first_letter, rest) = cpp_name. capitalize_first_ascii_letter ( ) . expect ( "Empty fld_declname" ) ;
460
+ let read_mut_func = if constness_filter. map_or ( true , |c| c. is_mut ( ) ) {
506
461
Some ( Func :: new_desc (
507
462
FuncDesc :: new (
508
463
FuncKind :: FieldAccessor ( self . clone ( ) , fld. clone ( ) ) ,
509
464
Constness :: Mut ,
510
- ReturnKind :: InfallibleNaked ,
511
- format ! ( "set{first_letter}{rest}" ) ,
512
- rust_module. clone ( ) ,
513
- [ Field :: new_desc ( FieldDesc {
514
- cpp_fullname : "val" . into ( ) ,
515
- type_ref : fld_type_ref. as_ref ( ) . clone ( ) . with_inherent_constness ( Constness :: Const ) ,
516
- default_value : fld. default_value ( ) . map ( |v| v. into ( ) ) ,
517
- } ) ] ,
518
- TypeRefDesc :: void ( ) ,
465
+ return_kind,
466
+ format ! ( "{fld_declname}Mut" ) ,
467
+ Rc :: clone ( & rust_module) ,
468
+ [ ] ,
469
+ fld_type_ref. as_ref ( ) . clone ( ) . with_inherent_constness ( Constness :: Mut ) ,
519
470
)
520
- . doc_comment ( doc_comment)
521
- . def_loc ( def_loc)
522
- . cpp_body ( FuncCppBody :: ManualCall ( "{{name}} = {{args}}" . into ( ) ) ) ,
471
+ . def_loc ( def_loc. clone ( ) )
472
+ . doc_comment ( Rc :: clone ( & doc_comment) )
473
+ . cpp_body ( FuncCppBody :: ManualCall ( "{{name}}" . into ( ) ) )
474
+ . maybe_rust_custom_leafname ( rust_custom_leafname. map ( |name| format ! ( "{name}_mut" ) ) ) ,
523
475
) )
524
476
} else {
525
477
None
526
478
} ;
527
- move || {
528
- read_const_yield
529
- . take ( )
530
- . or_else ( || read_mut_yield. take ( ) )
531
- . or_else ( || write_yield. take ( ) )
532
- }
479
+ ( read_const_func, read_mut_func)
480
+ } else {
481
+ let single_read_func = if constness_filter. map_or ( true , |c| c == fld_const) {
482
+ Some ( Func :: new_desc (
483
+ FuncDesc :: new (
484
+ FuncKind :: FieldAccessor ( self . clone ( ) , fld. clone ( ) ) ,
485
+ fld_const,
486
+ return_kind,
487
+ fld_declname. clone ( ) ,
488
+ Rc :: clone ( & rust_module) ,
489
+ [ ] ,
490
+ fld_type_ref. as_ref ( ) . clone ( ) ,
491
+ )
492
+ . def_loc ( def_loc. clone ( ) )
493
+ . doc_comment ( Rc :: clone ( & doc_comment) )
494
+ . cpp_body ( FuncCppBody :: ManualCall ( "{{name}}" . into ( ) ) )
495
+ . maybe_rust_custom_leafname ( rust_custom_leafname) ,
496
+ ) )
497
+ } else {
498
+ None
499
+ } ;
500
+ ( single_read_func, None )
501
+ } ;
502
+ let mut write_yield = if constness_filter. map_or ( true , |c| c. is_mut ( ) )
503
+ && !fld_type_ref. constness ( ) . is_const ( )
504
+ && !fld_type_kind. as_fixed_array ( ) . is_some ( )
505
+ {
506
+ let ( first_letter, rest) = fld_declname. capitalize_first_ascii_letter ( ) . expect ( "Empty fld_declname" ) ;
507
+ Some ( Func :: new_desc (
508
+ FuncDesc :: new (
509
+ FuncKind :: FieldAccessor ( self . clone ( ) , fld. clone ( ) ) ,
510
+ Constness :: Mut ,
511
+ ReturnKind :: InfallibleNaked ,
512
+ format ! ( "set{first_letter}{rest}" ) ,
513
+ Rc :: clone ( & rust_module) ,
514
+ [ Field :: new_desc ( FieldDesc {
515
+ cpp_fullname : "val" . into ( ) ,
516
+ type_ref : fld_type_ref. as_ref ( ) . clone ( ) . with_inherent_constness ( Constness :: Const ) ,
517
+ default_value : fld. default_value ( ) . map ( |v| v. into ( ) ) ,
518
+ } ) ] ,
519
+ TypeRefDesc :: void ( ) ,
520
+ )
521
+ . doc_comment ( doc_comment)
522
+ . def_loc ( def_loc)
523
+ . cpp_body ( FuncCppBody :: ManualCall ( "{{name}} = {{args}}" . into ( ) ) )
524
+ . maybe_rust_custom_leafname ( rust_custom_leafname. map ( |name| format ! ( "set_{name}" ) ) ) ,
525
+ ) )
526
+ } else {
527
+ None
528
+ } ;
529
+ iter:: from_fn ( move || {
530
+ read_const_yield
531
+ . take ( )
532
+ . or_else ( || read_mut_yield. take ( ) )
533
+ . or_else ( || write_yield. take ( ) )
533
534
} )
534
- } ) ) ;
535
- out
536
- }
537
- Self :: Desc ( _) => {
538
- vec ! [ ]
535
+ } ;
536
+ fields. flat_map ( accessor_generator) . collect ( )
539
537
}
538
+ Self :: Desc ( _) => vec ! [ ] ,
540
539
}
541
540
}
542
541
0 commit comments