[ES6] Implemented parse for export Name from Module variants. (#1701)

- add `AST_Export` new variants output
- add tests to `test/compress/`
- update `$propdoc` of `AST_Export` ("exported_names" & "module_name")
- add tests for `export ...  as ...` variants
This commit is contained in:
Ondřej Španěl
2017-03-30 11:07:50 +02:00
committed by Alex Lam S.L
parent fccefbeaca
commit 5dea52266b
6 changed files with 182 additions and 2 deletions

View File

@@ -789,11 +789,13 @@ var AST_Import = DEFNODE("Import", "imported_name imported_names module_name", {
}
});
var AST_Export = DEFNODE("Export", "exported_definition exported_value is_default", {
var AST_Export = DEFNODE("Export", "exported_definition exported_value is_default exported_names module_name", {
$documentation: "An `export` statement",
$propdoc: {
exported_definition: "[AST_Defun|AST_Definitions|AST_DefClass?] An exported definition",
exported_value: "[AST_Node?] An exported value",
exported_names: "[AST_NameImport*?] List of exported names",
module_name: "[AST_String?] Name of the file to load exports from",
is_default: "[Boolean] Whether this is the default exported value of this module"
},
_walk: function (visitor) {

View File

@@ -1277,11 +1277,37 @@ function OutputStream(options) {
output.print("default");
output.space();
}
if (self.exported_value) {
if (self.exported_names) {
output.space();
if (self.exported_names.length === 1 && self.exported_names[0].name.name === "*") {
self.exported_names[0].print(output);
} else {
output.print("{");
self.exported_names.forEach(function (name_import, i) {
output.space();
name_import.print(output);
if (i < self.exported_names.length - 1) {
output.print(",");
output.space();
}
});
output.space();
output.print("}");
}
output.space();
}
else if (self.exported_value) {
self.exported_value.print(output);
} else if (self.exported_definition) {
self.exported_definition.print(output);
}
if (self.module_name) {
output.space();
output.print("from");
output.space();
self.module_name.print(output);
}
output.semicolon();
});

View File

@@ -2237,17 +2237,85 @@ function parse($TEXT, options) {
})
}
function import_nameAsterisk() {
var start = S.token;
var foreign_name;
var name;
next();
var end = prev();
name = new AST_SymbolImport({
name: '*',
start: start,
end: end,
});
foreign_name = new AST_SymbolImportForeign({
name: '*',
start: start,
end: end,
});
return new AST_NameImport({
start: start,
foreign_name: foreign_name,
name: name,
end: end,
})
}
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();
}
if (is("punc", "{")) {
next();
exported_names = [];
while (!is("punc", "}")) {
exported_names.push(import_name());
if (is("punc", ",")) {
next();
}
}
next();
} else if (is("operator", "*")) {
var st = prev();
exported_names = [import_nameAsterisk()];
}
if (exported_names) {
expect_token("name", "from");
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(),
});
}
var is_definition =
is("keyword", "var") || is("keyword", "let") || is("keyword", "const") ||
is("keyword", "class") || is("keyword", "function");