1
1
use darling:: FromMeta ;
2
2
3
+ const MAGIC_METHOD : [ & str ; 17 ] = [
4
+ "__construct" ,
5
+ "__destruct" ,
6
+ "__call" ,
7
+ "__call_static" ,
8
+ "__get" ,
9
+ "__set" ,
10
+ "__isset" ,
11
+ "__unset" ,
12
+ "__sleep" ,
13
+ "__wakeup" ,
14
+ "__serialize" ,
15
+ "__unserialize" ,
16
+ "__to_string" ,
17
+ "__invoke" ,
18
+ "__set_state" ,
19
+ "__clone" ,
20
+ "__debug_info" ,
21
+ ] ;
22
+
3
23
#[ derive( Debug , FromMeta ) ]
4
24
pub enum Visibility {
5
25
#[ darling( rename = "public" ) ]
@@ -10,6 +30,14 @@ pub enum Visibility {
10
30
Protected ,
11
31
}
12
32
33
+ pub trait Rename {
34
+ fn rename ( & self , rule : & RenameRule ) -> String ;
35
+ }
36
+
37
+ pub trait MethodRename : Rename {
38
+ fn rename_method ( & self , rule : & RenameRule ) -> String ;
39
+ }
40
+
13
41
#[ derive( FromMeta , Debug , Default ) ]
14
42
#[ darling( default ) ]
15
43
pub struct PhpRename {
@@ -24,7 +52,7 @@ impl PhpRename {
24
52
let name = name. as_ref ( ) ;
25
53
self . rename
26
54
. as_ref ( )
27
- . map_or_else ( || name. to_string ( ) , |r| r . rename ( name ) )
55
+ . map_or_else ( || name. to_string ( ) , |r| name . rename ( r ) )
28
56
} ,
29
57
ToString :: to_string,
30
58
)
@@ -52,52 +80,66 @@ pub enum RenameRule {
52
80
}
53
81
54
82
impl RenameRule {
55
- /// Change case of an identifier.
56
- ///
57
- /// Magic methods are handled specially to make sure they're always cased
58
- /// correctly.
59
- pub fn rename ( self , name : impl AsRef < str > ) -> String {
60
- let name = name. as_ref ( ) ;
61
- match self {
62
- RenameRule :: None => name. to_string ( ) ,
63
- rule => match name {
64
- "__construct" => "__construct" . to_string ( ) ,
65
- "__destruct" => "__destruct" . to_string ( ) ,
66
- "__call" => "__call" . to_string ( ) ,
67
- "__call_static" => "__callStatic" . to_string ( ) ,
68
- "__get" => "__get" . to_string ( ) ,
69
- "__set" => "__set" . to_string ( ) ,
70
- "__isset" => "__isset" . to_string ( ) ,
71
- "__unset" => "__unset" . to_string ( ) ,
72
- "__sleep" => "__sleep" . to_string ( ) ,
73
- "__wakeup" => "__wakeup" . to_string ( ) ,
74
- "__serialize" => "__serialize" . to_string ( ) ,
75
- "__unserialize" => "__unserialize" . to_string ( ) ,
76
- "__to_string" => "__toString" . to_string ( ) ,
77
- "__invoke" => "__invoke" . to_string ( ) ,
78
- "__set_state" => "__set_state" . to_string ( ) ,
79
- "__clone" => "__clone" . to_string ( ) ,
80
- "__debug_info" => "__debugInfo" . to_string ( ) ,
81
- field => match rule {
82
- Self :: Camel => ident_case:: RenameRule :: CamelCase . apply_to_field ( field) ,
83
- Self :: Pascal => ident_case:: RenameRule :: PascalCase . apply_to_field ( field) ,
84
- Self :: Snake => ident_case:: RenameRule :: SnakeCase . apply_to_field ( field) ,
85
- Self :: ScreamingSnakeCase => {
86
- ident_case:: RenameRule :: ScreamingSnakeCase . apply_to_field ( field)
83
+ fn rename ( & self , value : impl AsRef < str > ) -> String {
84
+ match * self {
85
+ Self :: None => value. as_ref ( ) . to_string ( ) ,
86
+ Self :: Camel => ident_case:: RenameRule :: CamelCase . apply_to_field ( value. as_ref ( ) ) ,
87
+ Self :: Pascal => ident_case:: RenameRule :: PascalCase . apply_to_field ( value. as_ref ( ) ) ,
88
+ Self :: Snake => ident_case:: RenameRule :: SnakeCase . apply_to_field ( value. as_ref ( ) ) ,
89
+ Self :: ScreamingSnakeCase => {
90
+ ident_case:: RenameRule :: ScreamingSnakeCase . apply_to_field ( value. as_ref ( ) )
91
+ }
92
+ }
93
+ }
94
+ }
95
+
96
+ impl Rename for & str {
97
+ fn rename ( & self , rule : & RenameRule ) -> String {
98
+ rule. rename ( self )
99
+ }
100
+ }
101
+
102
+ impl Rename for syn:: Ident {
103
+ fn rename ( & self , rule : & RenameRule ) -> String {
104
+ let s = self . to_string ( ) ;
105
+ rule. rename ( s)
106
+ }
107
+ }
108
+
109
+ impl MethodRename for syn:: Ident {
110
+ fn rename_method ( & self , rule : & RenameRule ) -> String {
111
+ self . to_string ( ) . as_str ( ) . rename_method ( rule)
112
+ }
113
+ }
114
+
115
+ impl MethodRename for & str {
116
+ fn rename_method ( & self , rule : & RenameRule ) -> String {
117
+ match rule {
118
+ RenameRule :: None => self . to_string ( ) ,
119
+ _ => {
120
+ if MAGIC_METHOD . contains ( self ) {
121
+ match * self {
122
+ "__to_string" => "__toString" . to_string ( ) ,
123
+ "__debug_info" => "__debugInfo" . to_string ( ) ,
124
+ "__call_static" => "__callStatic" . to_string ( ) ,
125
+ _ => self . to_string ( ) ,
87
126
}
88
- Self :: None => unreachable ! ( ) ,
89
- } ,
90
- } ,
127
+ } else {
128
+ self . rename ( rule)
129
+ }
130
+ }
91
131
}
92
132
}
93
133
}
94
134
95
135
#[ cfg( test) ]
96
136
mod tests {
97
- use super :: { PhpRename , RenameRule } ;
137
+ use crate :: parsing:: { MethodRename , Rename } ;
138
+
139
+ use super :: { PhpRename , RenameRule , MAGIC_METHOD } ;
98
140
99
141
#[ test]
100
- fn test_php_rename ( ) {
142
+ fn php_rename ( ) {
101
143
let rename = PhpRename {
102
144
name : Some ( "test" . to_string ( ) ) ,
103
145
rename : None ,
@@ -132,7 +174,7 @@ mod tests {
132
174
}
133
175
134
176
#[ test]
135
- fn test_rename_magic ( ) {
177
+ fn rename_magic_method ( ) {
136
178
for & ( magic, expected) in & [
137
179
( "__construct" , "__construct" ) ,
138
180
( "__destruct" , "__destruct" ) ,
@@ -152,25 +194,42 @@ mod tests {
152
194
( "__clone" , "__clone" ) ,
153
195
( "__debug_info" , "__debugInfo" ) ,
154
196
] {
155
- assert_eq ! ( magic, RenameRule :: None . rename( magic) ) ;
156
- assert_eq ! ( expected, RenameRule :: Camel . rename( magic) ) ;
157
- assert_eq ! ( expected, RenameRule :: Pascal . rename( magic) ) ;
158
- assert_eq ! ( expected, RenameRule :: Snake . rename( magic) ) ;
159
- assert_eq ! ( expected, RenameRule :: ScreamingSnakeCase . rename( magic) ) ;
197
+ assert_eq ! ( magic, magic. rename_method( & RenameRule :: None ) ) ;
198
+ assert_eq ! ( expected, magic. rename_method( & RenameRule :: Camel ) ) ;
199
+ assert_eq ! ( expected, magic. rename_method( & RenameRule :: Pascal ) ) ;
200
+ assert_eq ! ( expected, magic. rename_method( & RenameRule :: Snake ) ) ;
201
+ assert_eq ! (
202
+ expected,
203
+ magic. rename_method( & RenameRule :: ScreamingSnakeCase )
204
+ ) ;
160
205
}
161
206
}
162
207
163
208
#[ test]
164
- fn test_rename_php_methods ( ) {
209
+ fn rename_method ( ) {
210
+ let & ( original, camel, snake, pascal, screaming_snake) =
211
+ & ( "get_name" , "getName" , "get_name" , "GetName" , "GET_NAME" ) ;
212
+ assert_eq ! ( original, original. rename_method( & RenameRule :: None ) ) ;
213
+ assert_eq ! ( camel, original. rename_method( & RenameRule :: Camel ) ) ;
214
+ assert_eq ! ( pascal, original. rename_method( & RenameRule :: Pascal ) ) ;
215
+ assert_eq ! ( snake, original. rename_method( & RenameRule :: Snake ) ) ;
216
+ assert_eq ! (
217
+ screaming_snake,
218
+ original. rename_method( & RenameRule :: ScreamingSnakeCase )
219
+ ) ;
220
+ }
221
+
222
+ #[ test]
223
+ fn rename ( ) {
165
224
let & ( original, camel, snake, pascal, screaming_snake) =
166
225
& ( "get_name" , "getName" , "get_name" , "GetName" , "GET_NAME" ) ;
167
- assert_eq ! ( original, RenameRule :: None . rename ( original ) ) ;
168
- assert_eq ! ( camel, RenameRule :: Camel . rename ( original ) ) ;
169
- assert_eq ! ( pascal, RenameRule :: Pascal . rename ( original ) ) ;
170
- assert_eq ! ( snake, RenameRule :: Snake . rename ( original ) ) ;
226
+ assert_eq ! ( original, original . rename ( & RenameRule :: None ) ) ;
227
+ assert_eq ! ( camel, original . rename ( & RenameRule :: Camel ) ) ;
228
+ assert_eq ! ( pascal, original . rename ( & RenameRule :: Pascal ) ) ;
229
+ assert_eq ! ( snake, original . rename ( & RenameRule :: Snake ) ) ;
171
230
assert_eq ! (
172
231
screaming_snake,
173
- RenameRule :: ScreamingSnakeCase . rename ( original )
232
+ original . rename ( & RenameRule :: ScreamingSnakeCase )
174
233
) ;
175
234
}
176
235
}
0 commit comments