fix line accounting in multi-line strings (#3752)
authorAlex Lam S.L <alexlamsl@gmail.com>
Fri, 20 Mar 2020 23:17:41 +0000 (23:17 +0000)
committerGitHub <noreply@github.com>
Fri, 20 Mar 2020 23:17:41 +0000 (07:17 +0800)
fixes #3748

lib/parse.js
test/mocha/sourcemaps.js

index 270af9b..a04533a 100644 (file)
@@ -241,16 +241,16 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
         if (signal_eof && !ch)
             throw EX_EOF;
         if (NEWLINE_CHARS[ch]) {
-            S.newline_before = S.newline_before || !in_string;
-            ++S.line;
             S.col = 0;
-            if (!in_string && ch == "\r" && peek() == "\n") {
-                // treat a \r\n sequence as a single \n
-                ++S.pos;
+            S.line++;
+            if (!in_string) S.newline_before = true;
+            if (ch == "\r" && peek() == "\n") {
+                // treat `\r\n` as `\n`
+                S.pos++;
                 ch = "\n";
             }
         } else {
-            ++S.col;
+            S.col++;
         }
         return ch;
     }
index 8457c86..7b1c70f 100644 (file)
@@ -89,6 +89,22 @@ describe("sourcemaps", function() {
         assert.strictEqual(result.code, code);
         assert.strictEqual(result.map, '{"version":3,"sources":["0"],"names":["console","log"],"mappings":"AAAAA,QAAQC,IAAI","sourceRoot":"//foo.bar/"}');
     });
+    it("Should produce same source map with DOS or UNIX line endings", function() {
+        var code = [
+            'console.log("\\',
+            'hello",',
+            '"world");',
+        ];
+        var dos = UglifyJS.minify(code.join("\r\n"), {
+            sourceMap: true,
+        });
+        if (dos.error) throw dos.error;
+        var unix = UglifyJS.minify(code.join("\n"), {
+            sourceMap: true,
+        });
+        if (unix.error) throw unix.error;
+        assert.strictEqual(dos.map, unix.map);
+    });
 
     describe("inSourceMap", function() {
         it("Should read the given string filename correctly when sourceMapIncludeSources is enabled", function() {