mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
[rust] SWC usage example
Basic example of parsing some code with SWC and then running name resolution.
This commit is contained in:
Generated
+1344
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
||||
[workspace]
|
||||
|
||||
members = [
|
||||
"crates/swc-demo",
|
||||
"crates/estree",
|
||||
"crates/estree-swc",
|
||||
]
|
||||
@@ -0,0 +1,14 @@
|
||||
[package]
|
||||
name = "swc-demo"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
swc_common = { version = "0.31.12", features = ["tty-emitter", "sourcemap", "anyhow"] }
|
||||
swc_core = "0.78.15"
|
||||
swc_ecma_parser = "0.136.2"
|
||||
swc_ecma_transforms_base = "0.129.8"
|
||||
swc_ecma_visit = "0.92.1"
|
||||
swc_visit = "0.5.6"
|
||||
@@ -0,0 +1,59 @@
|
||||
use swc_common::sync::Lrc;
|
||||
use swc_common::Mark;
|
||||
use swc_common::{
|
||||
errors::{ColorConfig, Handler},
|
||||
FileName, SourceMap,
|
||||
};
|
||||
use swc_ecma_parser::{lexer::Lexer, Parser, StringInput, Syntax};
|
||||
use swc_ecma_transforms_base::resolver;
|
||||
use swc_ecma_visit::swc_ecma_ast::Program;
|
||||
use swc_ecma_visit::VisitMutWith;
|
||||
|
||||
fn main() {
|
||||
let cm: Lrc<SourceMap> = Default::default();
|
||||
let handler = Handler::with_tty_emitter(ColorConfig::Auto, true, false, Some(cm.clone()));
|
||||
|
||||
// Real usage
|
||||
// let fm = cm
|
||||
// .load_file(Path::new("test.js"))
|
||||
// .expect("failed to load test.js");
|
||||
let fm = cm.new_source_file(
|
||||
FileName::Custom("test.js".into()),
|
||||
"function foo(x: number, y: number): number { return x + y}".into(),
|
||||
);
|
||||
let lexer = Lexer::new(
|
||||
// We want to parse ecmascript
|
||||
Syntax::Typescript(swc_ecma_parser::TsConfig {
|
||||
tsx: true,
|
||||
decorators: true,
|
||||
..Default::default()
|
||||
}),
|
||||
// EsVersion defaults to es5
|
||||
Default::default(),
|
||||
StringInput::from(&*fm),
|
||||
None,
|
||||
);
|
||||
|
||||
let mut parser = Parser::new_from(lexer);
|
||||
|
||||
for e in parser.take_errors() {
|
||||
e.into_diagnostic(&handler).emit();
|
||||
}
|
||||
|
||||
let module = parser
|
||||
.parse_module()
|
||||
.map_err(|e| {
|
||||
// Unrecoverable fatal error occurred
|
||||
e.into_diagnostic(&handler).emit()
|
||||
})
|
||||
.expect("failed to parser module");
|
||||
|
||||
let mut module = Program::Module(module);
|
||||
|
||||
let _result = swc_common::GLOBALS.set(&swc_common::Globals::new(), || {
|
||||
let mut resolved = resolver(Mark::new(), Mark::new(), true);
|
||||
module.visit_mut_with(&mut resolved)
|
||||
});
|
||||
|
||||
println!("{:#?}", module);
|
||||
}
|
||||
Reference in New Issue
Block a user