Skip to content

Commit 88a796b

Browse files
committed
return a parse error
1 parent 04b6a17 commit 88a796b

File tree

4 files changed

+39
-19
lines changed

4 files changed

+39
-19
lines changed

src/lib.rs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![doc = include_str!("../README.md")]
22
#![warn(missing_docs)]
33

4+
use std::fmt::Display;
45
use std::ops::Range;
56

67
mod name_resolver;
@@ -13,6 +14,7 @@ pub use name_resolver::NameResolver;
1314
pub use scope_index::{ScopeIndex, ScopeIndexError, ScopeLookupResult};
1415
pub use scope_name::{NameComponent, ScopeName};
1516
pub use source::{SourceContext, SourceContextError, SourcePosition};
17+
use swc_common::Spanned;
1618

1719
/// The Scopes extracted from a piece of JS Code.
1820
pub type Scopes = Vec<(Range<u32>, Option<ScopeName>)>;
@@ -53,6 +55,26 @@ pub type Scopes = Vec<(Range<u32>, Option<ScopeName>)>;
5355
/// assert_eq!(scopes, expected);
5456
/// ```
5557
#[tracing::instrument(level = "trace", skip_all)]
56-
pub fn extract_scope_names(src: &str) -> Scopes {
57-
swc::parse_with_swc(src)
58+
pub fn extract_scope_names(src: &str) -> Result<Scopes, ParseError> {
59+
swc::parse_with_swc(src).map_err(|e| ParseError { inner: e })
5860
}
61+
62+
/// An error parsing the JS Source provided to [`extract_scope_names`].
63+
#[derive(Debug)]
64+
pub struct ParseError {
65+
inner: swc::ParseError,
66+
}
67+
68+
impl Display for ParseError {
69+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
70+
let span = self.inner.span();
71+
f.write_fmt(format_args!(
72+
"{}:{}:{}",
73+
span.lo.0,
74+
span.hi.0,
75+
self.inner.kind().msg()
76+
))
77+
}
78+
}
79+
80+
impl std::error::Error for ParseError {}

src/swc.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,20 @@ use swc_ecma_visit::{AstNodePath, VisitAstPath, VisitWithPath};
88
use crate::scope_name::{NameComponent, ScopeName};
99
use crate::Scopes;
1010

11+
pub(crate) use swc_ecma_parser::error::Error as ParseError;
12+
1113
// TODO:
1214
// - getters / setters
1315
// - maybe even computed properties?
1416

15-
pub fn parse_with_swc(src: &str) -> Scopes {
17+
pub fn parse_with_swc(src: &str) -> Result<Scopes, ParseError> {
1618
let syntax = tracing::trace_span!("parsing source").in_scope(|| {
1719
let input = StringInput::new(src, BytePos(0), BytePos(src.len() as u32));
1820

1921
let mut parser = Parser::new(swc_ecma_parser::Syntax::default(), input, None);
2022

2123
parser.parse_module()
22-
});
23-
let syntax = match syntax {
24-
Ok(syntax) => syntax,
25-
Err(_) => return vec![],
26-
};
24+
})?;
2725

2826
// dbg!(&syntax);
2927

@@ -32,7 +30,7 @@ pub fn parse_with_swc(src: &str) -> Scopes {
3230

3331
syntax.visit_children_with_path(&mut collector, &mut Default::default());
3432

35-
collector.into_scopes()
33+
Ok(collector.into_scopes())
3634
})
3735
}
3836

tests/extract.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ fn extracts_named_fn() {
1616
return function fn_expr() {};
1717
}
1818
"#;
19-
let scopes = extract_scope_names(src);
19+
let scopes = extract_scope_names(src).unwrap();
2020
let scopes = scope_strs(scopes);
2121

2222
let expected = [
@@ -35,7 +35,7 @@ fn extracts_named_class() {
3535
}
3636
}
3737
"#;
38-
let scopes = extract_scope_names(src);
38+
let scopes = extract_scope_names(src).unwrap();
3939
let scopes = scope_strs(scopes);
4040

4141
let expected = [
@@ -52,7 +52,7 @@ fn infer_from_decl() {
5252
let anon_class = class {};
5353
const arrow = () => {};
5454
"#;
55-
let scopes = extract_scope_names(src);
55+
let scopes = extract_scope_names(src).unwrap();
5656
let scopes = scope_strs(scopes);
5757

5858
let expected = [
@@ -69,7 +69,7 @@ fn infer_from_assign() {
6969
assigned_fn = function () {};
7070
deep.assigned.klass = class {};
7171
"#;
72-
let scopes = extract_scope_names(src);
72+
let scopes = extract_scope_names(src).unwrap();
7373
let scopes = scope_strs(scopes);
7474

7575
let expected = [
@@ -89,7 +89,7 @@ fn extract_obj_literal() {
8989
method_prop() {},
9090
};
9191
"#;
92-
let scopes = extract_scope_names(src);
92+
let scopes = extract_scope_names(src).unwrap();
9393
let scopes = scope_strs(scopes);
9494

9595
let expected = [
@@ -110,7 +110,7 @@ fn extract_method_names() {
110110
#private_method() {}
111111
}
112112
"#;
113-
let scopes = extract_scope_names(src);
113+
let scopes = extract_scope_names(src).unwrap();
114114
let scopes = scope_strs(scopes);
115115

116116
let expected = [

tests/integration.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ fn resolves_scopes_simple() {
3030
let minified = std::fs::read_to_string("tests/fixtures/simple/minified.js").unwrap();
3131
let map = std::fs::read_to_string("tests/fixtures/simple/minified.js.map").unwrap();
3232

33-
let scopes = extract_scope_names(&minified);
33+
let scopes = extract_scope_names(&minified).unwrap();
3434

3535
let resolved_scopes = resolve_original_scopes(&minified, &map, scopes);
3636

@@ -44,7 +44,7 @@ fn resolves_scopes_simple() {
4444
fn resolves_scope_names() {
4545
let src = std::fs::read_to_string("tests/fixtures/trace/sync.mjs").unwrap();
4646

47-
let scopes = extract_scope_names(&src);
47+
let scopes = extract_scope_names(&src).unwrap();
4848
// dbg!(&scopes);
4949

5050
let scopes: Vec<_> = scopes
@@ -173,7 +173,7 @@ fn resolves_token_from_names() {
173173
let minified = std::fs::read_to_string("tests/fixtures/preact.module.js").unwrap();
174174
let map = std::fs::read_to_string("tests/fixtures/preact.module.js.map").unwrap();
175175

176-
let scopes = extract_scope_names(&minified);
176+
let scopes = extract_scope_names(&minified).unwrap();
177177

178178
let resolved_scopes = resolve_original_scopes(&minified, &map, scopes);
179179

@@ -189,7 +189,7 @@ fn parses_large_vendors() {
189189
let minified = std::fs::read_to_string("tests/fixtures/vendors/vendors.js").unwrap();
190190
let map = std::fs::read_to_string("tests/fixtures/vendors/vendors.js.map").unwrap();
191191

192-
let scopes = extract_scope_names(&minified);
192+
let scopes = extract_scope_names(&minified).unwrap();
193193

194194
let resolved_scopes = resolve_original_scopes(&minified, &map, scopes);
195195

0 commit comments

Comments
 (0)