1
1
/**
2
2
* Some code is modified based on
3
3
* https://github.com/vercel/turbo/blob/a1947f64443fb98e5c3e10bca6ef9eafd278bd21/crates/turbopack-ecmascript/src/code_gen.rs
4
+ * https://github.com/vercel/turbo/blob/a1947f64443fb98e5c3e10bca6ef9eafd278bd21/crates/turbopack-css/src/code_gen.rs
4
5
* MPL-2.0 Licensed
5
- * Author Alex Kirszenberg
6
+ * Author Alex Kirszenberg, ForsakenHarmony
6
7
* Copyright (c)
7
8
* https://github.com/vercel/turbo/blob/a1947f64443fb98e5c3e10bca6ef9eafd278bd21/LICENSE#L1
8
9
*/
@@ -215,7 +216,7 @@ macro_rules! create_javascript_visitor {
215
216
visit_mut_program: T ,
216
217
}
217
218
218
- impl <T : Fn ( & mut swc_core:: ecma:: ast:: Program ) + Send + Sync > $crate:: code_gen :: VisitorFactory
219
+ impl <T : Fn ( & mut swc_core:: ecma:: ast:: Program ) + Send + Sync > $crate:: JavaScriptVisitorBuilder
219
220
for Box <Visitor <T >>
220
221
{
221
222
fn create<' a>( & ' a self ) -> Box <dyn swc_core:: ecma:: visit:: VisitMut + Send + Sync + ' a> {
@@ -232,10 +233,12 @@ macro_rules! create_javascript_visitor {
232
233
}
233
234
234
235
(
235
- Vec :: new( ) ,
236
- box box Visitor {
237
- visit_mut_program: move |$arg: & mut swc_core:: ecma:: ast:: Program | $b,
238
- } as Box <dyn $crate:: code_gen:: VisitorFactory >,
236
+ $crate:: CodeGeneratableAstPath :: JavaScript ( Vec :: new( ) ) ,
237
+ $crate:: CodeGeneratableVisitorBuilder :: JavaScript (
238
+ box box Visitor {
239
+ visit_mut_program: move |$arg: & mut swc_core:: ecma:: ast:: Program | $b,
240
+ } as Box <dyn $crate:: JavaScriptVisitorBuilder >,
241
+ ) ,
239
242
)
240
243
} } ;
241
244
}
@@ -251,3 +254,87 @@ pub fn javascript_path_to(
251
254
path. to_vec ( )
252
255
}
253
256
}
257
+
258
+ #[ macro_export]
259
+ macro_rules! create_css_visitor {
260
+ ( exact $ast_path: expr, $name: ident( $arg: ident: & mut $ty: ident) $b: block) => {
261
+ $crate:: create_css_visitor!( __ $ast_path. to_vec( ) , $name( $arg: & mut $ty) $b)
262
+ } ;
263
+ ( $ast_path: expr, $name: ident( $arg: ident: & mut $ty: ident) $b: block) => {
264
+ $crate:: create_css_visitor!( __ $crate:: css_path_to( & $ast_path, |n| {
265
+ matches!( n, swc_core:: css:: visit:: AstParentKind :: $ty( _) )
266
+ } ) , $name( $arg: & mut $ty) $b)
267
+ } ;
268
+ ( __ $ast_path: expr, $name: ident( $arg: ident: & mut $ty: ident) $b: block) => { {
269
+ struct Visitor <T : Fn ( & mut swc_core:: css:: ast:: $ty) + Send + Sync > {
270
+ $name: T ,
271
+ }
272
+
273
+ impl <T : Fn ( & mut swc_core:: css:: ast:: $ty) + Send + Sync > $crate:: CssVisitorBuilder
274
+ for Box <Visitor <T >>
275
+ {
276
+ fn create<' a>( & ' a self ) -> Box <dyn swc_core:: css:: visit:: VisitMut + Send + Sync + ' a> {
277
+ Box :: new( & * * self )
278
+ }
279
+ }
280
+
281
+ impl <' a, T : Fn ( & mut swc_core:: css:: ast:: $ty) + Send + Sync > swc_core:: css:: visit:: VisitMut
282
+ for & ' a Visitor <T >
283
+ {
284
+ fn $name( & mut self , $arg: & mut swc_core:: css:: ast:: $ty) {
285
+ ( self . $name) ( $arg) ;
286
+ }
287
+ }
288
+
289
+ (
290
+ $crate:: CodeGeneratableAstPath :: from( $ast_path) ,
291
+ $crate:: CodeGeneratableVisitorBuilder :: Css (
292
+ box box Visitor {
293
+ $name: move |$arg: & mut swc_core:: css:: ast:: $ty| $b,
294
+ } as Box <dyn $crate:: CssVisitorBuilder >
295
+ ) ,
296
+ )
297
+ } } ;
298
+ ( visit_mut_stylesheet( $arg: ident: & mut Stylesheet ) $b: block) => { {
299
+ struct Visitor <T : Fn ( & mut swc_core:: css:: ast:: Stylesheet ) + Send + Sync > {
300
+ visit_mut_stylesheet: T ,
301
+ }
302
+
303
+ impl <T : Fn ( & mut swc_core:: css:: ast:: Stylesheet ) + Send + Sync > $crate:: CssVisitorBuilder
304
+ for Box <Visitor <T >>
305
+ {
306
+ fn create<' a>( & ' a self ) -> Box <dyn swc_core:: css:: visit:: VisitMut + Send + Sync + ' a> {
307
+ Box :: new( & * * self )
308
+ }
309
+ }
310
+
311
+ impl <' a, T : Fn ( & mut swc_core:: css:: ast:: Stylesheet ) + Send + Sync > swc_core:: css:: visit:: VisitMut
312
+ for & ' a Visitor <T >
313
+ {
314
+ fn visit_mut_stylesheet( & mut self , $arg: & mut swc_core:: css:: ast:: Stylesheet ) {
315
+ ( self . visit_mut_stylesheet) ( $arg) ;
316
+ }
317
+ }
318
+
319
+ (
320
+ $crate:: CodeGeneratableAstPath :: Css ( Vec :: new( ) ) ,
321
+ $crate:: CodeGeneratableVisitorBuilder :: Css (
322
+ box box Visitor {
323
+ visit_mut_stylesheet: move |$arg: & mut swc_core:: css:: ast:: Stylesheet | $b,
324
+ } as Box <dyn $crate:: CssVisitorBuilder >
325
+ ) ,
326
+ )
327
+ } } ;
328
+ }
329
+
330
+ pub fn css_path_to (
331
+ path : & [ swc_core:: css:: visit:: AstParentKind ] ,
332
+ f : impl FnMut ( & swc_core:: css:: visit:: AstParentKind ) -> bool ,
333
+ ) -> Vec < swc_core:: css:: visit:: AstParentKind > {
334
+ if let Some ( pos) = path. iter ( ) . rev ( ) . position ( f) {
335
+ let index = path. len ( ) - pos - 1 ;
336
+ path[ ..index] . to_vec ( )
337
+ } else {
338
+ path. to_vec ( )
339
+ }
340
+ }
0 commit comments