support export statements properly (#2126)
- mangle & compress correctly with `toplevel`
- retain non-toplevel import/export
- parse & output `export { variable as name }`
- remove extraneous spaces from `beautify`
fixes #2038
fixes #2124
This commit is contained in:
56
lib/parse.js
56
lib/parse.js
@@ -2302,7 +2302,7 @@ function parse($TEXT, options) {
|
||||
next();
|
||||
}
|
||||
|
||||
imported_names = import_names(true);
|
||||
imported_names = map_names(true);
|
||||
|
||||
if (imported_names || imported_name) {
|
||||
expect_token("name", "from");
|
||||
@@ -2326,26 +2326,32 @@ function parse($TEXT, options) {
|
||||
});
|
||||
}
|
||||
|
||||
function import_name() {
|
||||
function map_name(is_import) {
|
||||
var foreign_type = is_import ? AST_SymbolImportForeign : AST_SymbolExportForeign;
|
||||
var type = is_import ? AST_SymbolImport : AST_SymbolExport;
|
||||
var start = S.token;
|
||||
var foreign_name;
|
||||
var name;
|
||||
|
||||
if (peek().value === "as" && peek().type === "name") {
|
||||
foreign_name = as_symbol(AST_SymbolImportForeign);
|
||||
if (is_import) {
|
||||
foreign_name = as_symbol(foreign_type);
|
||||
} else {
|
||||
name = as_symbol(type);
|
||||
}
|
||||
if (is("name", "as")) {
|
||||
next(); // The "as" word
|
||||
}
|
||||
name = as_symbol(AST_SymbolImport);
|
||||
|
||||
if (foreign_name === undefined) {
|
||||
foreign_name = new AST_SymbolImportForeign({
|
||||
name: name.name,
|
||||
start: name.start,
|
||||
end: name.end,
|
||||
});
|
||||
if (is_import) {
|
||||
name = as_symbol(type);
|
||||
} else {
|
||||
foreign_name = as_symbol(foreign_type);
|
||||
}
|
||||
} else if (is_import) {
|
||||
name = new type(foreign_name);
|
||||
} else {
|
||||
foreign_name = new foreign_type(name);
|
||||
}
|
||||
|
||||
return new AST_NameImport({
|
||||
return new AST_NameMapping({
|
||||
start: start,
|
||||
foreign_name: foreign_name,
|
||||
name: name,
|
||||
@@ -2353,26 +2359,26 @@ function parse($TEXT, options) {
|
||||
})
|
||||
}
|
||||
|
||||
function import_nameAsterisk(name) {
|
||||
function map_nameAsterisk(is_import, name) {
|
||||
var foreign_type = is_import ? AST_SymbolImportForeign : AST_SymbolExportForeign;
|
||||
var type = is_import ? AST_SymbolImport : AST_SymbolExport;
|
||||
var start = S.token;
|
||||
var foreign_name;
|
||||
|
||||
|
||||
var end = prev();
|
||||
|
||||
name = name || new AST_SymbolImport({
|
||||
name = name || new type({
|
||||
name: '*',
|
||||
start: start,
|
||||
end: end,
|
||||
});
|
||||
|
||||
foreign_name = new AST_SymbolImportForeign({
|
||||
foreign_name = new foreign_type({
|
||||
name: '*',
|
||||
start: start,
|
||||
end: end,
|
||||
});
|
||||
|
||||
return new AST_NameImport({
|
||||
return new AST_NameMapping({
|
||||
start: start,
|
||||
foreign_name: foreign_name,
|
||||
name: name,
|
||||
@@ -2380,13 +2386,13 @@ function parse($TEXT, options) {
|
||||
})
|
||||
}
|
||||
|
||||
function import_names(allow_as) {
|
||||
function map_names(is_import) {
|
||||
var names;
|
||||
if (is("punc", "{")) {
|
||||
next();
|
||||
names = [];
|
||||
while (!is("punc", "}")) {
|
||||
names.push(import_name());
|
||||
names.push(map_name(is_import));
|
||||
if (is("punc", ",")) {
|
||||
next();
|
||||
}
|
||||
@@ -2395,11 +2401,11 @@ function parse($TEXT, options) {
|
||||
} else if (is("operator", "*")) {
|
||||
var name;
|
||||
next();
|
||||
if (allow_as && is("name", "as")) {
|
||||
if (is_import && is("name", "as")) {
|
||||
next(); // The "as" word
|
||||
name = as_symbol(AST_SymbolImportForeign);
|
||||
}
|
||||
names = [import_nameAsterisk(name)];
|
||||
names = [map_nameAsterisk(is_import, name)];
|
||||
}
|
||||
return names;
|
||||
}
|
||||
@@ -2415,7 +2421,7 @@ function parse($TEXT, options) {
|
||||
is_default = true;
|
||||
next();
|
||||
} else {
|
||||
exported_names = import_names(false);
|
||||
exported_names = map_names(false);
|
||||
|
||||
if (exported_names) {
|
||||
if (is("name", "from")) {
|
||||
|
||||
Reference in New Issue
Block a user