mirror of
https://github.com/swc-project/swc.git
synced 2024-10-05 20:58:35 +03:00
Fix parser (#539)
swc_ecma_parser: - mark `declare` as `declare` (#538) - fix span of `export * from 'foo'` (#535)
This commit is contained in:
parent
6fa85b646f
commit
8562d3fbfb
@ -86,7 +86,7 @@ impl<'a, I: Tokens> Parser<'a, I> {
|
||||
let src = self.parse_from_clause_and_semi()?;
|
||||
|
||||
Ok(ModuleDecl::Import(ImportDecl {
|
||||
span: span!(start),
|
||||
span: Span::new(start, src.span.hi(), Default::default()),
|
||||
specifiers,
|
||||
src,
|
||||
}))
|
||||
@ -215,7 +215,7 @@ impl<'a, I: Tokens> Parser<'a, I> {
|
||||
if is!("from") {
|
||||
let src = self.parse_from_clause_and_semi()?;
|
||||
return Ok(ModuleDecl::ExportAll(ExportAll {
|
||||
span: span!(start),
|
||||
span: Span::new(start, src.span.hi(), Default::default()),
|
||||
src,
|
||||
}));
|
||||
}
|
||||
@ -330,11 +330,11 @@ impl<'a, I: Tokens> Parser<'a, I> {
|
||||
|
||||
if is!("from") {
|
||||
if let Some(s) = export_ns {
|
||||
let src = self.parse_from_clause_and_semi().map(Some)?;
|
||||
let src = self.parse_from_clause_and_semi()?;
|
||||
return Ok(ModuleDecl::ExportNamed(NamedExport {
|
||||
span: span!(start),
|
||||
span: Span::new(start, src.span.hi(), Default::default()),
|
||||
specifiers: vec![s],
|
||||
src,
|
||||
src: Some(src),
|
||||
}));
|
||||
}
|
||||
}
|
||||
@ -352,13 +352,13 @@ impl<'a, I: Tokens> Parser<'a, I> {
|
||||
|
||||
if is!("from") {
|
||||
if let Some(default) = default {
|
||||
let src = self.parse_from_clause_and_semi().map(Some)?;
|
||||
let src = self.parse_from_clause_and_semi()?;
|
||||
return Ok(ModuleDecl::ExportNamed(NamedExport {
|
||||
span: span!(start),
|
||||
span: Span::new(start, src.span.hi(), Default::default()),
|
||||
specifiers: vec![ExportSpecifier::Default(DefaultExportSpecifier {
|
||||
exported: default,
|
||||
})],
|
||||
src,
|
||||
src: Some(src),
|
||||
}));
|
||||
}
|
||||
}
|
||||
@ -367,7 +367,7 @@ impl<'a, I: Tokens> Parser<'a, I> {
|
||||
// improve error message for `export * from foo`
|
||||
let src = self.parse_from_clause_and_semi()?;
|
||||
return Ok(ModuleDecl::ExportAll(ExportAll {
|
||||
span: span!(start),
|
||||
span: Span::new(start, src.span.hi(), Default::default()),
|
||||
src,
|
||||
}));
|
||||
}
|
||||
@ -406,12 +406,12 @@ impl<'a, I: Tokens> Parser<'a, I> {
|
||||
let src = if is!("from") {
|
||||
Some(self.parse_from_clause_and_semi()?)
|
||||
} else {
|
||||
eat!(';');
|
||||
if has_default || has_ns {
|
||||
syntax_error!(span!(start), SyntaxError::ExportDefaultWithOutFrom);
|
||||
}
|
||||
None
|
||||
};
|
||||
eat!(';');
|
||||
return Ok(ModuleDecl::ExportNamed(NamedExport {
|
||||
span: span!(start),
|
||||
specifiers,
|
||||
@ -451,10 +451,11 @@ impl<'a, I: Tokens> Parser<'a, I> {
|
||||
Token::Str { .. } => match bump!() {
|
||||
Token::Str { value, has_escape } => {
|
||||
expect!(';');
|
||||
|
||||
Ok(Str {
|
||||
value,
|
||||
has_escape,
|
||||
span: span!(start),
|
||||
span: Span::new(start, self.input.prev_span().hi(), Default::default()),
|
||||
})
|
||||
}
|
||||
_ => unreachable!(),
|
||||
|
@ -1914,11 +1914,23 @@ impl<'a, I: Tokens> Parser<'a, I> {
|
||||
|
||||
self.with_ctx(ctx).parse_with(|p| {
|
||||
if is!("function") {
|
||||
return p.parse_fn_decl(decorators).map(Some);
|
||||
return p
|
||||
.parse_fn_decl(decorators)
|
||||
.map(|decl| match decl {
|
||||
Decl::Fn(f) => Decl::Fn(FnDecl { declare: true, ..f }),
|
||||
_ => decl,
|
||||
})
|
||||
.map(Some);
|
||||
}
|
||||
|
||||
if is!("class") {
|
||||
return p.parse_class_decl(decorators).map(Some);
|
||||
return p
|
||||
.parse_class_decl(decorators)
|
||||
.map(|decl| match decl {
|
||||
Decl::Class(c) => Decl::Class(ClassDecl { declare: true, ..c }),
|
||||
_ => decl,
|
||||
})
|
||||
.map(Some);
|
||||
}
|
||||
|
||||
if is!("const") && peeked_is!("enum") {
|
||||
@ -1928,11 +1940,22 @@ impl<'a, I: Tokens> Parser<'a, I> {
|
||||
|
||||
return p
|
||||
.parse_ts_enum_decl(start, /* is_const */ true)
|
||||
.map(|decl| TsEnumDecl {
|
||||
declare: true,
|
||||
..decl
|
||||
})
|
||||
.map(From::from)
|
||||
.map(Some);
|
||||
}
|
||||
if is_one_of!("const", "var", "let") {
|
||||
return p.parse_var_stmt(false).map(From::from).map(Some);
|
||||
return p
|
||||
.parse_var_stmt(false)
|
||||
.map(|decl| VarDecl {
|
||||
declare: true,
|
||||
..decl
|
||||
})
|
||||
.map(From::from)
|
||||
.map(Some);
|
||||
}
|
||||
|
||||
if is!("global") {
|
||||
|
@ -0,0 +1 @@
|
||||
export * from "test";
|
@ -0,0 +1,29 @@
|
||||
{
|
||||
"type": "Module",
|
||||
"span": {
|
||||
"start": 0,
|
||||
"end": 21,
|
||||
"ctxt": 0
|
||||
},
|
||||
"body": [
|
||||
{
|
||||
"type": "ExportAllDeclaration",
|
||||
"span": {
|
||||
"start": 0,
|
||||
"end": 21,
|
||||
"ctxt": 0
|
||||
},
|
||||
"source": {
|
||||
"type": "StringLiteral",
|
||||
"span": {
|
||||
"start": 14,
|
||||
"end": 21,
|
||||
"ctxt": 0
|
||||
},
|
||||
"value": "test",
|
||||
"hasEscape": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"interpreter": null
|
||||
}
|
@ -0,0 +1 @@
|
||||
export declare function test(): string;
|
@ -0,0 +1,62 @@
|
||||
{
|
||||
"type": "Module",
|
||||
"span": {
|
||||
"start": 0,
|
||||
"end": 39,
|
||||
"ctxt": 0
|
||||
},
|
||||
"body": [
|
||||
{
|
||||
"type": "ExportDeclaration",
|
||||
"span": {
|
||||
"start": 0,
|
||||
"end": 39,
|
||||
"ctxt": 0
|
||||
},
|
||||
"declaration": {
|
||||
"type": "FunctionDeclaration",
|
||||
"identifier": {
|
||||
"type": "Identifier",
|
||||
"span": {
|
||||
"start": 24,
|
||||
"end": 28,
|
||||
"ctxt": 0
|
||||
},
|
||||
"value": "test",
|
||||
"typeAnnotation": null,
|
||||
"optional": false
|
||||
},
|
||||
"declare": true,
|
||||
"params": [],
|
||||
"decorators": [],
|
||||
"span": {
|
||||
"start": 15,
|
||||
"end": 39,
|
||||
"ctxt": 0
|
||||
},
|
||||
"body": null,
|
||||
"generator": false,
|
||||
"async": false,
|
||||
"typeParameters": null,
|
||||
"returnType": {
|
||||
"type": "TsTypeAnnotation",
|
||||
"span": {
|
||||
"start": 30,
|
||||
"end": 38,
|
||||
"ctxt": 0
|
||||
},
|
||||
"typeAnnotation": {
|
||||
"type": "TsKeywordType",
|
||||
"span": {
|
||||
"start": 32,
|
||||
"end": 38,
|
||||
"ctxt": 0
|
||||
},
|
||||
"kind": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"interpreter": null
|
||||
}
|
@ -83,7 +83,7 @@
|
||||
"typeAnnotation": null,
|
||||
"optional": false
|
||||
},
|
||||
"declare": false,
|
||||
"declare": true,
|
||||
"params": [],
|
||||
"decorators": [],
|
||||
"span": {
|
||||
@ -134,7 +134,7 @@
|
||||
"typeAnnotation": null,
|
||||
"optional": false
|
||||
},
|
||||
"declare": false,
|
||||
"declare": true,
|
||||
"span": {
|
||||
"start": 84,
|
||||
"end": 94,
|
||||
|
Loading…
Reference in New Issue
Block a user