terser 5.29.2 → 5.30.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/dist/bundle.min.js +39 -33
- package/lib/ast.js +18 -0
- package/lib/compress/drop-side-effect-free.js +7 -7
- package/lib/compress/drop-unused.js +8 -13
- package/lib/parse.js +6 -14
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## v5.30.1
|
4
|
+
- Removed useless `\` escapes for non-ascii characters
|
5
|
+
- Make modern identifier characters quoted for older environments (#1512)
|
6
|
+
|
7
|
+
## v5.30.0
|
8
|
+
- Improve removal of classes referring to themselves
|
9
|
+
|
3
10
|
## v5.29.2
|
4
11
|
- Make sure 'computed_props' creates string keys
|
5
12
|
- Take into account the evaluated size when inlining
|
package/dist/bundle.min.js
CHANGED
@@ -408,19 +408,6 @@ var UNICODE = {
|
|
408
408
|
ID_Continue: /(?:[$0-9A-Z_a-z\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF])+/,
|
409
409
|
};
|
410
410
|
|
411
|
-
try {
|
412
|
-
UNICODE = {
|
413
|
-
// https://262.ecma-international.org/13.0/#prod-IdentifierStartChar
|
414
|
-
// $, _, ID_Start
|
415
|
-
ID_Start: new RegExp("[_$\\p{ID_Start}]", "u"),
|
416
|
-
// https://262.ecma-international.org/13.0/#prod-IdentifierPartChar
|
417
|
-
// $, zero-width-joiner, zero-width-non-joiner, ID_Continue
|
418
|
-
ID_Continue: new RegExp("[$\\u200C\\u200D\\p{ID_Continue}]+", "u"),
|
419
|
-
};
|
420
|
-
} catch(e) {
|
421
|
-
// Could not use modern JS \p{...}. UNICODE is already defined above so let's continue
|
422
|
-
}
|
423
|
-
|
424
411
|
function get_full_char(str, pos) {
|
425
412
|
if (is_surrogate_pair_head(str.charCodeAt(pos))) {
|
426
413
|
if (is_surrogate_pair_tail(str.charCodeAt(pos + 1))) {
|
@@ -959,7 +946,12 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|
959
946
|
while ((ch = next(true))) if (NEWLINE_CHARS.has(ch)) {
|
960
947
|
parse_error("Unexpected line terminator");
|
961
948
|
} else if (prev_backslash) {
|
962
|
-
|
949
|
+
if (/^[\u0000-\u007F]$/.test(ch)) {
|
950
|
+
source += "\\" + ch;
|
951
|
+
} else {
|
952
|
+
// Remove the useless slash before the escape, but only for characters that won't be added to regexp syntax
|
953
|
+
source += ch;
|
954
|
+
}
|
963
955
|
prev_backslash = false;
|
964
956
|
} else if (ch == "[") {
|
965
957
|
in_class = true;
|
@@ -5894,6 +5886,24 @@ var AST_Class = DEFNODE("Class", "name extends properties", function AST_Class(p
|
|
5894
5886
|
}
|
5895
5887
|
});
|
5896
5888
|
},
|
5889
|
+
is_self_referential: function() {
|
5890
|
+
const this_id = this.name && this.name.definition().id;
|
5891
|
+
let found = false;
|
5892
|
+
let class_this = true;
|
5893
|
+
this.visit_nondeferred_class_parts(new TreeWalker((node, descend) => {
|
5894
|
+
if (found) return true;
|
5895
|
+
if (node instanceof AST_This) return (found = class_this);
|
5896
|
+
if (node instanceof AST_SymbolRef) return (found = node.definition().id === this_id);
|
5897
|
+
if (node instanceof AST_Lambda && !(node instanceof AST_Arrow)) {
|
5898
|
+
const class_this_save = class_this;
|
5899
|
+
class_this = false;
|
5900
|
+
descend();
|
5901
|
+
class_this = class_this_save;
|
5902
|
+
return true;
|
5903
|
+
}
|
5904
|
+
}));
|
5905
|
+
return found;
|
5906
|
+
},
|
5897
5907
|
}, AST_Scope /* TODO a class might have a scope but it's not a scope */);
|
5898
5908
|
|
5899
5909
|
var AST_ClassProperty = DEFNODE("ClassProperty", "static quote", function AST_ClassProperty(props) {
|
@@ -14919,9 +14929,13 @@ def_drop_side_effect_free(AST_Arrow, return_null);
|
|
14919
14929
|
|
14920
14930
|
def_drop_side_effect_free(AST_Class, function (compressor) {
|
14921
14931
|
const with_effects = [];
|
14932
|
+
|
14933
|
+
if (this.is_self_referential() && this.has_side_effects(compressor)) {
|
14934
|
+
return this;
|
14935
|
+
}
|
14936
|
+
|
14922
14937
|
const trimmed_extends = this.extends && this.extends.drop_side_effect_free(compressor);
|
14923
|
-
if (trimmed_extends)
|
14924
|
-
with_effects.push(trimmed_extends);
|
14938
|
+
if (trimmed_extends) with_effects.push(trimmed_extends);
|
14925
14939
|
|
14926
14940
|
for (const prop of this.properties) {
|
14927
14941
|
if (prop instanceof AST_ClassStaticBlock) {
|
@@ -14930,11 +14944,7 @@ def_drop_side_effect_free(AST_Class, function (compressor) {
|
|
14930
14944
|
}
|
14931
14945
|
} else {
|
14932
14946
|
const trimmed_prop = prop.drop_side_effect_free(compressor);
|
14933
|
-
if (trimmed_prop)
|
14934
|
-
if (trimmed_prop.contains_this()) return this;
|
14935
|
-
|
14936
|
-
with_effects.push(trimmed_prop);
|
14937
|
-
}
|
14947
|
+
if (trimmed_prop) with_effects.push(trimmed_prop);
|
14938
14948
|
}
|
14939
14949
|
}
|
14940
14950
|
|
@@ -15204,7 +15214,6 @@ AST_Scope.DEFMETHOD("drop_unused", function(compressor) {
|
|
15204
15214
|
return node.expression;
|
15205
15215
|
}
|
15206
15216
|
};
|
15207
|
-
var this_def = null;
|
15208
15217
|
var in_use_ids = new Map();
|
15209
15218
|
var fixed_ids = new Map();
|
15210
15219
|
if (self instanceof AST_Toplevel && compressor.top_retain) {
|
@@ -15216,6 +15225,7 @@ AST_Scope.DEFMETHOD("drop_unused", function(compressor) {
|
|
15216
15225
|
}
|
15217
15226
|
var var_defs_by_id = new Map();
|
15218
15227
|
var initializations = new Map();
|
15228
|
+
var self_referential_classes = new Set();
|
15219
15229
|
|
15220
15230
|
// pass 1: find out which symbols are directly used in
|
15221
15231
|
// this scope (not in nested scopes).
|
@@ -15229,6 +15239,10 @@ AST_Scope.DEFMETHOD("drop_unused", function(compressor) {
|
|
15229
15239
|
});
|
15230
15240
|
}
|
15231
15241
|
if (node === self) return;
|
15242
|
+
if (node instanceof AST_Class && node.has_side_effects(compressor)) {
|
15243
|
+
if (node.is_self_referential()) self_referential_classes.add(node);
|
15244
|
+
node.visit_nondeferred_class_parts(tw);
|
15245
|
+
}
|
15232
15246
|
if (node instanceof AST_Defun || node instanceof AST_DefClass) {
|
15233
15247
|
var node_def = node.name.definition();
|
15234
15248
|
const in_export = tw.parent() instanceof AST_Export;
|
@@ -15238,22 +15252,11 @@ AST_Scope.DEFMETHOD("drop_unused", function(compressor) {
|
|
15238
15252
|
}
|
15239
15253
|
}
|
15240
15254
|
|
15241
|
-
if (node instanceof AST_DefClass && node.has_side_effects(compressor)) {
|
15242
|
-
const save_this_def = this_def;
|
15243
|
-
this_def = node_def;
|
15244
|
-
node.visit_nondeferred_class_parts(tw);
|
15245
|
-
this_def = save_this_def;
|
15246
|
-
}
|
15247
|
-
|
15248
15255
|
map_add(initializations, node_def.id, node);
|
15249
15256
|
return true; // don't go in nested scopes
|
15250
15257
|
}
|
15251
15258
|
// In the root scope, we drop things. In inner scopes, we just check for uses.
|
15252
15259
|
const in_root_scope = scope === self;
|
15253
|
-
if (node instanceof AST_This && this_def && in_root_scope) {
|
15254
|
-
in_use_ids.set(this_def.id, this_def);
|
15255
|
-
return true;
|
15256
|
-
}
|
15257
15260
|
if (node instanceof AST_SymbolFunarg && in_root_scope) {
|
15258
15261
|
map_add(var_defs_by_id, node.definition().id, node);
|
15259
15262
|
}
|
@@ -15302,6 +15305,9 @@ AST_Scope.DEFMETHOD("drop_unused", function(compressor) {
|
|
15302
15305
|
init.walk(tw);
|
15303
15306
|
});
|
15304
15307
|
});
|
15308
|
+
self_referential_classes.forEach(function (cls) {
|
15309
|
+
cls.walk(tw);
|
15310
|
+
});
|
15305
15311
|
// pass 3: we should drop declarations not in_use
|
15306
15312
|
var tt = new TreeTransformer(
|
15307
15313
|
function before(node, descend, in_list) {
|
package/lib/ast.js
CHANGED
@@ -2271,6 +2271,24 @@ var AST_Class = DEFNODE("Class", "name extends properties", function AST_Class(p
|
|
2271
2271
|
}
|
2272
2272
|
});
|
2273
2273
|
},
|
2274
|
+
is_self_referential: function() {
|
2275
|
+
const this_id = this.name && this.name.definition().id;
|
2276
|
+
let found = false;
|
2277
|
+
let class_this = true;
|
2278
|
+
this.visit_nondeferred_class_parts(new TreeWalker((node, descend) => {
|
2279
|
+
if (found) return true;
|
2280
|
+
if (node instanceof AST_This) return (found = class_this);
|
2281
|
+
if (node instanceof AST_SymbolRef) return (found = node.definition().id === this_id);
|
2282
|
+
if (node instanceof AST_Lambda && !(node instanceof AST_Arrow)) {
|
2283
|
+
const class_this_save = class_this;
|
2284
|
+
class_this = false;
|
2285
|
+
descend();
|
2286
|
+
class_this = class_this_save;
|
2287
|
+
return true;
|
2288
|
+
}
|
2289
|
+
}));
|
2290
|
+
return found;
|
2291
|
+
},
|
2274
2292
|
}, AST_Scope /* TODO a class might have a scope but it's not a scope */);
|
2275
2293
|
|
2276
2294
|
var AST_ClassProperty = DEFNODE("ClassProperty", "static quote", function AST_ClassProperty(props) {
|
@@ -155,9 +155,13 @@ def_drop_side_effect_free(AST_Arrow, return_null);
|
|
155
155
|
|
156
156
|
def_drop_side_effect_free(AST_Class, function (compressor) {
|
157
157
|
const with_effects = [];
|
158
|
+
|
159
|
+
if (this.is_self_referential() && this.has_side_effects(compressor)) {
|
160
|
+
return this;
|
161
|
+
}
|
162
|
+
|
158
163
|
const trimmed_extends = this.extends && this.extends.drop_side_effect_free(compressor);
|
159
|
-
if (trimmed_extends)
|
160
|
-
with_effects.push(trimmed_extends);
|
164
|
+
if (trimmed_extends) with_effects.push(trimmed_extends);
|
161
165
|
|
162
166
|
for (const prop of this.properties) {
|
163
167
|
if (prop instanceof AST_ClassStaticBlock) {
|
@@ -166,11 +170,7 @@ def_drop_side_effect_free(AST_Class, function (compressor) {
|
|
166
170
|
}
|
167
171
|
} else {
|
168
172
|
const trimmed_prop = prop.drop_side_effect_free(compressor);
|
169
|
-
if (trimmed_prop)
|
170
|
-
if (trimmed_prop.contains_this()) return this;
|
171
|
-
|
172
|
-
with_effects.push(trimmed_prop);
|
173
|
-
}
|
173
|
+
if (trimmed_prop) with_effects.push(trimmed_prop);
|
174
174
|
}
|
175
175
|
}
|
176
176
|
|
@@ -70,7 +70,6 @@ import {
|
|
70
70
|
AST_SymbolFunarg,
|
71
71
|
AST_SymbolRef,
|
72
72
|
AST_SymbolVar,
|
73
|
-
AST_This,
|
74
73
|
AST_Toplevel,
|
75
74
|
AST_Unary,
|
76
75
|
AST_Var,
|
@@ -127,7 +126,6 @@ AST_Scope.DEFMETHOD("drop_unused", function(compressor) {
|
|
127
126
|
return node.expression;
|
128
127
|
}
|
129
128
|
};
|
130
|
-
var this_def = null;
|
131
129
|
var in_use_ids = new Map();
|
132
130
|
var fixed_ids = new Map();
|
133
131
|
if (self instanceof AST_Toplevel && compressor.top_retain) {
|
@@ -139,6 +137,7 @@ AST_Scope.DEFMETHOD("drop_unused", function(compressor) {
|
|
139
137
|
}
|
140
138
|
var var_defs_by_id = new Map();
|
141
139
|
var initializations = new Map();
|
140
|
+
var self_referential_classes = new Set();
|
142
141
|
|
143
142
|
// pass 1: find out which symbols are directly used in
|
144
143
|
// this scope (not in nested scopes).
|
@@ -152,6 +151,10 @@ AST_Scope.DEFMETHOD("drop_unused", function(compressor) {
|
|
152
151
|
});
|
153
152
|
}
|
154
153
|
if (node === self) return;
|
154
|
+
if (node instanceof AST_Class && node.has_side_effects(compressor)) {
|
155
|
+
if (node.is_self_referential()) self_referential_classes.add(node);
|
156
|
+
node.visit_nondeferred_class_parts(tw);
|
157
|
+
}
|
155
158
|
if (node instanceof AST_Defun || node instanceof AST_DefClass) {
|
156
159
|
var node_def = node.name.definition();
|
157
160
|
const in_export = tw.parent() instanceof AST_Export;
|
@@ -161,22 +164,11 @@ AST_Scope.DEFMETHOD("drop_unused", function(compressor) {
|
|
161
164
|
}
|
162
165
|
}
|
163
166
|
|
164
|
-
if (node instanceof AST_DefClass && node.has_side_effects(compressor)) {
|
165
|
-
const save_this_def = this_def;
|
166
|
-
this_def = node_def;
|
167
|
-
node.visit_nondeferred_class_parts(tw);
|
168
|
-
this_def = save_this_def;
|
169
|
-
}
|
170
|
-
|
171
167
|
map_add(initializations, node_def.id, node);
|
172
168
|
return true; // don't go in nested scopes
|
173
169
|
}
|
174
170
|
// In the root scope, we drop things. In inner scopes, we just check for uses.
|
175
171
|
const in_root_scope = scope === self;
|
176
|
-
if (node instanceof AST_This && this_def && in_root_scope) {
|
177
|
-
in_use_ids.set(this_def.id, this_def);
|
178
|
-
return true;
|
179
|
-
}
|
180
172
|
if (node instanceof AST_SymbolFunarg && in_root_scope) {
|
181
173
|
map_add(var_defs_by_id, node.definition().id, node);
|
182
174
|
}
|
@@ -225,6 +217,9 @@ AST_Scope.DEFMETHOD("drop_unused", function(compressor) {
|
|
225
217
|
init.walk(tw);
|
226
218
|
});
|
227
219
|
});
|
220
|
+
self_referential_classes.forEach(function (cls) {
|
221
|
+
cls.walk(tw);
|
222
|
+
});
|
228
223
|
// pass 3: we should drop declarations not in_use
|
229
224
|
var tt = new TreeTransformer(
|
230
225
|
function before(node, descend, in_list) {
|
package/lib/parse.js
CHANGED
@@ -263,19 +263,6 @@ var UNICODE = {
|
|
263
263
|
ID_Continue: /(?:[$0-9A-Z_a-z\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF])+/,
|
264
264
|
};
|
265
265
|
|
266
|
-
try {
|
267
|
-
UNICODE = {
|
268
|
-
// https://262.ecma-international.org/13.0/#prod-IdentifierStartChar
|
269
|
-
// $, _, ID_Start
|
270
|
-
ID_Start: new RegExp("[_$\\p{ID_Start}]", "u"),
|
271
|
-
// https://262.ecma-international.org/13.0/#prod-IdentifierPartChar
|
272
|
-
// $, zero-width-joiner, zero-width-non-joiner, ID_Continue
|
273
|
-
ID_Continue: new RegExp("[$\\u200C\\u200D\\p{ID_Continue}]+", "u"),
|
274
|
-
};
|
275
|
-
} catch(e) {
|
276
|
-
// Could not use modern JS \p{...}. UNICODE is already defined above so let's continue
|
277
|
-
}
|
278
|
-
|
279
266
|
function get_full_char(str, pos) {
|
280
267
|
if (is_surrogate_pair_head(str.charCodeAt(pos))) {
|
281
268
|
if (is_surrogate_pair_tail(str.charCodeAt(pos + 1))) {
|
@@ -814,7 +801,12 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
|
|
814
801
|
while ((ch = next(true))) if (NEWLINE_CHARS.has(ch)) {
|
815
802
|
parse_error("Unexpected line terminator");
|
816
803
|
} else if (prev_backslash) {
|
817
|
-
|
804
|
+
if (/^[\u0000-\u007F]$/.test(ch)) {
|
805
|
+
source += "\\" + ch;
|
806
|
+
} else {
|
807
|
+
// Remove the useless slash before the escape, but only for characters that won't be added to regexp syntax
|
808
|
+
source += ch;
|
809
|
+
}
|
818
810
|
prev_backslash = false;
|
819
811
|
} else if (ch == "[") {
|
820
812
|
in_class = true;
|