correctly parse export of function & class (#2135)

This commit is contained in:
Alex Lam S.L
2017-06-21 23:15:39 +08:00
committed by GitHub
parent 8709753bfb
commit 71556d00b5
6 changed files with 89 additions and 56 deletions

View File

@@ -2413,72 +2413,60 @@ function parse($TEXT, options) {
function export_() {
var start = S.token;
var is_default;
var exported_value;
var exported_definition;
var exported_names;
if (is("keyword", "default")) {
is_default = true;
next();
} else {
exported_names = map_names(false);
} else if (exported_names = map_names(false)) {
if (is("name", "from")) {
next();
if (exported_names) {
if (is("name", "from")) {
next();
var mod_str = S.token;
if (mod_str.type !== 'string') {
unexpected();
}
next();
return new AST_Export({
start: start,
is_default: is_default,
exported_names: exported_names,
module_name: new AST_String({
start: mod_str,
value: mod_str.value,
quote: mod_str.quote,
end: mod_str,
}),
end: prev(),
});
} else {
return new AST_Export({
start: start,
is_default: is_default,
exported_names: exported_names,
end: prev(),
});
var mod_str = S.token;
if (mod_str.type !== 'string') {
unexpected();
}
next();
return new AST_Export({
start: start,
is_default: is_default,
exported_names: exported_names,
module_name: new AST_String({
start: mod_str,
value: mod_str.value,
quote: mod_str.quote,
end: mod_str,
}),
end: prev(),
});
} else {
return new AST_Export({
start: start,
is_default: is_default,
exported_names: exported_names,
end: prev(),
});
}
}
var is_definition = is("keyword", "var") || is("keyword", "let") || is("keyword", "const");
if (is_definition) {
if (is_default) unexpected();
exported_definition = statement();
} else if (is("keyword", "class")) {
var cls = expr_atom(false);
if (cls.name) {
cls.name = new AST_SymbolDefClass(cls.name);
exported_definition = new AST_DefClass(cls);
} else {
exported_value = cls;
}
} else if (is("keyword", "function")) {
var func = expr_atom(false);
if (func.name) {
func.name = new AST_SymbolDefun(func.name);
exported_definition = new AST_Defun(func);
} else {
exported_value = func;
}
} else {
var node;
var exported_value;
var exported_definition;
if (is("punc", "{")
|| is_default
&& (is("keyword", "class") || is("keyword", "function"))
&& is_token(peek(), "punc")) {
exported_value = expression(false);
semicolon();
} else if ((node = statement()) instanceof AST_Definitions && is_default) {
unexpected(node.start);
} else if (node instanceof AST_Definitions || node instanceof AST_Defun || node instanceof AST_DefClass) {
exported_definition = node;
} else if (node instanceof AST_SimpleStatement) {
exported_value = node.body;
} else {
unexpected(node.start);
}
return new AST_Export({