Fix parser (#539)

swc_ecma_parser:
 - mark `declare` as `declare` (#538)
 - fix span of `export * from 'foo'` (#535)
This commit is contained in:
강동윤 2019-12-28 12:19:44 +09:00 committed by GitHub
parent 6fa85b646f
commit 8562d3fbfb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 133 additions and 16 deletions

View File

@ -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!(),

View File

@ -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") {

View File

@ -0,0 +1 @@
export * from "test";

View File

@ -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
}

View File

@ -0,0 +1 @@
export declare function test(): string;

View File

@ -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
}

View File

@ -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,