rtok_ts_analyzer/
lib.rs

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    // テストのときはこれを使う
32    // let fm = cm.new_source_file(
33    //     FileName::Custom("index.js".into()).into(),
34    //     "function foo() {}",
35    // );
36    let fm = cm
37    .load_file(Path::new("index.js"))
38    .expect("failed to load test.js");
39    let lexer = Lexer::new(
40        // We want to parse ecmascript
41        Syntax::Es(Default::default()),
42        // EsVersion defaults to es5
43        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                // println!("Class Name: {}", class_decl.ident.sym);
55                match class_decl {
56                        Stmt::Decl(class_decl) => {
57                            match class_decl {
58                                swc_ecma_ast::Decl::Class(_) => {
59                                    // println!("Class Name: {}", class_decl.ident.sym);
60                                    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}