1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#![allow(incomplete_features)]
#![feature(box_syntax)]
#![feature(specialization)]
use rnode::IntoRNode;
use stc_ts_ast_rnode::RModule;
use swc_common::{comments::Comments, errors::HANDLER, input::SourceFileInput, Mark, SourceFile};
use swc_ecma_ast::{EsVersion, Module};
use swc_ecma_parser::{lexer::Lexer, Parser, Syntax, TsConfig};
use swc_ecma_transforms::resolver;
use swc_ecma_visit::VisitMutWith;
pub mod conformance;
pub mod lsp;
pub mod tsc;
pub mod visualizer;
pub fn parse(fm: &SourceFile, comments: &dyn Comments, unresolved_mark: Mark, top_level_mark: Mark) -> Module {
let lexer = Lexer::new(
Syntax::Typescript(TsConfig {
tsx: fm.name.to_string().ends_with(".tsx"),
decorators: true,
dts: fm.name.to_string().ends_with(".d.ts"),
no_early_errors: false,
}),
EsVersion::latest(),
SourceFileInput::from(fm),
Some(comments),
);
let mut parser = Parser::new_from(lexer);
let mut m = parser
.parse_module()
.map_err(|err| {
HANDLER.with(|handler| {
err.into_diagnostic(handler).emit();
})
})
.unwrap();
m.visit_mut_with(&mut resolver(unresolved_mark, top_level_mark, true));
m
}
pub fn parse_rnode(fm: &SourceFile, comments: &dyn Comments, unresolved_mark: Mark, top_level_mark: Mark) -> RModule {
let module = parse(fm, comments, unresolved_mark, top_level_mark);
let mut generator = rnode::NodeIdGenerator::default();
module.into_rnode(&mut generator)
}