efront 4.0.20 → 4.0.23

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.
@@ -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, rename, isHalfSentence, skipFunction, getDeclared, skipAssignment, skipSentenceQueue, createScoped, createString, splice, relink, snapExpressHead, needBreakBetween } = require("./common");
4
+ var { STAMP, SCOPED, STRAP, EXPRESS, COMMENT, SPACE, PROPERTY, VALUE, LABEL, QUOTED, snapExpressFoot, 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>自</red2>'), from && createString([from]), console.format('\r\n<yellow>至</yellow>'), to && createString([to]), console.format(`\r\n<cyan>码列</cyan>`), createString(q)), '结构异常';
@@ -13,8 +13,37 @@ var insert1 = function (q, r, ...a) {
13
13
  if (r) splice2(q, r, r, ...a);
14
14
  else splice(q, q.length, 0, ...a);
15
15
  };
16
+ var unslice = function (arr) {
17
+ var rest = [arr];
18
+ while (rest.length) {
19
+ arr = rest.pop();
20
+ for (var cx = arr.length - 1; cx >= 0; cx--) {
21
+ var o = arr[cx];
22
+ if (o.type === SCOPED) {
23
+ if (o.entry !== "[") {
24
+ if (o.isObject) rest.push(o);
25
+ continue;
26
+ }
27
+ var n = o.next;
28
+ if (n && (n.type !== STAMP || n.text !== ',')) {
29
+ rest.push(o);
30
+ continue;
31
+ }
32
+ var p = o.prev;
33
+ if (p && p.type === EXPRESS && p.text === '...') {
34
+ var px = arr.lastIndexOf(p, cx);
35
+ splice(arr, px, cx - px + 1, ...o);
36
+ cx += o.length - 1;
37
+ }
38
+ else {
39
+ rest.push(o);
40
+ }
41
+ }
42
+ }
43
+ };
44
+ };
16
45
  // 解构赋值
17
- var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
46
+ var killdec = function (queue, i, getobjname, _var = 'var', killobj, islet) {
18
47
  var tmpname = '';
19
48
  var index = 0;
20
49
  var deep = 0;
@@ -23,10 +52,17 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
23
52
  var [k, v] = d;
24
53
  var dp = 0;
25
54
  if (typeof k === 'number' && k < 0) {
55
+ if (iter) throw "暂不支持在当前语境读取尾部非剩余元素";
26
56
  dp = 1;
27
57
  k = `${tmpname}["length"]>${doged - k - 1}?${tmpname}[${tmpname}["length"] - ${-k}]:undefined`;
28
58
  } else {
29
- k = tmpname + k;
59
+ if (rootenvs.Symbol && /\[\d+\]/.test(k)) {
60
+ var inc = parseInt(k.slice(1, k.length - 1));
61
+ inc++;
62
+ while (iter.index < inc) iter.next();
63
+ k = iter.tname + `["value"]`;
64
+ }
65
+ else k = tmpname + k;
30
66
  }
31
67
  if (v.attributes) {
32
68
  tmpname = k;
@@ -34,28 +70,25 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
34
70
  if (dp) {
35
71
  deep += dp;
36
72
  var n = getobjname(deep);
37
- write(n, k);
73
+ write([{ text: n, type: EXPRESS, istmp: true }], k);
38
74
  k = tmpname = n;
39
75
  }
40
76
  dog(v);
41
77
  deep -= dp;
42
78
  }
43
79
  else {
44
- deep++;
45
80
  var n = getobjname(deep);
46
- write(n, `${tmpname}!==undefined?${tmpname}:`);
81
+ write([{ text: n, type: EXPRESS, istmp: true }], `${tmpname},${n}=${n}!==undefined?${n}:`);
47
82
  var skiped = splice2(d[2], d[3], d[4]);
48
83
  killobj(skiped);
49
84
  splice(queue, i, 0, ...skiped);
50
85
  i += skiped.length;
51
86
  k = tmpname = n;
52
87
  dog(v);
53
- deep--;
54
88
  }
55
89
  if (tmpname === k) tmpname = previx;
56
90
  return;
57
91
  }
58
-
59
92
  if (!tmpname) {
60
93
  write(v, null, x < total - 1);
61
94
  }
@@ -63,7 +96,11 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
63
96
  write(v, k, x < total - 1);
64
97
  }
65
98
  else {
66
- write(v, `${k}!==undefined?${k}:`, x < total - 1);
99
+ var objname = getobjname(deep);
100
+ var tmpv = scanner2(`${index++ > 0 ? ',' : ''}${objname}=${k}`)
101
+ splice(queue, i, 0, ...tmpv);
102
+ i += tmpv.length;
103
+ write(v, `${objname}!==undefined?${objname}:`, x < total - 1);
67
104
  var skiped = splice2(d[2], d[3], d[4]);
68
105
  killobj(skiped);
69
106
  splice(queue, i, 0, ...skiped);
@@ -72,25 +109,72 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
72
109
  index++;
73
110
  };
74
111
  var doged, total;
75
- var write = function (name, value, hasnext) {
76
- if (name === tmpname && hasnext) {
112
+ var write = function (sname, value, hasnext) {
113
+ if (value && (sname.length === 1 && sname[0].text === tmpname) && hasnext) {
77
114
  tmpname = getobjname(deep++);
78
- if (index > 0) queue.splice(i++, 0, { type: STAMP, text: ',' });
79
- var q = scanner2(`${tmpname}=${name}`);
80
- queue.splice(i, 0, ...q);
115
+ if (index > 0) splice(queue, i++, 0, { type: STAMP, text: ',' });
116
+ var q = scanner2(`${tmpname}=${sname[0].text}`);
117
+ splice(queue, i, 0, ...q);
81
118
  i += q.length;
82
119
  index++;
83
120
  }
84
- if (index > 0) queue.splice(i++, 0, { type: STAMP, text: ',' });
85
- queue.splice(i++, 0, { type: EXPRESS, text: name });
121
+ if (index > 0) splice(queue, i++, 0, { type: STAMP, text: ',' });
122
+ if (sname[0].type === SCOPED && snapExpressFoot(sname[0]) === sname[0]) {
123
+ var [[d]] = getDeclared(sname[0]);
124
+ if (sname[0].entry === '{') {
125
+ sname = scanner2(tmpname = getobjname(deep));
126
+ }
127
+ }
128
+ splice(queue, i, 0, ...sname);
129
+ i += sname.length;
130
+ if (!value && islet) {
131
+ value = "undefined";
132
+ }
86
133
  if (value) {
87
134
  var q = scanner2("=" + value);
88
- queue.splice(i, 0, ...q);
135
+ splice(queue, i, 0, ...q);
89
136
  i += q.length;
90
137
  }
91
138
  index++;
139
+ if (d) dog(d);
92
140
  };
93
141
  var dog = function (d) {
142
+ var deepback = deep++;
143
+ var iterbackup = iter;
144
+ dog_(d);
145
+ if (iter && !iter.done) iter.return();
146
+ iter = iterbackup;
147
+ deep = deepback;
148
+ }
149
+ var iter = null;
150
+ var Iter = class {
151
+ index = 0;
152
+ iname = getobjname(deep++);
153
+ tname = getobjname(deep);
154
+ init() {
155
+ var init = scanner2(`${index++ > 0 ? ',' : ''}${this.iname}=(${tmpname}[Symbol["iterator"]]||Array["prototype"][Symbol["iterator"]])["call"](${tmpname}),${this.tname}=undefined`);
156
+ splice(queue, i, 0, ...init);
157
+ i += init.length;
158
+ }
159
+ return() {
160
+ var retn = scanner2(`${index++ > 0 ? "," : ''}${this.tname}=(!${this.tname}||!${this.tname}["done"])&& isFunction(${this.iname}["return"])&&${this.iname}["return"]()`);
161
+ rootenvs.isFunction = true;
162
+ splice(queue, i, 0, ...retn);
163
+ i += retn.length;
164
+ }
165
+ next() {
166
+ var inext = scanner2(`${index++ > 0 ? "," : ""}${this.tname}=${this.iname}["next"]()`);
167
+ splice(queue, i, 0, ...inext);
168
+ i += inext.length;
169
+ this.index++;
170
+ }
171
+ }
172
+ var dog_ = function (d) {
173
+ if (!d) return;
174
+ if (rootenvs.Symbol && d.entry === '[') {
175
+ iter = new Iter;
176
+ iter.init();
177
+ };
94
178
  var _d = doged, _t = total;
95
179
  total = d.attributes.length;
96
180
  var at = total;
@@ -103,6 +187,8 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
103
187
  var head = d.attributes.slice(0, at);
104
188
  for (var r of rest) if (r[1] === name) return d.attributes.forEach(dec);
105
189
  var [name, at, a] = d["..."];
190
+ if (name[0].text === "...") name.shift();
191
+ else name[0].text = name[0].text.replace(/^\.\.\./, '');
106
192
  var dp = 0;
107
193
  if (d.entry === '{') {
108
194
  var map = Object.create(null);
@@ -128,8 +214,12 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
128
214
  else {
129
215
  doged = at + 1;
130
216
  head.forEach(dec);
131
- write(name, `slice_["call"](${tmpname},${at}${a > at ? `,${at - a}` : ''})`, rest.length > 0), rootenvs.slice_ = true;
132
- doged = at + 1;
217
+ if (iter) {
218
+ while (iter.index < a) iter.next();
219
+ iter.done = true;
220
+ write(name, `restIter_(${tmpname})`);
221
+ }
222
+ else write(name, `slice_["call"](${tmpname},${at}${a > at ? `,${at - a}` : ''})`, rest.length > 0), rootenvs.slice_ = true;
133
223
  total = rest.length;
134
224
  rest.forEach(dec);
135
225
  }
@@ -137,27 +227,39 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
137
227
  total = _t;
138
228
  };
139
229
  var single = function (d, p) {
140
- if (d.attributes.length !== 1 || d["..."]) return;
141
- var [k, v] = d.attributes[0];
230
+ if (!d || d.attributes.length !== 1 || d["..."]) return;
231
+ var [k, v, q, f1, f2] = d.attributes[0];
232
+ if (rootenvs.Symbol && /^\[\d+\]$/.test(k)) return;
142
233
  p += k;
143
- if (!v.attributes) return [p, v];
234
+ if (!v.attributes) return [p, v, q, f1, f2];
144
235
  return single(v, p);
145
236
  };
146
- if (_var && i < queue.length) queue.splice(i++, 0, { type: STRAP, text: _var });
237
+ if (_var && i < queue.length) splice(queue, i++, 0, { type: STRAP, text: _var });
147
238
  loop: while (i < queue.length) {
148
239
  var o = queue[i];
149
- var next = o.next;
240
+ var next = snapExpressFoot(o).next;
150
241
  tmpname = '';
242
+ var index0 = index;
243
+ var hasnext = false;
151
244
  if (!next || next.type !== STAMP || next.text !== '=') {
152
245
  // 只声明不赋值的语句
153
- var hasnext = next && next.type === STAMP && next.text === ',';
246
+ hasnext = next && next.type === STAMP && next.text === ',';
154
247
  if (hasnext) next = next.next;
155
248
  var n = indexof(queue, next, i);
249
+ if (islet && o.type === EXPRESS) {
250
+ if (!next || next.type !== STRAP || !/^(in|of)$/.test(next.text)) splice(queue, i + 1, 0, ...scanner2('=undefined'));
251
+ n += 2;
252
+ }
156
253
  if (o.type === SCOPED) {
157
- var [o0] = queue.splice(i, n - i);
158
- var [[d]] = getDeclared(o0);
254
+ var prev = o.prev;
255
+ if (prev && prev.type === STAMP && prev.text === ',') i = queue.lastIndexOf(prev, i), index = 1;
256
+ else index = 0;
257
+ splice(queue, i, n - i);
258
+ unslice(o);
259
+ var [[d]] = getDeclared(o);
159
260
  dog(d);
160
261
  n = i = indexof(queue, next, i);
262
+ if (hasnext && index0 < index) splice(queue, i, 0, { type: STAMP, text: ',' }), i++, n++;
161
263
  if (hasnext) continue loop;
162
264
  }
163
265
  else if (hasnext) {
@@ -170,22 +272,24 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
170
272
  }
171
273
  var objs = [];
172
274
  do {
173
- var next = o.next;
275
+ var next = snapExpressFoot(o).next;
276
+ hasnext = next && next.type === STAMP && next.text === ',';
174
277
  if (!next || next.type !== STAMP || next.text !== "=") {
175
278
  // 赋值结束
176
279
  if (tmpname) {
177
280
  var n = skipAssignment(queue, i);
178
281
  o = queue[n];
179
- var skiped = queue.splice(i, n - i);
282
+ var skiped = splice(queue, i, n - i);
180
283
  killobj(skiped);
181
- queue.splice(i, 0, ...skiped);
284
+ splice(queue, i, 0, ...skiped);
182
285
  i += skiped.length;
183
286
  break;
184
287
  }
185
288
  if (!next || next.type === STAMP && /^[,;]$/.test(next.text)) {
186
- if (o.type === EXPRESS && !/\./.test(o.text)) {
289
+ if (o.type === EXPRESS && !/[\.\[]/.test(o.text) && snapExpressFoot(o) === o) {
187
290
  tmpname = o.text;
188
- queue.splice(i, indexof(queue, o = next, i) - i);
291
+ if (hasnext) next = next.next;
292
+ splice(queue, i, indexof(queue, o = next, i) - i);
189
293
  i = indexof(queue, o, i);
190
294
  }
191
295
  }
@@ -193,12 +297,16 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
193
297
  }
194
298
  if (o.type === SCOPED) {
195
299
  var n = indexof(queue, next.next, i);
196
- var [o0] = queue.splice(i, n - i);
197
- delete o0.next;
198
- if (o0.length && getDeclared(o0).length > 0) objs.push(o0);
300
+ var prev = o.prev;
301
+ if (prev && prev.type === STAMP && prev.text === ',') i = queue.lastIndexOf(prev, i), index = 1;
302
+ else index = 0;
303
+ splice(queue, i, n - i);
304
+ unslice(o);
305
+ delete o.next;
306
+ if (o.length && getDeclared(o).length > 0) objs.push(o);
199
307
  }
200
- else if (o.type === EXPRESS && !/\.\[/.test(o.text)) {
201
- if (!tmpname) tmpname = o.text, index++;
308
+ else if (o.type === EXPRESS && !/[\.\[]/.test(o.text) && snapExpressFoot(o) === o) {
309
+ if (!tmpname) tmpname = o.text;
202
310
  }
203
311
  o = next.next;
204
312
  i = indexof(queue, o, i);
@@ -208,18 +316,26 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
208
316
  var [[d]] = getDeclared(objs[0]);
209
317
  var a = single(d, '');
210
318
  if (a) {
211
- splice(queue, i, 0, { type: EXPRESS, text: a[1] }, { type: STAMP, text: "=" });
319
+ if (index > 0) splice(queue, i++, 0, { type: STAMP, text: ',' });
320
+ splice(queue, i, 0, ...a[1], { type: STAMP, text: "=" });
212
321
  i += 2;
213
322
  var i2 = skipAssignment(queue, i);
214
- killobj(queue.slice(i, i = i2));
215
- var q = scanner2(a[0])
216
- queue.splice(i, 0, ...q);
323
+ killobj(queue.slice(i, i2));
324
+ if (!a[2]) var q = scanner2(a[0]);
325
+ else {
326
+ var objname = getobjname(0);
327
+ q = scanner2(`(${objname} =)`);
328
+ q[0].push(...splice(queue, i, i2));
329
+ q[0].push(...scanner2(`${a[0]},${objname}!== undefined ? ${objname}: `), ...splice2(a[2], a[3], a[4]));
330
+ i2 = i;
331
+ }
332
+ splice(queue, i = i2, 0, ...q);
217
333
  i += q.length;
218
334
  index++;
219
335
  continue;
220
336
  }
221
337
  }
222
- tmpname = getobjname();
338
+ tmpname = getobjname(0);
223
339
  splice(queue, i, 0, { type: EXPRESS, text: tmpname }, { type: STAMP, text: "=" });
224
340
  i += 2;
225
341
  var i2 = skipAssignment(queue, i);
@@ -227,11 +343,16 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
227
343
  index++;
228
344
  }
229
345
  for (var o0 of objs) {
346
+ deep = 0;
230
347
  var [[d]] = getDeclared(o0);
231
348
  dog(d);
232
349
  }
350
+ if (hasnext && index > index0) {
351
+ splice(queue, i++, 0, { type: STAMP, text: ',' });
352
+ }
353
+ index = 0;
233
354
  }
234
- relink(queue);
355
+ // relink(queue);
235
356
  return i;
236
357
  };
237
358
  // 键值对重组
@@ -303,7 +424,7 @@ var killmap = function (body, i, _getobjname, killobj) {
303
424
  var next = o.next;
304
425
  var l = 1;
305
426
  var initq = function () {
306
- q = scanner2(`(${_getobjname()}=)`)[0];
427
+ q = scanner2(`(${_getobjname()} =)`)[0];
307
428
  var qo = splice(body, i, l, q);
308
429
  insert1(q, null, ...qo);
309
430
  insert1(q, null, { type: STAMP, text: ',' });
@@ -328,7 +449,7 @@ var killmap = function (body, i, _getobjname, killobj) {
328
449
  if (!t) {
329
450
  t = scanner2(`extend()`);
330
451
  rootenvs.extend = true;
331
- var [o0] = body.splice(i, 1, ...t);
452
+ var [o0] = splice(body, i, 1, ...t);
332
453
  t[1].push(o0);
333
454
  l = 2;
334
455
  }
@@ -408,8 +529,11 @@ var getprop = function (o, m) {
408
529
  }
409
530
  else m = skipAssignment(m);
410
531
  if (m && !m.isprop) m = m.next;
411
- if (!prop.short) prop.value = splice2(o, s, m);
412
- else if (s) splice2(o, s, m);
532
+ if (s) {
533
+ if (!prop.short) prop.value = splice2(o, s, m);
534
+ else splice2(o, s, m);
535
+ }
536
+ else if (!prop.value) prop.value = [];
413
537
  return [prop, m];
414
538
  };
415
539
  var setprop = function (prop, k, d, q) {
@@ -449,6 +573,7 @@ var killcls = function (body, i, getname_) {
449
573
  var ishalf = isHalfSentence(body, i - 1);
450
574
  var start = o;
451
575
  var decName = !o.isExpress && o.next.type === EXPRESS && o.next.text;
576
+ var isExpress = o.isExpress;
452
577
  while (o) {
453
578
  o = o.next;
454
579
  if (!o) break;
@@ -519,7 +644,9 @@ var killcls = function (body, i, getname_) {
519
644
  }
520
645
  relink(o);
521
646
  if (invokes.length) insert1(invokes, null, { type: STAMP, text: ',' });
522
- insert1(invokes, null, ...scanner2('function ' + name));
647
+ var fname = scanner2('function ' + name);
648
+ if (isExpress) fname[0].isExpress = true;
649
+ insert1(invokes, null, ...fname);
523
650
  if (base) {
524
651
  constructor[1].push(...scanner2('return this'))
525
652
  relink(constructor[1]);
@@ -569,7 +696,7 @@ var killcls = function (body, i, getname_) {
569
696
  var s = i;
570
697
  i = body.indexOf(o, i);
571
698
  if (i < 0) i = body.length;
572
- if (head.length > 1 || start.isExpress || ishalf && defines.length) {
699
+ if (head.length > 1 || start.isExpress && (defines.length) || ishalf && defines.length) {
573
700
  splice(defines, defines.length, 0, ...scanner2(`\r\nreturn ${clz.name}`))
574
701
  if (decName) splice(func, 0, 0, ...scanner2(`var ${decName}=`));
575
702
  splice(body, s, i - s, ...func);
@@ -588,7 +715,7 @@ var indexof = function (list, o, i) {
588
715
  i = list.indexOf(o, i);
589
716
  if (i < 0) i = list.length;
590
717
  }
591
- else i++;
718
+ else i = list.length;
592
719
  return i;
593
720
  };
594
721
  // 数组或参数展开
@@ -596,7 +723,9 @@ var killspr = function (body, i, _getobjname, killobj) {
596
723
  var o = body[i];
597
724
  var m = o.first;
598
725
  if (!m) return i + 1;
726
+ unslice(o);
599
727
  killobj(o);
728
+ m = o.first;
600
729
  var index = 0;
601
730
  var spr = function () {
602
731
  var s = m;
@@ -745,27 +874,30 @@ var killobj = function (body, getobjname, getletname, getname_, letname_, deep =
745
874
  break;
746
875
  case "yield":
747
876
  var o = o.next;
748
- if (o.type === STAMP && o.text === '*') {
877
+ if (o && o.type === STAMP && o.text === '*') {
749
878
  i++;
750
879
  var n = body.indexOf(o, i) + 1;
751
880
  o = o.next;
752
881
  splice(body, i, n - i);
753
882
  n = skipAssignment(body, i - 1);
754
883
  var name = getname_("_");
755
- var y = scanner2(`for(var ${name} of) yield ${name};`);
756
- y[2].type = STRAP;
757
- splice(y[1], y[1].length, 0, ...splice(body, i, n - i));
758
- unforof(y[0], getname_.bind(null, '_'), y.used);
884
+ var y = scanner2(`for await(var ${name} of)yield ${name}`, innerJs);
885
+ splice(y[2], y[2].length, 0, ...splice(body, i, n - i));
886
+ splice.debug = true;
759
887
  splice(body, i - 1, 1, ...y);
888
+ splice.debug = false;
889
+ innerJs.setType(y[1]);
890
+ if (y[1].type === EXPRESS) splice(body, i, 1);
891
+ unforof(y[0], getname_.bind(null, '_'), y.used, deepkill);
760
892
  }
761
893
  i++;
762
894
  break;
763
895
  case "let":
764
- case "const":
765
896
  islet = body.keeplet !== false;
897
+ case "const":
766
898
  case "var":
767
899
  splice(body, i, 1);
768
- i = killdec(body, i, getletname, 'var', deepkill, islet);
900
+ i = killdec(body, i, _getdeepname, 'var', deepkill, islet);
769
901
  break;
770
902
  case "catch":
771
903
  var n = o.next;
@@ -794,7 +926,7 @@ var killobj = function (body, getobjname, getletname, getname_, letname_, deep =
794
926
  if (i < 0) i = body.length;
795
927
  break;
796
928
  case "async":
797
- body.splice(i, 1);
929
+ splice(body, i, 1);
798
930
  break;
799
931
  default:
800
932
  i++;
@@ -914,6 +1046,12 @@ var ises3 = function (o, killobj) {
914
1046
  }
915
1047
  return true;
916
1048
  }
1049
+ var getexplist = function (f, m) {
1050
+ var explist = [];
1051
+ while (f !== m) explist.push(f), f = f.next;
1052
+ explist.push(m);
1053
+ return explist;
1054
+ }
917
1055
  var unforin = function (o, getnewname_, killobj) {
918
1056
  // 仅处理有 await 或 yield 的代码
919
1057
  var m = o.first;
@@ -922,6 +1060,8 @@ var unforin = function (o, getnewname_, killobj) {
922
1060
  m = m.next;
923
1061
  hasdeclare = true;
924
1062
  }
1063
+ var f = m;
1064
+ m = snapExpressFoot(m);
925
1065
  var n = m.next;
926
1066
  if (n.type !== STRAP || n.text !== 'in') {
927
1067
  return false;
@@ -945,15 +1085,18 @@ var unforin = function (o, getnewname_, killobj) {
945
1085
  var s = scanner2(`${sname}=`);
946
1086
  insert1(s, null, ...splice2(o, n));
947
1087
  insert1(s, null,
948
- ...scanner2(`,${tname}=[];for(${hasdeclare ? 'var ' : ''}${m.text} in ${sname})${tname}.push(${m.text});`)
1088
+ ...scanner2(`,${tname}=[];for(${hasdeclare ? 'var ' : ''}${hasdeclare ? f.text : kname} in ${sname})${tname}.push(${hasdeclare ? f.text : kname});`)
949
1089
  );
950
1090
  insert1(o.queue, o.prev, ...s);
951
- splice(o, 0, o.length, ...scanner2(`${kname}=0;${kname}<${tname}.length&&`));
952
- var c = scanner2(`(${m.text}=${tname}[${kname}],true);${kname}++`);
1091
+ splice(o, 0, o.length, ...scanner2(`${kname}=0;${kname}<${tname}["length"]&&`));
1092
+ var c = scanner2(`(=${tname}[${kname}],true);${kname}++`);
1093
+ splice(c[0], 0, 0, ...getexplist(f, m));
953
1094
  insert1(o, null, ...c);
954
1095
  };
955
-
956
- var unforof = function (o, getnewname, used) {
1096
+ var Javascript = require("./Javascript");
1097
+ var innerJs = new Javascript;
1098
+ innerJs.defaultType = STRAP;
1099
+ var unforof = function (o, getnewname, used, killobj) {
957
1100
  var hasawait = false;
958
1101
  var r = o;
959
1102
  o = o.next;
@@ -968,15 +1111,18 @@ var unforof = function (o, getnewname, used) {
968
1111
  m = m.next;
969
1112
  hasdeclare = true;
970
1113
  }
1114
+ var m0 = m;
1115
+ m = snapExpressFoot(m);
971
1116
  var n = m.next;
972
1117
  if (n.type !== STRAP || n.text !== 'of') {
973
1118
  return o.next;
974
1119
  }
975
1120
  var f = n.next;
976
- var p = splice2(o, m, m = n)[0];
1121
+ var p = splice2(o, m0, m = n);
977
1122
  if (hasdeclare) {
978
- var [d] = getDeclared(p);
1123
+ var [d] = getDeclared(m0);
979
1124
  if (d.length) insert1(o, m, ...scanner2(d.join(",") + ","));
1125
+ else splice(o, o.first, m0);
980
1126
  }
981
1127
  var iname = getnewname();
982
1128
  var gname = getnewname();
@@ -995,16 +1141,32 @@ var unforof = function (o, getnewname, used) {
995
1141
  splice(o, o.length, 0, ...mo);
996
1142
  splice(o, o.length, 0, { type: STAMP, text: ',' });
997
1143
  }
998
- if (useSimpleLoop) splice(o, o.length, 0, ...scanner2(`${iname}=0;${iname}<${oname}["length"]&&(${createString([p])}=${oname}[${iname}],true);${iname}++`));
1144
+ var pnames = [];
1145
+ var getpname = function (i) {
1146
+ var n = pnames[i];
1147
+ if (!n) n = pnames[i] = getnewname();
1148
+ return n;
1149
+ }
1150
+ if (useSimpleLoop) {
1151
+ splice(o, o.length, 0, ...scanner2(`${iname}=0;${iname}<${oname}["length"]&&(,true);${iname}++`));
1152
+ splice(p, p.length, 0, ...scanner2(`=${oname}[${iname}]`));
1153
+ killdec(p, 0, getpname, null, killobj);
1154
+ if (p.length) splice(o[o.length - 4], 0, 0, ...p);
1155
+ else splice(o[o.length - 4], 0, 1);
1156
+ }
999
1157
  else {
1000
- rootenvs.Symbol = true, splice(o, o.length, 0, ...scanner2(`${gname}=${hasawait ? `${oname}[Symbol["asyncIterator"]]||${oname}[Symbol["iterator"]]` : `${oname}[Symbol["iterator"]]`}||Array["prototype"][Symbol["iterator"]],${gname}=${gname}["call"](${oname}),${iname}=${hasawait ? "await " : ''}${gname}["next"]();!${iname}["done"]&&(${createString([p])}=${iname}["value"],true);${iname}=${hasawait ? 'await ' : ''}${gname}["next"]()`));
1158
+ rootenvs.Symbol = true;
1159
+ splice(o, o.length, 0, ...scanner2(`${gname}=${hasawait ? `${oname}[Symbol["asyncIterator"]]||${oname}[Symbol["iterator"]]` : `${oname}[Symbol["iterator"]]`}||Array["prototype"][Symbol["iterator"]],${gname}=${gname}["call"](${oname}),${iname}=${hasawait ? "await " : ''}${gname}["next"]();!${iname}["done"]&&(,true);${iname}=${hasawait ? 'await ' : ''}${gname}["next"]()`, innerJs));
1160
+ splice(p, p.length, 0, ...scanner2(`=${hasawait ? 'await ' : ''}${iname}["value"]`, innerJs));
1161
+ killdec(p, 0, getpname, null, killobj);
1162
+ if (p.length) splice(o[o.length - 7 - hasawait], 0, 0, ...p);
1163
+ else splice(o[o.length - 7 - hasawait], 0, 1);
1001
1164
  var n = o.next;
1002
1165
  n = skipSentenceQueue(n);
1003
1166
  var tf = scanner2(`try{}finally{if(${iname}&&!${iname}["done"]&&isFunction(${gname}["return"]))${gname}["return"]()}`);
1004
1167
  splice(tf[1], 0, 0, ...splice2(r.queue, r, n, ...tf));
1005
1168
  rootenvs.isFunction = true;
1006
1169
  }
1007
- relink(o);
1008
1170
  };
1009
1171
  var unarrow = function (body, i, killobj, letname_) {
1010
1172
  var o = body[i];
@@ -1013,13 +1175,13 @@ var unarrow = function (body, i, killobj, letname_) {
1013
1175
  var b = n, h = p;
1014
1176
  var pi = body.lastIndexOf(p, i);
1015
1177
  if (pi < 0) pi = 0;
1016
- body.splice(i, 1);
1017
- body.splice(pi, 0, { type: STRAP, text: 'function' });
1178
+ splice(body, i, 1);
1179
+ splice(body, pi, 0, { type: STRAP, text: 'function' });
1018
1180
  var ni = body.indexOf(n, i);
1019
1181
  if (ni < 0) ni = body.length;
1020
1182
  if (p && p.type !== SCOPED || p.entry !== "(") {
1021
1183
  h = scanner2("()")[0];
1022
- h.splice(0, 0, ...body.splice(i, 1, h));
1184
+ splice(h, 0, 0, ...splice(body, i, 1, h));
1023
1185
  }
1024
1186
  if (n.type !== SCOPED || n.entry !== "{") {
1025
1187
  var nni = skipAssignment(body, ni);
@@ -1056,20 +1218,22 @@ var killarg = function (head, body, _getname, setarg = true) {
1056
1218
  if (/^var\s/.test(argcodes[argcodes.length - 1])) argcodes[argcodes.length - 1] += ',' + dec;
1057
1219
  else argcodes.push(`var ` + dec);
1058
1220
  }
1059
- else if (o.type === EXPRESS || o.type === VALUE) {
1221
+ else if (o.type & (EXPRESS | VALUE)) {
1060
1222
  aname = o.text;
1061
1223
  if (/^\.\.\./.test(aname)) {
1062
1224
  cname = aname.replace(/^\.\.\./, '');
1063
1225
  splice2(head, o.prev ? o.prev : o, o = o.next);
1064
1226
  collect = index + 1;
1065
- continue;
1066
1227
  }
1067
- o = o.next;
1068
- if (collect) {
1069
- anames.push(aname);
1228
+ else {
1229
+ o = o.next;
1230
+ if (collect) {
1231
+ anames.push(aname);
1232
+ }
1233
+ index++;
1070
1234
  }
1071
- index++;
1072
1235
  }
1236
+ else throw "参数声明异常!"
1073
1237
  if (o && o.type === STAMP) {
1074
1238
  if (o.text === ',') {
1075
1239
  o = o.next; continue;
@@ -1112,37 +1276,39 @@ var killarg = function (head, body, _getname, setarg = true) {
1112
1276
  }
1113
1277
  return [namemap, argcodes];
1114
1278
  };
1115
- var revar = function (scoped) {
1116
- if (!scoped.body) return;
1117
- var killed = [];
1118
- var rm = function (o, i) {
1119
- if (o.type === STRAP && /^(const|let|var)$/.test(o.text)) {
1120
- var q = o.queue;
1121
- if (!q) return;
1122
- var n = o;
1123
- var s = i, v = o;
1124
- if (o.next) do {
1125
- o = n.next;
1126
- n = o.next;
1127
- if (n && n.type === STRAP && n.text === 'in') break;
1128
- if (n && n.text === '=') {
1129
- n = skipAssignment(n);
1130
- }
1131
- else {
1132
- i = q.indexOf(o.prev, i);
1133
- var j = n ? q.indexOf(n, i) : q.length;
1134
- q.splice(i, j - i);
1135
- }
1136
- } while (n && n.type === STAMP && n.text === ',');
1137
- if (q[s] === v) q.splice(s, 1);
1138
- if (killed.indexOf(q) < 0) killed.push(q);
1279
+ var revar = function (body) {
1280
+ for (var i = 0; i < body.length; i++) {
1281
+ var o = body[i];
1282
+ if (o.type === STRAP) {
1283
+ if (/^(const|let|var)$/.test(o.text)) {
1284
+ var q = body;
1285
+ if (!q) return;
1286
+ splice(q, i, 1)
1287
+ o = o.next;
1288
+ var s = i, v = o;
1289
+ if (o) do {
1290
+ var n = snapExpressFoot(o).next;
1291
+ if (n && n.type === STRAP && /^(in|of)$/.test(n.text)) break;
1292
+ if (n && n.text === '=') {
1293
+ n = skipAssignment(n);
1294
+ }
1295
+ else {
1296
+ i = q.indexOf(o, i);
1297
+ var j = n ? q.indexOf(n, i) + 1 : q.length;
1298
+ splice(q, i, j - i);
1299
+ }
1300
+ } while (n && n.type === STAMP && n.text === ',');
1301
+ i = s - 1;
1302
+ }
1303
+ else if (/^function$/.test(o.text)) {
1304
+ o = skipFunction(o);
1305
+ i = indexof(body, o, i);
1306
+ }
1139
1307
  }
1140
1308
  else if (o.length) {
1141
- backEach(o, rm);
1309
+ revar(o);
1142
1310
  }
1143
- };
1144
- backEach(scoped.body, rm);
1145
- killed.forEach(relink);
1311
+ }
1146
1312
  };
1147
1313
  var killret = function (body, labels = Object.create(null), gettmpname) {
1148
1314
  var o = body.first;
@@ -1286,6 +1452,14 @@ var down = function (scoped) {
1286
1452
  var tmp1 = null;
1287
1453
  var wrapper = scanner2(`(${inAsync ? 'async ' : ''}function${inAster ? "*" : ''}(${lets}){}(${lets}))`)[0];
1288
1454
  var body = scoped.body;
1455
+ if (!body) {
1456
+ var btemp = scoped.head.next;
1457
+ if (!btemp) throw "语句不完整";
1458
+ var btmp2 = skipSentenceQueue(btemp);
1459
+ body = scoped.body = scanner2('{}')[0];
1460
+ splice(body, 0, 0, ...splice2(btemp.queue, btemp, btmp2, body));
1461
+ }
1462
+ if (body.isClass) return;
1289
1463
  var bp = body.prev;
1290
1464
  var bn = body.next;
1291
1465
  var bq = body.queue;
@@ -1386,7 +1560,7 @@ var down = function (scoped) {
1386
1560
  if (hp && hp.type === STRAP && hp.text === 'await') hp = hp.prev;
1387
1561
  if (!hp) break a;
1388
1562
  if (hp.text === 'for') {
1389
- unforof(hp, getdeepname, scoped.used);
1563
+ unforof(hp, getdeepname, scoped.used, _killobj.bind(null, _getlocal));
1390
1564
  if (funcMark) killed = unforin(scoped.head, getdeepname, _killobj.bind(null, _getlocal)) !== false;
1391
1565
  // unforcx(scoped.head, getdeepname);
1392
1566
  }
@@ -1415,6 +1589,7 @@ var down = function (scoped) {
1415
1589
  var body = scanner2(`return ${funcMark}()`);
1416
1590
  var code = unawait(scoped.body, _getname, argname);
1417
1591
  code.forEach(function (c) {
1592
+ revar(c);
1418
1593
  var f = scanner2(`function(${c.awaited ? argname : ''}){\r\n}`);
1419
1594
  if (!c.length) f[2].push(...scanner2('return [1,0]'));
1420
1595
  else f[2].push(...c);
@@ -1431,7 +1606,6 @@ var down = function (scoped) {
1431
1606
  splice(scoped.body, scoped.body.length, 0, ...body);
1432
1607
  for (var k in envs) if (!(k in scoped.envs)) vars[k] = true;
1433
1608
  delete vars[argname];
1434
- revar(scoped);
1435
1609
  scoped.vars = Object.create(null);
1436
1610
  scoped.async = false;
1437
1611
  scoped.yield = false;