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.
Files changed (38) hide show
  1. package/#/345/233/275/351/231/205/345/214/226.yml +15 -0
  2. package/coms/basic/Matrix.js +181 -304
  3. package/coms/basic/mark.js +1 -9
  4. package/coms/basic/parseYML.js +1 -1
  5. package/coms/basic/parseYML_test.js +26 -1
  6. package/coms/basic_/asyncAster_.js +5 -1
  7. package/coms/compile/Javascript.js +35 -7
  8. package/coms/compile/Javascript_test.js +1 -0
  9. package/coms/compile/Program.js +4 -0
  10. package/coms/compile/common.js +98 -40
  11. package/coms/compile/downLevel.js +30 -7
  12. package/coms/compile/downLevel_test.js +62 -10
  13. package/coms/compile/run-test262.js +19 -9
  14. package/coms/compile/translate.js +4 -4
  15. package/coms/compile/unstruct.js +12 -3
  16. package/coms/compile/unstruct_test.js +3 -1
  17. package/coms/compile//347/264/240/351/246/250.js +1 -0
  18. package/coms/compile//347/264/240/351/246/250_test.js +1 -0
  19. package/coms/zimoli/checker.less +1 -1
  20. package/coms/zimoli/css.js +9 -2
  21. package/coms/zimoli/getTypedChildren.js +4 -0
  22. package/coms/zimoli/input.js +1 -0
  23. package/coms/zimoli/input.less +5 -1
  24. package/coms/zimoli/list.js +1 -0
  25. package/coms/zimoli/menuList.less +1 -0
  26. package/coms/zimoli/model.js +18 -6
  27. package/coms/zimoli/model.less +35 -1
  28. package/coms/zimoli/on.js +3 -3
  29. package/coms/zimoli/picture.js +3 -0
  30. package/coms/zimoli/popup.js +1 -1
  31. package/coms/zimoli/select.js +49 -7
  32. package/coms/zimoli/select.less +22 -4
  33. package/coms/zimoli/selectList.js +14 -2
  34. package/coms/zimoli/view.js +4 -2
  35. package/coms/zimoli/view.less +1 -2
  36. package/coms/zimoli/vscroll.js +0 -1
  37. package/package.json +1 -1
  38. 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|default|instanceof|throw|extends|import|from)$/
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 === QUOTED) {
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": setAwaitExpress(o, this.defaultType); break;
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
- compile$patchname(name, u, ".default");
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') removeExport.call(this, o, i, code);
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)');
@@ -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) {
@@ -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 + 1;
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.async = funcbody.await = true;
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.yield = scoped.aster = isAster;
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.isExpress && o.type !== SCOPED) {
813
+ else while (o && (o.type !== SCOPED || o.entry === '[')) {
801
814
  o = o.next;
802
815
  if (o && o.type === EXPRESS) {
803
- saveTo(used, o.text, o);
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[o.text] = true;
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
- if (snapExpressFoot(o) === o) {
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
- if (isrest) declared.push(k = k.slice(3))
1051
- else if (o.text) declared.push(k);
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 (helpcode) {
1278
- if (helpreg.test(tmp)) {
1279
- opentmp = true;
1280
- if (/^\/\*/.test(tmp)) opentmp = 2;
1281
- tmp = tmp.replace(helpreg, '');
1282
- cacheresult = [];
1283
- result = cacheresult;
1284
- result.push("/* [[ 开发辅助代码: */");
1285
- }
1286
- if (/--\!?\>\s*(?:\*\/)?$/.test(tmp) && result !== finalresult) {
1287
- if (!opentmp) tmp = tmp.replace(/^\/[\/\*]\s*/, '');
1288
- tmp = tmp.replace(/\s*--\!?\>\s*(?:\*\/)?$/, "");
1289
- if (tmp) {
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, 0, { type: EXPRESS, text: tmpname }, { type: STAMP, text: "=" });
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 [[d]] = getDeclared(o0);
360
- dog(d);
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
- _; _0 = 0; return [1, 0]
341
+ return [9, 8]
342
342
  },
343
343
  function () {
344
- _3 = _0 < a["length"]; if (!_3) return [1, 0]; _ = a[_0]; _3 = true
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
- if (!_3) return [2, 0]; return [_, 3]
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
- _3 = _0++; return [-2, 0]
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: false,
101
+ displayErrors: true,
99
102
  };
100
- running = true;
101
- if (code.envs.$DONE) harness.$DONE = function (e) {
102
- if (e) console.fail(ti, f + "\r\n"), console.log(currentText), console.trace(e), process.exit();
103
- };
104
- vm.runInThisContext(text, ctxOptions);
105
- running = false;
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) { de = null };
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
  }();