[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:
committed by
Alex Lam S.L
parent
fccefbeaca
commit
5dea52266b
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
|
||||
|
||||
68
lib/parse.js
68
lib/parse.js
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user