fix extra regex slash when going through mozilla AST I/O (#3025)
authorFábio Santos <fabiosantosart@gmail.com>
Mon, 26 Mar 2018 18:22:01 +0000 (19:22 +0100)
committerAlex Lam S.L <alexlamsl@gmail.com>
Mon, 26 Mar 2018 18:22:01 +0000 (03:22 +0900)
This relates to #1929, but in the context of mozilla AST input/output.

lib/mozilla-ast.js
test/mocha/spidermonkey.js

index b80afbb..8e66c91 100644 (file)
                 end    : my_end_token(M)
             };
             if (val === null) return new AST_Null(args);
+            var rx = M.regex;
+            if (rx && rx.pattern) {
+                // RegExpLiteral as per ESTree AST spec
+                args.value = new RegExp(rx.pattern, rx.flags);
+                args.value.raw_source = rx.pattern;
+                return new AST_RegExp(args);
+            } else if (rx) {
+                // support legacy RegExp
+                args.value = M.regex && M.raw ? M.raw : val;
+                return new AST_RegExp(args);
+            }
             switch (typeof val) {
               case "string":
                 args.value = val;
                 return new AST_Number(args);
               case "boolean":
                 return new (val ? AST_True : AST_False)(args);
-              default:
-                var rx = M.regex;
-                if (rx && rx.pattern) {
-                    // RegExpLiteral as per ESTree AST spec
-                    args.value = new RegExp(rx.pattern, rx.flags).toString();
-                } else {
-                    // support legacy RegExp
-                    args.value = M.regex && M.raw ? M.raw : val;
-                }
-                return new AST_RegExp(args);
             }
         },
         Identifier: function(M) {
     });
 
     def_to_moz(AST_RegExp, function To_Moz_RegExpLiteral(M) {
-        var value = M.value;
+        var flags = M.value.toString().match(/[gimuy]*$/)[0];
+        var value = "/" + M.value.raw_source + "/" + flags;
         return {
             type: "Literal",
             value: value,
-            raw: value.toString(),
+            raw: value,
             regex: {
-                pattern: value.source,
-                flags: value.toString().match(/[gimuy]*$/)[0]
+                pattern: M.value.raw_source,
+                flags: flags
             }
         };
     });
index ccd11c4..756a2f4 100644 (file)
@@ -23,6 +23,15 @@ describe("spidermonkey export/import sanity test", function() {
         });
     });
 
+    it("should not add unnecessary escape slashes to regexps", function() {
+        var input = "/[\\\\/]/;";
+        var ast = uglify.parse(input).to_mozilla_ast();
+        assert.equal(
+            uglify.AST_Node.from_mozilla_ast(ast).print_to_string(),
+            input
+        );
+    });
+
     it("Should judge between directives and strings correctly on import", function() {
         var tests = [
             {