Skip to content

Commit 95a28c5

Browse files
committed
Refactor __declare_class_rewrite_methods to be more straightforward
This slightly regresses UI with invalid syntax, since errors may now be output twice
1 parent 28c546d commit 95a28c5

File tree

2 files changed

+260
-129
lines changed

2 files changed

+260
-129
lines changed

crates/objc2/src/macros/declare_class.rs

Lines changed: 91 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -670,10 +670,7 @@ macro_rules! __declare_class_output_impls {
670670

671671
$(#[$m])*
672672
impl $for {
673-
$crate::__declare_class_rewrite_methods! {
674-
($crate::__declare_class_method_out)
675-
()
676-
673+
$crate::__declare_class_output_methods! {
677674
$($methods)*
678675
}
679676
}
@@ -694,10 +691,7 @@ macro_rules! __declare_class_output_impls {
694691
) => {
695692
$(#[$m])*
696693
impl $for {
697-
$crate::__declare_class_rewrite_methods! {
698-
($crate::__declare_class_method_out)
699-
()
700-
694+
$crate::__declare_class_output_methods! {
701695
$($methods)*
702696
}
703697
}
@@ -708,6 +702,63 @@ macro_rules! __declare_class_output_impls {
708702
};
709703
}
710704

705+
#[doc(hidden)]
706+
#[macro_export]
707+
macro_rules! __declare_class_output_methods {
708+
// Base case
709+
{} => {};
710+
711+
// Unsafe variant
712+
{
713+
$(#[$($m:tt)*])*
714+
unsafe fn $name:ident($($params:tt)*) $(-> $ret:ty)? $body:block
715+
716+
$($rest:tt)*
717+
} => {
718+
$crate::__rewrite_self_param! {
719+
($($params)*)
720+
721+
($crate::__extract_custom_attributes)
722+
($(#[$($m)*])*)
723+
724+
($crate::__declare_class_method_out)
725+
(unsafe)
726+
($name)
727+
($($ret)?)
728+
($body)
729+
}
730+
731+
$crate::__declare_class_output_methods! {
732+
$($rest)*
733+
}
734+
};
735+
736+
// Safe variant
737+
{
738+
$(#[$($m:tt)*])*
739+
fn $name:ident($($params:tt)*) $(-> $ret:ty)? $body:block
740+
741+
$($rest:tt)*
742+
} => {
743+
$crate::__rewrite_self_param! {
744+
($($params)*)
745+
746+
($crate::__extract_custom_attributes)
747+
($(#[$($m)*])*)
748+
749+
($crate::__declare_class_method_out)
750+
()
751+
($name)
752+
($($ret)?)
753+
($body)
754+
}
755+
756+
$crate::__declare_class_output_methods! {
757+
$($rest)*
758+
}
759+
};
760+
}
761+
711762
#[doc(hidden)]
712763
#[macro_export]
713764
macro_rules! __declare_class_register_impls {
@@ -742,8 +793,7 @@ macro_rules! __declare_class_register_impls {
742793
#[allow(unused_unsafe)]
743794
// SAFETY: Upheld by caller
744795
unsafe {
745-
$crate::__declare_class_rewrite_methods! {
746-
($crate::__declare_class_register_out)
796+
$crate::__declare_class_register_methods! {
747797
(__objc2_protocol_builder)
748798

749799
$($methods)*
@@ -781,8 +831,7 @@ macro_rules! __declare_class_register_impls {
781831
#[allow(unused_unsafe)]
782832
// SAFETY: Upheld by caller
783833
unsafe {
784-
$crate::__declare_class_rewrite_methods! {
785-
($crate::__declare_class_register_out)
834+
$crate::__declare_class_register_methods! {
786835
($builder)
787836

788837
$($methods)*
@@ -800,16 +849,15 @@ macro_rules! __declare_class_register_impls {
800849

801850
#[doc(hidden)]
802851
#[macro_export]
803-
macro_rules! __declare_class_rewrite_methods {
852+
macro_rules! __declare_class_register_methods {
853+
// Base case
804854
{
805-
($out_macro:path)
806-
($($macro_args:tt)*)
855+
($builder:ident)
807856
} => {};
808857

809858
// Unsafe variant
810859
{
811-
($out_macro:path)
812-
($($macro_args:tt)*)
860+
($builder:ident)
813861

814862
$(#[$($m:tt)*])*
815863
unsafe fn $name:ident($($params:tt)*) $(-> $ret:ty)? $body:block
@@ -822,26 +870,24 @@ macro_rules! __declare_class_rewrite_methods {
822870
($crate::__extract_custom_attributes)
823871
($(#[$($m)*])*)
824872

825-
($out_macro)
826-
($($macro_args)*)
873+
($crate::__declare_class_register_out)
874+
($builder)
827875
(unsafe)
828876
($name)
829877
($($ret)?)
830878
($body)
831879
}
832880

833-
$crate::__declare_class_rewrite_methods! {
834-
($out_macro)
835-
($($macro_args)*)
881+
$crate::__declare_class_register_methods! {
882+
($builder)
836883

837884
$($rest)*
838885
}
839886
};
840887

841888
// Safe variant
842889
{
843-
($out_macro:path)
844-
($($macro_args:tt)*)
890+
($builder:ident)
845891

846892
$(#[$($m:tt)*])*
847893
fn $name:ident($($params:tt)*) $(-> $ret:ty)? $body:block
@@ -854,28 +900,43 @@ macro_rules! __declare_class_rewrite_methods {
854900
($crate::__extract_custom_attributes)
855901
($(#[$($m)*])*)
856902

857-
($out_macro)
858-
($($macro_args)*)
903+
($crate::__declare_class_register_out)
904+
($builder)
859905
()
860906
($name)
861907
($($ret)?)
862908
($body)
863909
}
864910

865-
$crate::__declare_class_rewrite_methods! {
866-
($out_macro)
867-
($($macro_args)*)
911+
$crate::__declare_class_register_methods! {
912+
($builder)
868913

869914
$($rest)*
870915
}
871916
};
917+
918+
// Consume associated items for better UI.
919+
//
920+
// This will still fail inside __declare_class_output_methods!
921+
{
922+
($builder:ident)
923+
924+
$_associated_item:item
925+
926+
$($rest:tt)*
927+
} => {
928+
$crate::__declare_class_output_methods! {
929+
($builder)
930+
931+
$($rest)*
932+
}
933+
}
872934
}
873935

874936
#[doc(hidden)]
875937
#[macro_export]
876938
macro_rules! __declare_class_method_out {
877939
{
878-
()
879940
($($qualifiers:tt)*)
880941
($name:ident)
881942
($($ret:ty)?)

0 commit comments

Comments
 (0)