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:
Alex Lam S.L
2017-06-21 00:51:36 +08:00
committed by GitHub
parent 849ba79dee
commit 62d1fbf645
7 changed files with 199 additions and 57 deletions

View File

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