correctly parse export of function & class (#2135)
This commit is contained in:
96
lib/parse.js
96
lib/parse.js
@@ -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({
|
||||
|
||||
Reference in New Issue
Block a user