efront 4.7.3 → 4.8.2
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/#/345/233/275/351/231/205/345/214/226.yml +30 -0
- package/apps/pay/alipay-query.jsp +2 -2
- package/apps/pivot/cert/main.xht +1 -1
- package/apps/pivot/cert/orders.xht +7 -1
- package/apps/pivot/home/welcome.js +1 -1
- package/apps/pivot/main.js +1 -0
- package/apps/pivot/wow/root.js +8 -32
- package/coms/basic/Speed.js +0 -1
- package/coms/basic/Timer.js +15 -0
- package/coms/basic/compile_test.js +2 -2
- package/coms/basic/cookie.js +2 -2
- package/coms/basic/lazy_test.js +2 -2
- package/coms/compile/Html.js +23 -6
- package/coms/compile/Html_test.js +9 -1
- package/coms/compile/Javascript.js +48 -30
- package/coms/compile/Program.js +30 -7
- package/coms/compile/audit.js +106 -4
- package/coms/compile/audit_test.js +8 -1
- package/coms/compile/autoenum.js +15 -0
- package/coms/compile/common.js +134 -19
- package/coms/compile/downLevel.js +11 -3
- package/coms/compile/downLevel_test.js +9 -1
- package/coms/compile/prefunc.js +38 -0
- package/coms/compile/scanner.js +4 -4
- package/coms/compile/translate.js +2 -2
- package/coms/compile/unstruct.js +1 -33
- package/coms/compile/unstruct_test.js +8 -8
- package/coms/crypt/encode62.js +1 -1
- package/coms/docs/codetext.xht +2 -0
- package/coms/frame/chat.js +1 -1
- package/coms/kugou/qqjc.js +1 -1
- package/coms/pivot/acme2.js +8 -4
- package/coms/random//350/272/253/344/273/275/350/257/201.js +1 -1
- package/coms/third-party/html2canvas.js +3 -3
- package/coms/zimoli/alert.js +3 -0
- package/coms/zimoli/lazySwap.js +1 -1
- package/coms/zimoli/loading.html +1 -1
- package/coms/zimoli/menuList.js +2 -2
- package/coms/zimoli/remove.js +1 -0
- package/coms/zimoli/sessionStorage.js +1 -1
- package/coms/zimoli/speed_test.js +2 -2
- package/coms/zimoli/zimoli.js +1 -4
- package/docs//345/267/245/345/205/267//345/233/275/351/231/205/345/214/226.xht +19 -9
- package/docs//347/273/204/344/273/266.xht +38 -12
- package/package.json +1 -1
- package/public/efront.js +1 -1
- package/apps/pivot/wow/root.less +0 -2
package/coms/compile/audit.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var { STAMP, getDeclared, VALUE, STRAP, SCOPED, QUOTED, snapSentenceHead, pickSentence, createString, getBodyWith } = require("./common");
|
|
1
|
+
var { STAMP, EXPRESS, STRAP, isHalfSentence, skipAssignment, skipFunction, getDeclared, VALUE, STRAP, SCOPED, QUOTED, snapSentenceHead, pickSentence, createString, getBodyWith, getFuncBody } = require("./common");
|
|
2
2
|
var addAccessedStart = function (matched, namedMap) {
|
|
3
3
|
var start = +namedMap["#1"];
|
|
4
4
|
var body = getBodyWith(matched[0], 'arguments');
|
|
@@ -24,18 +24,120 @@ var getLoop = function (c, root) {
|
|
|
24
24
|
c = h.queue;
|
|
25
25
|
} while (c?.type === SCOPED && c !== root)
|
|
26
26
|
return loop;
|
|
27
|
+
};
|
|
28
|
+
var hasRupt = function (a) {
|
|
29
|
+
if (a.type === STRAP && /^(await|yield)$/.test(a.text)) return true;
|
|
30
|
+
if (a.length) {
|
|
31
|
+
var a = a.first;
|
|
32
|
+
while (a) {
|
|
33
|
+
if (a.type === STRAP && /^(class|function|async)$/.test(a.text)) {
|
|
34
|
+
a = skipFunction(a);
|
|
35
|
+
}
|
|
36
|
+
else if (a.type === STAMP && a.text === '=>') {
|
|
37
|
+
a = skipAssignment(a);
|
|
38
|
+
}
|
|
39
|
+
else if (a.type === SCOPED) {
|
|
40
|
+
if (a.entry === "{") {
|
|
41
|
+
if (!a.isObject) {
|
|
42
|
+
if (hasRupt(a)) return true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
if (hasRupt(a)) return true;
|
|
47
|
+
}
|
|
48
|
+
a = a.next;
|
|
49
|
+
}
|
|
50
|
+
else a = a.next;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
};
|
|
55
|
+
var getNodePath = function (a, body) {
|
|
56
|
+
var q = a;
|
|
57
|
+
var qs = [];
|
|
58
|
+
while (q && q !== body) {
|
|
59
|
+
qs.push(q);
|
|
60
|
+
q = q.queue;
|
|
61
|
+
}
|
|
62
|
+
return qs.reverse();
|
|
63
|
+
};
|
|
64
|
+
var hasRuptBetween = function (a1, a2) {
|
|
65
|
+
var qp1 = getNodePath(a1);
|
|
66
|
+
var qp2 = getNodePath(a2);
|
|
67
|
+
var qc = [];
|
|
68
|
+
for (var cx = 0, dx = Math.min(qp1.length, qp2.length); cx < dx; cx++) {
|
|
69
|
+
var q1 = qp1[cx];
|
|
70
|
+
if (q1 !== qp2[cx]) break;
|
|
71
|
+
qc.push(q1);
|
|
72
|
+
}
|
|
73
|
+
if (!qc.length) return false;
|
|
74
|
+
var qce = qc.pop();
|
|
75
|
+
var q2 = qp2[cx];
|
|
76
|
+
for (var cx = qce.indexOf(q1), dx = qce.indexOf(q2) + 1 || qce.length; cx < dx; cx++) {
|
|
77
|
+
var q = qce[cx];
|
|
78
|
+
if (hasRupt(q)) return true;
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
var unMultiple = function (matched) {
|
|
83
|
+
var body = getFuncBody(matched[0]);
|
|
84
|
+
if (!body?.prev || body.checked & 0b10) return;
|
|
85
|
+
body.checked |= 0b10;
|
|
86
|
+
var { envs, used } = body.scoped;
|
|
87
|
+
var undec = [];
|
|
88
|
+
for (var k in envs) {
|
|
89
|
+
var w = [];
|
|
90
|
+
for (var o of used[k]) {
|
|
91
|
+
if (o.text !== k) continue;
|
|
92
|
+
if (o.equal && o.next === o.equal) {
|
|
93
|
+
w.push(o);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (!w.length) continue;
|
|
97
|
+
for (var cx = 0, dx = w.length; cx < dx; cx++) {
|
|
98
|
+
var loop = getLoop(w[cx]);
|
|
99
|
+
if (loop && hasRupt(loop)) {
|
|
100
|
+
undec.push(k);
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
if (cx > 0 && hasRuptBetween(w[cx - 1], w[cx])) {
|
|
104
|
+
undec.push(k)
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (!undec.length) return;
|
|
110
|
+
var h = snapSentenceHead(body.prev);
|
|
111
|
+
matched = [];
|
|
112
|
+
var declared = null;
|
|
113
|
+
while (h && h !== body) {
|
|
114
|
+
if (h.kind) {
|
|
115
|
+
declared = h.text;
|
|
116
|
+
}
|
|
117
|
+
matched.push(h);
|
|
118
|
+
h = h.next;
|
|
119
|
+
}
|
|
120
|
+
if (!declared) {
|
|
121
|
+
declared = h.type & (STRAP | EXPRESS) && /^(module|exports|return)$/.test(h.tack);
|
|
122
|
+
if (!declared) return;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
matched.suggest = `${createString(matched)}{\r\n // 不建议在可并行执行的函数中更改外部变量,以防并发调用时出现异常\r\n // 建议在可并行函数内声明如下变量,并修改用到这些变量的代码\r\n var ${undec.join(',')};\r\n }`;
|
|
126
|
+
return matched;
|
|
27
127
|
}
|
|
28
128
|
var suggest = {
|
|
29
129
|
"while($2[$1++]!==$3)": "while($1<$2.length&&$2[$1++]!==$3)",
|
|
30
130
|
"while($2[$1]!==$3)$1++": "while($1<$2.length&&$2[$1]!==$3)$1++",
|
|
31
131
|
"for(var $1=#1,$2=arguments.length;$1<$2;$1++)": addAccessedStart,
|
|
32
132
|
"for(var $1=#1;$1<arguments.length;$1++)": addAccessedStart,
|
|
133
|
+
"await": unMultiple,
|
|
134
|
+
"yield": unMultiple,
|
|
33
135
|
"arguments"(matched) {
|
|
34
136
|
var m = matched[0];
|
|
35
137
|
var body = getBodyWith(m, 'arguments');
|
|
36
138
|
var head = body.prev;
|
|
37
|
-
if (!head?.length || body.checked) return;
|
|
38
|
-
body.checked
|
|
139
|
+
if (!head?.length || body.checked & 1) return;
|
|
140
|
+
body.checked |= 1;
|
|
39
141
|
var { used, args } = body.scoped;
|
|
40
142
|
if (!args?.length) return;
|
|
41
143
|
var access_start = body.reststart ?? args?.length;
|
|
@@ -93,7 +195,7 @@ var suggest = {
|
|
|
93
195
|
}
|
|
94
196
|
matched.suggest = `${createString(matched.slice(0, matched.length - 1))}(){\r\n var[${createString(head)}]=arguments;\r\n // ${i18n`后续代码`}..\r\n }`;
|
|
95
197
|
return matched;
|
|
96
|
-
}
|
|
198
|
+
},
|
|
97
199
|
};
|
|
98
200
|
|
|
99
201
|
var regSuggest = function (c) {
|
package/coms/compile/autoenum.js
CHANGED
|
@@ -100,6 +100,9 @@ var maplist = function (u) {
|
|
|
100
100
|
}
|
|
101
101
|
else if (enumtype & REFMOVE) m.wcount++;
|
|
102
102
|
}
|
|
103
|
+
else {
|
|
104
|
+
if (o.equal) m.wcount++;
|
|
105
|
+
}
|
|
103
106
|
}
|
|
104
107
|
else if (enumtype & REFSTRC) {
|
|
105
108
|
if (o.enumref && o.enumref !== m.enumref) m.wcount++, m.enumref = o.enumref;
|
|
@@ -172,6 +175,18 @@ function inCondition(o) {
|
|
|
172
175
|
}
|
|
173
176
|
|
|
174
177
|
function enumref(refitem, scoped) {
|
|
178
|
+
if (enumtype === REFMOVE) {
|
|
179
|
+
var c = 0;
|
|
180
|
+
for (var rk in refitem) {
|
|
181
|
+
c++;
|
|
182
|
+
var a = refitem[rk];
|
|
183
|
+
if (a.ccount > 0) return;
|
|
184
|
+
}
|
|
185
|
+
var a = refitem[""];
|
|
186
|
+
if (a && c > 1) {
|
|
187
|
+
if (a.wcount < a.length) return;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
175
190
|
for (var rk in refitem) {
|
|
176
191
|
var os = refitem[rk];
|
|
177
192
|
if (os.wcount !== 1 || os.length < 2) continue;
|
package/coms/compile/common.js
CHANGED
|
@@ -36,9 +36,13 @@ var skipAssignment = function (o, cx) {
|
|
|
36
36
|
else if (o.type & (SPACE | COMMENT)) o = o.next;
|
|
37
37
|
var needpunc = false;
|
|
38
38
|
var qcount = 0;
|
|
39
|
+
var condition = false;
|
|
39
40
|
var ifdeep = 0;
|
|
40
|
-
var labeled = o && o.type === LABEL;
|
|
41
|
-
|
|
41
|
+
var labeled = o && (o.type === LABEL || o.type === STRAP && /^(var|const|let)$/i.test(o.text));
|
|
42
|
+
var skipLabel = function () {
|
|
43
|
+
while (o?.type === LABEL) next();
|
|
44
|
+
};
|
|
45
|
+
skipLabel();
|
|
42
46
|
loop: while (o) switch (o.type) {
|
|
43
47
|
case LABEL:
|
|
44
48
|
if (!ifdeep) break loop;
|
|
@@ -51,7 +55,7 @@ var skipAssignment = function (o, cx) {
|
|
|
51
55
|
next();
|
|
52
56
|
break;
|
|
53
57
|
case ",":
|
|
54
|
-
if (!ifdeep && !labeled) break loop;
|
|
58
|
+
if (!ifdeep && !labeled && !condition) break loop;
|
|
55
59
|
needpunc = false;
|
|
56
60
|
next();
|
|
57
61
|
break;
|
|
@@ -132,6 +136,7 @@ var skipAssignment = function (o, cx) {
|
|
|
132
136
|
if (o.text === 'catch') {
|
|
133
137
|
next();
|
|
134
138
|
if (o && o.entry === '(') next();
|
|
139
|
+
skipLabel();
|
|
135
140
|
needpunc = false;
|
|
136
141
|
break;
|
|
137
142
|
}
|
|
@@ -147,14 +152,23 @@ var skipAssignment = function (o, cx) {
|
|
|
147
152
|
if (ifdeep <= 0) break loop;
|
|
148
153
|
ifdeep--;
|
|
149
154
|
needpunc = false;
|
|
155
|
+
skipLabel();
|
|
150
156
|
next();
|
|
151
157
|
}
|
|
152
158
|
else if (/^(if|while|with|switch|try)$/.test(o.text)) {
|
|
153
159
|
if (o.text === 'if') ifdeep++;
|
|
160
|
+
skipLabel();
|
|
154
161
|
next();
|
|
155
|
-
|
|
162
|
+
skipLabel();
|
|
163
|
+
if (o?.entry === "(") next();
|
|
164
|
+
skipLabel();
|
|
165
|
+
if (o?.type === SCOPED && o.entry === '{') {
|
|
166
|
+
condition = false;
|
|
167
|
+
}
|
|
168
|
+
else condition = true;
|
|
156
169
|
}
|
|
157
170
|
else if (o.text === 'do') {
|
|
171
|
+
skipLabel();
|
|
158
172
|
next();
|
|
159
173
|
next();
|
|
160
174
|
next();
|
|
@@ -162,6 +176,7 @@ var skipAssignment = function (o, cx) {
|
|
|
162
176
|
else if (o.text === 'for') {
|
|
163
177
|
next();
|
|
164
178
|
if (o.type === STRAP && o.text === 'await') next();
|
|
179
|
+
skipLabel();
|
|
165
180
|
next();
|
|
166
181
|
}
|
|
167
182
|
else if (o.text === "class") {
|
|
@@ -289,12 +304,15 @@ function snapSentenceHead(o) {
|
|
|
289
304
|
p = o.prev;
|
|
290
305
|
if (!p) break;
|
|
291
306
|
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
307
|
+
var pp = getContitionHeadBeforeScoped(o, false);
|
|
308
|
+
if (pp) { o = pp; break; }
|
|
309
|
+
pp = getFunctionHeadBeforeScoped(o);
|
|
310
|
+
if (pp) {
|
|
311
|
+
o = pp;
|
|
312
|
+
p = o.prev;
|
|
313
|
+
if (!p || p.type === STAMP && /^[,;]$/.test(p.text)) break;
|
|
314
|
+
continue
|
|
315
|
+
};
|
|
298
316
|
}
|
|
299
317
|
var maybeprop = o.type === SCOPED && o.entry !== "{" || o.type === EXPRESS && /^[\.\[]/.test(o.text);
|
|
300
318
|
if (p.type === EXPRESS) {
|
|
@@ -325,7 +343,12 @@ function snapSentenceHead(o) {
|
|
|
325
343
|
var pp = getContitionHeadBeforeScoped(p, true);
|
|
326
344
|
if (pp) { o = pp; break; }
|
|
327
345
|
var pp = getFunctionHeadBeforeScoped(p);
|
|
328
|
-
if (pp) {
|
|
346
|
+
if (pp) {
|
|
347
|
+
o = pp;
|
|
348
|
+
p = o.prev;
|
|
349
|
+
if (!p || p.type === STAMP && /^[,;]$/.test(p.text)) break;
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
329
352
|
}
|
|
330
353
|
break;
|
|
331
354
|
}
|
|
@@ -361,7 +384,7 @@ function snapSentenceHead(o) {
|
|
|
361
384
|
if (/^[\?\:]$/.test(p.text)) {
|
|
362
385
|
if (o) {
|
|
363
386
|
var e = snapExpressFoot(o).next;
|
|
364
|
-
if (e.type === STAMP && equal_reg.test(e.text)) break;
|
|
387
|
+
if (!e || e.type === STAMP && equal_reg.test(e.text)) break;
|
|
365
388
|
}
|
|
366
389
|
}
|
|
367
390
|
if (/^(?:[!~]|\+\+|\-\-)$/.test(p.text)) {
|
|
@@ -375,11 +398,6 @@ function snapSentenceHead(o) {
|
|
|
375
398
|
o = p;
|
|
376
399
|
continue;
|
|
377
400
|
}
|
|
378
|
-
var pp = p.prev;
|
|
379
|
-
if (pp.type === STAMP && /^(\+\+|\-\-)$/.test(pp.text) && pp.prev) {
|
|
380
|
-
o = pp.prev;
|
|
381
|
-
continue;
|
|
382
|
-
}
|
|
383
401
|
o = p.prev;
|
|
384
402
|
continue;
|
|
385
403
|
}
|
|
@@ -541,6 +559,7 @@ var createScoped = function (parsed, wash) {
|
|
|
541
559
|
case VALUE:
|
|
542
560
|
if (o.isdigit || /^(null|false|true)$/.test(o.text)) break;
|
|
543
561
|
case EXPRESS:
|
|
562
|
+
if (needhead_reg.test(o.text)) break;
|
|
544
563
|
// if (o.text === 'readFileAsync') console.log(o)
|
|
545
564
|
if (o.prev && o.prev.type === EXPRESS) {
|
|
546
565
|
if (/\.$/.test(o.prev.text)) break;
|
|
@@ -548,6 +567,7 @@ var createScoped = function (parsed, wash) {
|
|
|
548
567
|
if (o.next && o.next.type === STAMP && o.next.text === "=>") {
|
|
549
568
|
isScope = true;
|
|
550
569
|
isArrow = true;
|
|
570
|
+
isAsync = o.prev?.type === STRAP && o.prev.text === 'async';
|
|
551
571
|
}
|
|
552
572
|
else {
|
|
553
573
|
var u = o.text;
|
|
@@ -569,7 +589,7 @@ var createScoped = function (parsed, wash) {
|
|
|
569
589
|
name = name.replace(/\s*\:$/, '');
|
|
570
590
|
vars[name] = true;
|
|
571
591
|
o.kind = "label";
|
|
572
|
-
saveTo(
|
|
592
|
+
saveTo(labelused, name, o);
|
|
573
593
|
break;
|
|
574
594
|
|
|
575
595
|
case STRAP:
|
|
@@ -663,7 +683,7 @@ var createScoped = function (parsed, wash) {
|
|
|
663
683
|
if (o.next && o.next.type === STAMP && o.next.text === "=>") {
|
|
664
684
|
isArrow = true;
|
|
665
685
|
isScope = true;
|
|
666
|
-
if (o.prev && o.prev.text === 'async') {
|
|
686
|
+
if (o.prev?.type === STRAP && o.prev.text === 'async') {
|
|
667
687
|
isAsync = true;
|
|
668
688
|
}
|
|
669
689
|
}
|
|
@@ -801,6 +821,7 @@ var createScoped = function (parsed, wash) {
|
|
|
801
821
|
}
|
|
802
822
|
else if (isArrow) {
|
|
803
823
|
var next = skipAssignment(o);
|
|
824
|
+
scoped.arraw = o;
|
|
804
825
|
var u = o;
|
|
805
826
|
while (o !== next) {
|
|
806
827
|
var n = run(o, 0);
|
|
@@ -1047,6 +1068,7 @@ var saveTo = function (used, k, o) {
|
|
|
1047
1068
|
k = uncode(k);
|
|
1048
1069
|
if (!(used[k] instanceof Array)) used[k] = [];
|
|
1049
1070
|
used[k].push(o);
|
|
1071
|
+
o.tack = k;
|
|
1050
1072
|
};
|
|
1051
1073
|
|
|
1052
1074
|
var mergeTo = function (used, used0) {
|
|
@@ -1114,6 +1136,27 @@ var relink = function (list) {
|
|
|
1114
1136
|
list.last = p;
|
|
1115
1137
|
return list;
|
|
1116
1138
|
};
|
|
1139
|
+
var rehead = function (list) {
|
|
1140
|
+
for (var cx = 0, dx = list.length; cx < dx; cx++) {
|
|
1141
|
+
var o = list[cx];
|
|
1142
|
+
if (o.type & (COMMENT | SPACE)) {
|
|
1143
|
+
o.prev = null;
|
|
1144
|
+
continue;
|
|
1145
|
+
}
|
|
1146
|
+
list.first = o;
|
|
1147
|
+
break;
|
|
1148
|
+
}
|
|
1149
|
+
for (var cx = list.length - 1; cx >= 0; cx--) {
|
|
1150
|
+
var o = list[cx];
|
|
1151
|
+
if (o.type & (COMMENT | SPACE)) {
|
|
1152
|
+
o.last = null;
|
|
1153
|
+
continue;
|
|
1154
|
+
}
|
|
1155
|
+
list.last = o;
|
|
1156
|
+
break;
|
|
1157
|
+
}
|
|
1158
|
+
return list;
|
|
1159
|
+
}
|
|
1117
1160
|
var setqueue = function (list, queue = list) {
|
|
1118
1161
|
/**
|
|
1119
1162
|
* @type {PropertyDescriptor}
|
|
@@ -1219,6 +1262,9 @@ var createString = function (parsed) {
|
|
|
1219
1262
|
}
|
|
1220
1263
|
}
|
|
1221
1264
|
intag = 0;
|
|
1265
|
+
if (o.short && attributes.length > 0 && !(lasttype & (SPACE | QUOTED))) {
|
|
1266
|
+
if (!/[\s'"]$/.test(result[result.length - 1])) result.push(' ');
|
|
1267
|
+
}
|
|
1222
1268
|
}
|
|
1223
1269
|
if (o.closed) {
|
|
1224
1270
|
if (!o.short) {
|
|
@@ -1521,6 +1567,25 @@ var pickSentence = function (o) {
|
|
|
1521
1567
|
} while (h !== e);
|
|
1522
1568
|
return res;
|
|
1523
1569
|
};
|
|
1570
|
+
var pickExpress = function (o) {
|
|
1571
|
+
o = snapExpressFoot(o);
|
|
1572
|
+
var e = snapExpressFoot(o);
|
|
1573
|
+
var os = [];
|
|
1574
|
+
do {
|
|
1575
|
+
os.push(o);
|
|
1576
|
+
}
|
|
1577
|
+
while (o && o !== e);
|
|
1578
|
+
return os;
|
|
1579
|
+
};
|
|
1580
|
+
var pickAssignment = function (n) {
|
|
1581
|
+
var e = skipAssignment(n);
|
|
1582
|
+
var values = [];
|
|
1583
|
+
while (n && n !== e) {
|
|
1584
|
+
values.push(n);
|
|
1585
|
+
n = n.next;
|
|
1586
|
+
}
|
|
1587
|
+
return values;
|
|
1588
|
+
}
|
|
1524
1589
|
var insertBefore = function () {
|
|
1525
1590
|
var [o] = arguments;
|
|
1526
1591
|
var queue = this || o.queue;
|
|
@@ -1565,12 +1630,57 @@ var unshort = function (o, text) {
|
|
|
1565
1630
|
o.type = EXPRESS;
|
|
1566
1631
|
delete o.short;
|
|
1567
1632
|
};
|
|
1633
|
+
var getFuncBody = function (o) {
|
|
1634
|
+
var q = o.queue;
|
|
1635
|
+
while (q && !(q.scoped?.isfunc)) q = q.queue;
|
|
1636
|
+
return q;
|
|
1637
|
+
};
|
|
1568
1638
|
var getBodyWith = function (o, k) {
|
|
1569
1639
|
var q = o.queue;
|
|
1570
1640
|
while (q && (!q.scoped || !q.scoped.caps[k])) q = q.queue;
|
|
1571
1641
|
return q;
|
|
1572
1642
|
};
|
|
1573
1643
|
|
|
1644
|
+
|
|
1645
|
+
var createSeeker = function (o) {
|
|
1646
|
+
var os = pickExpress(o);
|
|
1647
|
+
var ids = [];
|
|
1648
|
+
for (var o of os) {
|
|
1649
|
+
if (o.type === SCOPED) {
|
|
1650
|
+
if (o.entry !== '[') break;
|
|
1651
|
+
var t = o.last;
|
|
1652
|
+
if (!t) throw new Error(i18n`格式错误`);
|
|
1653
|
+
if (t.type === QUOTED) {
|
|
1654
|
+
if (!t.length) {
|
|
1655
|
+
if (/\.|^#/.test(t.text)) {
|
|
1656
|
+
ids.push(`[${t.text}]`);
|
|
1657
|
+
}
|
|
1658
|
+
else {
|
|
1659
|
+
ids.push(strings.decode(t.text));
|
|
1660
|
+
}
|
|
1661
|
+
}
|
|
1662
|
+
else {
|
|
1663
|
+
ids.push("...");
|
|
1664
|
+
break;
|
|
1665
|
+
}
|
|
1666
|
+
}
|
|
1667
|
+
}
|
|
1668
|
+
else if (o.type === EXPRESS) {
|
|
1669
|
+
var t = o.text.replace(/^\.\.\./, "").replace(/^[^\.\[]+/, '');
|
|
1670
|
+
t.replace(/[^\.\[]+|\[[\s\S]*?\]/g, function (m) {
|
|
1671
|
+
if (/^\[/.test(m)) {
|
|
1672
|
+
ids.push(strings.decode(m.slice(1, -1)));
|
|
1673
|
+
}
|
|
1674
|
+
else {
|
|
1675
|
+
ids.push(m);
|
|
1676
|
+
}
|
|
1677
|
+
})
|
|
1678
|
+
}
|
|
1679
|
+
|
|
1680
|
+
}
|
|
1681
|
+
return ids;
|
|
1682
|
+
};
|
|
1683
|
+
|
|
1574
1684
|
var patchArrawScope = function (arraw, origin) {
|
|
1575
1685
|
var s1 = createScoped(arraw);
|
|
1576
1686
|
if (s1.caps.this) {
|
|
@@ -1604,6 +1714,7 @@ module.exports = {
|
|
|
1604
1714
|
skipAssignment,
|
|
1605
1715
|
getDeclared,
|
|
1606
1716
|
getBodyWith,
|
|
1717
|
+
getFuncBody,
|
|
1607
1718
|
patchArrawScope,
|
|
1608
1719
|
remove,
|
|
1609
1720
|
createString,
|
|
@@ -1612,6 +1723,8 @@ module.exports = {
|
|
|
1612
1723
|
snapSentenceHead,
|
|
1613
1724
|
pickArgument,
|
|
1614
1725
|
pickSentence,
|
|
1726
|
+
pickExpress,
|
|
1727
|
+
pickAssignment,
|
|
1615
1728
|
snapExpressHead,
|
|
1616
1729
|
snapExpressFoot,
|
|
1617
1730
|
skipSentenceQueue,
|
|
@@ -1620,6 +1733,8 @@ module.exports = {
|
|
|
1620
1733
|
isEval,
|
|
1621
1734
|
rename,
|
|
1622
1735
|
relink,
|
|
1736
|
+
rehead,
|
|
1737
|
+
createSeeker,
|
|
1623
1738
|
setqueue,
|
|
1624
1739
|
replace,
|
|
1625
1740
|
canbeTemp,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var scanner2 = require("./scanner2");
|
|
2
2
|
var strings = require("../basic/strings");
|
|
3
3
|
var Program = scanner2.Program;
|
|
4
|
-
var { STAMP, SCOPED, STRAP, EXPRESS, COMMENT, SPACE, PROPERTY, VALUE, LABEL, QUOTED, snapExpressFoot, isEval, canbeTemp, rename, isHalfSentence, skipFunction, getDeclared, skipAssignment, skipSentenceQueue, createScoped, createString, splice, relink, snapExpressHead, needBreakBetween } = require("./common");
|
|
4
|
+
var { STAMP, SCOPED, STRAP, EXPRESS, pickAssignment, COMMENT, SPACE, PROPERTY, VALUE, LABEL, QUOTED, snapExpressFoot, isEval, canbeTemp, rename, isHalfSentence, skipFunction, getDeclared, skipAssignment, skipSentenceQueue, createScoped, createString, splice, relink, snapExpressHead, needBreakBetween } = require("./common");
|
|
5
5
|
var splice2 = function (q, from, to, ...a) {
|
|
6
6
|
var cx = q.indexOf(from);
|
|
7
7
|
if (cx < 0) throw console.log(splice2.caller, console.format(`\r\n<red2>${i18n`自`}</red2>`), from && createString([from]), console.format(`\r\n<yellow>${i18n`至`}</yellow>`), to && createString([to]), console.format(`\r\n<cyan>${i18n`码列`}</cyan>`), createString(q)), i18n`结构异常`;
|
|
@@ -1721,13 +1721,19 @@ var down = function (scoped) {
|
|
|
1721
1721
|
fordeep = saveddeep;
|
|
1722
1722
|
};
|
|
1723
1723
|
if (scoped.isfunc) {
|
|
1724
|
-
if (!scoped.body && scoped.head) scoped.body = scoped.head.next;
|
|
1724
|
+
if (!scoped.body && scoped.head?.next?.type === SCOPED && scoped.head.next.entry === "{") scoped.body = scoped.head.next;
|
|
1725
1725
|
if (scoped.head) var [argsmap, argcodes] = killarg(scoped.head, scoped.body, _letname, false);
|
|
1726
1726
|
else argcodes = [];
|
|
1727
1727
|
if ((markcodes.length || argcodes.length) && !funcMark) precode(markcodes.concat(argcodes).join(";") + ";");
|
|
1728
1728
|
if (scoped.body) scoped.body.keeplet = false, _killobj(_getname, scoped.body);
|
|
1729
|
-
|
|
1730
1729
|
scoped.forEach(kill);
|
|
1730
|
+
var requeue = null, requeuei = -1, requeuee = -1;
|
|
1731
|
+
if (!scoped.body && scoped.arraw) {
|
|
1732
|
+
requeue = scoped.arraw.queue;
|
|
1733
|
+
requeuei = requeue.indexOf(scoped.arraw);
|
|
1734
|
+
scoped.body = pickAssignment(scoped.arraw);
|
|
1735
|
+
requeuee = requeue.indexOf(scoped.body[scoped.body.length - 1], requeuei) + 1;
|
|
1736
|
+
}
|
|
1731
1737
|
if (funcMark) {
|
|
1732
1738
|
var argname = _letname("_");
|
|
1733
1739
|
unstruct.debug = downLevel.debug;
|
|
@@ -1761,6 +1767,8 @@ var down = function (scoped) {
|
|
|
1761
1767
|
if (argsmap) vars1 = vars1.filter(k => !(k in argsmap));
|
|
1762
1768
|
if (vars1.length && scoped.body) scoped.body.push(...scanner2(`\r\nvar ${vars1}`));
|
|
1763
1769
|
if (scoped.body) relink(scoped.body);
|
|
1770
|
+
|
|
1771
|
+
if (requeuei >= 0) splice(requeue, requeuei, requeuee - requeuei, ...scoped.body);
|
|
1764
1772
|
}
|
|
1765
1773
|
else {
|
|
1766
1774
|
kill(scoped);
|
|
@@ -85,7 +85,7 @@ assert(downLevel(`class a { static{ a.a=1}}`), "function a() {}; (function () {
|
|
|
85
85
|
assert(downLevel(`if(a) a = 1; class a {}`), "if (a) a = 1; function a() {}")
|
|
86
86
|
assert(downLevel(`async function(){if(a) a = 1; class a {}}`), `function () { return async_(
|
|
87
87
|
function () {
|
|
88
|
-
a = function
|
|
88
|
+
a = function () {}; if (!a) return [1, 0]; a = 1; return [1, 0]
|
|
89
89
|
})
|
|
90
90
|
var a, _0 }`)
|
|
91
91
|
assert(downLevel(`if(a) class b{ c(){}};`), `if (a) var b = function (b) { b["prototype"].c = function () {}\r\nreturn b }(function b() {});`)
|
|
@@ -424,3 +424,11 @@ function (_) {
|
|
|
424
424
|
_0 = _; _0 = _0.a; a = _0
|
|
425
425
|
})
|
|
426
426
|
var a, _0`)
|
|
427
|
+
|
|
428
|
+
assert(downLevel(`async a=>await a`), `function (a) { return return async_(
|
|
429
|
+
function () {
|
|
430
|
+
_0 = a; return [_0, 1]
|
|
431
|
+
})
|
|
432
|
+
var a, _0 }`)
|
|
433
|
+
|
|
434
|
+
assert(downLevel(`function(a=b=>b,c){c}`), 'function (a, c) { if (a === undefined) a = function (b) { return b }; c }')
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
var { COMMENT, SPACE, STRAP, EXPRESS, STAMP, skipAssignment, isHalfSentence, splice } = common;
|
|
2
|
+
// 将当前代码队列中的function及class声明提前
|
|
3
|
+
var prefunc = function (sbody) {
|
|
4
|
+
var fx = 0;
|
|
5
|
+
for (var cx = 0, dx = sbody.length; cx < dx; cx++) {
|
|
6
|
+
var o = sbody[cx];
|
|
7
|
+
var bx = cx;
|
|
8
|
+
while (o && o.type & (SPACE | COMMENT)) o = sbody[++cx];
|
|
9
|
+
if (!o) break;
|
|
10
|
+
if (o.type === STRAP && /^(async|function|class)$/.test(o.text)) {
|
|
11
|
+
if (!o.isExpress) {
|
|
12
|
+
var ex = skipAssignment(sbody, cx);
|
|
13
|
+
var fname = '';
|
|
14
|
+
o = o.next;
|
|
15
|
+
while (o.type & (STRAP | STAMP)) o = o.next;
|
|
16
|
+
if (o.type === EXPRESS) fname = o.text;
|
|
17
|
+
if (fname) {
|
|
18
|
+
var ni = sbody.indexOf(o, cx);
|
|
19
|
+
splice(sbody, ni, 1);
|
|
20
|
+
if (isHalfSentence(sbody, cx - 1)) {
|
|
21
|
+
splice(sbody, cx, 0, o, { type: STAMP, text: "=" });
|
|
22
|
+
ex++;
|
|
23
|
+
dx++;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
var sb = splice(sbody, bx, ex - bx);
|
|
27
|
+
splice(sbody, fx, 0, { type: SPACE, text: "\r\n" }, o, { type: STAMP, text: "=" }, ...sb);
|
|
28
|
+
fx += ex - bx + 2;
|
|
29
|
+
ex += 2;
|
|
30
|
+
dx += 2;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
cx = ex;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
};
|
package/coms/compile/scanner.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
function test(test, count) {
|
|
3
|
-
var time = Date
|
|
3
|
+
var time = +new Date;
|
|
4
4
|
if (test instanceof Function) {
|
|
5
5
|
while (count-- > 0) {
|
|
6
6
|
test();
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
|
-
return Date
|
|
9
|
+
return new Date - time;
|
|
10
10
|
}
|
|
11
11
|
// - function () {
|
|
12
12
|
// single_comment_scanner.call("'", 0) === 1;
|
|
@@ -622,11 +622,11 @@ function lookback_scanner(blockIndex, blocks) {
|
|
|
622
622
|
var scanner = module.exports = function (s, keepdeep) {
|
|
623
623
|
var blocks = [];
|
|
624
624
|
var s = String(s);
|
|
625
|
-
// var time = Date
|
|
625
|
+
// var time = +new Date;
|
|
626
626
|
// for (var i = 0; i < 1000; i++) {
|
|
627
627
|
// block_code_scanner.call(s, 0, blocks);
|
|
628
628
|
// }//angular 1.5.3 x1000 7.0s
|
|
629
|
-
// console.log(Date
|
|
629
|
+
// console.log(+new Date - time);
|
|
630
630
|
block_code_scanner.call(s, 0, blocks, keepdeep);
|
|
631
631
|
// console.log(blocks.map(a => s.slice(a.start, a.end)).join())
|
|
632
632
|
return blocks;
|
|
@@ -110,7 +110,7 @@ function translate([imap, supports], code) {
|
|
|
110
110
|
|
|
111
111
|
var imp = imap[tt];
|
|
112
112
|
if (!imp) {
|
|
113
|
-
if (warn !== false && !warningMap[tt]) warningMap[tt] = true, console.warn(`<yellow>${i18n`翻译缺失:`}</yellow>${tt}`);
|
|
113
|
+
if (warn !== false && !/^\s*$/.test(tt) && !warningMap[tt]) warningMap[tt] = true, console.warn(`<yellow>${i18n`翻译缺失:`}</yellow>${tt}`);
|
|
114
114
|
imp = imap[tt] = supports.map(_ => tt);
|
|
115
115
|
}
|
|
116
116
|
if (nodup && imp.length <= 1) nodup = false;
|
|
@@ -158,7 +158,7 @@ function translate([imap, supports], code) {
|
|
|
158
158
|
if (a in t) v = t[a];
|
|
159
159
|
else v = scanner2(JSON.stringify(v));
|
|
160
160
|
}
|
|
161
|
-
else if (
|
|
161
|
+
else if (/^(name|holder|comment)$/.test(k)) v = ctn('i18n' + getm(v, t.nodup, t.warn), t);
|
|
162
162
|
else v = scanner2(JSON.stringify(v));
|
|
163
163
|
o.push({ type: PROPERTY, isprop: true, text: JSON.stringify(k) }, { type: STAMP, text: ':' }, ...v, { type: STAMP, text: ',' });
|
|
164
164
|
})
|