From b163b13a0b832daaac38c2d2d2e5e24516d1c491 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Fri, 23 Jun 2017 03:49:30 +0800 Subject: [PATCH] fix `export` of keyword and redirection (#2143) fixes #2141 fixes #2142 --- lib/parse.js | 16 ++++++--- lib/scope.js | 5 +-- test/compress/export.js | 72 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 6 deletions(-) diff --git a/lib/parse.js b/lib/parse.js index 57710d15..57e95a98 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -2327,6 +2327,14 @@ function parse($TEXT, options) { } function map_name(is_import) { + function make_symbol(type) { + return new type({ + name: as_property_name(), + start: prev(), + end: prev() + }); + } + var foreign_type = is_import ? AST_SymbolImportForeign : AST_SymbolExportForeign; var type = is_import ? AST_SymbolImport : AST_SymbolExport; var start = S.token; @@ -2334,16 +2342,16 @@ function parse($TEXT, options) { var name; if (is_import) { - foreign_name = as_symbol(foreign_type); + foreign_name = make_symbol(foreign_type); } else { - name = as_symbol(type); + name = make_symbol(type); } if (is("name", "as")) { next(); // The "as" word if (is_import) { - name = as_symbol(type); + name = make_symbol(type); } else { - foreign_name = as_symbol(foreign_type); + foreign_name = make_symbol(foreign_type); } } else if (is_import) { name = new type(foreign_name); diff --git a/lib/scope.js b/lib/scope.js index 216a22a7..59e55bab 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -263,8 +263,9 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){ s.uses_eval = true; } } - var sym = node.scope.find_variable(name); - if (!sym) { + var sym; + if (tw.parent() instanceof AST_NameMapping && tw.parent(1).module_name + || !(sym = node.scope.find_variable(name))) { sym = self.def_global(node); } else if (sym.scope instanceof AST_Lambda && name == "arguments") { sym.scope.uses_arguments = true; diff --git a/test/compress/export.js b/test/compress/export.js index 7b11a618..f20ed208 100644 --- a/test/compress/export.js +++ b/test/compress/export.js @@ -154,3 +154,75 @@ issue_2134_2: { Foo.prototype = {}; } } + +redirection: { + mangle = { + toplevel: true, + } + input: { + let foo = 1, bar = 2; + export { foo as delete }; + export { bar as default }; + export { foo as var } from "module.js"; + } + expect: { + let o = 1, d = 2; + export { o as delete }; + export { d as default }; + export { foo as var } from "module.js"; + } +} + +keyword_invalid_1: { + input: { + export { default }; + } + expect: { + export { default }; + } +} + +keyword_invalid_2: { + input: { + export { default as Alias }; + } + expect: { + export { default as Alias }; + } +} + +keyword_invalid_3: { + input: { + export { default as default }; + } + expect: { + export { default as default }; + } +} + +keyword_valid_1: { + input: { + export { default } from "module.js"; + } + expect: { + export { default } from "module.js"; + } +} + +keyword_valid_2: { + input: { + export { default as Alias } from "module.js"; + } + expect: { + export { default as Alias } from "module.js"; + } +} + +keyword_valid_3: { + input: { + export { default as default } from "module.js"; + } + expect: { + export { default as default } from "module.js"; + } +}