@@ -29,6 +29,7 @@ use std::ptr::null_mut;
29
29
struct JavaSwc4jAstFactory {
30
30
#[ allow( dead_code) ]
31
31
class : GlobalRef ,
32
+ method_create_binding_ident : JStaticMethodID ,
32
33
method_create_ident : JStaticMethodID ,
33
34
method_create_module : JStaticMethodID ,
34
35
method_create_script : JStaticMethodID ,
@@ -46,11 +47,18 @@ impl JavaSwc4jAstFactory {
46
47
let class = env
47
48
. new_global_ref ( class)
48
49
. expect ( "Couldn't globalize class Swc4jAstFactory" ) ;
50
+ let method_create_binding_ident = env
51
+ . get_static_method_id (
52
+ & class,
53
+ "createBindingIdent" ,
54
+ "(Lcom/caoccao/javet/swc4j/ast/expr/Swc4jAstIdent;Lcom/caoccao/javet/swc4j/ast/ts/Swc4jAstTsTypeAnn;II)Lcom/caoccao/javet/swc4j/ast/pat/Swc4jAstBindingIdent;" ,
55
+ )
56
+ . expect ( "Couldn't find method Swc4jAstFactory.createBindingIdent" ) ;
49
57
let method_create_ident = env
50
58
. get_static_method_id (
51
59
& class,
52
60
"createIdent" ,
53
- "(Ljava/lang/String;ZII)Lcom/caoccao/javet/swc4j/ast/pat /Swc4jAstIdent;" ,
61
+ "(Ljava/lang/String;ZII)Lcom/caoccao/javet/swc4j/ast/expr /Swc4jAstIdent;" ,
54
62
)
55
63
. expect ( "Couldn't find method Swc4jAstFactory.createIdent" ) ;
56
64
let method_create_module = env
@@ -83,6 +91,7 @@ impl JavaSwc4jAstFactory {
83
91
. expect ( "Couldn't find method Swc4jAstFactory.createVarDeclarator" ) ;
84
92
JavaSwc4jAstFactory {
85
93
class,
94
+ method_create_binding_ident,
86
95
method_create_ident,
87
96
method_create_module,
88
97
method_create_script,
@@ -91,6 +100,35 @@ impl JavaSwc4jAstFactory {
91
100
}
92
101
}
93
102
103
+ pub fn create_binding_ident < ' local , ' a > (
104
+ & self ,
105
+ env : & mut JNIEnv < ' local > ,
106
+ id : & JObject < ' _ > ,
107
+ type_ann : & JObject < ' _ > ,
108
+ range : & Range < usize > ,
109
+ ) -> JObject < ' a >
110
+ where
111
+ ' local : ' a ,
112
+ {
113
+ let id = jvalue { l : id. as_raw ( ) } ;
114
+ let type_ann = jvalue { l : type_ann. as_raw ( ) } ;
115
+ let start_position = jvalue { i : range. start as i32 } ;
116
+ let end_position = jvalue { i : range. end as i32 } ;
117
+ let return_value = unsafe {
118
+ env
119
+ . call_static_method_unchecked (
120
+ & self . class ,
121
+ self . method_create_binding_ident ,
122
+ ReturnType :: Object ,
123
+ & [ id, type_ann, start_position, end_position] ,
124
+ )
125
+ . expect ( "Couldn't create Swc4jAstBindingIdent by create_binding_ident()" )
126
+ . l ( )
127
+ . expect ( "Couldn't convert Swc4jAstBindingIdent by create_binding_ident()" )
128
+ } ;
129
+ return_value
130
+ }
131
+
94
132
pub fn create_ident < ' local , ' a > (
95
133
& self ,
96
134
env : & mut JNIEnv < ' local > ,
@@ -298,8 +336,36 @@ pub mod span {
298
336
} ;
299
337
}
300
338
339
+ fn register_ident ( byte_to_index_map : & mut ByteToIndexMap , ident : & Ident ) {
340
+ byte_to_index_map. register_by_span ( & ident. span ) ;
341
+ }
342
+
301
343
fn register_module ( byte_to_index_map : & mut ByteToIndexMap , module : & Module ) {
302
344
byte_to_index_map. register_by_span ( & module. span ) ;
345
+ module
346
+ . body
347
+ . iter ( )
348
+ . for_each ( |module_item| register_module_item ( byte_to_index_map, & module_item) ) ;
349
+ }
350
+
351
+ fn register_module_decl ( byte_to_index_map : & mut ByteToIndexMap , module_decl : & ModuleDecl ) {
352
+ match module_decl {
353
+ _ => { } // TODO
354
+ }
355
+ }
356
+
357
+ fn register_module_item ( byte_to_index_map : & mut ByteToIndexMap , module_item : & ModuleItem ) {
358
+ match module_item {
359
+ ModuleItem :: ModuleDecl ( module_decl) => register_module_decl ( byte_to_index_map, & module_decl) ,
360
+ ModuleItem :: Stmt ( stmt) => register_stmt ( byte_to_index_map, & stmt) ,
361
+ }
362
+ }
363
+
364
+ fn register_pat ( byte_to_index_map : & mut ByteToIndexMap , pat : & Pat ) {
365
+ match & pat {
366
+ Pat :: Ident ( binding_ident) => register_ident ( byte_to_index_map, & binding_ident. id ) ,
367
+ _ => { }
368
+ }
303
369
}
304
370
305
371
fn register_script ( byte_to_index_map : & mut ByteToIndexMap , script : & Script ) {
@@ -335,7 +401,7 @@ pub mod span {
335
401
336
402
fn register_var_declarator ( byte_to_index_map : & mut ByteToIndexMap , var_declarator : & VarDeclarator ) {
337
403
byte_to_index_map. register_by_span ( & var_declarator. span ) ;
338
- // TODO
404
+ register_pat ( byte_to_index_map , & var_declarator . name ) ;
339
405
}
340
406
}
341
407
@@ -353,49 +419,48 @@ pub mod program {
353
419
use deno_ast:: swc:: ast:: * ;
354
420
use deno_ast:: swc:: common:: Spanned ;
355
421
356
- fn create_ident < ' local , ' a > (
422
+ fn create_binding_ident < ' local , ' a > (
357
423
env : & mut JNIEnv < ' local > ,
358
424
byte_to_index_map : & ByteToIndexMap ,
359
- ident : & Ident ,
425
+ binding_ident : & BindingIdent ,
360
426
) -> JObject < ' a >
361
427
where
362
428
' local : ' a ,
363
429
{
364
430
let java_ast_factory = unsafe { JAVA_AST_FACTORY . as_ref ( ) . unwrap ( ) } ;
365
- let range = byte_to_index_map. get_range_by_span ( & ident. span ( ) ) ;
366
- let sym = ident. sym . as_str ( ) ;
367
- let optional = ident. optional ;
368
- java_ast_factory. create_ident ( env, sym, optional, & range)
431
+ let range = byte_to_index_map. get_range_by_span ( & binding_ident. span ( ) ) ;
432
+ let java_id = create_ident ( env, byte_to_index_map, & binding_ident. id ) ;
433
+ let type_ann: JObject < ' _ > = Default :: default ( ) ; // TODO
434
+ let return_value = java_ast_factory. create_binding_ident ( env, & java_id, & type_ann, & range) ;
435
+ env
436
+ . delete_local_ref ( java_id)
437
+ . expect ( "Couldn't delete local binding ident" ) ;
438
+ return_value
369
439
}
370
440
371
- pub fn create_program < ' local , ' a > (
441
+ fn create_expr < ' local , ' a > ( env : & mut JNIEnv < ' local > , byte_to_index_map : & ByteToIndexMap , expr : & Expr ) -> JObject < ' a >
442
+ where
443
+ ' local : ' a ,
444
+ {
445
+ match expr {
446
+ Expr :: Ident ( ident) => create_ident ( env, byte_to_index_map, & ident) ,
447
+ _ => Default :: default ( ) ,
448
+ }
449
+ }
450
+
451
+ fn create_ident < ' local , ' a > (
372
452
env : & mut JNIEnv < ' local > ,
373
453
byte_to_index_map : & ByteToIndexMap ,
374
- program : & Option < Arc < Program > > ,
454
+ ident : & Ident ,
375
455
) -> JObject < ' a >
376
456
where
377
457
' local : ' a ,
378
458
{
379
- match program {
380
- Some ( arc_program) => {
381
- if arc_program. is_module ( ) {
382
- create_module (
383
- env,
384
- byte_to_index_map,
385
- arc_program. as_module ( ) . expect ( "Couldn't get module" ) ,
386
- )
387
- } else if arc_program. is_script ( ) {
388
- create_script (
389
- env,
390
- byte_to_index_map,
391
- arc_program. as_script ( ) . expect ( "Couldn't get script" ) ,
392
- )
393
- } else {
394
- Default :: default ( )
395
- }
396
- }
397
- None => Default :: default ( ) ,
398
- }
459
+ let java_ast_factory = unsafe { JAVA_AST_FACTORY . as_ref ( ) . unwrap ( ) } ;
460
+ let range = byte_to_index_map. get_range_by_span ( & ident. span ( ) ) ;
461
+ let sym = ident. sym . as_str ( ) ;
462
+ let optional = ident. optional ;
463
+ java_ast_factory. create_ident ( env, sym, optional, & range)
399
464
}
400
465
401
466
fn create_module < ' local , ' a > (
@@ -432,15 +497,40 @@ pub mod program {
432
497
where
433
498
' local : ' a ,
434
499
{
435
- let java_ast_factory = unsafe { JAVA_AST_FACTORY . as_ref ( ) . unwrap ( ) } ;
436
- let range = byte_to_index_map. get_range_by_span ( & pat. span ( ) ) ;
437
500
match pat {
438
- Pat :: Ident ( bingding_ident) => {
439
- let java_id = create_ident ( env, byte_to_index_map, & bingding_ident. id ) ;
501
+ Pat :: Ident ( bingding_ident) => create_binding_ident ( env, byte_to_index_map, & bingding_ident) ,
502
+ _ => Default :: default ( ) ,
503
+ }
504
+ }
505
+
506
+ pub fn create_program < ' local , ' a > (
507
+ env : & mut JNIEnv < ' local > ,
508
+ byte_to_index_map : & ByteToIndexMap ,
509
+ program : & Option < Arc < Program > > ,
510
+ ) -> JObject < ' a >
511
+ where
512
+ ' local : ' a ,
513
+ {
514
+ match program {
515
+ Some ( arc_program) => {
516
+ if arc_program. is_module ( ) {
517
+ create_module (
518
+ env,
519
+ byte_to_index_map,
520
+ arc_program. as_module ( ) . expect ( "Couldn't get module" ) ,
521
+ )
522
+ } else if arc_program. is_script ( ) {
523
+ create_script (
524
+ env,
525
+ byte_to_index_map,
526
+ arc_program. as_script ( ) . expect ( "Couldn't get script" ) ,
527
+ )
528
+ } else {
529
+ Default :: default ( )
530
+ }
440
531
}
441
- _ => { }
532
+ None => Default :: default ( ) ,
442
533
}
443
- Default :: default ( )
444
534
}
445
535
446
536
fn create_stmt < ' local , ' a > (
@@ -542,7 +632,10 @@ pub mod program {
542
632
{
543
633
let java_ast_factory = unsafe { JAVA_AST_FACTORY . as_ref ( ) . unwrap ( ) } ;
544
634
let definite = var_declarator. definite ;
545
- let init: Option < JObject > = None ; // TODO
635
+ let init: Option < JObject > = match & var_declarator. init {
636
+ Some ( box_expr) => Some ( create_expr ( env, byte_to_index_map, & box_expr. as_ref ( ) ) ) ,
637
+ None => None ,
638
+ } ;
546
639
let name = create_pat ( env, byte_to_index_map, & var_declarator. name ) ;
547
640
let range = byte_to_index_map. get_range_by_span ( & var_declarator. span ( ) ) ;
548
641
let return_value = java_ast_factory. create_var_declarator ( env, & name, & init, definite, & range) ;
0 commit comments