efront 4.15.3 → 4.17.0
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 +15 -0
- package/coms/basic/Matrix.js +181 -304
- package/coms/basic/mark.js +1 -9
- package/coms/basic/parseYML.js +1 -1
- package/coms/basic/parseYML_test.js +26 -1
- package/coms/basic_/asyncAster_.js +5 -1
- package/coms/compile/Javascript.js +35 -7
- package/coms/compile/Javascript_test.js +1 -0
- package/coms/compile/Program.js +4 -0
- package/coms/compile/common.js +98 -40
- package/coms/compile/downLevel.js +30 -7
- package/coms/compile/downLevel_test.js +62 -10
- package/coms/compile/run-test262.js +19 -9
- package/coms/compile/translate.js +4 -4
- package/coms/compile/unstruct.js +12 -3
- package/coms/compile/unstruct_test.js +3 -1
- package/coms/compile//347/264/240/351/246/250.js +1 -0
- package/coms/compile//347/264/240/351/246/250_test.js +1 -0
- package/coms/zimoli/checker.less +1 -1
- package/coms/zimoli/css.js +9 -2
- package/coms/zimoli/getTypedChildren.js +4 -0
- package/coms/zimoli/input.js +1 -0
- package/coms/zimoli/input.less +5 -1
- package/coms/zimoli/list.js +1 -0
- package/coms/zimoli/menuList.less +1 -0
- package/coms/zimoli/model.js +18 -6
- package/coms/zimoli/model.less +35 -1
- package/coms/zimoli/on.js +3 -3
- package/coms/zimoli/picture.js +3 -0
- package/coms/zimoli/popup.js +1 -1
- package/coms/zimoli/select.js +49 -7
- package/coms/zimoli/select.less +22 -4
- package/coms/zimoli/selectList.js +14 -2
- package/coms/zimoli/view.js +4 -2
- package/coms/zimoli/view.less +1 -2
- package/coms/zimoli/vscroll.js +0 -1
- package/package.json +1 -1
- package/public/efront.js +1 -1
|
@@ -44,7 +44,7 @@ var colonstrap_reg = /^(case|default)$/;
|
|
|
44
44
|
class Javascript extends Program {
|
|
45
45
|
straps = straps;
|
|
46
46
|
value_reg = /^(false|true|null|Infinity|NaN|undefined|eval)$/
|
|
47
|
-
transive_reg = /^(new|var|let|const|yield|void|in|of|typeof|delete|case|return|await|
|
|
47
|
+
transive_reg = /^(new|var|let|const|yield|void|in|of|typeof|delete|case|return|await|instanceof|throw|extends|import|from)$/
|
|
48
48
|
strapexp_reg = /^(new|void|typeof|delete|class|function|await)/;
|
|
49
49
|
forceend_reg = /^(return|yield|break|continue|debugger|async)$/;
|
|
50
50
|
defaultType = EXPRESS;
|
|
@@ -137,7 +137,6 @@ var setStrapExpress = function (mark_type, mark_text, prop, o, default_type) {
|
|
|
137
137
|
if (pp && pp.type === STAMP && pp.text === "*") pp = pp.prev;
|
|
138
138
|
isfunc = pp && pp.type === STRAP && pp.text === 'function';
|
|
139
139
|
if (isfunc) break;
|
|
140
|
-
|
|
141
140
|
q = q.queue;
|
|
142
141
|
}
|
|
143
142
|
if (isfunc) {
|
|
@@ -211,6 +210,16 @@ var fixType = function (o) {
|
|
|
211
210
|
type = EXPRESS;
|
|
212
211
|
}
|
|
213
212
|
}
|
|
213
|
+
else if (m === 'of') {
|
|
214
|
+
if (!last) {
|
|
215
|
+
type = EXPRESS;
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
var qp = queue.prev;
|
|
219
|
+
if (qp?.type === STRAP && qp.text === 'await') qp = qp.prev;
|
|
220
|
+
if (qp?.type === STRAP && qp.text === 'for') type = STRAP;
|
|
221
|
+
else type = EXPRESS;
|
|
222
|
+
}
|
|
214
223
|
break;
|
|
215
224
|
}
|
|
216
225
|
if (type === PROPERTY) o.isprop = true;
|
|
@@ -259,11 +268,10 @@ var setObject = function (o) {
|
|
|
259
268
|
continue;
|
|
260
269
|
}
|
|
261
270
|
m.isprop = true;
|
|
262
|
-
if (m.type === EXPRESS || m.type ===
|
|
271
|
+
if (m.type === EXPRESS || m.type === STRAP) {
|
|
263
272
|
if (!/\./.test(m.text)) m.type = PROPERTY;
|
|
264
273
|
}
|
|
265
274
|
if (m.prev && m.prev.type === PROPERTY) {
|
|
266
|
-
|
|
267
275
|
m.prev.type = STRAP;
|
|
268
276
|
}
|
|
269
277
|
}
|
|
@@ -378,7 +386,11 @@ Javascript.prototype.setType = function (o) {
|
|
|
378
386
|
}
|
|
379
387
|
if (o.type === STRAP) switch (o.text) {
|
|
380
388
|
case "yield": setYieldExpress(o, this.defaultType); break;
|
|
381
|
-
case "await":
|
|
389
|
+
case "await":
|
|
390
|
+
var p = o.prev;
|
|
391
|
+
if (p?.type === STRAP && p.text === 'for') break;
|
|
392
|
+
setAwaitExpress(o, this.defaultType);
|
|
393
|
+
break;
|
|
382
394
|
}
|
|
383
395
|
if (o.type === EXPRESS && last?.type === EXPRESS && !last.isend && /^(async|await|yield)$/.test(last.text)) {
|
|
384
396
|
last.type = STRAP;
|
|
@@ -784,7 +796,7 @@ var removeImport = function (c, i, code) {
|
|
|
784
796
|
else {
|
|
785
797
|
if (!name) name = name1;
|
|
786
798
|
used[name1].forEach(u => {
|
|
787
|
-
|
|
799
|
+
patchname(name, u, ".default");
|
|
788
800
|
});
|
|
789
801
|
}
|
|
790
802
|
}
|
|
@@ -877,6 +889,16 @@ var removeExport = function (c, i, code) {
|
|
|
877
889
|
code.exportDefault = true;
|
|
878
890
|
n.next.isExpress = true;
|
|
879
891
|
c.type = EXPRESS;
|
|
892
|
+
var d = n.next;
|
|
893
|
+
if (d.type === STRAP && /^(class|function|var|let|const)$/.test(d.text)) {
|
|
894
|
+
d = d.next;
|
|
895
|
+
if (d.type === EXPRESS && !/[\.\[]/.test(d.text)) {
|
|
896
|
+
code.used[d.tack].forEach(o => {
|
|
897
|
+
if (d === o) return;
|
|
898
|
+
patchname('', o, "exports.default");
|
|
899
|
+
})
|
|
900
|
+
}
|
|
901
|
+
}
|
|
880
902
|
return;
|
|
881
903
|
}
|
|
882
904
|
var [dec, map, o] = getDeclared(n.next, 'export');
|
|
@@ -961,10 +983,14 @@ Javascript.prototype.newVar = function (used, string_template) {
|
|
|
961
983
|
return name;
|
|
962
984
|
}
|
|
963
985
|
Javascript.prototype.fix = function (code) {
|
|
986
|
+
var hasExport = false;
|
|
964
987
|
backEach(code, function (o, i) {
|
|
965
988
|
if (o.type !== STRAP) return;
|
|
966
989
|
if (o.text === 'import') removeImport.call(this, o, i, code);
|
|
967
|
-
else if (o.text === 'export')
|
|
990
|
+
else if (o.text === 'export') {
|
|
991
|
+
hasExport = true;
|
|
992
|
+
removeExport.call(this, o, i, code);
|
|
993
|
+
}
|
|
968
994
|
}, this);
|
|
969
995
|
if (code.exportStars) {
|
|
970
996
|
var exportStars = code.exportStars;
|
|
@@ -1033,8 +1059,10 @@ Javascript.prototype.fix = function (code) {
|
|
|
1033
1059
|
}
|
|
1034
1060
|
});
|
|
1035
1061
|
}
|
|
1062
|
+
if (hasExport) code.export = true;
|
|
1036
1063
|
relink(code);
|
|
1037
1064
|
setqueue(code);
|
|
1065
|
+
return code;
|
|
1038
1066
|
}
|
|
1039
1067
|
Javascript.prototype.createString = createString;
|
|
1040
1068
|
Javascript.prototype.createScoped = createScoped;
|
|
@@ -7,6 +7,7 @@ var testFix = function (a, e) {
|
|
|
7
7
|
}
|
|
8
8
|
js.debug = true;
|
|
9
9
|
assert(scanner2("/a/g", js)[0].type, common.QUOTED);
|
|
10
|
+
testFix(`export default function a(){} a.a=1`, `exports.default = function a() {} exports.default.a = 1`);
|
|
10
11
|
testFix(`export * from "a";`, 'var a = require("a");\r\nexports.default = undefined\r\nextendIfNeeded(exports, a)');
|
|
11
12
|
testFix(`export {A} from "a";`, 'var a = require("a")\r\nexports.A = a.A;');
|
|
12
13
|
testFix(`import a from "a";console.log(a)`, 'var a = require("a"); console.log(a.default)');
|
package/coms/compile/Program.js
CHANGED
|
@@ -852,6 +852,10 @@ class Program {
|
|
|
852
852
|
else queue.inExpress = scope.isObject = !/^(;|\+\+|\-\-|=>)$/.test(last.text);
|
|
853
853
|
}
|
|
854
854
|
else if (last.type === EXPRESS) a: {
|
|
855
|
+
if (last.text === '...') {
|
|
856
|
+
scope.isObject = true;
|
|
857
|
+
break a;
|
|
858
|
+
}
|
|
855
859
|
var li = queue.length - 1;
|
|
856
860
|
var lp = queue[li];
|
|
857
861
|
while (lp !== last) {
|
package/coms/compile/common.js
CHANGED
|
@@ -32,7 +32,7 @@ var skipAssignment = function (o, cx) {
|
|
|
32
32
|
var ox = cx;
|
|
33
33
|
o = body[ox];
|
|
34
34
|
while (o && o.type & (SPACE | COMMENT)) o = body[++ox];
|
|
35
|
-
cx = ox
|
|
35
|
+
cx = ox;
|
|
36
36
|
}
|
|
37
37
|
else if (o.type & (SPACE | COMMENT)) o = o.next;
|
|
38
38
|
var needpunc = false;
|
|
@@ -558,7 +558,7 @@ var createScoped = function (parsed, wash) {
|
|
|
558
558
|
var function_obj = null;
|
|
559
559
|
if (o.type === STAMP && equal_reg.test(o.text)) {
|
|
560
560
|
var p = snapExpressHead(o.prev);
|
|
561
|
-
if (!p || p.type & (STRAP | STAMP) || !p.isExpress) {
|
|
561
|
+
if (!p || p.type & (STRAP | STAMP) || p.type !== EXPRESS && !p.isExpress) {
|
|
562
562
|
let n = o.next;
|
|
563
563
|
if (n && n.type & (EXPRESS | VALUE)) {
|
|
564
564
|
n.equal = o;
|
|
@@ -586,6 +586,14 @@ var createScoped = function (parsed, wash) {
|
|
|
586
586
|
break;
|
|
587
587
|
case PROPERTY:
|
|
588
588
|
if (!o.short) break;
|
|
589
|
+
switch (o.text) {
|
|
590
|
+
case "yield":
|
|
591
|
+
scoped.yield = false;
|
|
592
|
+
break;
|
|
593
|
+
case "await":
|
|
594
|
+
scoped.await = false;
|
|
595
|
+
break;
|
|
596
|
+
}
|
|
589
597
|
case VALUE:
|
|
590
598
|
if (o.isdigit || /^(null|false|true)$/.test(o.text)) break;
|
|
591
599
|
case EXPRESS:
|
|
@@ -651,7 +659,12 @@ var createScoped = function (parsed, wash) {
|
|
|
651
659
|
funcbody.return.push(o);
|
|
652
660
|
break;
|
|
653
661
|
case "await":
|
|
654
|
-
funcbody.
|
|
662
|
+
funcbody.await = true;
|
|
663
|
+
if (!funcbody.async) saveTo(used, 'await', o);
|
|
664
|
+
break;
|
|
665
|
+
case "yield":
|
|
666
|
+
funcbody.yield = true;
|
|
667
|
+
if (!funcbody.aster) saveTo(used, 'yield', o);
|
|
655
668
|
break;
|
|
656
669
|
case "as":
|
|
657
670
|
case "from":
|
|
@@ -776,7 +789,7 @@ var createScoped = function (parsed, wash) {
|
|
|
776
789
|
lets = vars;
|
|
777
790
|
if (isFunction) {
|
|
778
791
|
vars.this = true, vars.arguments = true;
|
|
779
|
-
scoped.
|
|
792
|
+
scoped.aster = isAster;
|
|
780
793
|
thisscope = scoped;
|
|
781
794
|
argscope = scoped;
|
|
782
795
|
}
|
|
@@ -797,16 +810,16 @@ var createScoped = function (parsed, wash) {
|
|
|
797
810
|
}
|
|
798
811
|
}
|
|
799
812
|
if (isArrow);
|
|
800
|
-
else while (o && o.
|
|
813
|
+
else while (o && (o.type !== SCOPED || o.entry === '[')) {
|
|
801
814
|
o = o.next;
|
|
802
815
|
if (o && o.type === EXPRESS) {
|
|
803
|
-
|
|
816
|
+
var tack = o.text.replace(/[\.\[][\s\S]*$/, '');
|
|
817
|
+
saveTo(used, tack, o);
|
|
804
818
|
if (o.prev && o.prev.type === STRAP && o.prev.text === 'extends') continue;
|
|
805
|
-
lets[
|
|
819
|
+
lets[tack] = true;
|
|
806
820
|
o.kind = isFunction ? 'function' : 'class';
|
|
807
821
|
o = o.next;
|
|
808
822
|
}
|
|
809
|
-
if (isFunction) break;
|
|
810
823
|
}
|
|
811
824
|
if (!isFunction) while (o.type !== SCOPED) {
|
|
812
825
|
// if (o.next && o.next.type === STAMP && o.next.text === "=>") break;
|
|
@@ -959,23 +972,55 @@ var createScoped = function (parsed, wash) {
|
|
|
959
972
|
}
|
|
960
973
|
if (vars.yield) scoped.yield = false;
|
|
961
974
|
if (vars.await) scoped.await = false;
|
|
962
|
-
if (scoped.yield !== false && envs.yield) {
|
|
975
|
+
y: if (scoped.yield !== false && envs.yield) {
|
|
976
|
+
for (var s of scoped) if (s.isfunc && s.envs.yield) break y;
|
|
977
|
+
for (var s of used.yield) if (s.kind || s.isprop || hasEqual(s)) break y;
|
|
963
978
|
used.yield.forEach(o => o.type = STRAP);
|
|
964
979
|
scoped.yield = scoped.aster = true;
|
|
965
980
|
delete envs.yield;
|
|
966
981
|
delete used.yield;
|
|
967
982
|
}
|
|
968
|
-
if (scoped.await !== false && envs.await) {
|
|
983
|
+
a: if (scoped.await !== false && envs.await) {
|
|
984
|
+
for (var s of scoped) if (s.isfunc && s.envs.await) break a;
|
|
985
|
+
for (var s of used.await) if (s.kind || s.isprop || hasEqual(s)) break a;
|
|
969
986
|
used.await.forEach(o => o.type = STRAP);
|
|
970
987
|
scoped.await = scoped.async = true;
|
|
971
988
|
delete envs.await;
|
|
972
989
|
delete used.await;
|
|
973
990
|
}
|
|
991
|
+
if (used.yield) {
|
|
992
|
+
used.yield.forEach(o => { if (o.type === STRAP) o.type = EXPRESS });
|
|
993
|
+
}
|
|
994
|
+
if (used.await) {
|
|
995
|
+
used.await.forEach(o => { if (o.type === STRAP) o.type = EXPRESS });
|
|
996
|
+
}
|
|
974
997
|
delete envs.eval;
|
|
975
998
|
delete envs.new;
|
|
976
999
|
scoped.envs = envs;
|
|
977
1000
|
return scoped;
|
|
978
1001
|
};
|
|
1002
|
+
var hasEqual = function (s) {
|
|
1003
|
+
while (s) {
|
|
1004
|
+
if (s.equal) return true;
|
|
1005
|
+
var sn = s.next;
|
|
1006
|
+
if (sn?.type === STRAP) {
|
|
1007
|
+
if (sn.text === 'of') return true;
|
|
1008
|
+
if (sn.text === "in") {
|
|
1009
|
+
var q = s.queue;
|
|
1010
|
+
if (q.entry === '(') {
|
|
1011
|
+
var qp = q.prev;
|
|
1012
|
+
if (qp.type === STRAP && qp.text === 'await') qp = qp.text;
|
|
1013
|
+
if (qp.type === STRAP && qp.text === 'for') return true;
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
var sp = s.prev;
|
|
1018
|
+
if (sp?.type === STRAP && sp.text === 'as') return true;
|
|
1019
|
+
s = s.queue;
|
|
1020
|
+
}
|
|
1021
|
+
return false;
|
|
1022
|
+
};
|
|
1023
|
+
|
|
979
1024
|
var getDeclared = function (o, kind, queue) {
|
|
980
1025
|
var declared = [], used = Object.create(null); var skiped = [];
|
|
981
1026
|
var prop = null;
|
|
@@ -1007,18 +1052,31 @@ var getDeclared = function (o, kind, queue) {
|
|
|
1007
1052
|
}
|
|
1008
1053
|
switch (o.type) {
|
|
1009
1054
|
case SCOPED:
|
|
1010
|
-
|
|
1055
|
+
var foot = snapExpressFoot(o);
|
|
1056
|
+
if (!prop) prop = declared["..."] ? declared["..."][1] - index : `[${index}]`;
|
|
1057
|
+
if (foot === o) {
|
|
1011
1058
|
var [d, u, _, s] = getDeclared(o.first, kind, o);
|
|
1012
1059
|
while (s.length) skiped.push.apply(skiped, s.splice(0, 1024));
|
|
1013
1060
|
mergeTo(used, u);
|
|
1014
1061
|
if (d.length || d.attributes.length) declared.push(d);
|
|
1015
|
-
if (!prop) prop = declared["..."] ? declared["..."][1] - index : `[${index}]`;
|
|
1016
1062
|
d.entry = o.entry;
|
|
1017
1063
|
o.kind = kind;
|
|
1018
1064
|
attributes.push([prop, d]);
|
|
1019
1065
|
o = o.next;
|
|
1020
1066
|
break;
|
|
1021
1067
|
}
|
|
1068
|
+
else {
|
|
1069
|
+
var s = [];
|
|
1070
|
+
while (foot !== o) {
|
|
1071
|
+
s.push(o);
|
|
1072
|
+
o = o.next;
|
|
1073
|
+
}
|
|
1074
|
+
s.push(foot);
|
|
1075
|
+
skiped.push(...s);
|
|
1076
|
+
o = o.next;
|
|
1077
|
+
attributes.push([prop, s]);
|
|
1078
|
+
break;
|
|
1079
|
+
}
|
|
1022
1080
|
case STAMP:
|
|
1023
1081
|
var next = o.next;
|
|
1024
1082
|
if (o.text === "*" && next) {
|
|
@@ -1044,11 +1102,12 @@ var getDeclared = function (o, kind, queue) {
|
|
|
1044
1102
|
case EXPRESS:
|
|
1045
1103
|
case STRAP:
|
|
1046
1104
|
case VALUE:
|
|
1047
|
-
var isrest = /^\.\.\./.test(o.text);
|
|
1048
1105
|
var n = o;
|
|
1049
1106
|
var k = o.text;
|
|
1050
|
-
|
|
1051
|
-
|
|
1107
|
+
var isrest = /^\.\.\./.test(k);
|
|
1108
|
+
if (isrest) k = k.slice(3);
|
|
1109
|
+
var isdec = !/[\.\[]/.test(k);
|
|
1110
|
+
if (k && isdec) declared.push(k);
|
|
1052
1111
|
if (!isrest) {
|
|
1053
1112
|
var prev = o.prev;
|
|
1054
1113
|
if (prev?.type === STAMP && prev.text === '...') {
|
|
@@ -1078,7 +1137,7 @@ var getDeclared = function (o, kind, queue) {
|
|
|
1078
1137
|
o = f.next;
|
|
1079
1138
|
break;
|
|
1080
1139
|
default:
|
|
1081
|
-
console.log(createString(pickSentence(queue)));
|
|
1140
|
+
console.log(createString(pickSentence(queue)), o.text, o.type);
|
|
1082
1141
|
throw new Error(i18n`代码结构异常`);
|
|
1083
1142
|
}
|
|
1084
1143
|
if (!o) break;
|
|
@@ -1094,7 +1153,7 @@ var getDeclared = function (o, kind, queue) {
|
|
|
1094
1153
|
o.prev.equal = o;
|
|
1095
1154
|
o = o.next;
|
|
1096
1155
|
var o0 = skipAssignment(o);
|
|
1097
|
-
if (isrest) throw i18n
|
|
1156
|
+
if (isrest) throw new Error(i18n`余集变量不能有默认值`);
|
|
1098
1157
|
attributes[attributes.length - 1].push(queue, o, o0);
|
|
1099
1158
|
while (o !== o0) {
|
|
1100
1159
|
skiped.push(o);
|
|
@@ -1274,30 +1333,28 @@ var createString = function (parsed) {
|
|
|
1274
1333
|
// 每一次要远行,我都不得不对自己的物品去粗取精。取舍之间,什么重要,什么不是那么重要,都有了一道明显的分界线。
|
|
1275
1334
|
if (uncomment) break;
|
|
1276
1335
|
var tmp = o.text, opentmp = false;
|
|
1277
|
-
if (
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
if (
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
result.push(tmp);
|
|
1291
|
-
}
|
|
1292
|
-
result.push("/* ]] */");
|
|
1293
|
-
opentmp = true;
|
|
1294
|
-
if (helpcode && cacheresult) finalresult = finalresult.concat(cacheresult), cacheresult = [];
|
|
1295
|
-
result = finalresult;
|
|
1296
|
-
}
|
|
1297
|
-
else if (opentmp) {
|
|
1298
|
-
if (opentmp === 2) tmp = tmp.replace(/\s*\*\/$/, '');
|
|
1299
|
-
if (tmp) result.push("\r\n", tmp);
|
|
1336
|
+
if (helpreg.test(tmp)) {
|
|
1337
|
+
opentmp = true;
|
|
1338
|
+
if (/^\/\*/.test(tmp)) opentmp = 2;
|
|
1339
|
+
tmp = tmp.replace(helpreg, '');
|
|
1340
|
+
cacheresult = [];
|
|
1341
|
+
result = cacheresult;
|
|
1342
|
+
result.push("/* [[ 开发辅助代码: */");
|
|
1343
|
+
}
|
|
1344
|
+
if (/--\!?\>\s*(?:\*\/)?$/.test(tmp) && result !== finalresult) {
|
|
1345
|
+
if (!opentmp) tmp = tmp.replace(/^\/[\/\*]\s*/, '');
|
|
1346
|
+
tmp = tmp.replace(/\s*--\!?\>\s*(?:\*\/)?$/, "");
|
|
1347
|
+
if (tmp) {
|
|
1348
|
+
result.push(tmp);
|
|
1300
1349
|
}
|
|
1350
|
+
result.push("/* ]] */");
|
|
1351
|
+
opentmp = true;
|
|
1352
|
+
if (helpcode && cacheresult) finalresult = finalresult.concat(cacheresult), cacheresult = [];
|
|
1353
|
+
result = finalresult;
|
|
1354
|
+
}
|
|
1355
|
+
else if (opentmp) {
|
|
1356
|
+
if (opentmp === 2) tmp = tmp.replace(/\s*\*\/$/, '');
|
|
1357
|
+
if (tmp) result.push("\r\n", tmp);
|
|
1301
1358
|
}
|
|
1302
1359
|
if (keepspace && !opentmp) {
|
|
1303
1360
|
if (patchspace && lasttype !== SPACE && lasttype !== EXPRESS) result.push(" ");
|
|
@@ -1488,6 +1545,7 @@ var isHalfSentence = function (body, i) {
|
|
|
1488
1545
|
while (a && a.type & (SPACE | COMMENT)) a = body[--i];
|
|
1489
1546
|
if (!a) return false;
|
|
1490
1547
|
if (a.type === STRAP && a.text === 'else') return true;
|
|
1548
|
+
if (a.type === STAMP && (a.unary || !/^(;|\+\+|\-\-)$/.test(a.text))) return true;
|
|
1491
1549
|
if (a.type !== SCOPED || a.entry !== "(") return false;
|
|
1492
1550
|
a = a.prev;
|
|
1493
1551
|
if (!a || a.type !== STRAP) return false;
|
|
@@ -42,6 +42,16 @@ var unslice = function (arr) {
|
|
|
42
42
|
}
|
|
43
43
|
};
|
|
44
44
|
};
|
|
45
|
+
var patchCurve = function (b) {
|
|
46
|
+
if (b.length > 1) {
|
|
47
|
+
var b0 = b[0];
|
|
48
|
+
if (b0.brace) {
|
|
49
|
+
b[0] = scanner2(`()`)[0];
|
|
50
|
+
b[0].push(b0);
|
|
51
|
+
relink(b[0]);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
45
55
|
// 解构赋值
|
|
46
56
|
var killdec = function (queue, i, getobjname, _var = 'var', killobj, islet) {
|
|
47
57
|
var tmpname = '';
|
|
@@ -52,11 +62,11 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj, islet) {
|
|
|
52
62
|
var [k, v] = d;
|
|
53
63
|
var dp = 0;
|
|
54
64
|
if (typeof k === 'number' && k < 0) {
|
|
55
|
-
if (iter) throw i18n
|
|
65
|
+
if (iter) throw new Error(i18n`暂不支持在当前语境读取尾部非剩余元素`);
|
|
56
66
|
dp = 1;
|
|
57
67
|
k = `${tmpname}["length"]>${doged - k - 1}?${tmpname}[${tmpname}["length"] - ${-k}]:undefined`;
|
|
58
68
|
} else {
|
|
59
|
-
if (rootenvs.Symbol && /\[\d+\]/.test(k)) {
|
|
69
|
+
if (rootenvs.Symbol && /\[\d+\]/.test(k) && iter) {
|
|
60
70
|
var inc = parseInt(k.slice(1, k.length - 1));
|
|
61
71
|
inc++;
|
|
62
72
|
while (iter.index < inc) iter.next();
|
|
@@ -235,8 +245,18 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj, islet) {
|
|
|
235
245
|
return single(v, p);
|
|
236
246
|
};
|
|
237
247
|
if (_var && i < queue.length) splice(queue, i++, 0, { type: STRAP, text: _var });
|
|
248
|
+
var i0 = i;
|
|
238
249
|
loop: while (i < queue.length) {
|
|
239
250
|
var o = queue[i];
|
|
251
|
+
if (o.type === STAMP) {
|
|
252
|
+
switch (o.text) {
|
|
253
|
+
case ",":
|
|
254
|
+
i++;
|
|
255
|
+
continue;
|
|
256
|
+
case ";":
|
|
257
|
+
return i;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
240
260
|
var next = snapExpressFoot(o).next;
|
|
241
261
|
tmpname = '';
|
|
242
262
|
var index0 = index;
|
|
@@ -317,6 +337,7 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj, islet) {
|
|
|
317
337
|
var a = single(d, '');
|
|
318
338
|
if (a) {
|
|
319
339
|
if (index > 0) splice(queue, i++, 0, { type: STAMP, text: ',' });
|
|
340
|
+
patchCurve(a[1]);
|
|
320
341
|
var i2 = skipAssignment(queue, i);
|
|
321
342
|
var restq = splice(queue, i, i2 - i, ...a[1], { type: STAMP, text: "=" });
|
|
322
343
|
killobj(restq);
|
|
@@ -341,12 +362,12 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj, islet) {
|
|
|
341
362
|
}
|
|
342
363
|
splice(queue, i = i2, 0, ...q);
|
|
343
364
|
i += q.length;
|
|
344
|
-
index++;
|
|
345
365
|
continue;
|
|
346
366
|
}
|
|
347
367
|
}
|
|
348
368
|
tmpname = getobjname(0);
|
|
349
|
-
splice(queue, i
|
|
369
|
+
if (i > i0) splice(queue, i++, 0, { type: STAMP, text: ',' }, { type: EXPRESS, text: tmpname }, { type: STAMP, text: "=" });
|
|
370
|
+
else splice(queue, i, 0, { type: EXPRESS, text: tmpname }, { type: STAMP, text: "=" });
|
|
350
371
|
i += 2;
|
|
351
372
|
var i2 = skipAssignment(queue, i);
|
|
352
373
|
var n = queue[i2];
|
|
@@ -356,8 +377,10 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj, islet) {
|
|
|
356
377
|
}
|
|
357
378
|
for (var o0 of objs) {
|
|
358
379
|
deep = 0;
|
|
359
|
-
var
|
|
360
|
-
|
|
380
|
+
var dd = getDeclared(o0)[0];
|
|
381
|
+
var d = dd[0];
|
|
382
|
+
if (!d) dog(dd.attributes[0][1]);
|
|
383
|
+
else dog(d);
|
|
361
384
|
}
|
|
362
385
|
if (hasnext && index > index0) {
|
|
363
386
|
splice(queue, i++, 0, { type: STAMP, text: ',' });
|
|
@@ -1322,7 +1345,7 @@ var killarg = function (head, body, _getname, setarg = true) {
|
|
|
1322
1345
|
cname = '';
|
|
1323
1346
|
collect = index + 1;
|
|
1324
1347
|
}
|
|
1325
|
-
else throw i18n
|
|
1348
|
+
else throw new Error(i18n`参数声明异常!`);
|
|
1326
1349
|
if (o && o.type === STAMP) {
|
|
1327
1350
|
if (o.text === ',') {
|
|
1328
1351
|
o = o.next; continue;
|
|
@@ -338,18 +338,45 @@ var _0 };`);
|
|
|
338
338
|
i++//异步或步进函数
|
|
339
339
|
assert(downLevel(`function *(){yield *a}`), `function () { return aster_(
|
|
340
340
|
function () {
|
|
341
|
-
|
|
341
|
+
return [9, 8]
|
|
342
342
|
},
|
|
343
343
|
function () {
|
|
344
|
-
_3 =
|
|
344
|
+
_; _3 = Symbol["asyncIterator"]; _3 = a[_3]; if (_3) return [1, 0]; _3 = Symbol["iterator"]; _3 = a[_3]; if (_3) return [1, 0]; _3 = Array["prototype"]; _4 = Symbol["iterator"]; _3 = _3[_4]
|
|
345
345
|
},
|
|
346
346
|
function () {
|
|
347
|
-
|
|
347
|
+
_1 = _3; _1 = _1["call"](a); _3 = _1["next"](); return [_3, 1]
|
|
348
|
+
},
|
|
349
|
+
function (_2) {
|
|
350
|
+
_3 = _2; _0 = _3; return [1, 0]
|
|
351
|
+
},
|
|
352
|
+
function () {
|
|
353
|
+
_3 = !_0["done"]; if (!_3) return [2, 0]; _3 = _0["value"]; return [_3, 1]
|
|
354
|
+
},
|
|
355
|
+
function (_2) {
|
|
356
|
+
_3 = _2; _ = _3; _3 = true
|
|
357
|
+
},
|
|
358
|
+
function () {
|
|
359
|
+
if (!_3) return [3, 0]; return [_, 3]
|
|
360
|
+
},
|
|
361
|
+
function () {
|
|
362
|
+
_3 = _1["next"](); return [_3, 1]
|
|
363
|
+
},
|
|
364
|
+
function (_2) {
|
|
365
|
+
_3 = _2; _0 = _3; return [-4, 0]
|
|
348
366
|
},
|
|
349
367
|
function () {
|
|
350
|
-
|
|
368
|
+
return [0, 9]
|
|
369
|
+
},
|
|
370
|
+
function () {
|
|
371
|
+
_3 = _0; if (!_3) return [1, 0]; _3 = !_0["done"]; if (!_3) return [1, 0]; _3 = _1["return"]; _3 = isFunction(_3)
|
|
372
|
+
},
|
|
373
|
+
function () {
|
|
374
|
+
if (!_3) return [1, 0]; _3 = _1["return"](); return [1, 0]
|
|
375
|
+
},
|
|
376
|
+
function () {
|
|
377
|
+
return [1, 9]
|
|
351
378
|
})
|
|
352
|
-
var _, _0, _1, _3 }`)
|
|
379
|
+
var _, _0, _1, _3, _4 }`)
|
|
353
380
|
assert(downLevel(`async function(){}`), `function () { return async_() }`)
|
|
354
381
|
assert(downLevel(`async function(){for(var a of b){Symbol}}`), `function () { return async_(
|
|
355
382
|
function () {
|
|
@@ -424,7 +451,6 @@ function (_) {
|
|
|
424
451
|
_0 = _; _0 = _0.a; a = _0
|
|
425
452
|
})
|
|
426
453
|
var a, _0`)
|
|
427
|
-
|
|
428
454
|
assert(downLevel(`async a=>await a`), `function (a) { return return async_(
|
|
429
455
|
function () {
|
|
430
456
|
_0 = a; return [_0, 1]
|
|
@@ -437,10 +463,36 @@ _.set = function (v) {}, _))
|
|
|
437
463
|
var _`);
|
|
438
464
|
assert(downLevel(`var restq = splice(queue, i, i2 - i, ...a[1], { type: STAMP, text: "=" });`), `var slice_ = Array["prototype"]["slice"];
|
|
439
465
|
var restq = splice["apply"](null, [queue, i, i2 - i]["concat"](slice_["call"](a[1]), [{ type: STAMP, text: "=" }]));`)
|
|
440
|
-
var c = scanner2(`\r\n if (search.length) return null;\r\n return path.join(...pathlist);\r\n`);
|
|
441
|
-
c.fix();
|
|
442
|
-
c.break();
|
|
443
|
-
assert(c.toString(), `\r\n if (search["length"]) return null;\r\n return path["join"](...pathlist);\r\n`)
|
|
466
|
+
var c = scanner2(`\r\n if (search.length) return null;\r\n return path.join(...pathlist);\r\n`); i++
|
|
467
|
+
c.fix(); i++
|
|
468
|
+
c.break(); i++
|
|
469
|
+
assert(c.toString(), `\r\n if (search["length"]) return null;\r\n return path["join"](...pathlist);\r\n`);
|
|
444
470
|
assert(downLevel.code(c).toString(), `\r\n if (search["length"]) return null;\r\n return path["join"]["apply"](path, pathlist);\r\n`);
|
|
445
471
|
downLevel.debug = true; i++;
|
|
446
472
|
assert(downLevel(`Symbol;var c = (a.data || (a.data = {})).transition = no(this);`), 'Symbol; var c = (a.data || (a.data = {})).transition = no(this);', true);
|
|
473
|
+
assert(downLevel(`[a.b]=[1]`), 'a.b = [1][0]')
|
|
474
|
+
assert(downLevel(`[a[b]]=[1]`), 'a[b] = [1][0]')
|
|
475
|
+
assert(downLevel(`[(a)[b]]=[1]`), '(a)[b] = [1][0]')
|
|
476
|
+
assert(downLevel(`[[a][b]]=[1]`), '[a][b] = [1][0]')
|
|
477
|
+
assert(downLevel(`[a,{}.b,c]=[1]`), '_ = [1], a = _[0], {}.b = _[1], c = _[2]\r\nvar _')
|
|
478
|
+
assert(downLevel(`[{}.b,c]=[1]`), '_ = [1], {}.b = _[0], c = _[1]\r\nvar _')
|
|
479
|
+
assert(downLevel(`[{}.b]=[1]`), '({}).b = [1][0]')
|
|
480
|
+
assert(downLevel(`[[[a[b]]]]=[1]`), 'a[b] = [1][0][0][0]')
|
|
481
|
+
assert(downLevel(`[[[{}[b]]]]=[1]`), '({})[b] = [1][0][0][0]')
|
|
482
|
+
assert(downLevel(`[...a[b]]=[1]`), 'var slice_ = Array["prototype"]["slice"];\r\n_ = [1], a[b] = slice_["call"](_, 0)\r\nvar _')
|
|
483
|
+
assert(downLevel(`[a,...{length}]=[1]`), 'var slice_ = Array["prototype"]["slice"];\r\n_ = [1], a = _[0], _0 = slice_["call"](_, 1), length = _0.length\r\nvar _, _0')
|
|
484
|
+
assert(downLevel(`[...{length}]=[1]`), `var slice_ = Array["prototype"]["slice"];
|
|
485
|
+
_ = [1], _0 = slice_["call"](_, 0), length = _0.length
|
|
486
|
+
var _, _0`)
|
|
487
|
+
assert(downLevel(`[...{}[a]]=[1]`), `var slice_ = Array["prototype"]["slice"];
|
|
488
|
+
_ = [1], {}[a] = slice_["call"](_, 0)
|
|
489
|
+
var _`)
|
|
490
|
+
assert(downLevel(`,{...{}[a]}=[1]`), `_ = [1], {}[a] = rest_(_, [])
|
|
491
|
+
var _`)
|
|
492
|
+
assert(downLevel(`var res=null,res2=1,{...{}[a]}=[1]`), `var res = null, res2 = 1, _ = [1], {}[a] = rest_(_, [])
|
|
493
|
+
var _`);
|
|
494
|
+
assert(downLevel(`var res=null,{...{}[a]}=[1]`), `var res = null, _ = [1], {}[a] = rest_(_, [])
|
|
495
|
+
var _`)
|
|
496
|
+
assert(downLevel(`,{b,...{}[a]}=[1]`), `_ = [1], b = _.b, {}[a] = rest_(_, ["b"])
|
|
497
|
+
var _`)
|
|
498
|
+
assert(downLevel(`var penddings = {}, circle = [], module_keys = [];`), `var penddings = {}, circle = [], module_keys = [];`)
|
|
@@ -49,6 +49,7 @@ await async function () {
|
|
|
49
49
|
aster_,
|
|
50
50
|
async_,
|
|
51
51
|
asyncAster_,
|
|
52
|
+
extends_,
|
|
52
53
|
isFunction,
|
|
53
54
|
restIter_,
|
|
54
55
|
rest_,
|
|
@@ -59,6 +60,7 @@ await async function () {
|
|
|
59
60
|
var ignore = [
|
|
60
61
|
"dynamic-import",
|
|
61
62
|
"intl402",
|
|
63
|
+
"identifiers",
|
|
62
64
|
"built-ins",
|
|
63
65
|
];
|
|
64
66
|
ignore.forEach(k => ignore[k] = true);
|
|
@@ -94,15 +96,17 @@ await async function () {
|
|
|
94
96
|
* @type {vm.RunningCodeInNewContextOptions}
|
|
95
97
|
*/
|
|
96
98
|
var ctxOptions = {
|
|
99
|
+
timeout: 1000,
|
|
97
100
|
filename: f,
|
|
98
|
-
displayErrors:
|
|
101
|
+
displayErrors: true,
|
|
99
102
|
};
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
if (
|
|
103
|
-
}
|
|
104
|
-
vm.
|
|
105
|
-
|
|
103
|
+
var sandbox = Object.create(null);
|
|
104
|
+
for (var k in code.envs) {
|
|
105
|
+
if (k in harness) sandbox[k] = harness[k];
|
|
106
|
+
}
|
|
107
|
+
var ctx = vm.createContext(sandbox);
|
|
108
|
+
var p = vm.runInContext(text, ctx, ctxOptions);
|
|
109
|
+
await Promise.race([p, wait(1000)]);
|
|
106
110
|
};
|
|
107
111
|
var ti = `${i}/${testFiles.length}`;
|
|
108
112
|
var data = await fs.readFile(f);
|
|
@@ -119,23 +123,29 @@ await async function () {
|
|
|
119
123
|
currentText = text;
|
|
120
124
|
currentIndex = ti;
|
|
121
125
|
if (text) {
|
|
126
|
+
running = true;
|
|
122
127
|
try {
|
|
123
128
|
console.test("执行", ti, f);
|
|
124
129
|
await runText(text);
|
|
125
130
|
} catch (e) { de = e };
|
|
131
|
+
running = false;
|
|
126
132
|
}
|
|
127
133
|
if (de) try {
|
|
134
|
+
running = true;
|
|
128
135
|
try {
|
|
129
136
|
console.test("检查", ti, f);
|
|
130
137
|
await runText(data);
|
|
131
|
-
} catch (e) {
|
|
138
|
+
} catch (e) {
|
|
139
|
+
if (typeof e === typeof de) de = null
|
|
140
|
+
};
|
|
141
|
+
running = false;
|
|
132
142
|
} catch { de = null; }
|
|
133
143
|
if (!text && de) {
|
|
134
144
|
console.log(de)
|
|
135
145
|
console.fail(ti, f);
|
|
136
146
|
throw de;
|
|
137
147
|
}
|
|
138
|
-
console.pass(path.relative(testpath, f));
|
|
148
|
+
console.pass(ti, path.relative(testpath, f));
|
|
139
149
|
}, 1, null);
|
|
140
150
|
console.log(`\r\n完成 ${testFiles.length} 个测试项!`);
|
|
141
151
|
}();
|