1use swc_ecma_ast::Stmt;
2use swc_ecma_ast::{ModuleItem};
3use wasm_bindgen::prelude::*;
4use serde::{Serialize};
5use std::fs::File;
6use std::io::Write;
7use std::path::Path;
8
9use swc_common::sync::Lrc;
10use swc_common::{SourceMap};
11use swc_ecma_parser::{lexer::Lexer, Parser, StringInput, Syntax};
12
13
14#[derive(Serialize, Debug)]
15struct Output {
16 class_number: usize,
17}
18
19#[wasm_bindgen]
20unsafe extern "C" {
21 pub unsafe fn alert(s: &str);
22}
23
24#[wasm_bindgen]
25pub fn greet(name: &str) {
26 unsafe { alert(&format!("Hello, {}!", name)) };
27}
28
29pub fn execute() {
30 let cm: Lrc<SourceMap> = Default::default();
31 let fm = cm
37 .load_file(Path::new("index.js"))
38 .expect("failed to load test.js");
39 let lexer = Lexer::new(
40 Syntax::Es(Default::default()),
42 Default::default(),
44 StringInput::from(&*fm),
45 None,
46 );
47 let mut parser = Parser::new_from(lexer);
48 let _module = parser
49 .parse_module()
50 .expect("failed to parser module");
51 let class_count = _module.body.iter().filter(|item| {
52 match item {
53 ModuleItem::Stmt(class_decl) => {
54 match class_decl {
56 Stmt::Decl(class_decl) => {
57 match class_decl {
58 swc_ecma_ast::Decl::Class(_) => {
59 return true;
61 },
62 _ => return false,
63 }
64 },
65 _ => return false,
66 }
67 },
68 _ => return false,
69 }
70 }).count();
71
72 let output = Output{class_number: class_count};
73 let output_file_name = String::from("output.json");
74 let result = write_json(&output_file_name, output);
75 match result {
76 Ok(..) => { println!("Json Output Finished. [{}]", output_file_name) }
77 Err(err) => { println!("Error! : {}", err) }
78 }
79}
80
81fn write_json(output_file_name: &str, output: Output) -> std::io::Result<()> {
82 let serialized: String = serde_json::to_string_pretty(&output).unwrap();
83 let mut file = File::create(output_file_name)?;
84 file.write_all(serialized.as_bytes())?;
85 Ok(())
86}