efront 3.37.0 → 3.38.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.
@@ -1,37 +1,24 @@
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, QUOTED, rename, getDeclared, skipAssignment, createString, relink, createExpressList } = require("./common");
5
- var link = function (a, b) {
6
- if (a) a.next = b;
7
- if (b) b.prev = a;
8
- };
9
- var splice1 = function (q, from, to, ...a) {
10
- var index1 = from ? q.indexOf(from) : q.length;
11
- var index2 = to ? q.indexOf(to) : q.length;
12
- if (index1 > index2) index2 = index1;
13
- if (a.length) {
14
- link(q[index1 - 1], a[0]);
15
- link(a[a.length - 1], q[index2]);
16
- }
17
- else if (index1 !== index2) {
18
- link(q[index1 - 1], q[index2]);
19
- }
20
- var res = q.splice(index1, index2 - index1, ...a);
21
- if (res[0]) delete res[0].prev, res.first = res[0];
22
- if (res[res.length - 1]) delete res[res.length - 1].next;
23
- q.first = q.find(o => o.type !== COMMENT && o.type !== SPACE);
24
- return res;
4
+ var { STAMP, SCOPED, STRAP, EXPRESS, COMMENT, SPACE, PROPERTY, VALUE, LABEL, QUOTED, rename, getDeclared, skipAssignment, createScoped, createString, splice, relink, snapExpressHead } = require("./common");
5
+ var splice2 = function (q, from, to, ...a) {
6
+ var cx = q.indexOf(from);
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)), '结构异常';
8
+ var dx = to ? q.indexOf(to, cx) : q.length;
9
+ if (dx < 0) throw console.log(splice2.caller, console.format('\r\n<yellow>自</yellow>'), from && createString([from]), console.format('\r\n<red2>至</red2>'), to && createString([to]), console.format(`\r\n<cyan>码列</cyan>`), createString(q)), '结构异常';
10
+ return splice(q, cx, dx - cx, ...a);
25
11
  };
26
12
  var insert1 = function (q, r, ...a) {
27
- splice1(q, r, r, ...a);
13
+ if (r) splice2(q, r, r, ...a);
14
+ else splice(q, q.length, 0, ...a);
28
15
  };
29
16
  // 解构赋值
30
- var killdec = function (queue, o, getobjname, _var = 'var', killobj, islet) {
17
+ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
31
18
  var tmpname = '';
32
19
  var index = 0;
33
20
  var deep = 0;
34
- var dec = function (d, i) {
21
+ var dec = function (d, x) {
35
22
  var previx = tmpname;
36
23
  var [k, v] = d;
37
24
  var dp = 0;
@@ -47,8 +34,7 @@ var killdec = function (queue, o, getobjname, _var = 'var', killobj, islet) {
47
34
  if (dp) {
48
35
  deep += dp;
49
36
  var n = getobjname(deep);
50
- insert1(queue, o, ...scanner2(`${index > 0 ? ',' : ''}${n}=${k}`));
51
- index++;
37
+ write(n, k);
52
38
  k = tmpname = n;
53
39
  }
54
40
  dog(v);
@@ -56,13 +42,13 @@ var killdec = function (queue, o, getobjname, _var = 'var', killobj, islet) {
56
42
  }
57
43
  else {
58
44
  deep++;
59
- var n = getobjname(deep)
60
- insert1(queue, o, ...scanner2(`${index > 0 ? "," : ''}${n}=${tmpname}!==undefined?${tmpname}:`));
61
- var skiped = splice1(d[2], d[3], d[4]);
45
+ var n = getobjname(deep);
46
+ write(n, `${tmpname}!==undefined?${tmpname}:`);
47
+ var skiped = splice2(d[2], d[3], d[4]);
62
48
  killobj(skiped);
63
- insert1(queue, o, ...skiped);
49
+ splice(queue, i, 0, ...skiped);
50
+ i += skiped.length;
64
51
  k = tmpname = n;
65
- index++;
66
52
  dog(v);
67
53
  deep--;
68
54
  }
@@ -71,16 +57,17 @@ var killdec = function (queue, o, getobjname, _var = 'var', killobj, islet) {
71
57
  }
72
58
 
73
59
  if (!tmpname) {
74
- write(v, null, i < total - 1);
60
+ write(v, null, x < total - 1);
75
61
  }
76
62
  else if (d.length === 2) {
77
- write(v, k, i < total - 1);
63
+ write(v, k, x < total - 1);
78
64
  }
79
65
  else {
80
- write(v, `{k}!==undefined?${k}:`, i < total - 1);
81
- var skiped = splice1(d[2], d[3], d[4]);
66
+ write(v, `${k}!==undefined?${k}:`, x < total - 1);
67
+ var skiped = splice2(d[2], d[3], d[4]);
82
68
  killobj(skiped);
83
- insert1(queue, o, ...skiped);
69
+ splice(queue, i, 0, ...skiped);
70
+ i += skiped.length;
84
71
  }
85
72
  index++;
86
73
  };
@@ -88,12 +75,19 @@ var killdec = function (queue, o, getobjname, _var = 'var', killobj, islet) {
88
75
  var write = function (name, value, hasnext) {
89
76
  if (name === tmpname && hasnext) {
90
77
  tmpname = getobjname(deep++);
91
- insert1(queue, o, ...scanner2(`${index > 0 ? "," : ""}${tmpname}=${name}`));
78
+ if (index > 0) queue.splice(i++, 0, { type: STAMP, text: ',' });
79
+ var q = scanner2(`${tmpname}=${name}`);
80
+ queue.splice(i, 0, ...q);
81
+ i += q.length;
92
82
  index++;
93
83
  }
94
- if (!value && islet) value = 'undefined';
95
- var text = `${index > 0 ? "," : ''}${name}${value ? '=' + value : ''}`;
96
- insert1(queue, o, ...scanner2(text));
84
+ if (index > 0) queue.splice(i++, 0, { type: STAMP, text: ',' });
85
+ queue.splice(i++, 0, { type: EXPRESS, text: name });
86
+ if (value) {
87
+ var q = scanner2("=" + value);
88
+ queue.splice(i, 0, ...q);
89
+ i += q.length;
90
+ }
97
91
  index++;
98
92
  };
99
93
  var dog = function (d) {
@@ -149,73 +143,87 @@ var killdec = function (queue, o, getobjname, _var = 'var', killobj, islet) {
149
143
  if (!v.attributes) return [p, v];
150
144
  return single(v, p);
151
145
  };
152
- if (_var) insert1(queue, o, { type: STRAP, text: _var });
153
- loop: while (o) {
146
+ if (_var && i < queue.length) queue.splice(i++, 0, { type: STRAP, text: _var });
147
+ loop: while (i < queue.length) {
148
+ var o = queue[i];
154
149
  var next = o.next;
155
150
  tmpname = '';
156
151
  if (!next || next.type !== STAMP || next.text !== '=') {
152
+ // 只声明不赋值的语句
157
153
  var hasnext = next && next.type === STAMP && next.text === ',';
154
+ if (hasnext) next = next.next;
155
+ var n = indexof(queue, next, i);
158
156
  if (o.type === SCOPED) {
159
- var [o0] = splice1(queue, o, o = hasnext ? next.next : next);
157
+ var [o0] = queue.splice(i, n - i);
160
158
  var [[d]] = getDeclared(o0);
161
159
  dog(d);
160
+ n = i = indexof(queue, next, i);
162
161
  if (hasnext) continue loop;
163
162
  }
164
163
  else if (hasnext) {
165
- if (islet) insert1(queue, next, ...scanner2('=undefined'));
166
- o = next.next;
164
+ i = n;
167
165
  index++;
168
166
  continue;
169
- } else if (islet) insert1(queue, next, ...scanner2('=undefined'));
170
- o = next;
167
+ }
168
+ i = n;
171
169
  break;
172
170
  }
173
171
  var objs = [];
174
172
  do {
175
173
  var next = o.next;
176
174
  if (!next || next.type !== STAMP || next.text !== "=") {
175
+ // 赋值结束
177
176
  if (tmpname) {
178
- o = skipAssignment(o);
177
+ var n = skipAssignment(queue, i);
178
+ o = queue[n];
179
+ var skiped = queue.splice(i, n - i);
180
+ killobj(skiped);
181
+ queue.splice(i, 0, ...skiped);
182
+ i += skiped.length;
179
183
  break;
180
184
  }
181
185
  if (!next || next.type === STAMP && /^[,;]$/.test(next.text)) {
182
186
  if (o.type === EXPRESS && !/\./.test(o.text)) {
183
187
  tmpname = o.text;
184
- splice1(queue, o, o = next && next.text === ',' ? next.next : next);
188
+ queue.splice(i, indexof(queue, o = next, i) - i);
189
+ i = indexof(queue, o, i);
185
190
  }
186
191
  }
187
192
  break;
188
193
  }
189
194
  if (o.type === SCOPED) {
190
- var [o0] = splice1(queue, o, o = next.next);
195
+ var n = indexof(queue, next.next, i);
196
+ var [o0] = queue.splice(i, n - i);
191
197
  delete o0.next;
192
198
  if (o0.length && getDeclared(o0).length > 0) objs.push(o0);
193
199
  }
194
200
  else if (o.type === EXPRESS && !/\.\[/.test(o.text)) {
195
201
  if (!tmpname) tmpname = o.text, index++;
196
- o = next.next;
197
- }
198
- else {
199
- o = next.next;
200
202
  }
203
+ o = next.next;
204
+ i = indexof(queue, o, i);
201
205
  } while (o);
202
206
  if (!tmpname) {
203
207
  if (objs.length === 1) {
204
208
  var [[d]] = getDeclared(objs[0]);
205
209
  var a = single(d, '');
206
210
  if (a) {
207
- insert1(queue, o, { type: EXPRESS, text: a[1] });
208
- insert1(queue, o, { type: STAMP, text: "=" });
209
- o = skipAssignment(o);
210
- insert1(queue, o, ...scanner2(a[0]));
211
+ splice(queue, i, 0, { type: EXPRESS, text: a[1] }, { type: STAMP, text: "=" });
212
+ i += 2;
213
+ var i2 = skipAssignment(queue, i);
214
+ killobj(queue.slice(i, i = i2));
215
+ var q = scanner2(a[0])
216
+ queue.splice(i, 0, ...q);
217
+ i += q.length;
211
218
  index++;
212
219
  continue;
213
220
  }
214
221
  }
215
222
  tmpname = getobjname();
216
- insert1(queue, o, { type: EXPRESS, text: tmpname });
217
- insert1(queue, o, { type: STAMP, text: "=" });
218
- o = skipAssignment(o);
223
+ splice(queue, i, 0, { type: EXPRESS, text: tmpname }, { type: STAMP, text: "=" });
224
+ i += 2;
225
+ var i2 = skipAssignment(queue, i);
226
+ killobj(queue.slice(i, i = i2));
219
227
  index++;
220
228
  }
221
229
  for (var o0 of objs) {
@@ -223,34 +231,80 @@ var killdec = function (queue, o, getobjname, _var = 'var', killobj, islet) {
223
231
  dog(d);
224
232
  }
225
233
  }
226
- return o;
234
+ relink(queue);
235
+ return i;
227
236
  };
228
237
  // 键值对重组
229
- var killmap = function (body, o, _getobjname, killobj) {
230
- if (!o.length) return o.next;
238
+ var killmap = function (body, i, _getobjname, killobj) {
239
+ var o = body[i];
240
+ if (!o.length) return indexof(body, o.next, i);
231
241
  var m = o.first;
232
- var s = m;
233
- while (m) {
242
+ var s = m, p;
243
+
244
+ loop: while (m) {
245
+ s = m, p = m.prev;
234
246
  if (m.type === EXPRESS) break;
235
- s = m;
236
247
  while (m && (m.type === STRAP || m.type === STAMP)) m = m.next;
237
- if (m.isprop && (m.type === SCOPED || m.type === PROPERTY && /\[/.test(m.text) || m.short || m.next && m.next.type === SCOPED)) {
248
+ if (!m || m.isprop && (m.type === SCOPED || m.type === PROPERTY && /\[/.test(m.text) || m.short || m.next && m.next.type === SCOPED)) {
238
249
  break;
239
250
  }
240
251
  m = m.next;
241
- m = skipAssignment(m);
252
+ if (!m) break;
253
+ if (m && m.type === STAMP && m.text === ':') m = m.next;
254
+ if (!m) break;
255
+ var n = skipAssignment(m);
256
+ while (m !== n) {
257
+ if (m.type === STAMP && m.text === '=>') {
258
+ body.await_ = true;
259
+ break loop;
260
+ }
261
+ if (m.type === STRAP) {
262
+ if (/^await$/.test(m.text)) {
263
+ body.await_ = true;
264
+ break loop;
265
+ }
266
+ if (/^function$/.test(m.text)) {
267
+ while (m && (m.type !== SCOPED || m.entry !== '{')) m = m.next;
268
+ continue;
269
+ }
270
+ if (/^class$/.test(m.text)) {
271
+ while (m && !m.isClass) m = m.next;
272
+ while (m && m.isClass) m = m.next;
273
+ continue;
274
+ }
275
+ }
276
+ if (m.type === SCOPED) {
277
+ if (m.entry === "(" && m.next && m.next.type === STAMP && m.next.text === '=>') {
278
+ s = skipAssignment(m);
279
+ var mi = o.indexOf(m);
280
+ var si = o.indexOf(s, mi);
281
+ if (si < 0) si = o.length;
282
+ var ms = o.slice(mi, si);
283
+ killobj(ms);
284
+ splice(o, mi, si - mi, ...ms);
285
+ m = s;
286
+ continue;
287
+ }
288
+ killobj(m);
289
+ if (m.await_) break loop;
290
+ }
291
+ m = m.next;
292
+ }
293
+ if (m && m.type === STAMP && /^[,;]$/.test(m.text)) m = m.next;
242
294
  }
243
- if (!m) return o.next;
295
+ if (!m) return indexof(body, o.next, i);
244
296
  m = s;
245
- if (m.prev && m.prev.type === STAMP && m.prev.text === ',') {
246
- splice1(body, m.prev, m);
297
+ if (p && p.type === STAMP && p.text === ',') {
298
+ var mi = o.indexOf(m);
299
+ var pi = o.lastIndexOf(p, mi);
300
+ if (pi > 0) splice(o, pi, mi - pi);
247
301
  }
248
- var q, qf = o;
302
+ var q;
249
303
  var next = o.next;
250
-
304
+ var l = 1;
251
305
  var initq = function () {
252
306
  q = scanner2(`(${_getobjname()}=)`)[0];
253
- var qo = splice1(body, qf, next, q);
307
+ var qo = splice(body, i, l, q);
254
308
  insert1(q, null, ...qo);
255
309
  insert1(q, null, { type: STAMP, text: ',' });
256
310
  }
@@ -262,41 +316,57 @@ var killmap = function (body, o, _getobjname, killobj) {
262
316
  m = skipAssignment(m);
263
317
  if (/^\.\.\./.test(s.text)) {
264
318
  s.text = s.text.replace(/^\.\.\./, '');
319
+ if (!s.text) {
320
+ splice2(o, s, s = s.next);
321
+ }
265
322
  if (q) {
266
323
  t = scanner2(`extend(${_getobjname()},)`);
324
+ rootenvs.extend = true;
267
325
  insert1(q, null, ...t);
268
326
  }
269
327
  else {
270
328
  if (!t) {
271
329
  t = scanner2(`extend()`);
272
- var [o0] = splice1(body, o, next, t);
273
- insert1(t[1], null, o0);
274
- qf = t[0];
275
- insert1(body, next, ...t);
330
+ rootenvs.extend = true;
331
+ var [o0] = body.splice(i, 1, ...t);
332
+ t[1].push(o0);
333
+ l = 2;
276
334
  }
277
335
  insert1(t[1], null, { type: STAMP, text: "," });
278
336
  }
279
- var e = splice1(o, s, m);
337
+ var e = splice2(o, s, m);
280
338
  insert1(t[1], null, ...e);
281
339
  if (q) {
282
340
  if (m) {
283
- e = splice1(body, m, m = m.next);
341
+ e = splice2(o, m, m = m.next);
284
342
  killobj(e);
285
343
  insert1(q, null, ...e);
286
344
  }
287
345
  }
288
- if (m && m.type === STAMP && m.text === ',') splice1(o, m, m = m.next);
346
+ if (m && m.type === STAMP && m.text === ',') splice2(o, m, m = m.next);
289
347
  }
290
348
  continue;
291
349
  }
350
+ if (m && m.type === STAMP && m.text === ',') {
351
+ splice2(o, m, m = m.next);
352
+ continue;
353
+ }
292
354
  if (!q) initq();
355
+
293
356
  var [prop, m] = getprop(o, m);
294
357
  if (!prop.value.length) insert1(prop.value, null, { type: EXPRESS, text: prop.name })
295
- else killobj(prop.value);
358
+ else if (prop.sfunc === false) killobj(prop.value);
296
359
  setprop(prop, _getobjname(), define_, q);
297
360
  }
298
- if (q) insert1(q, null, ...scanner2(',' + _getobjname()));
299
- return next;
361
+
362
+ if (q) {
363
+ relink(q);
364
+ var qe = q.last;
365
+ if (qe.type !== STAMP || qe.text !== ',') q.push({ type: STAMP, text: ',' });
366
+ q.push(...scanner2(_getobjname()));
367
+ relink(q);
368
+ }
369
+ return indexof(body, next, i);
300
370
  };
301
371
  var getprop = function (o, m) {
302
372
  var prop = {};
@@ -328,9 +398,9 @@ var getprop = function (o, m) {
328
398
  }
329
399
  else {
330
400
  prop.sfunc = false;
331
- if (m && /[\=\:]/.test(m.text)) m = m.next;
401
+ if (m && /^[\=\:]$/.test(m.text)) m = m.next;
332
402
  }
333
- splice1(o, s, m);
403
+ splice2(o, s, m);
334
404
  var s = m;
335
405
  if (m && prop.sfunc !== false && m.type === SCOPED && m.entry === '(') {
336
406
  m = m.next;
@@ -338,33 +408,42 @@ var getprop = function (o, m) {
338
408
  }
339
409
  else m = skipAssignment(m);
340
410
  if (m && !m.isprop) m = m.next;
341
- if (!prop.short) prop.value = splice1(o, s, m);
342
- else splice1(o, s, m);
411
+ if (!prop.short) prop.value = splice2(o, s, m);
412
+ else if (s) splice2(o, s, m);
343
413
  return [prop, m];
344
414
  };
345
415
  var setprop = function (prop, k, d, q) {
346
- if (prop.sfunc !== false) insert1(prop.value, prop.value[0], ...scanner2(`${prop.async ? "async " : ""}function${prop["*"] ? "*" : ''}`));
416
+ if (prop.sfunc !== false)
417
+ // insert1(prop.value, prop.value[0], ...scanner2(`${prop.async ? "async " : ""}function${prop["*"] ? "*" : ''}`));
418
+ insert1(prop.value, prop.value[0], ...scanner2(`function`));
347
419
  if (prop.get || prop.set) {
348
- let end = prop.value[prop.value.length - 1];
349
- if (end.type === STAMP && /[,;]/.test(end.text)) prop.value.pop();
420
+ var pv = prop.value;
421
+ if (pv) {
422
+ while (pv.length && pv[pv.length - 1].type & (SPACE | COMMENT)) pv.pop();
423
+ var pe = pv[pv.length - 1];
424
+ if (pe && pe.type === STAMP && /^[,;]$/.test(pe.text)) pv.pop();
425
+ else pe = null;
426
+ }
350
427
  if (!d[prop.name]) {
351
- let tmp = scanner2(`Object.defineProperty(${k},${prop.name},{})`);
428
+ let tmp = scanner2(`\r\nObject.defineProperty(${k},${prop.name},{})`);
352
429
  insert1(q, null, ...tmp);
353
- if (end.type === STAMP && /^[,;]/.test(end.text)) insert1(q, null, end);
354
- d[prop.name] = tmp[1][4];
430
+ if (pe) insert1(q, null, pe);
431
+ d[prop.name] = tmp[tmp.length - 1][4];
355
432
  }
356
433
  if (d[prop.name].length) insert1(d[prop.name], null, { type: STAMP, text: ',' });
357
434
  insert1(d[prop.name], null, { type: PROPERTY, text: prop.get ? "get" : "set" });
358
435
  insert1(d[prop.name], null, { type: STAMP, text: ":" });
359
- insert1(d[prop.name], null, ...prop.value);
436
+ if (pv && pv.length) insert1(d[prop.name], null, ...pv);
360
437
  }
361
438
  else {
362
- insert1(q, null, ...scanner2(`${k}${prop.name}=`));
439
+ insert1(q, null, ...scanner2(`${q && q.length ? "\r\n" : ''}${k}${prop.name}=`));
363
440
  insert1(q, null, ...prop.value);
364
441
  }
365
442
  }
366
- var killcls = function (body, o, getname_) {
443
+ var rootenvs = null, rootHyper;
444
+ var killcls = function (body, i, getname_) {
367
445
  var extends_ = [];
446
+ var o = body[i];
368
447
  var start = o;
369
448
  var decName = !o.isExpress && o.next.type === EXPRESS && o.next.text;
370
449
  while (o) {
@@ -392,94 +471,130 @@ var killcls = function (body, o, getname_) {
392
471
  if (o) {
393
472
  var next = o;
394
473
  while (next && !next.isClass) next = next.next;
395
- base = createString(splice1(body, o, o = next));
474
+ base = createString(splice2(body, o, o = next));
396
475
  }
397
- // if (base === 'Array') base = 'Array2'; 降级时不做填充的工作
476
+ if (base === 'Array') base = 'Array2', rootenvs.Array2 = true;
398
477
  var index = 0;
399
478
  while (o && o.isClass) {
479
+ var scoped = o.scoped;
400
480
  var m = o.first;
401
481
  var name = extends_.pop();
402
- if (!name && (base || extends_.length)) name = getname_('class' + index);
482
+ if (!name && (base || extends_.length)) name = getname_('cls' + index);
403
483
  var assign = [];
404
484
  var constructor = scanner2('(){}');
405
485
  var define_ = Object.create(null);
406
486
  var static_ = Object.create(null);
407
487
  var clz = { name };
488
+ if (!clz.name) clz.name = getname_("cls" + index);
408
489
  while (m) {
409
490
  var [prop, m] = getprop(o, m);
410
491
  if (!prop.value.length) prop.value = scanner2('undefined;');
411
492
  var k = prop.static ? clz.name : `${clz.name}.prototype`;
412
493
  var d = prop.static ? static_ : define_;
413
- if (prop.get || prop.set || prop.sfunc !== false) {
494
+ if (prop.get || prop.set || prop.static) {
414
495
  setprop(prop, k, d, defines);
415
496
  }
416
- else if (/^(?:constructor|(['"`])constructor\1)/.test(prop.name)) {
497
+ else if (/^(?:\.constructor|\[(['"`])constructor\1\])$/.test(prop.name)) {
417
498
  constructor = prop.value;
499
+ var ce = constructor[constructor.length - 1];
500
+ while (ce.type & (SPACE | COMMENT) || ce.type === STAMP && /^[,;]$/.test(ce.text)) constructor.pop(), ce = constructor[constructor.length - 1];
501
+ }
502
+ else if (prop.sfunc !== false) {
503
+ setprop(prop, k, d, defines);
418
504
  }
419
505
  else {
420
506
  insert1(assign, null, ...scanner2(`this${prop.name}=`));
421
507
  insert1(assign, null, ...prop.value);
422
508
  }
423
509
  }
510
+ relink(o);
424
511
  if (invokes.length) insert1(invokes, null, { type: STAMP, text: ',' });
425
512
  insert1(invokes, null, ...scanner2('function ' + name));
426
- insert1(constructor[1], constructor[1][0], ...assign);
513
+ if (base) {
514
+ constructor[1].push(...scanner2('return this'))
515
+ relink(constructor[1]);
516
+ var cs = createScoped(constructor[1]);
517
+ var newt = getname(cs.vars, cs.envs, 'this_');
518
+ if (cs.used.this) rename(cs.used, 'this', newt);
519
+ var inited = false;
520
+ assign.forEach(o => {
521
+ if (o.type === EXPRESS) o.text = o.text.replace(/^this\./g, newt);
522
+ });
523
+ if (cs.used.super) {
524
+ cs.used.super.forEach(o => {
525
+ if (o.text !== 'super') return;
526
+ var n = o.next;
527
+ if (!n || n.type !== SCOPED || n.entry !== "(") return;
528
+ o.text = base + '.call';
529
+ if (!inited) {
530
+ insert1(o.queue, o, ...assign);
531
+ }
532
+ inited = true;
533
+ insert1(o.queue, o, ...scanner2(`var ${newt}=`));
534
+ if (n.length) n.unshift({ type: STAMP, text: ',' });
535
+ n.unshift({ type: EXPRESS, text: 'this' });
536
+ insert1(o.queue, n.next, ...scanner2(`||this;`));
537
+ })
538
+ }
539
+ if (scoped.used.super) {
540
+ scoped.used.super.forEach(o => {
541
+ if (!/^super(\.|\[|$)/.test(o.text)) return;
542
+ o.text = `${base}.prototype` + o.text.replace(/^super/, '');
543
+ insert1(o.queue, o.next, ...scanner2('.bind(this)'));
544
+ })
545
+ }
546
+ if (!inited) constructor[1].unshift(...scanner2(`\r\nvar ${newt}=${base}.apply(this,arguments)||this;\r\n`), ...assign);
547
+ }
548
+ else {
549
+ constructor[1].unshift(...assign);
550
+ }
427
551
  insert1(invokes, null, ...constructor);
428
552
  o = o.next;
429
- if (base) insert1(foot, null, ...scanner2(`${foot.length ? ";" : ""}extends_(${clz.name},${base})`));
553
+ if (base) defines.unshift(...scanner2(`extends_(${clz.name},${base})${defines.length ? "\r\n" : ""}`)), rootenvs.extends_ = true;
430
554
  base = clz.name;
431
555
  if (clz.name) insert1(head, null, ...scanner2(`${head.length ? ',' : ''}${clz.name}`));
432
556
  index++;
433
557
  }
434
558
  insert1(defines, null, ...foot);
559
+ var s = i;
560
+ i = body.indexOf(o, i);
561
+ if (i < 0) i = body.length;
435
562
  if (head.length > 1 || start.isExpress) {
436
- insert1(defines, null, ...scanner2(`; return ${clz.name}`))
437
- if (decName) insert1(func, func[0], ...scanner2(`var ${decName}=`));
438
- splice1(body, start, o, ...func);
563
+ splice(defines, defines.length, 0, ...scanner2(`\r\nreturn ${clz.name}`))
564
+ if (decName) splice(func, 0, 0, ...scanner2(`var ${decName}=`));
565
+ splice(body, s, i - s, ...func);
439
566
  }
440
567
  else {
441
- splice1(body, start, o, ...invokes);
442
568
  if (defines.length) {
443
- insert1(body, o, { text: ';', type: STAMP });
444
- insert1(body, o, ...defines);
569
+ splice(invokes, invokes.length, 0, { text: ';', type: STAMP }, ...defines);
445
570
  }
571
+ splice(body, s, i - s, ...invokes);
572
+ if (o) insert1(body, o, { type: SPACE, text: '\r\n' });
446
573
  }
447
- return o;
574
+ return i;
448
575
  };
449
- var prevInvoke = function (o) {
450
- while (o) {
451
- var prev = o.prev;
452
- if (!prev) break;
453
- if (o.type === EXPRESS) {
454
- if (prev.type === STRAP && /^(class|function|new|extends)$/.test(prev.text));
455
- else if (!/^\.|\[/.test(o.text) || /^\.\.\./.test(o.text)) break;
456
- }
457
- else if (o.type === VALUE || o.type === QUOTED) break;
458
- else if (prev.type === STAMP) {
459
- if (prev.text === '*') {
460
- if (prev.prev && prev.prev.type !== STRAP) break;
461
- }
462
- else if (prev.text !== "=>" || o.type !== SCOPED || o.entry !== '{') {
463
- break;
464
- }
465
- }
466
- else if (prev.type === STRAP) break;
467
- o = prev;
576
+ var indexof = function (list, o, i) {
577
+ if (o) {
578
+ i = list.indexOf(o, i);
579
+ if (i < 0) i = list.length;
468
580
  }
469
- return o;
581
+ else i++;
582
+ return i;
470
583
  };
471
584
  // 数组或参数展开
472
- var killspr = function (body, o, _getobjname, setsolid, killobj) {
585
+ var killspr = function (body, i, _getobjname, setsolid, killobj) {
586
+ var o = body[i];
473
587
  var m = o.first;
474
- if (!m) return o.next;
588
+ if (!m) return i + 1;
589
+ killobj(o);
475
590
  var index = 0;
476
591
  var spr = function () {
477
592
  var s = m;
478
593
  s.text = s.text.replace(/^\.\.\./, '');
479
594
  m = skipAssignment(m);
480
595
  var q = scanner2(`Array.prototype.slice.call()`);
481
- var v = splice1(o, s, m);
482
- if (m) splice1(o, m, m = m.next);
596
+ var v = splice2(o, s, m);
597
+ if (m) splice2(o, m, m = m.next);
483
598
  killobj(v);
484
599
  insert1(q[1], null, ...v);
485
600
  setsolid(q, q[0]);
@@ -487,7 +602,6 @@ var killspr = function (body, o, _getobjname, setsolid, killobj) {
487
602
  };
488
603
  var killnext = function (m) {
489
604
  while (m && (m.type !== STAMP || m.text !== ',')) {
490
- if (m.length) killobj(m);
491
605
  m = m.next;
492
606
  }
493
607
  return m;
@@ -498,57 +612,67 @@ var killspr = function (body, o, _getobjname, setsolid, killobj) {
498
612
  if (m) m = m.next;
499
613
  index++;
500
614
  }
501
- if (!m) return o.next;
615
+ if (!m) return i + 1;
502
616
  var c = scanner2('.concat()');
503
617
  var next = o.next;
504
618
  if (o.entry === '(') {
505
- var r = prevInvoke(o);
619
+ var r = snapExpressHead(o);
620
+ var rt = r.type === EXPRESS && r.text.replace(/^\.\.\./, '');
506
621
  if (r === o);
507
- else if (r === o.prev && r.type === EXPRESS && !/\.[\s\S]*\./.test(r.text)) {
622
+ else if (
623
+ r === o.prev && r.type === EXPRESS && !/\.[\s\S]*\./.test(rt) && !/\[[^\]]*\]\[[^\]]*\]/.test(rt)) {
508
624
  var p = r;
509
- var n = /\./.test(p.text) && p.text.replace(/\.[^\.]*$/, '') || "null";
510
- insert1(o, o.first, ...scanner2(n + ","));
625
+ var n = /\.|\[/.test(rt) ? rt.replace(/\.[^\.]*|\[[^\]]*\]$/, '') : "null";
626
+ splice(o, 0, 0, ...scanner2(n + ","));
511
627
  }
512
628
  else {
513
- var p = o.prev;
514
- if (p.type === EXPRESS) {
515
- var n = p.text.replace(/^[\s\S]*?(\.[^\.]*)$/, "$1");
516
- p.text = p.text.replace(/\.[^\.]*$/, "");
517
- insert1(body, o, { type: EXPRESS, text: n });
629
+ var p = o.prev, n = null, hasdot = false;
630
+ var pt = p.type === EXPRESS && p.text.replace(/^\.\.\./, '');
631
+ if (p.type === EXPRESS && (n = /^(?:[\s\S]*[^\.])?(\.[^\.]*|\[[^\]]*\])$/.exec(pt))) {
632
+ hasdot = p.text.length !== pt.length;
633
+ var n = n[1];
634
+ p.text = pt.slice(0, pt.length - n.length);
635
+ splice(body, i++, 0, { type: EXPRESS, text: n });
636
+ }
637
+ else if (p.type === SCOPED && p.entry === '[') {
638
+ p = p.prev;
518
639
  }
519
640
  else {
520
- // p = p.prev;
641
+ splice(body, i++, 0, { type: VALUE, text: "null" });
521
642
  }
522
- insert1(o, o.first, ...scanner2(`${_getobjname()},`));
523
- var h = scanner2(`(${_getobjname()}=)`);
524
- insert1(h[0], null, ...splice1(body, r, p));
525
- insert1(body, p, ...h);
526
- if (!p.text) {
527
- splice1(body, p, p.next);
643
+ splice(o, 0, 0, ...scanner2(`${_getobjname()},`));
644
+ var h = scanner2(`${hasdot ? "..." : ''}(${_getobjname()}=)`);
645
+ var cx = body.lastIndexOf(r, i);
646
+ var dx = body.indexOf(p, cx) + 1;
647
+ var h1 = h[h.length - 1];
648
+ splice(h1, h1.length, 0, ...splice(body, cx, dx - cx, ...h));
649
+ i += cx - dx + h.length;
650
+ if (p.type === EXPRESS && !p.text) {
651
+ var cx = h[0].lastIndexOf(p);
652
+ if (cx >= 0) splice(h1, cx, 1);
528
653
  }
529
654
  }
530
- insert1(body, o, ...scanner2('.apply'));
655
+ splice(body, i++, 0, ...scanner2('.apply'));
531
656
  var m1 = skipAssignment(m);
532
657
  if (index > 0 || m1 && m1.next) {
533
- var h = splice1(o, o.first.next.next, null);
658
+ var h = splice(o, 2, o.length);
534
659
  var c = scanner2(`[]`);
535
- insert1(c[0], null, ...h);
660
+ splice(c[0], 0, 0, ...h);
536
661
  killobj(c);
537
- insert1(o, null, ...c);
538
- return next;
662
+ splice(o, o.length, 0, ...c);
663
+ return indexof(body, next, i);
539
664
  };
540
665
  killnext(m);
541
666
  m.text = m.text.replace(/^\.\.\./, '');
542
- return next;
667
+ return indexof(body, next, i);
543
668
  }
544
669
  if (index > 0) {
545
- if (m) splice1(o, m.prev, m);
546
- insert1(body, next, ...c);
670
+ if (m) splice2(o, m.prev, m);
671
+ splice(body, i + 1, 0, ...c);
547
672
  insert1(c[1], null, ...spr());
548
673
  }
549
674
  else {
550
- splice1(body, o, next, ...spr());
551
- if (m) insert1(body, next, ...c);
675
+ splice(body, i, 1, ...spr(), ...(m ? c : []));
552
676
  }
553
677
  var d;
554
678
  while (m) {
@@ -566,14 +690,14 @@ var killspr = function (body, o, _getobjname, setsolid, killobj) {
566
690
  insert1(c[1], null, ...d);
567
691
  }
568
692
  if (d[0].length) insert1(d[0], null, { type: STAMP, text: "," });
569
- insert1(d[0], null, ...splice1(o, s, m));
570
- if (m) splice1(o, m, m = m.next);
693
+ insert1(d[0], null, ...splice2(o, s, m));
694
+ if (m) splice2(o, m, m = m.next);
571
695
  }
572
- return next;
696
+ return indexof(body, next, i);
573
697
  };
574
698
 
575
- var killobj = function (body, getobjname, getname_, setsolid, deep = 0) {
576
- var o = body.first;
699
+ var killobj = function (body, getobjname, getletname, getname_, letname_, setsolid, deep = 0) {
700
+ var i = 0;
577
701
  var _getdeep = function () {
578
702
  deep++;
579
703
  _getdeep = function () {
@@ -588,80 +712,123 @@ var killobj = function (body, getobjname, getname_, setsolid, deep = 0) {
588
712
  return getobjname(deep + i);
589
713
  };
590
714
  var deepkill = function (o) {
591
- killobj(o, getobjname, getname_, setsolid, deep);
715
+ killobj(o, getobjname, getletname, getname_, letname_, setsolid, deep);
716
+ if (o.await_) body.await_ = true;
592
717
  };
593
- while (o) {
718
+ while (i < body.length) {
719
+ var o = body[i];
594
720
  var islet = false;
595
721
  if (o.type === STRAP) {
596
722
  switch (o.text) {
597
723
  case "await":
598
- body.await = true;
599
- o = o.next;
724
+ body.await_ = true;
725
+ i++;
726
+ break;
727
+ case "yield":
728
+ var o = o.next;
729
+ if (o.type === STAMP && o.text === '*') {
730
+ i++;
731
+ var n = body.indexOf(o, i) + 1;
732
+ o = o.next;
733
+ splice(body, i, n - i);
734
+ n = skipAssignment(body, i - 1);
735
+ var name = getname_("_");
736
+ var y = scanner2(`for(var ${name} of) yield ${name};`);
737
+ y[2].type = STRAP;
738
+ splice(y[1], y[1].length, 0, ...splice(body, i, n - i));
739
+ unforof(y[1], getname_.bind(null, '_'), y.used);
740
+ splice(body, i - 1, 1, ...y);
741
+ }
742
+ i++;
600
743
  break;
601
744
  case "let":
602
745
  case "const":
603
746
  islet = body.keeplet !== false;
604
747
  case "var":
605
- splice1(body, o, o = o.next);
606
- o = killdec(body, o, _getdeepname, 'var', deepkill, islet);
748
+ splice(body, i, 1);
749
+ i = killdec(body, i, getletname, 'var', deepkill, islet);
750
+ break;
751
+ case "catch":
752
+ var n = o.next;
753
+ if (n.type !== SCOPED || n.entry !== '(') {
754
+ splice(body, ++i, 0, scanner2(`(${letname_('e')})`)[0])
755
+ }
756
+ i++;
607
757
  break;
608
758
  case "class":
609
- o = killcls(body, o, getname_);
759
+ i = killcls(body, i, letname_);
610
760
  break;
611
761
  case "function":
612
762
  o = o.next;
613
- if (o && o.type === STAMP) o = o.next;
763
+ if (o && o.type === STAMP) {
764
+ i++;
765
+ var n = body.indexOf(o, i) + 1;
766
+ o = o.next;
767
+ splice(body, i, n - i);
768
+ }
614
769
  if (o && o.type === EXPRESS) o = o.next;
615
770
  if (o && o.type === SCOPED) o = o.next;// ()
616
771
  if (o && o.type === SCOPED) o = o.next;// {}
772
+ i = body.indexOf(o, i);
773
+ if (i < 0) i = body.length;
617
774
  break;
618
775
  case "async":
619
- splice1(body, o, o = o.next);
776
+ body.splice(i, 1);
620
777
  break;
621
778
  default:
622
- o = o.next;
779
+ i++;
623
780
  }
624
781
  continue;
625
782
  }
626
783
  else if (o.type === SCOPED) {
627
784
  if (o.isObject) {
628
785
  if (o.next && o.next.type === STAMP && o.next.text === '=') {
629
- o = killdec(body, o, _getdeepname, '', deepkill);
786
+ i = killdec(body, i, _getdeepname, '', deepkill);
630
787
  continue;
631
788
  }
632
789
  else {
633
- o = killmap(body, o, _getobjname, deepkill);
790
+ i = killmap(body, i, _getobjname, deepkill);
791
+ // i = indexof(body, o, i);
634
792
  continue;
635
793
  }
636
794
  }
637
795
  else if (o.entry === '[') {
638
- if (o.next && o.next.type === STAMP && o.next.text === '=' || o.next && o.next.type === STRAP && /^(in|of)$/.test(o.next.type) && body.entry === '(' && body.prev && body.prev.type === STRAP && body.prev.text === 'for') {
639
- o = killdec(body, o, _getdeepname, '', deepkill);
796
+ var a = snapExpressHead(o);
797
+ if (a === o && o.next && o.next.type === STAMP && o.next.text === '=' || o.next && o.next.type === STRAP && /^(in|of)$/.test(o.next.type) && body.entry === '(' && body.prev && body.prev.type === STRAP && body.prev.text === 'for') {
798
+ i = killdec(body, i, _getdeepname, '', deepkill);
640
799
  }
641
800
  else {
642
- o = killspr(body, o, _getobjname, setsolid, deepkill);
801
+ i = killspr(body, i, _getobjname, setsolid, deepkill);
643
802
  }
644
803
  continue;
645
804
  }
646
805
  else if (o.entry === '(') {
647
806
  if (o.next && o.next.type === STAMP && o.next.text === '=>');
648
- else if (o.prev && o.prev.type === STRAP);
807
+ else if (o.prev && o.prev.type === STRAP) {
808
+ var p = o.prev;
809
+ if (p.transive || /^(if|else|while|with|switch)$/.test(p.text)) deepkill(o);
810
+ }
649
811
  else if (!o.prev || o.prev.type === STAMP || o.prev.type === STRAP) {
650
812
  deepkill(o);
651
813
  }
652
814
  else {
653
- o = killspr(body, o, _getobjname, setsolid, deepkill);
815
+ i = killspr(body, i, _getobjname, setsolid, deepkill);
654
816
  continue;
655
817
  }
656
818
  }
657
819
  }
658
820
  else if (o.type === STAMP) {
659
821
  if (o.text === "=>") {
660
- o = unarrow(body, o, killobj, getname_);
822
+ i = unarrow(body, i, deepkill, letname_);
661
823
  continue;
662
824
  }
663
825
  }
664
- o = o.next;
826
+ else if (o.isdigit) {
827
+ if (/^0[^\.]/.test(o.text)) {
828
+ o.text = String(eval(o.text));
829
+ }
830
+ }
831
+ i++;
665
832
  }
666
833
  };
667
834
 
@@ -683,33 +850,51 @@ var unawait = function (body, getname, argname) {
683
850
  return getname("_");
684
851
  }, argname);
685
852
  };
686
- var getsync = function (m) {
687
- if (m.type === SCOPED && m.await) return null;
853
+ var isbreak = function (m) {
854
+ return /^(yield|await|throw)$/.test(m.text) || /^(break|continue)/.test(m.text) && !m.isend;
855
+ }
856
+ var getsync = function (m, killobj) {
857
+ if (m.type === SCOPED && m.await_) return null;
688
858
  var n = skipAssignment(m);
689
859
  while (m !== n) {
690
- if (m.await || m.type === STRAP && /^(yield|await)$/.test(m.text)) return null;
860
+ if (m.type === STRAP && isbreak(m)) return null;
861
+ if (m.length) {
862
+ killobj(m);
863
+ if (m.await_) return null;
864
+ if (hasbreak(m)) return null;
865
+ }
691
866
  m = m.next;
692
867
  }
868
+ return n;
869
+ };
870
+ var hasbreak = function (body) {
871
+ for (var o of body) {
872
+ if (o.type !== STRAP) continue;
873
+ if (isbreak(o)) return true;
874
+ }
875
+ for (var o of body) {
876
+ if (o.length && hasbreak(o)) return true;
877
+ }
878
+ return false;
693
879
  };
694
- var ises3 = function (o) {
880
+ var ises3 = function (o, killobj) {
695
881
  if (o && o.type === SCOPED && o.entry === "{") {
696
- if (!o.await) return false;
882
+ killobj(o);
883
+ if (o.await_) return false;
884
+ if (hasbreak(o)) return false;
697
885
  }
698
886
  else while (o) {
699
- o = getsync(o);
700
- if (o === null) return true;
887
+ o = getsync(o, killobj);
888
+ if (o === null) return false;
701
889
  if (!o || o.type !== STAMP || o.text !== ',') {
702
890
  break;
703
891
  }
704
892
  o = o.next;
705
893
  }
706
- return false;
894
+ return true;
707
895
  }
708
- var unforin = function (o, body, getnewname_) {
896
+ var unforin = function (o, getnewname_, killobj) {
709
897
  // 仅处理有 await 或 yield 的代码
710
- if (!o.await) {
711
- if (!ises3(o.next)) return;
712
- }
713
898
  var m = o.first;
714
899
  var hasdeclare = false;
715
900
  if (m.type === STRAP) {
@@ -718,23 +903,32 @@ var unforin = function (o, body, getnewname_) {
718
903
  }
719
904
  var n = m.next;
720
905
  if (n.type !== STRAP || n.text !== 'in') {
721
- return;
906
+ return false;
907
+ }
908
+ if (ises3(o, killobj) && ises3(o.next, killobj)) return;
909
+ var prev = o.prev;
910
+ while (prev && prev.type === LABEL) prev = prev.prev;
911
+ var pp = prev && prev.prev;
912
+ var ppp = pp && pp.prev;
913
+ if (pp && pp.type === STRAP && pp.text === 'else' ||
914
+ ppp && pp.type === SCOPED && pp.entry === '(' && ppp.type === STRAP && /^(with|for|while|if)$/.test(ppp.text)) {
915
+ var brace = scanner2("{}")[0];
916
+ var nn = skipAssignment(prev);
917
+ var os = splice2(o.queue, prev, nn, brace);
918
+ splice(brace, 0, 0, ...os);
722
919
  }
723
920
  n = n.next;
724
921
  var tname = getnewname_();
725
922
  var sname = getnewname_();
726
923
  var kname = getnewname_();
727
924
  var s = scanner2(`${sname}=`);
728
- insert1(s, null, ...splice1(o, n));
925
+ insert1(s, null, ...splice2(o, n));
729
926
  insert1(s, null,
730
- ...scanner2(`,${tname}=[];for(${kname} in ${sname})${tname}.push(${kname});`)
927
+ ...scanner2(`,${tname}=[];for(${hasdeclare ? 'var ' : ''}${m.text} in ${sname})${tname}.push(${m.text});`)
731
928
  );
732
- insert1(body, o.prev, ...s);
733
- splice1(o, m.next);
734
- splice1(o, m);
735
- insert1(o, o.first, ...scanner2(`${kname}=0;${kname}<${tname}.length`));
736
- var c = scanner2(`(=${tname}[${kname}]);${kname}++`);
737
- insert1(c[0], c[0].first, m);
929
+ insert1(o.queue, o.prev, ...s);
930
+ splice(o, 0, o.length, ...scanner2(`${kname}=0;${kname}<${tname}.length&&`));
931
+ var c = scanner2(`(${m.text}=${tname}[${kname}]);${kname}++`);
738
932
  insert1(o, null, ...c);
739
933
  };
740
934
 
@@ -750,85 +944,92 @@ var unforof = function (o, getnewname, used) {
750
944
  m = m.next;
751
945
  hasdeclare = true;
752
946
  }
753
-
754
947
  var n = m.next;
755
948
  if (n.type !== STRAP || n.text !== 'of') {
756
949
  return o.next;
757
950
  }
758
951
  var f = n.next;
759
- var p = splice1(o, m, m = n)[0];
952
+ var p = splice2(o, m, m = n)[0];
760
953
  if (hasdeclare) {
761
954
  var [d] = getDeclared(p);
762
- insert1(o, m, ...scanner2(d.map(a => a.text).join(",")));
955
+ if (d.length) insert1(o, m, ...scanner2(d.join(",") + ","));
763
956
  }
764
957
  var iname = getnewname();
765
958
  var gname = getnewname();
766
959
  var oname;
767
- if (!f.next && f.type === EXPRESS && !/\./.test(f.text) && used[f.text].length === 1) {
768
- splice1(o, m);
960
+ var useSimpleLoop = !(rootHyper || used.Symbol || hasawait);
961
+ if (!f.next && f.type === EXPRESS && !/\./.test(f.text) && used[f.origin || f.text.replace(/[\.\[][\s\S]*$/, '')].length === 1) {
962
+ splice2(o, m);
769
963
  oname = f.text;
770
964
  }
771
965
  else {
772
966
  oname = getnewname();
773
- splice1(o, n, f);
774
- var mo = splice1(o, f);
775
- insert1(o, null, ...scanner2(`,${oname}=`));
776
- insert1(o, null, ...mo);
967
+ splice2(o, n, f);
968
+ var mo = splice2(o, f);
969
+ if (useSimpleLoop) useSimpleLoop = mo.length === 1 && (mo[0].type === EXPRESS || mo[0].type === SCOPED && mo[0].entry === "[");
970
+ o.push(...scanner2(`${oname}=`));
971
+ o.push(...mo);
972
+ o.push({ type: STAMP, text: ',' });
777
973
  }
778
- insert1(o, null, ...scanner2(`${gname}=${hasawait ? `${oname}[Symbol.asyncGenerator]||${oname}[Symbol.generator]` : `${oname}[Symbol.generator]||${oname}[Symbol.asyncGenerator]`}||Array.prototype[Symbol.asyncGenerator].bind(${oname}),${gname}=${gname}(),${iname}=${hasawait ? "await " : ''}${gname}.next();${p.text}=${iname}.value,!${iname}.done;${iname}=${gname}.next();`));
974
+ if (useSimpleLoop) o.push(...scanner2(`${iname}=0,${gname}=${oname}.length;${iname}<${gname}&&(${createString([p])}=${oname}[${iname}],true);${iname}++`));
975
+ else rootenvs.Symbol = true, o.push(...scanner2(`${gname}=${hasawait ? `${oname}[Symbol.asyncIterator]||${oname}[Symbol.iterator]` : `${oname}[Symbol.iterator]||${oname}[Symbol.asyncIterator]`}||Array.prototype[Symbol.iterator],${gname}=${gname}.call(${oname}),${iname}=${hasawait ? "await " : ''}${gname}.next();!${iname}.done&&(${createString([p])}=${iname}.value,true);${iname}=${gname}.next()`));
976
+ relink(o);
779
977
  };
780
- var unarrow = function (body, o, killobj, getname_) {
978
+ var unarrow = function (body, i, killobj, letname_) {
979
+ var o = body[i];
781
980
  var p = o.prev;
782
981
  var n = o.next;
783
982
  var b = n, h = p;
784
- insert1(body, p || o, ...scanner2("function"));
983
+ var pi = body.lastIndexOf(p, i);
984
+ if (pi < 0) pi = 0;
985
+ body.splice(i, 1);
986
+ body.splice(pi, 0, { type: STRAP, text: 'function' });
987
+ var ni = body.indexOf(n, i);
988
+ if (ni < 0) ni = body.length;
785
989
  if (p && p.type !== SCOPED || p.entry !== "(") {
786
- h = scanner2("()");
787
- insert1(h[0], null, ...splice1(body, p, o));
788
- h = h[0];
789
- insert1(body, o, h);
790
- }
791
- if (n.type !== SCOPED || n.text !== "{") {
792
- var nn = skipAssignment(n);
793
- b = scanner2('{}');
794
- b = b[0];
795
- killarg(h, b, getname_);
796
- insert1(b, null, { type: STRAP, text: "return" });
797
- insert1(b, null, ...splice1(body, n, nn));
798
- insert1(body, o, b);
990
+ h = scanner2("()")[0];
991
+ h.splice(0, 0, ...body.splice(i, 1, h));
992
+ }
993
+ if (n.type !== SCOPED || n.entry !== "{") {
994
+ var nni = skipAssignment(body, ni);
995
+ b = scanner2('{}')[0];
996
+ b.push({ type: STRAP, text: "return" }, ...body.splice(ni, nni - ni, b));
997
+ killarg(h, b, letname_);
799
998
  killobj(b);
999
+ ni = nni;
800
1000
  }
801
- splice1(body, o, o = o && o.next);
802
- return o;
1001
+ else nni = ni + 1;
1002
+ return nni;
803
1003
  };
804
1004
  var getname = function (vars, envs, k) {
805
1005
  if (!(k in vars) && !(k in envs)) return vars[k] = true, k;
806
1006
  var inc = /\d+$/.exec(k);
807
1007
  if (inc) k = k.slice(0, k.length - inc[0].length), inc = 1 + +inc[0];
808
1008
  else inc = 0;
809
- while ((k + inc) in vars) inc++;
1009
+ while ((k + inc) in vars || (k + inc) in envs) inc++;
810
1010
  vars[k + inc] = true;
811
1011
  return k + inc;
812
1012
  };
813
- var killarg = function (head, body, _getname) {
1013
+ var killarg = function (head, body, _getname, setarg = true) {
814
1014
  var argcodes = [];
815
1015
  var o = head.first;
816
1016
  var index = 0;
817
1017
  var collect = 0, cname, anames = [];
1018
+ var namemap = Object.create(null);
818
1019
  while (o) {
819
- var aname;
1020
+ var aname = null;
820
1021
  if (o.type === SCOPED) {
821
1022
  aname = _getname(head.length > 1 ? 'arg' + index : 'arg');
822
- var dec = splice1(head, o, o = o.next, { type: EXPRESS, text: aname });
1023
+ var dec = splice2(head, o, o = o.next, { type: EXPRESS, text: aname });
823
1024
  dec = `${createString(dec)}=${aname}`;
824
1025
  if (/^var\s/.test(argcodes[argcodes.length - 1])) argcodes[argcodes.length - 1] += ',' + dec;
825
1026
  else argcodes.push(`var ` + dec);
826
1027
  }
827
- else if (o.type === EXPRESS) {
1028
+ else if (o.type === EXPRESS || o.type === VALUE) {
828
1029
  aname = o.text;
829
1030
  if (/^\.\.\./.test(aname)) {
830
1031
  cname = aname.replace(/^\.\.\./, '');
831
- splice1(head, o.prev ? o.prev : o, o = o.next);
1032
+ splice2(head, o.prev ? o.prev : o, o = o.next);
832
1033
  collect = index + 1;
833
1034
  continue;
834
1035
  }
@@ -844,10 +1045,11 @@ var killarg = function (head, body, _getname) {
844
1045
  }
845
1046
  var start = o;
846
1047
  while (o && (o.type !== STAMP || o.text !== ',')) o = o.next;
847
- var assign = splice1(head, start, o);
1048
+ var assign = splice2(head, start, o);
848
1049
  argcodes.push(`if(${aname}===undefined)${aname}${createString(assign)}`);
1050
+ if (o) o = o.next;
849
1051
  }
850
-
1052
+ namemap[aname] = true;
851
1053
  }
852
1054
  if (collect > 0) {
853
1055
  collect--;
@@ -859,29 +1061,249 @@ var killarg = function (head, body, _getname) {
859
1061
 
860
1062
  if (cname) argcodes.unshift(`var ${cname}=Array.prototype.slice.call(arguments,${collect}${index > collect ? `,${collect - index}` : ""})`);
861
1063
  }
862
- if (argcodes.length) insert1(body, null, ...scanner2(argcodes.join(";") + ";"));
1064
+ if (argcodes.length && setarg) {
1065
+ if (!body) {
1066
+ var next = head.next;
1067
+ if (next.type === STAMP && /^=>$/.test(next.text)) next = next.next;
1068
+ var end = skipAssignment(next);
1069
+ var body = scanner2(`{${argcodes.join(";")};return}`)[0];
1070
+ while (next !== end) {
1071
+ body.push(next);
1072
+ next = next.next;
1073
+ };
1074
+ relink(body);
1075
+ var hq = head.queue;
1076
+ var i = hq.indexOf(head.next);
1077
+ var j = end ? hq.indexOf(end) : hq.length;
1078
+ splice(hq, i + 1, j - i, body);
1079
+ }
1080
+ else body.unshift(...scanner2(argcodes.join(";") + ";")), relink(body);
1081
+ }
1082
+ return [namemap, argcodes];
863
1083
  };
864
-
1084
+ var revar = function (scoped) {
1085
+ if (!scoped.body) return;
1086
+ var killed = [];
1087
+ var rm = function (o, i) {
1088
+ if (o.type === STRAP && /^(const|let|var)$/.test(o.text)) {
1089
+ var q = o.queue;
1090
+ if (!q) return;
1091
+ var n = o;
1092
+ var s = i, v = o;
1093
+ if (o.next) do {
1094
+ o = n.next;
1095
+ n = o.next;
1096
+ if (n && n.type === STRAP && n.text === 'in') break;
1097
+ if (n && n.text === '=') {
1098
+ n = skipAssignment(n);
1099
+ }
1100
+ else {
1101
+ i = q.indexOf(o.prev, i);
1102
+ var j = n ? q.indexOf(n, i) : q.length;
1103
+ q.splice(i, j - i);
1104
+ }
1105
+ } while (n && n.type === STAMP && n.text === ',');
1106
+ if (q[s] === v) q.splice(s, 1);
1107
+ if (killed.indexOf(q) < 0) killed.push(q);
1108
+ }
1109
+ else if (o.length) {
1110
+ backEach(o, rm);
1111
+ }
1112
+ };
1113
+ backEach(scoped.body, rm);
1114
+ killed.forEach(relink);
1115
+ };
1116
+ var killret = function (body, labels = Object.create(null), gettmpname) {
1117
+ var o = body.first;
1118
+ var breakmap = {};
1119
+ var breakIndex = 4;
1120
+ var tmpname = null;
1121
+ var gettmp = function () {
1122
+ if (tmpname) return tmpname;
1123
+ return tmpname = gettmpname();
1124
+ }
1125
+ var lbls = [];
1126
+ while (o) {
1127
+ var unlabel = false;
1128
+ if (o.type === LABEL) {
1129
+ var lbl = o.text.slice(0, o.text.length - 1);
1130
+ if (!labels[lbl]) {
1131
+ labels[lbl] = true;
1132
+ lbls.push(lbl);
1133
+ }
1134
+ }
1135
+ else if (o.type === SCOPED) {
1136
+ killret(o, labels, gettmpname);
1137
+ if (o.entry === '{') unlabel = true;
1138
+ }
1139
+ else if (o.type === STAMP && o.text === ';') {
1140
+ unlabel = true;
1141
+ }
1142
+ if (unlabel) {
1143
+ for (var lbl of lbls) delete labels[lbl];
1144
+ lbls = [];
1145
+ }
1146
+ if (o.type !== STRAP) {
1147
+ o = o.next;
1148
+ continue;
1149
+ }
1150
+ switch (o.text) {
1151
+ case "function":
1152
+ while (o && o.type !== SCOPED || o.entry !== '{') o = o.next;
1153
+ break;
1154
+ case "return":
1155
+ if (o.next && !o.isend) insert1(body, o.next, ...scanner2(`${gettmp()}=1,`));
1156
+ else insert1(body, o.next, ...scanner2(`${gettmp()}=1,void 0`)), o.isend = false;
1157
+ breakmap[o.text] = 1;
1158
+ break;
1159
+ case "break":
1160
+ case "continue":
1161
+ if (o.next && !o.isend) {
1162
+ var lbl = o.next.text;
1163
+ if (labels[lbl]) break;
1164
+ var k = `${o.text} ${lbl}`;
1165
+ var v = breakmap[k] || breakIndex++;
1166
+ breakmap[k] = [v, o.text, o.next];
1167
+ splice2(body, o.next, o.next.next, ...scanner2(`${gettmp()}=${v}`));
1168
+ }
1169
+ else {
1170
+ if (labels[o.text]) break;
1171
+ var v = breakmap[o.text] = o.text === 'break' ? 2 : 3;
1172
+ insert1(body, o.next, ...scanner2(`${gettmp()}=${v}`));
1173
+ o.isend = false;
1174
+ }
1175
+ o.text = 'return';
1176
+ break;
1177
+ case "for":
1178
+ case "do":
1179
+ case "while":
1180
+ if (!labels.continue) {
1181
+ lbls.push('continue');
1182
+ labels.continue = true;
1183
+ }
1184
+ case "switch":
1185
+ if (!labels.break) {
1186
+ labels.break = true;
1187
+ lbls.push('break');
1188
+ }
1189
+ break;
1190
+ }
1191
+ o = o.next;
1192
+ }
1193
+ return breakmap;
1194
+ }
865
1195
  var down = function (scoped) {
1196
+ var inAsync = scoped.async;
1197
+ var inAster = scoped.yield;
1198
+ var funcMark = [, "aster_", "async_", "asyncAster_"][inAsync << 1 | inAster];
1199
+ if (funcMark) rootenvs[funcMark] = true;
866
1200
  var vars = Object.assign(Object.create(null), scoped.vars);
1201
+ var envs = Object.assign(Object.create(null), scoped.envs);
867
1202
  var objnames = [];
868
1203
 
869
- var _getname = getname.bind(null, vars, scoped.envs);
1204
+ var _getname = getname.bind(null, vars, envs);
1205
+ var _letname = getname.bind(null, envs, vars);
870
1206
  var gettmpname = function (i = 0) {
871
1207
  if (!objnames[i]) objnames[i] = _getname("_");
872
1208
  return objnames[i];
873
1209
  };
874
- var killvar = function (scoped) {
875
- if (!scoped.body) return;
1210
+ var letnames = [];
1211
+ var getletname = function (i = 0) {
1212
+ if (!letnames[i]) letnames[i] = _letname("_");
1213
+ return letnames[i];
876
1214
  };
877
1215
  // let 转 var
878
1216
  var killlet = function (scoped) {
1217
+ if (!scoped.lets || scoped.isfunc) return;
879
1218
  for (var k in scoped.lets) {
880
- var nk = _getname(k);
881
- if (nk !== k) rename(scoped.used, k, nk);
1219
+ var nk = _letname(k);
1220
+ if (nk !== k) {
1221
+ delete scoped.lets[k];
1222
+ scoped.lets[nk] = true;
1223
+ rename(scoped.used, k, nk);
1224
+ }
1225
+ }
1226
+ var lets = Object.keys(scoped.lets);
1227
+ var hasChildFunc = false;
1228
+ var checkScope = function (s) {
1229
+ if (s.length) {
1230
+ for (var c of s) {
1231
+ if (hasChildFunc) return;
1232
+ checkScope(c);
1233
+ }
1234
+ }
1235
+ if (!s.isfunc) return;
1236
+ var sused = s.used;
1237
+ for (var k of lets) {
1238
+ if (k in sused) {
1239
+ hasChildFunc = true;
1240
+ break;
1241
+ }
1242
+ }
1243
+ };
1244
+ checkScope(scoped);
1245
+ if (!hasChildFunc) return;
1246
+ var tmp0 = _getname("tmp");
1247
+ var tmp1 = null;
1248
+ var wrapper = scanner2(`(${inAsync ? 'async ' : ''}function${inAster ? "*" : ''}(${lets}){}(${lets}))`)[0];
1249
+ var body = scoped.body;
1250
+ var bp = body.prev;
1251
+ var bn = body.next;
1252
+ var bq = body.queue;
1253
+ var bpp = bp && bp.prev;
1254
+ var isswitch = bp && bp.type === SCOPED && bp.entry === '(' && bpp && bpp.type === STRAP && bpp.text === 'switch';
1255
+ var wbody = wrapper[wrapper.length - 2];
1256
+ for (var k of lets) vars[k] = true, delete envs[k];
1257
+ backEach(body, function (o, i) {
1258
+ if (o.type === STRAP && /^(const|let|var)$/.test(o.text)) splice(body, i, 1);
1259
+ });
1260
+ if (isswitch) splice(wbody, 0, 0, bpp, bp, body);
1261
+ else splice(wrapper, wrapper.length - 2, 1, body), wbody = body;
1262
+ var retmap = killret(wbody, scoped.lets, function () {
1263
+ if (!tmp0) tmp0 = _getname("tmp");
1264
+ return tmp0;
1265
+ });
1266
+ var hasret = false;
1267
+ for (var k in retmap) {
1268
+ hasret = true;
1269
+ break;
1270
+ }
1271
+ var pre = [];
1272
+ var fix = [];
1273
+ if (hasret) {
1274
+ pre.push({ text: 'if', type: STRAP });
1275
+ fix = scanner2('{}');
1276
+ var fix0 = fix[0];
1277
+ for (var k in retmap) {
1278
+ var v = retmap[k];
1279
+ if (v === 1) {
1280
+ if (!tmp1) tmp1 = _getname('tmp');
1281
+ fix0.push(...scanner2(`if(${tmp0}===${v}) return ${tmp1}`), { text: ';', type: STAMP });
1282
+ }
1283
+ else if (v === 2 || v === 3) {
1284
+ fix0.push(...scanner2(`if(${tmp0}===${v}) ${k}`), { text: ';', type: STAMP });
1285
+ }
1286
+ else {
1287
+ fix0.push(...scanner2(`if(${tmp0}===${v[0]}) ${v[1]}`), v[2], { text: ';', type: STAMP });
1288
+ }
1289
+ }
1290
+ wrapper.unshift(...scanner2(`${tmp0}=0,${tmp1 ? tmp1 + '=' : ''}`));
1291
+ }
1292
+ if (!pre.length && bn && !(bn.type === STAMP && /^[,;]/.test(bn.text))) fix.push({ type: SPACE, text: ';' });
1293
+ if (isswitch) {
1294
+ splice2(bq, bpp, bn, ...pre, wrapper, ...fix);
1295
+ }
1296
+ else if (body.entry === '{' && (!bp || !bpp && (bp.type !== STRAP || !/^(do|try)$/.test(bp.text)) || bp.type === SCOPED && bp.entry === '(' && bpp && bpp.type === STRAP || bp.type === LABEL)) {
1297
+ splice2(bq, body, bn, ...pre, wrapper, ...fix);
1298
+ }
1299
+ else {
1300
+ var wrap = scanner2('{}')[0];
1301
+ splice(wrap, 0, 0, wrapper);
1302
+ splice2(bq, body, bn, wrap);
882
1303
  }
883
1304
  };
884
1305
  var precode = function (text) {
1306
+ if (!scoped.body) return;
885
1307
  var codelist = typeof text === 'string' ? scanner2(text) : text;
886
1308
  var first = codelist[0];
887
1309
  var last = codelist[codelist.length - 1];
@@ -893,7 +1315,6 @@ var down = function (scoped) {
893
1315
  scoped.body.unshift.apply(scoped.body, codelist);
894
1316
  };
895
1317
 
896
- var argcodes = [];
897
1318
  var solidmap = {};
898
1319
  var setsolid = function (q, o) {
899
1320
  var k = o.text;
@@ -913,17 +1334,23 @@ var down = function (scoped) {
913
1334
  }
914
1335
  o.text = solidmap[k] + c;
915
1336
  };
916
- if (scoped.used.this) {
1337
+ var markcodes = [];
1338
+ if (scoped.isfunc && scoped.used.this && (funcMark || scoped.insett)) {
917
1339
  let tn = _getname("this_");
918
1340
  rename(scoped.used, "this", tn);
919
- argcodes.push(`var ${tn}=this;`);
1341
+ scoped.used.this.forEach(o => o.origin = 'this');
1342
+ markcodes.push(`${tn}=this`);
920
1343
  }
921
- if (scoped.used.arguments) {
1344
+ if (scoped.isfunc && scoped.used.arguments && (funcMark || scoped.inseta)) {
922
1345
  let an = _getname("arguments_");
1346
+ scoped.used.arguments.forEach(o => o.origin = 'arguments');
923
1347
  rename(scoped.used, "arguments", an);
924
- argcodes.push(`var ${an}=arguments;`);
1348
+ markcodes.push(`${an}=arguments`);
925
1349
  }
926
1350
  var fordeep = 0;
1351
+ var _killobj = function (_getlocal, o) {
1352
+ return killobj(o, gettmpname, getletname, _getlocal, _letname, setsolid);
1353
+ };
927
1354
  var kill = function (scoped, _, body) {
928
1355
  if (scoped.isfunc) return down(scoped);
929
1356
  killlet(scoped);
@@ -932,45 +1359,62 @@ var down = function (scoped) {
932
1359
  var getdeepname = function () {
933
1360
  return gettmpname(--fordeep);
934
1361
  };
1362
+ var killed = false;
935
1363
  a: if (scoped.head) {
936
1364
  var hp = scoped.head.prev;
937
1365
  if (hp && hp.type === STRAP) {
938
1366
  if (hp.text === 'for') {
939
1367
  unforof(scoped.head, getdeepname, scoped.used);
940
- unforin(scoped.head, body, getdeepname);
1368
+ killed = unforin(scoped.head, getdeepname, _killobj.bind(null, _getlocal)) !== false;
941
1369
  // unforcx(scoped.head, getdeepname);
942
1370
  }
943
1371
  else if (hp.text === 'catch') {
944
- killarg(scoped.head, scoped.body, _getname);
1372
+ killarg(scoped.head, scoped.body, _letname);
945
1373
  break a;
946
1374
  }
947
1375
  }
948
- killobj(scoped.head, gettmpname, _getlocal, setsolid);
1376
+ if (!killed) _killobj(_getlocal, scoped.head);
949
1377
  }
950
- if (scoped.body) killobj(scoped.body, gettmpname, _getlocal, setsolid);
1378
+ if (!killed && scoped.body) _killobj(_getlocal, scoped.body);
951
1379
  if (scoped.length) scoped.forEach(kill);
952
1380
  fordeep = saveddeep;
953
1381
  };
954
1382
  if (scoped.isfunc) {
955
- killlet(scoped);
956
- if (scoped.head) killarg(scoped.head, scoped.body, _getname);
957
- if (argcodes.length) precode(argcodes.join(";") + ";");
958
- if (scoped.body) scoped.body.keeplet = false, killobj(scoped.body, gettmpname, _getname, setsolid);
1383
+ if (scoped.head) var [argsmap, argcodes] = killarg(scoped.head, scoped.body, _letname, false);
1384
+ else argcodes = [];
1385
+ if ((markcodes.length || argcodes.length) && !funcMark) precode(markcodes.concat(argcodes).join(";") + ";");
1386
+ if (scoped.body) scoped.body.keeplet = false, _killobj(_getname, scoped.body);
1387
+
959
1388
  scoped.forEach(kill);
960
- if (scoped.async || scoped.yield) {
961
- var argname = _getname("_");
1389
+ if (funcMark) {
1390
+ var argname = _letname("_");
1391
+ unstruct.debug = downLevel.debug;
962
1392
  var code = unawait(scoped.body, _getname, argname);
963
- var body = scanner2(`return ${[, "aster_", "async_", "asyncAster_"][scoped.async << 1 | scoped.yield]}()`);
1393
+ var body = scanner2(`return ${funcMark}()`);
964
1394
  code.forEach(function (c) {
965
- var f = scanner2(`function(${body[2].length ? argname : ''}){}`);
966
- if (!c.length) insert1(f[2], null, ...scanner2('return []'));
967
- else insert1(f[2], null, ...c);
968
- if (body[2].length) insert1(body[2], null, { type: STAMP, text: "," });
969
- insert1(body[2], null, ...f);
1395
+ var f = scanner2(`function(${c.awaited ? argname : ''}){\r\n}`);
1396
+ if (!c.length) f[2].push(...scanner2('return [1,0]'));
1397
+ else f[2].push(...c);
1398
+ f[2].push({ type: SPACE, text: "\r\n" });
1399
+ if (body[2].length) body[2].push({ type: STAMP, text: "," });
1400
+ body[2].push({ type: SPACE, text: '\r\n' }, ...f);
970
1401
  });
971
- scoped.body.splice(0, scoped.body.length);
972
- insert1(scoped.body, null, ...body);
1402
+ splice(scoped.body, 0, scoped.body.length);
1403
+ if (markcodes.length || argcodes.length) {
1404
+ splice(scoped.body, 0, 0, ...scanner2(markcodes.concat(argcodes).join(';') + ";\r\n"));
1405
+ }
1406
+ splice(scoped.body, scoped.body.length, 0, ...body);
1407
+ for (var k in envs) if (!(k in scoped.envs)) vars[k] = true;
1408
+ delete vars[argname];
1409
+ revar(scoped);
1410
+ scoped.vars = Object.create(null);
1411
+ scoped.async = false;
1412
+ scoped.yield = false;
973
1413
  }
1414
+ var vars1 = Object.keys(vars).filter(k => !(k in scoped.vars));
1415
+ if (argsmap) vars1 = vars1.filter(k => !(k in argsmap));
1416
+ if (vars1.length && scoped.body) scoped.body.push(...scanner2(`\r\nvar ${vars1}`));
1417
+ if (scoped.body) relink(scoped.body);
974
1418
  }
975
1419
  else {
976
1420
  kill(scoped);
@@ -981,7 +1425,15 @@ var down = function (scoped) {
981
1425
  */
982
1426
  function downLevel(data) {
983
1427
  var code = scanner2(data);
984
- down(code.scoped);
1428
+ code = downcode(code);
985
1429
  return code.toString();
986
1430
  }
1431
+ var downcode = downLevel.code = function (code) {
1432
+ rootenvs = code.envs;
1433
+ rootHyper = rootenvs.Symbol || code.yield || code.async;
1434
+ down(code.scoped);
1435
+ code.keepcolor = false;
1436
+ rootenvs = null;
1437
+ return code;
1438
+ };
987
1439
  module.exports = downLevel;