1
1
use crate :: common:: SQL ;
2
2
use swc_common:: MultiSpan ;
3
- use swc_ecma_ast:: { BlockStmt , ClassMember , Expr , Pat , Prop , PropOrSpread , SuperProp , VarDeclarator } ;
3
+ use swc_ecma_ast:: { BlockStmt , ClassMember , Expr , OptChainBase , Pat , Prop , PropOrSpread , SuperProp , VarDeclarator } ;
4
4
5
5
use super :: { get_var_decl_name_from_key, recurse_and_find_sql} ;
6
6
@@ -21,7 +21,8 @@ pub fn process_block_stmt_as_expr(
21
21
let expr = & expr. expr ;
22
22
get_sql_from_expr ( sqls, var_decl_name, expr, span, import_alias) ;
23
23
} else {
24
- recurse_and_find_sql ( sqls, stmt, import_alias) ;
24
+ // TODO: we should be using `?` and return Results
25
+ recurse_and_find_sql ( sqls, stmt, import_alias) . unwrap ( ) ;
25
26
}
26
27
}
27
28
}
@@ -83,7 +84,7 @@ pub fn get_sql_from_expr<'a>(
83
84
}
84
85
}
85
86
for arg in & call_expr. args {
86
- get_sql_from_expr ( sqls, var_decl_name, & arg. expr , span, import_alias)
87
+ get_sql_from_expr ( sqls, var_decl_name, & arg. expr , span, import_alias) ;
87
88
}
88
89
}
89
90
Expr :: This ( _) => { }
@@ -103,24 +104,23 @@ pub fn get_sql_from_expr<'a>(
103
104
Prop :: Shorthand ( _) => { }
104
105
Prop :: KeyValue ( key_val) => {
105
106
let value = & key_val. value ;
106
- get_sql_from_expr ( sqls, var_decl_name, value, span, import_alias)
107
+ get_sql_from_expr ( sqls, var_decl_name, value, span, import_alias) ;
107
108
}
108
109
Prop :: Assign ( assign) => {
109
110
let value = & assign. value ;
110
- get_sql_from_expr ( sqls, var_decl_name, value, span, import_alias)
111
+ get_sql_from_expr ( sqls, var_decl_name, value, span, import_alias) ;
111
112
}
112
113
Prop :: Getter ( getter) => {
113
114
let body = & getter. body ;
114
- process_block_stmt_as_expr ( body, sqls, var_decl_name, span, import_alias)
115
+ process_block_stmt_as_expr ( body, sqls, var_decl_name, span, import_alias) ;
115
116
}
116
- // TODO: add test
117
117
Prop :: Setter ( setter) => {
118
118
let body = & setter. body ;
119
- process_block_stmt_as_expr ( body, sqls, var_decl_name, span, import_alias)
119
+ process_block_stmt_as_expr ( body, sqls, var_decl_name, span, import_alias) ;
120
120
}
121
121
Prop :: Method ( method) => {
122
122
let body = & method. function . body ;
123
- process_block_stmt_as_expr ( body, sqls, var_decl_name, span, import_alias)
123
+ process_block_stmt_as_expr ( body, sqls, var_decl_name, span, import_alias) ;
124
124
}
125
125
} ,
126
126
}
@@ -142,8 +142,13 @@ pub fn get_sql_from_expr<'a>(
142
142
get_sql_from_expr ( sqls, var_decl_name, right, span, import_alias) ;
143
143
}
144
144
Expr :: Assign ( assign) => {
145
- let expr = & assign. right ;
146
- return get_sql_from_expr ( sqls, var_decl_name, expr, span, import_alias) ;
145
+ let right_expr = & assign. right ;
146
+ get_sql_from_expr ( sqls, var_decl_name, right_expr, span, import_alias) ;
147
+
148
+ let left_expr = & assign. left ;
149
+ left_expr
150
+ . as_expr ( )
151
+ . map ( |expr| get_sql_from_expr ( sqls, var_decl_name, & expr, span, import_alias) ) ;
147
152
}
148
153
Expr :: Member ( member) => {
149
154
let obj = & member. obj ;
@@ -159,22 +164,50 @@ pub fn get_sql_from_expr<'a>(
159
164
}
160
165
}
161
166
}
162
- Expr :: Cond ( _) => { }
167
+ Expr :: Cond ( cond) => {
168
+ let test = & cond. test ;
169
+ let cons = & cond. cons ;
170
+ let alt = & cond. alt ;
171
+ get_sql_from_expr ( sqls, var_decl_name, test, span, import_alias) ;
172
+ get_sql_from_expr ( sqls, var_decl_name, cons, span, import_alias) ;
173
+ get_sql_from_expr ( sqls, var_decl_name, alt, span, import_alias) ;
174
+ }
163
175
Expr :: New ( expr) => {
176
+ let args = & expr. args ;
164
177
let expr = & expr. callee ;
165
- return get_sql_from_expr ( sqls, var_decl_name, expr, span, import_alias) ;
178
+ if let Some ( args) = & args {
179
+ for arg in args {
180
+ get_sql_from_expr ( sqls, var_decl_name, & arg. expr , span, import_alias) ;
181
+ }
182
+ }
183
+
184
+ get_sql_from_expr ( sqls, var_decl_name, expr, span, import_alias) ;
166
185
}
167
186
Expr :: Seq ( seq) => {
168
187
let exprs = & seq. exprs ;
169
188
for expr in exprs {
170
- get_sql_from_expr ( sqls, var_decl_name, expr, span, import_alias)
189
+ get_sql_from_expr ( sqls, var_decl_name, expr, span, import_alias) ;
171
190
}
172
191
}
173
192
Expr :: Ident ( ident) => { }
174
193
Expr :: Lit ( lit) => { }
175
194
Expr :: Tpl ( tpl) => {
195
+ let new_sqls: Vec < SQL > = tpl
196
+ . quasis
197
+ . iter ( )
198
+ . map ( |tpl_element| SQL {
199
+ var_decl_name : var_decl_name. to_owned ( ) ,
200
+ query : tpl_element. raw . to_string ( ) ,
201
+ span : span. clone ( ) ,
202
+ } )
203
+ . collect ( ) ;
204
+
205
+ if !new_sqls. is_empty ( ) {
206
+ sqls. extend ( new_sqls) ;
207
+ }
208
+
176
209
for expr in & tpl. exprs {
177
- get_sql_from_expr ( sqls, var_decl_name, expr, span, import_alias)
210
+ get_sql_from_expr ( sqls, var_decl_name, expr, span, import_alias) ;
178
211
}
179
212
}
180
213
Expr :: Arrow ( arrow) => {
@@ -183,7 +216,14 @@ pub fn get_sql_from_expr<'a>(
183
216
process_block_stmt_as_expr ( & block_stmt, sqls, var_decl_name, span, import_alias) ;
184
217
185
218
if let Some ( expr) = expr {
186
- return get_sql_from_expr ( sqls, var_decl_name, expr, span, import_alias) ;
219
+ get_sql_from_expr ( sqls, var_decl_name, expr, span, import_alias) ;
220
+ }
221
+
222
+ for param in & arrow. params {
223
+ let param = param. as_expr ( ) ;
224
+ if let Some ( expr) = & param {
225
+ get_sql_from_expr ( sqls, var_decl_name, expr, span, import_alias) ;
226
+ }
187
227
}
188
228
}
189
229
Expr :: Class ( class) => {
@@ -203,11 +243,11 @@ pub fn get_sql_from_expr<'a>(
203
243
}
204
244
ClassMember :: Method ( method) => {
205
245
let body = & method. function . body ;
206
- process_block_stmt_as_expr ( body, sqls, var_decl_name, span, import_alias)
246
+ process_block_stmt_as_expr ( body, sqls, var_decl_name, span, import_alias) ;
207
247
}
208
248
ClassMember :: PrivateMethod ( private_method) => {
209
249
let body = & private_method. function . body ;
210
- process_block_stmt_as_expr ( body, sqls, var_decl_name, span, import_alias)
250
+ process_block_stmt_as_expr ( body, sqls, var_decl_name, span, import_alias) ;
211
251
}
212
252
ClassMember :: ClassProp ( class_prop) => {
213
253
let body = & class_prop. value ;
@@ -225,15 +265,15 @@ pub fn get_sql_from_expr<'a>(
225
265
ClassMember :: Empty ( _) => { }
226
266
ClassMember :: StaticBlock ( static_block) => {
227
267
let body = & static_block. body ;
228
- process_block_stmt_as_expr ( & Some ( body. clone ( ) ) , sqls, var_decl_name, span, import_alias)
268
+ process_block_stmt_as_expr ( & Some ( body. clone ( ) ) , sqls, var_decl_name, span, import_alias) ;
229
269
}
230
270
ClassMember :: AutoAccessor ( auto_accessor) => {
231
271
let value = & auto_accessor. value ;
232
272
let key = & auto_accessor. key ;
233
273
234
274
if let Some ( expr) = & value {
235
275
let var_decl_name = & get_var_decl_name_from_key ( & key) ;
236
- get_sql_from_expr ( sqls, var_decl_name, expr, span, import_alias)
276
+ get_sql_from_expr ( sqls, var_decl_name, expr, span, import_alias) ;
237
277
}
238
278
}
239
279
}
@@ -254,6 +294,25 @@ pub fn get_sql_from_expr<'a>(
254
294
let expr = & paren. expr ;
255
295
return get_sql_from_expr ( sqls, var_decl_name, expr, span, import_alias) ;
256
296
}
297
+ Expr :: OptChain ( opt_chain) => {
298
+ let expr = & * opt_chain. base ;
299
+ match & expr {
300
+ OptChainBase :: Member ( member) => {
301
+ let obj = & member. obj ;
302
+ get_sql_from_expr ( sqls, var_decl_name, obj, span, import_alias) ;
303
+ }
304
+ OptChainBase :: Call ( call) => {
305
+ let expr = & call. callee ;
306
+ get_sql_from_expr ( sqls, var_decl_name, & expr, span, import_alias) ;
307
+
308
+ let args = & call. args ;
309
+ for arg in args. iter ( ) {
310
+ let expr = & arg. expr ;
311
+ get_sql_from_expr ( sqls, var_decl_name, & expr, span, import_alias) ;
312
+ }
313
+ }
314
+ }
315
+ }
257
316
Expr :: JSXMember ( _) => { }
258
317
Expr :: JSXNamespacedName ( _) => { }
259
318
Expr :: JSXEmpty ( _) => { }
@@ -264,7 +323,6 @@ pub fn get_sql_from_expr<'a>(
264
323
Expr :: TsAs ( _) => { }
265
324
Expr :: TsInstantiation ( _) => { }
266
325
Expr :: PrivateName ( _) => { }
267
- Expr :: OptChain ( _) => { }
268
326
Expr :: Invalid ( _) => { }
269
327
Expr :: TsSatisfies ( _) => { }
270
328
}
0 commit comments