1
+ use core:: panic;
1
2
use std:: fmt;
2
3
3
4
use clang:: { Entity , EntityKind , ObjCAttributes , ObjCQualifiers } ;
4
5
5
6
use crate :: availability:: Availability ;
6
- use crate :: config:: MethodData ;
7
+ use crate :: config:: { self , MethodData , TypeOverride } ;
7
8
use crate :: context:: Context ;
8
9
use crate :: display_helper:: FormatterFn ;
9
10
use crate :: documentation:: Documentation ;
@@ -437,7 +438,8 @@ impl Method {
437
438
. get_arguments ( )
438
439
. expect ( "method arguments" )
439
440
. into_iter ( )
440
- . map ( |entity| {
441
+ . enumerate ( )
442
+ . map ( |( index, entity) | {
441
443
let name = entity. get_name ( ) . expect ( "arg display name" ) ;
442
444
let _span = debug_span ! ( "method argument" , name) . entered ( ) ;
443
445
let qualifier = entity
@@ -473,12 +475,24 @@ impl Method {
473
475
} ) ;
474
476
475
477
let ty = entity. get_type ( ) . expect ( "argument type" ) ;
476
- let ty = Ty :: parse_method_argument ( ty, qualifier, sendable, no_escape, context) ;
478
+ let mut ty = Ty :: parse_method_argument ( ty, qualifier, sendable, no_escape, context) ;
479
+
480
+ if let Some ( ty_or) = data. arguments . get ( & index) {
481
+ apply_type_override ( & mut ty, ty_or) ;
482
+ }
477
483
478
484
( name, ty)
479
485
} )
480
486
. collect ( ) ;
481
487
488
+ let last_arg_override = * data. arguments . keys ( ) . max ( ) . unwrap_or ( & 0 ) ;
489
+ if arguments. len ( ) < last_arg_override {
490
+ panic ! (
491
+ "argument override index out of bounds {}" ,
492
+ last_arg_override
493
+ ) ;
494
+ }
495
+
482
496
let is_error = if let Some ( ( _, ty) ) = arguments. last ( ) {
483
497
ty. argument_is_error_out ( )
484
498
} else {
@@ -531,6 +545,8 @@ impl Method {
531
545
modifiers. mainthreadonly ,
532
546
) ;
533
547
548
+ apply_type_override ( & mut result_type, & data. return_ ) ;
549
+
534
550
let encoding = entity
535
551
. get_objc_type_encoding ( )
536
552
. expect ( "method to have encoding" ) ;
@@ -605,7 +621,7 @@ impl Method {
605
621
. expect ( "method to have encoding" ) ;
606
622
607
623
let getter = if !getter_data. skipped {
608
- let ty = Ty :: parse_property_return (
624
+ let mut ty = Ty :: parse_property_return (
609
625
entity. get_type ( ) . expect ( "property type" ) ,
610
626
is_copy,
611
627
modifiers. sendable ,
@@ -627,6 +643,8 @@ impl Method {
627
643
modifiers. mainthreadonly ,
628
644
) ;
629
645
646
+ apply_type_override ( & mut ty, & getter_data. return_ ) ;
647
+
630
648
Some ( Method {
631
649
selector : getter_sel. clone ( ) ,
632
650
fn_name : getter_sel. clone ( ) ,
@@ -655,7 +673,7 @@ impl Method {
655
673
let setter_data = setter_data. expect ( "setter_data must be present if setter_sel was" ) ;
656
674
if !setter_data. skipped {
657
675
let result_type = Ty :: VOID_RESULT ;
658
- let ty = Ty :: parse_property (
676
+ let mut ty = Ty :: parse_property (
659
677
entity. get_type ( ) . expect ( "property type" ) ,
660
678
is_copy,
661
679
modifiers. sendable ,
@@ -674,6 +692,10 @@ impl Method {
674
692
modifiers. mainthreadonly ,
675
693
) ;
676
694
695
+ if let Some ( ty_or) = setter_data. arguments . get ( & 0 ) {
696
+ apply_type_override ( & mut ty, ty_or) ;
697
+ }
698
+
677
699
Some ( Method {
678
700
selector,
679
701
fn_name,
@@ -909,3 +931,28 @@ pub(crate) fn handle_reserved(name: &str) -> String {
909
931
name. into ( )
910
932
}
911
933
}
934
+
935
+ pub ( crate ) fn apply_type_override ( ty : & mut Ty , or : & TypeOverride ) {
936
+ if let Some ( nullability) = & or. nullability {
937
+ let c_nullability = match nullability {
938
+ config:: Nullability :: Nullable => clang:: Nullability :: Nullable ,
939
+ config:: Nullability :: NonNull => clang:: Nullability :: NonNull ,
940
+ } ;
941
+
942
+ let check_and_set_nullability = |current_nullability : & mut clang:: Nullability | {
943
+ if * current_nullability == c_nullability {
944
+ warn ! ( "nullability already set to {:?}" , current_nullability) ;
945
+ }
946
+ * current_nullability = c_nullability;
947
+ } ;
948
+
949
+ match ty {
950
+ Ty :: Pointer { nullability, .. }
951
+ | Ty :: Sel { nullability, .. }
952
+ | Ty :: IncompleteArray { nullability, .. } => {
953
+ check_and_set_nullability ( nullability) ;
954
+ }
955
+ _ => panic ! ( "unexpected type: {:?}" , ty) ,
956
+ } ;
957
+ }
958
+ }
0 commit comments