xbintsc 0.3.3 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/ast/expressions.d.ts +8 -0
- package/dist/src/binder/binder.js +1 -0
- package/dist/src/binder/binder.js.map +1 -1
- package/dist/src/binder/references.d.ts +1 -1
- package/dist/src/binder/references.js +34 -5
- package/dist/src/binder/references.js.map +1 -1
- package/dist/src/binder/types.d.ts +4 -0
- package/dist/src/binder/types.js.map +1 -1
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/codegen/generator/calls/access.d.ts +9 -1
- package/dist/src/codegen/generator/calls/access.js +146 -13
- package/dist/src/codegen/generator/calls/access.js.map +1 -1
- package/dist/src/codegen/generator/calls/closures.d.ts +1 -0
- package/dist/src/codegen/generator/calls/closures.js +25 -0
- package/dist/src/codegen/generator/calls/closures.js.map +1 -1
- package/dist/src/codegen/generator/calls/invocation.js +12 -1
- package/dist/src/codegen/generator/calls/invocation.js.map +1 -1
- package/dist/src/codegen/generator/calls/literals.js +12 -4
- package/dist/src/codegen/generator/calls/literals.js.map +1 -1
- package/dist/src/codegen/generator/calls/super.js +4 -7
- package/dist/src/codegen/generator/calls/super.js.map +1 -1
- package/dist/src/codegen/generator/context.d.ts +21 -2
- package/dist/src/codegen/generator/context.js +42 -5
- package/dist/src/codegen/generator/context.js.map +1 -1
- package/dist/src/codegen/generator/expressions/assignment.js +1 -3
- package/dist/src/codegen/generator/expressions/assignment.js.map +1 -1
- package/dist/src/codegen/generator/expressions/primary.d.ts +3 -1
- package/dist/src/codegen/generator/expressions/primary.js +99 -1
- package/dist/src/codegen/generator/expressions/primary.js.map +1 -1
- package/dist/src/codegen/generator/generator.js.map +1 -1
- package/dist/src/codegen/generator/module.js +25 -15
- package/dist/src/codegen/generator/module.js.map +1 -1
- package/dist/src/codegen/generator/state.d.ts +15 -0
- package/dist/src/codegen/generator/state.js +28 -1
- package/dist/src/codegen/generator/state.js.map +1 -1
- package/dist/src/codegen/generator/statements/control-flow.d.ts +3 -1
- package/dist/src/codegen/generator/statements/control-flow.js +85 -0
- package/dist/src/codegen/generator/statements/control-flow.js.map +1 -1
- package/dist/src/codegen/generator/statements/dispatch.js +15 -6
- package/dist/src/codegen/generator/statements/dispatch.js.map +1 -1
- package/dist/src/codegen/generator/statements/loops.d.ts +3 -0
- package/dist/src/codegen/generator/statements/loops.js +25 -11
- package/dist/src/codegen/generator/statements/loops.js.map +1 -1
- package/dist/src/codegen/generator/tables.d.ts +7 -0
- package/dist/src/codegen/generator/tables.js +41 -1
- package/dist/src/codegen/generator/tables.js.map +1 -1
- package/dist/src/driver/compiler.d.ts +1 -1
- package/dist/src/driver/compiler.js +33 -1
- package/dist/src/driver/compiler.js.map +1 -1
- package/dist/src/driver/modules.d.ts +4 -3
- package/dist/src/driver/modules.js +61 -4
- package/dist/src/driver/modules.js.map +1 -1
- package/dist/src/driver/toolchain.js +1 -1
- package/dist/src/driver/toolchain.js.map +1 -1
- package/dist/src/lexer/scanner.js.map +1 -1
- package/dist/src/parser/declarations/classes.js +4 -0
- package/dist/src/parser/declarations/classes.js.map +1 -1
- package/dist/src/parser/declarations/type-members.js.map +1 -1
- package/dist/src/parser/expressions.d.ts +2 -1
- package/dist/src/parser/expressions.js +10 -1
- package/dist/src/parser/expressions.js.map +1 -1
- package/dist/src/parser/helpers.js +2 -2
- package/dist/src/parser/helpers.js.map +1 -1
- package/dist/src/parser/literals.js +79 -6
- package/dist/src/parser/literals.js.map +1 -1
- package/dist/src/parser/modules.js.map +1 -1
- package/dist/src/parser/parser.js +0 -1
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/parser/statements.d.ts +1 -0
- package/dist/src/parser/statements.js +13 -1
- package/dist/src/parser/statements.js.map +1 -1
- package/dist/src/parser/types.js +2 -2
- package/dist/src/parser/types.js.map +1 -1
- package/dist/tests/ast/factory.test.d.ts +1 -0
- package/dist/tests/ast/factory.test.js +35 -0
- package/dist/tests/ast/factory.test.js.map +1 -0
- package/dist/tests/ast/visitor.test.d.ts +1 -0
- package/dist/tests/ast/visitor.test.js +53 -0
- package/dist/tests/ast/visitor.test.js.map +1 -0
- package/dist/tests/cli/main.test.js +109 -9
- package/dist/tests/cli/main.test.js.map +1 -1
- package/dist/tests/codegen/closures.test.d.ts +1 -0
- package/dist/tests/codegen/closures.test.js +32 -0
- package/dist/tests/codegen/closures.test.js.map +1 -0
- package/dist/tests/codegen/expressions.test.d.ts +1 -0
- package/dist/tests/codegen/expressions.test.js +149 -0
- package/dist/tests/codegen/expressions.test.js.map +1 -0
- package/dist/tests/codegen/llvm.test.js +14 -0
- package/dist/tests/codegen/llvm.test.js.map +1 -1
- package/dist/tests/codegen/values.test.d.ts +1 -0
- package/dist/tests/codegen/values.test.js +48 -0
- package/dist/tests/codegen/values.test.js.map +1 -0
- package/dist/tests/diagnostics/diagnostic.test.d.ts +1 -0
- package/dist/tests/diagnostics/diagnostic.test.js +117 -0
- package/dist/tests/diagnostics/diagnostic.test.js.map +1 -0
- package/dist/tests/diagnostics/source.test.d.ts +1 -0
- package/dist/tests/diagnostics/source.test.js +58 -0
- package/dist/tests/diagnostics/source.test.js.map +1 -0
- package/dist/tests/driver/modules.test.d.ts +1 -0
- package/dist/tests/driver/modules.test.js +140 -0
- package/dist/tests/driver/modules.test.js.map +1 -0
- package/dist/tests/driver/paths.test.js +17 -1
- package/dist/tests/driver/paths.test.js.map +1 -1
- package/dist/tests/driver/runtime-lib.test.d.ts +1 -0
- package/dist/tests/driver/runtime-lib.test.js +19 -0
- package/dist/tests/driver/runtime-lib.test.js.map +1 -0
- package/dist/tests/driver/toolchain-provider.test.js +91 -0
- package/dist/tests/driver/toolchain-provider.test.js.map +1 -1
- package/dist/tests/driver/toolchain.test.js +11 -1
- package/dist/tests/driver/toolchain.test.js.map +1 -1
- package/dist/tests/e2e/compile-node.test.js +14 -1
- package/dist/tests/e2e/compile-node.test.js.map +1 -1
- package/dist/tests/e2e/compile.test.js +465 -2
- package/dist/tests/e2e/compile.test.js.map +1 -1
- package/dist/tests/e2e/differential.test.d.ts +7 -0
- package/dist/tests/e2e/differential.test.js +581 -0
- package/dist/tests/e2e/differential.test.js.map +1 -0
- package/dist/tests/e2e/harness.d.ts +21 -0
- package/dist/tests/e2e/harness.js +26 -0
- package/dist/tests/e2e/harness.js.map +1 -1
- package/dist/tests/extensions/node.test.d.ts +1 -0
- package/dist/tests/extensions/node.test.js +32 -0
- package/dist/tests/extensions/node.test.js.map +1 -0
- package/dist/tests/lexer/identifiers.test.d.ts +1 -0
- package/dist/tests/lexer/identifiers.test.js +13 -0
- package/dist/tests/lexer/identifiers.test.js.map +1 -0
- package/dist/tests/lexer/numbers.test.d.ts +1 -0
- package/dist/tests/lexer/numbers.test.js +23 -0
- package/dist/tests/lexer/numbers.test.js.map +1 -0
- package/dist/tests/lexer/strings.test.d.ts +1 -0
- package/dist/tests/lexer/strings.test.js +72 -0
- package/dist/tests/lexer/strings.test.js.map +1 -0
- package/dist/tests/parser/declarations.test.d.ts +1 -0
- package/dist/tests/parser/declarations.test.js +70 -0
- package/dist/tests/parser/declarations.test.js.map +1 -0
- package/dist/tests/parser/expressions.test.d.ts +1 -0
- package/dist/tests/parser/expressions.test.js +47 -0
- package/dist/tests/parser/expressions.test.js.map +1 -0
- package/dist/tests/parser/helpers.test.d.ts +1 -0
- package/dist/tests/parser/helpers.test.js +58 -0
- package/dist/tests/parser/helpers.test.js.map +1 -0
- package/dist/tests/parser/literals.test.d.ts +1 -0
- package/dist/tests/parser/literals.test.js +70 -0
- package/dist/tests/parser/literals.test.js.map +1 -0
- package/dist/tests/parser/module-syntax.test.d.ts +1 -0
- package/dist/tests/parser/module-syntax.test.js +91 -0
- package/dist/tests/parser/module-syntax.test.js.map +1 -0
- package/dist/tests/parser/statements.test.d.ts +1 -0
- package/dist/tests/parser/statements.test.js +85 -0
- package/dist/tests/parser/statements.test.js.map +1 -0
- package/dist/tests/parser/type-members.test.d.ts +1 -0
- package/dist/tests/parser/type-members.test.js +86 -0
- package/dist/tests/parser/type-members.test.js.map +1 -0
- package/dist/tests/parser/types.test.d.ts +1 -0
- package/dist/tests/parser/types.test.js +143 -0
- package/dist/tests/parser/types.test.js.map +1 -0
- package/package.json +6 -1
- package/runtime/ext_node/fs/fs_ops.c +36 -1
- package/runtime/rt.h +17 -0
- package/runtime/rt_internal.h +88 -2
- package/runtime/xt_builtins.c +174 -6
- package/runtime/xt_containers.c +234 -42
- package/runtime/xt_generator.c +304 -0
- package/runtime/xt_io.c +170 -30
- package/runtime/xt_promise.c +6 -1
- package/runtime/xt_regex.h +105 -35
- package/runtime/xt_stdlib/dispatch.inc +255 -4
- package/runtime/xt_stdlib/strings.inc +17 -13
- package/runtime/xt_stdlib2/arrays.inc +126 -19
- package/runtime/xt_stdlib2/date.inc +9 -2
- package/runtime/xt_stdlib2/error.inc +162 -12
- package/runtime/xt_stdlib2/helpers.inc +4 -0
- package/runtime/xt_stdlib2/json.inc +19 -6
- package/runtime/xt_stdlib2/number-string-statics.inc +1 -1
- package/runtime/xt_stdlib2/numbers.inc +4 -5
- package/runtime/xt_stdlib2/objects.inc +29 -0
- package/runtime/xt_stdlib2/regexp-match.inc +293 -51
- package/runtime/xt_stdlib2/set.inc +58 -2
- package/runtime/xt_stdlib2/strings.inc +38 -0
- package/runtime/xt_symbol.c +149 -0
- package/runtime/xt_values.c +221 -15
- package/scripts/build-runtime.ts +1 -1
- package/src/ast/expressions.ts +8 -0
- package/src/binder/binder.ts +1 -1
- package/src/binder/references.ts +47 -4
- package/src/binder/types.ts +4 -0
- package/src/cli/main.ts +1 -2
- package/src/codegen/generator/calls/access.ts +158 -13
- package/src/codegen/generator/calls/closures.ts +24 -0
- package/src/codegen/generator/calls/invocation.ts +11 -1
- package/src/codegen/generator/calls/literals.ts +10 -4
- package/src/codegen/generator/calls/super.ts +6 -9
- package/src/codegen/generator/context.ts +44 -7
- package/src/codegen/generator/expressions/assignment.ts +1 -3
- package/src/codegen/generator/expressions/primary.ts +108 -2
- package/src/codegen/generator/generator.ts +0 -1
- package/src/codegen/generator/module.ts +24 -18
- package/src/codegen/generator/state.ts +44 -1
- package/src/codegen/generator/statements/control-flow.ts +86 -0
- package/src/codegen/generator/statements/dispatch.ts +18 -6
- package/src/codegen/generator/statements/loops.ts +29 -11
- package/src/codegen/generator/tables.ts +44 -1
- package/src/driver/compiler.ts +32 -2
- package/src/driver/modules.ts +64 -4
- package/src/driver/toolchain.ts +1 -1
- package/src/lexer/scanner.ts +0 -1
- package/src/parser/declarations/classes.ts +4 -0
- package/src/parser/declarations/type-members.ts +0 -2
- package/src/parser/expressions.ts +13 -1
- package/src/parser/helpers.ts +2 -2
- package/src/parser/literals.ts +82 -7
- package/src/parser/modules.ts +0 -1
- package/src/parser/parser.ts +0 -1
- package/src/parser/statements.ts +14 -0
- package/src/parser/types.ts +2 -2
|
@@ -81,7 +81,25 @@ describeE2E("end-to-end compilation", (harness) => {
|
|
|
81
81
|
const user = { name: "ada", tags: ["math", "code"], age: 36 };
|
|
82
82
|
console.log(user);
|
|
83
83
|
`;
|
|
84
|
-
expect(runProgram(source)).toBe("{ name: ada, tags: [ math, code ], age: 36 }");
|
|
84
|
+
expect(runProgram(source)).toBe("{ name: 'ada', tags: [ 'math', 'code' ], age: 36 }");
|
|
85
|
+
});
|
|
86
|
+
it("orders object keys like JavaScript", () => {
|
|
87
|
+
const source = `
|
|
88
|
+
console.log(JSON.stringify({ b: 1, a: 2, 10: 3, 2: 4 }));
|
|
89
|
+
const o: any = {};
|
|
90
|
+
o.z = 1; o[5] = 2; o.a = 3; o[1] = 4; o["01"] = 5; o[100] = 6;
|
|
91
|
+
console.log(Object.keys(o).join(" "));
|
|
92
|
+
let seen = "";
|
|
93
|
+
for (const k in o) seen += k + ",";
|
|
94
|
+
console.log(seen);
|
|
95
|
+
console.log(JSON.stringify(Object.fromEntries([["b", 1], ["2", 2], ["a", 3]])));
|
|
96
|
+
`;
|
|
97
|
+
expect(runProgram(source)).toBe([
|
|
98
|
+
'{"2":4,"10":3,"b":1,"a":2}',
|
|
99
|
+
"1 5 100 z a 01",
|
|
100
|
+
"1,5,100,z,a,01,",
|
|
101
|
+
'{"2":2,"b":1,"a":3}',
|
|
102
|
+
].join("\n"));
|
|
85
103
|
});
|
|
86
104
|
it("supports switch statements with fall-through", () => {
|
|
87
105
|
const source = `
|
|
@@ -201,16 +219,250 @@ describeE2E("end-to-end compilation", (harness) => {
|
|
|
201
219
|
`;
|
|
202
220
|
expect(runProgram(source)).toBe("10 -1 try;catch:boom;finally");
|
|
203
221
|
});
|
|
222
|
+
it("runs finally blocks on early return, break and continue", () => {
|
|
223
|
+
const source = `
|
|
224
|
+
const events: string[] = [];
|
|
225
|
+
function f(n: number): string {
|
|
226
|
+
try {
|
|
227
|
+
events.push("try" + n);
|
|
228
|
+
if (n === 1) return "ret1";
|
|
229
|
+
if (n === 2) throw "boom" + n;
|
|
230
|
+
} catch (e) {
|
|
231
|
+
events.push("catch" + e);
|
|
232
|
+
if (n === 3) return "ret3";
|
|
233
|
+
} finally {
|
|
234
|
+
events.push("finally" + n);
|
|
235
|
+
}
|
|
236
|
+
return "done" + n;
|
|
237
|
+
}
|
|
238
|
+
console.log(f(0), f(1), f(2), f(3));
|
|
239
|
+
console.log(events.join("|"));
|
|
240
|
+
const loop: string[] = [];
|
|
241
|
+
for (let i = 0; i < 5; i++) {
|
|
242
|
+
try {
|
|
243
|
+
if (i === 2) break;
|
|
244
|
+
if (i === 4) continue;
|
|
245
|
+
loop.push("i" + i);
|
|
246
|
+
} finally {
|
|
247
|
+
loop.push("F" + i);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
console.log(loop.join("|"));
|
|
251
|
+
function nested(): string {
|
|
252
|
+
try {
|
|
253
|
+
try {
|
|
254
|
+
return "inner";
|
|
255
|
+
} finally {
|
|
256
|
+
events.push("innerFinally");
|
|
257
|
+
}
|
|
258
|
+
} finally {
|
|
259
|
+
events.push("outerFinally");
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
console.log(nested(), events[events.length - 2], events[events.length - 1]);
|
|
263
|
+
`;
|
|
264
|
+
expect(runProgram(source)).toBe([
|
|
265
|
+
"done0 ret1 done2 done3",
|
|
266
|
+
"try0|finally0|try1|finally1|try2|catchboom2|finally2|try3|finally3",
|
|
267
|
+
"i0|F0|i1|F1|F2",
|
|
268
|
+
"inner innerFinally outerFinally",
|
|
269
|
+
].join("\n"));
|
|
270
|
+
});
|
|
271
|
+
it("implements abstract equality with ToPrimitive", () => {
|
|
272
|
+
const source = `
|
|
273
|
+
console.log(([] as any) == 0, ([] as any) == "", ([1] as any) == 1, ([1, 2] as any) == "1,2");
|
|
274
|
+
console.log(({} as any) == "[object Object]");
|
|
275
|
+
console.log(([1] as any) == [1], ([] as any) == false, ([] as any) == null);
|
|
276
|
+
console.log(0 == "0", 0 == false, "" == false, null == undefined, null == 0, undefined == 0);
|
|
277
|
+
console.log(NaN == NaN, (1 as any) == "1");
|
|
278
|
+
`;
|
|
279
|
+
expect(runProgram(source)).toBe([
|
|
280
|
+
"true true true true",
|
|
281
|
+
"true",
|
|
282
|
+
"false true false",
|
|
283
|
+
"true true true true false false",
|
|
284
|
+
"false true",
|
|
285
|
+
].join("\n"));
|
|
286
|
+
});
|
|
287
|
+
it("supports labeled break and continue across nested loops", () => {
|
|
288
|
+
const source = `
|
|
289
|
+
const out: string[] = [];
|
|
290
|
+
outer: for (let i = 0; i < 3; i++) {
|
|
291
|
+
inner: for (let j = 0; j < 3; j++) {
|
|
292
|
+
if (j === 1) continue outer;
|
|
293
|
+
if (i === 2) break outer;
|
|
294
|
+
out.push(i + "," + j);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
block: {
|
|
298
|
+
out.push("before");
|
|
299
|
+
if (out.length > 0) break block;
|
|
300
|
+
out.push("unreachable");
|
|
301
|
+
}
|
|
302
|
+
out.push("after");
|
|
303
|
+
function f(): number {
|
|
304
|
+
let total = 0;
|
|
305
|
+
loop: for (let i = 0; i < 5; i++) {
|
|
306
|
+
try {
|
|
307
|
+
if (i === 2) continue loop;
|
|
308
|
+
if (i === 4) break loop;
|
|
309
|
+
total += i;
|
|
310
|
+
} finally {
|
|
311
|
+
total += 100;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return total;
|
|
315
|
+
}
|
|
316
|
+
console.log(out.join("|"), f());
|
|
317
|
+
`;
|
|
318
|
+
expect(runProgram(source)).toBe("0,0|1,0|before|after 504");
|
|
319
|
+
});
|
|
320
|
+
it("supports #private fields, methods and static members", () => {
|
|
321
|
+
const source = `
|
|
322
|
+
class Counter {
|
|
323
|
+
#count = 0;
|
|
324
|
+
static #instances = 0;
|
|
325
|
+
constructor() { Counter.#bumpStatic(); }
|
|
326
|
+
#bump(by: number): void { this.#count += by; }
|
|
327
|
+
static #bumpStatic(): void { Counter.#instances++; }
|
|
328
|
+
inc(by: number): number { this.#bump(by); return this.#count; }
|
|
329
|
+
get count(): number { return this.#count; }
|
|
330
|
+
set count(v: number) { this.#count = v; }
|
|
331
|
+
static instances(): number { return Counter.#instances; }
|
|
332
|
+
}
|
|
333
|
+
class Sub extends Counter {
|
|
334
|
+
#label = "sub";
|
|
335
|
+
constructor() { super(); this.inc(5); }
|
|
336
|
+
describe(): string { return this.#label + ":" + this.count; }
|
|
337
|
+
}
|
|
338
|
+
const a = new Counter();
|
|
339
|
+
const b = new Counter();
|
|
340
|
+
a.inc(3);
|
|
341
|
+
a.count = 10;
|
|
342
|
+
console.log(a.count, b.count, Counter.instances());
|
|
343
|
+
console.log(new Sub().describe());
|
|
344
|
+
`;
|
|
345
|
+
expect(runProgram(source)).toBe("10 0 2\nsub:5");
|
|
346
|
+
});
|
|
347
|
+
it("encodes and decodes URIs like the specification", () => {
|
|
348
|
+
const source = `
|
|
349
|
+
console.log(encodeURI("a/b?c=d&e#f"), encodeURIComponent("a/b?c=d&e#f"));
|
|
350
|
+
console.log(encodeURI("café"), encodeURIComponent("😀 中文"));
|
|
351
|
+
console.log(decodeURI("%2f%2F"), decodeURIComponent("a%23b"));
|
|
352
|
+
console.log(decodeURIComponent("%C3%A9"), decodeURIComponent("%F0%9F%98%80"));
|
|
353
|
+
console.log(typeof encodeURIComponent, typeof decodeURI);
|
|
354
|
+
try { decodeURIComponent("%E0%80%80"); } catch (e) { console.log(String(e)); }
|
|
355
|
+
`;
|
|
356
|
+
expect(runProgram(source)).toBe([
|
|
357
|
+
"a/b?c=d&e#f a%2Fb%3Fc%3Dd%26e%23f",
|
|
358
|
+
"caf%C3%A9 %F0%9F%98%80%20%E4%B8%AD%E6%96%87",
|
|
359
|
+
"%2f%2F a#b",
|
|
360
|
+
"é 😀",
|
|
361
|
+
"function function",
|
|
362
|
+
"URIError: URI malformed",
|
|
363
|
+
].join("\n"));
|
|
364
|
+
});
|
|
365
|
+
it("exposes RegExp capture groups in exec, match, replace and split", () => {
|
|
366
|
+
const source = `
|
|
367
|
+
const m = "12-34".match(/(\\d+)-(\\d+)/)!;
|
|
368
|
+
console.log(JSON.stringify([m[0], m[1], m[2], m.index]), Array.isArray(m), m.length);
|
|
369
|
+
console.log(JSON.stringify("a1b2c3".split(/(\\d)/)));
|
|
370
|
+
console.log(JSON.stringify("a1b2c3".split(/\\d/)));
|
|
371
|
+
console.log("2020-01-02".replace(/(\\d+)-(\\d+)-(\\d+)/, "$3/$2/$1"));
|
|
372
|
+
console.log("a1b2".replace(/(\\d)/g, "[$1]"));
|
|
373
|
+
console.log("a1b2".replace(/\\d/g, (x: string) => "<" + x + ">"));
|
|
374
|
+
console.log("a.b.c".search(/\\./));
|
|
375
|
+
console.log(JSON.stringify("abc".split(/(?:)/)));
|
|
376
|
+
`;
|
|
377
|
+
expect(runProgram(source)).toBe([
|
|
378
|
+
'["12-34","12","34",0] true 3',
|
|
379
|
+
'["a","1","b","2","c","3",""]',
|
|
380
|
+
'["a","b","c",""]',
|
|
381
|
+
"02/01/2020",
|
|
382
|
+
"a[1]b[2]",
|
|
383
|
+
"a<1>b<2>",
|
|
384
|
+
"1",
|
|
385
|
+
'["a","b","c"]',
|
|
386
|
+
].join("\n"));
|
|
387
|
+
});
|
|
388
|
+
it("supports the immutable array methods and Object statics", () => {
|
|
389
|
+
const source = `
|
|
390
|
+
const a = [3, 1, 2];
|
|
391
|
+
console.log(JSON.stringify(a.toSorted((x, y) => x - y)), JSON.stringify(a));
|
|
392
|
+
console.log(JSON.stringify(a.toReversed()), JSON.stringify(a));
|
|
393
|
+
console.log(JSON.stringify(a.toSpliced(1, 1, 9, 9)), JSON.stringify(a));
|
|
394
|
+
console.log(JSON.stringify(a.with(1, 9)), JSON.stringify(a.with(-1, 9)));
|
|
395
|
+
console.log(JSON.stringify(Object.getOwnPropertyNames({ b: 1, a: 2 })));
|
|
396
|
+
console.log(JSON.stringify(Object.getOwnPropertyNames([1, 2])));
|
|
397
|
+
console.log(JSON.stringify(Object.groupBy([1, 2, 3, 4], (n: number) => (n % 2 === 0 ? "even" : "odd"))));
|
|
398
|
+
`;
|
|
399
|
+
expect(runProgram(source)).toBe([
|
|
400
|
+
"[1,2,3] [3,1,2]",
|
|
401
|
+
"[2,1,3] [3,1,2]",
|
|
402
|
+
"[3,9,9,2] [3,1,2]",
|
|
403
|
+
"[3,9,2] [3,1,9]",
|
|
404
|
+
'["b","a"]',
|
|
405
|
+
'["0","1","length"]',
|
|
406
|
+
'{"odd":[1,3],"even":[2,4]}',
|
|
407
|
+
].join("\n"));
|
|
408
|
+
});
|
|
204
409
|
it("supports optional chaining", () => {
|
|
205
410
|
const source = `
|
|
206
411
|
const obj = { a: { b: 5 }, m: (x: number) => x + 1 };
|
|
207
|
-
const empty = null;
|
|
412
|
+
const empty: any = null;
|
|
208
413
|
console.log(obj?.a?.b, empty?.a?.b, obj?.m?.(10), empty?.m?.(10));
|
|
209
414
|
const arr = [1, 2, 3];
|
|
210
415
|
console.log(arr?.length, arr?.map((x) => x * 2).join(","), empty?.length);
|
|
211
416
|
`;
|
|
212
417
|
expect(runProgram(source)).toBe("5 undefined 11 undefined\n3 2,4,6 undefined");
|
|
213
418
|
});
|
|
419
|
+
it("short-circuits a whole optional chain but throws past the guard", () => {
|
|
420
|
+
const source = `
|
|
421
|
+
const empty: any = null;
|
|
422
|
+
const nested: any = { a: { b: null } };
|
|
423
|
+
// A \`?.\` short-circuits every later member, so nothing past it is evaluated.
|
|
424
|
+
console.log("A", empty?.a.b.c);
|
|
425
|
+
console.log("B", (nested?.a)?.b);
|
|
426
|
+
console.log("C", nested.a?.b?.c);
|
|
427
|
+
// Once the chain has started, a non-optional member on null throws.
|
|
428
|
+
try {
|
|
429
|
+
console.log(nested?.b.c);
|
|
430
|
+
console.log("D-ok");
|
|
431
|
+
} catch (e) {
|
|
432
|
+
console.log("D-threw");
|
|
433
|
+
}
|
|
434
|
+
try {
|
|
435
|
+
console.log(nested.a?.b.c);
|
|
436
|
+
console.log("E-ok");
|
|
437
|
+
} catch (e) {
|
|
438
|
+
console.log("E-threw");
|
|
439
|
+
}
|
|
440
|
+
`;
|
|
441
|
+
expect(runProgram(source)).toBe("A undefined\nB null\nC undefined\nD-threw\nE-threw");
|
|
442
|
+
});
|
|
443
|
+
it("defaults Array.sort to string order and reveals circular references", () => {
|
|
444
|
+
const source = `
|
|
445
|
+
console.log([10, 1, 2, 20].sort().join(","));
|
|
446
|
+
console.log(["banana", "apple", "cherry"].sort().join(","));
|
|
447
|
+
console.log(JSON.stringify([3, undefined, 1, 2, undefined].sort()));
|
|
448
|
+
console.log([5, 3, 8, 1].sort((a, b) => a - b).join(","));
|
|
449
|
+
const o: any = { name: "x" };
|
|
450
|
+
o.self = o;
|
|
451
|
+
o.child = { parent: o };
|
|
452
|
+
console.log(o);
|
|
453
|
+
const arr: any = [1, 2];
|
|
454
|
+
arr.push(arr);
|
|
455
|
+
console.log(arr);
|
|
456
|
+
`;
|
|
457
|
+
expect(runProgram(source)).toBe([
|
|
458
|
+
"1,10,2,20",
|
|
459
|
+
"apple,banana,cherry",
|
|
460
|
+
"[1,2,3,null,null]",
|
|
461
|
+
"1,3,5,8",
|
|
462
|
+
"{ name: 'x', self: [Circular *1], child: { parent: [Circular *1] } }",
|
|
463
|
+
"[ 1, 2, [Circular *1] ]",
|
|
464
|
+
].join("\n"));
|
|
465
|
+
});
|
|
214
466
|
it("supports classes with new, this, statics, inheritance and instanceof", () => {
|
|
215
467
|
const source = `
|
|
216
468
|
class Animal {
|
|
@@ -402,5 +654,216 @@ describeE2E("end-to-end compilation", (harness) => {
|
|
|
402
654
|
`;
|
|
403
655
|
expect(runProgram(source)).toBe("a b\n1 2\n7\nHello, Ada Hi, Bob\n30 3");
|
|
404
656
|
});
|
|
657
|
+
it("supports Function.prototype.call, apply and bind", () => {
|
|
658
|
+
const source = `
|
|
659
|
+
function add(a: number, b: number): number { return a + b; }
|
|
660
|
+
console.log(add.call(null, 1, 2), add.apply(null, [5, 6]));
|
|
661
|
+
|
|
662
|
+
const obj = {
|
|
663
|
+
base: 10,
|
|
664
|
+
sum(a: number, b: number): number { return this.base + a + b; },
|
|
665
|
+
};
|
|
666
|
+
console.log(obj.sum.call(obj, 1, 2), obj.sum.apply(obj, [3, 4]));
|
|
667
|
+
|
|
668
|
+
const bound = obj.sum.bind(obj, 1);
|
|
669
|
+
console.log(bound(2));
|
|
670
|
+
const bound2 = add.bind(null, 10);
|
|
671
|
+
console.log(bound2(5));
|
|
672
|
+
|
|
673
|
+
class Greeter {
|
|
674
|
+
prefix = "hi";
|
|
675
|
+
greet(name: string): string { return this.prefix + " " + name; }
|
|
676
|
+
}
|
|
677
|
+
const g = new Greeter();
|
|
678
|
+
console.log(g.greet.call(g, "ada"), g.greet.bind(g)("cy"));
|
|
679
|
+
`;
|
|
680
|
+
expect(runProgram(source)).toBe("3 11\n13 17\n13\n15\nhi ada hi cy");
|
|
681
|
+
});
|
|
682
|
+
it("supports object-literal getters and setters", () => {
|
|
683
|
+
const source = `
|
|
684
|
+
const obj = {
|
|
685
|
+
_x: 0,
|
|
686
|
+
get x(): number { return this._x; },
|
|
687
|
+
set x(v: number) { this._x = v * 2; },
|
|
688
|
+
get double(): number { return this._x * 2; },
|
|
689
|
+
method(a: number, b: number) { return a + b; },
|
|
690
|
+
};
|
|
691
|
+
obj.x = 5;
|
|
692
|
+
console.log(obj.x, obj.double);
|
|
693
|
+
console.log(obj.method(2, 3));
|
|
694
|
+
console.log(Object.keys(obj).join(","));
|
|
695
|
+
|
|
696
|
+
const base = 7;
|
|
697
|
+
const o2 = { base, get next() { return base + 1; } };
|
|
698
|
+
console.log(o2.base, o2.next);
|
|
699
|
+
|
|
700
|
+
const o3 = { get ["dyn" + "amic"]() { return 42; } };
|
|
701
|
+
console.log(o3.dynamic);
|
|
702
|
+
`;
|
|
703
|
+
expect(runProgram(source)).toBe("10 20\n5\n_x,x,double,method\n7 8\n42");
|
|
704
|
+
});
|
|
705
|
+
it("supports first-class built-in method values", () => {
|
|
706
|
+
const source = `
|
|
707
|
+
const arr = [1, 2, 3];
|
|
708
|
+
console.log(typeof arr.map, arr.map.name, arr.map.length);
|
|
709
|
+
console.log(arr.map?.((x: number) => x * 2).join(","));
|
|
710
|
+
|
|
711
|
+
const text = "abc";
|
|
712
|
+
console.log(typeof text.slice, text.slice(1), text.split?.("").join("-"));
|
|
713
|
+
|
|
714
|
+
const obj = { base: 10, add(n: number) { return this.base + n; } };
|
|
715
|
+
console.log(obj.add?.(5));
|
|
716
|
+
|
|
717
|
+
const detached = arr.map;
|
|
718
|
+
try {
|
|
719
|
+
(detached as any)((x: number) => x);
|
|
720
|
+
console.log("no throw");
|
|
721
|
+
} catch (e) {
|
|
722
|
+
console.log("threw");
|
|
723
|
+
}
|
|
724
|
+
`;
|
|
725
|
+
expect(runProgram(source)).toBe("function map 1\n2,4,6\nfunction bc a-b-c\n15\nthrew");
|
|
726
|
+
});
|
|
727
|
+
it("supports the Error family as first-class constructors", () => {
|
|
728
|
+
const source = `
|
|
729
|
+
console.log(typeof Error, typeof TypeError, typeof AggregateError);
|
|
730
|
+
console.log(new Error("a") instanceof Error);
|
|
731
|
+
console.log(new TypeError("b") instanceof TypeError);
|
|
732
|
+
console.log(new TypeError("b") instanceof Error);
|
|
733
|
+
console.log(new RangeError("c") instanceof TypeError);
|
|
734
|
+
const e = new Error("boom");
|
|
735
|
+
console.log(String(e), e.toString(), e.name, e.message);
|
|
736
|
+
|
|
737
|
+
class MyErr extends Error {
|
|
738
|
+
constructor(m: string) { super(m); this.name = "MyErr"; }
|
|
739
|
+
}
|
|
740
|
+
const m = new MyErr("m");
|
|
741
|
+
console.log(m.name, m.message, m instanceof MyErr, m instanceof Error);
|
|
742
|
+
|
|
743
|
+
class CustomRange extends RangeError {}
|
|
744
|
+
const r = new CustomRange("too big");
|
|
745
|
+
console.log(r.name, r.message, r instanceof RangeError, r instanceof Error);
|
|
746
|
+
|
|
747
|
+
const agg = new AggregateError([1, 2], "all failed");
|
|
748
|
+
console.log(agg.name, agg.message, JSON.stringify(agg.errors), agg instanceof Error);
|
|
749
|
+
|
|
750
|
+
Promise.any([Promise.reject("x"), Promise.reject("y")]).catch((reason) => {
|
|
751
|
+
const err = reason as { name: string; errors: unknown[] };
|
|
752
|
+
console.log(err.name, JSON.stringify(err.errors));
|
|
753
|
+
});
|
|
754
|
+
`;
|
|
755
|
+
expect(runProgram(source)).toBe("function function function\ntrue\ntrue\ntrue\nfalse\n" +
|
|
756
|
+
"Error: boom Error: boom Error boom\n" +
|
|
757
|
+
"MyErr m true true\nRangeError too big true true\n" +
|
|
758
|
+
"AggregateError all failed [1,2] true\nAggregateError [\"x\",\"y\"]");
|
|
759
|
+
});
|
|
760
|
+
it("supports generator functions", () => {
|
|
761
|
+
const source = `
|
|
762
|
+
function* nums() { yield 1; yield 2; yield 3; }
|
|
763
|
+
const g = nums();
|
|
764
|
+
console.log(typeof nums, g.next().value, g.next().value, g.next().value);
|
|
765
|
+
console.log(JSON.stringify(g.next()));
|
|
766
|
+
|
|
767
|
+
function* counter(start: number) {
|
|
768
|
+
let x = start;
|
|
769
|
+
while (true) {
|
|
770
|
+
const step = yield x;
|
|
771
|
+
x = step === undefined ? x + 1 : step;
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
const c = counter(10);
|
|
775
|
+
console.log(c.next().value, c.next().value, c.next(100).value, c.next().value);
|
|
776
|
+
|
|
777
|
+
class Box {
|
|
778
|
+
private n = 0;
|
|
779
|
+
*gen(): Generator<number> { yield this.n++; yield this.n++; }
|
|
780
|
+
}
|
|
781
|
+
const box = new Box();
|
|
782
|
+
console.log([...box.gen()].join(","), [...box.gen()].join(","));
|
|
783
|
+
|
|
784
|
+
function* inner() { yield 1; yield 2; }
|
|
785
|
+
function* outer() { yield* inner(); yield 9; }
|
|
786
|
+
console.log([...outer()].join("-"), [...outer()].join("-"));
|
|
787
|
+
|
|
788
|
+
function* echo() { const a = yield "first"; const b = yield a; return b; }
|
|
789
|
+
const e = echo();
|
|
790
|
+
console.log(e.next().value, e.next("A").value, JSON.stringify(e.next("B")));
|
|
791
|
+
|
|
792
|
+
function* guarded() {
|
|
793
|
+
try { yield "x"; } catch (err) { yield "caught:" + (err as Error).message; }
|
|
794
|
+
yield "end";
|
|
795
|
+
}
|
|
796
|
+
const t = guarded();
|
|
797
|
+
console.log(t.next().value, t.throw(new Error("E")).value, t.next().value);
|
|
798
|
+
|
|
799
|
+
function* once() { yield 1; }
|
|
800
|
+
const o = once();
|
|
801
|
+
o.next();
|
|
802
|
+
console.log(JSON.stringify(o.next()), typeof o);
|
|
803
|
+
|
|
804
|
+
function* naturals() { let i = 0; while (true) yield i++; }
|
|
805
|
+
const seen: number[] = [];
|
|
806
|
+
for (const v of naturals()) { if (v >= 3) break; seen.push(v); }
|
|
807
|
+
console.log(seen.join(","));
|
|
808
|
+
`;
|
|
809
|
+
expect(runProgram(source)).toBe("function 1 2 3\n{\"done\":true}\n10 11 100 101\n0,1 2,3\n" +
|
|
810
|
+
"1-2-9 1-2-9\nfirst A {\"value\":\"B\",\"done\":true}\n" +
|
|
811
|
+
"x caught:E end\n{\"done\":true} object\n0,1,2");
|
|
812
|
+
});
|
|
813
|
+
it("supports symbols and the well-known symbol protocol", () => {
|
|
814
|
+
const source = `
|
|
815
|
+
const a = Symbol("desc");
|
|
816
|
+
const b = Symbol("desc");
|
|
817
|
+
console.log(typeof Symbol, typeof a, a === a, a === b);
|
|
818
|
+
console.log(a.toString(), String(a), a.description, String(Symbol()));
|
|
819
|
+
console.log(String(Symbol.iterator), typeof Symbol.iterator);
|
|
820
|
+
|
|
821
|
+
const holder: Record<string, unknown> = {};
|
|
822
|
+
(holder as any)[a] = 1;
|
|
823
|
+
(holder as any)[b] = 2;
|
|
824
|
+
holder.x = 3;
|
|
825
|
+
console.log(Object.keys(holder).join(","));
|
|
826
|
+
console.log(Object.getOwnPropertySymbols(holder).length);
|
|
827
|
+
console.log((holder as any)[a], (holder as any)[b], (holder as any)[Symbol("desc")]);
|
|
828
|
+
console.log(JSON.stringify(holder), JSON.stringify(a), JSON.stringify([a, 1]));
|
|
829
|
+
console.log(holder);
|
|
830
|
+
|
|
831
|
+
const reg = Symbol.for("shared");
|
|
832
|
+
console.log(reg === Symbol.for("shared"), Symbol.keyFor(reg), Symbol.keyFor(a));
|
|
833
|
+
|
|
834
|
+
class Range {
|
|
835
|
+
start: number;
|
|
836
|
+
end: number;
|
|
837
|
+
constructor(start: number, end: number) {
|
|
838
|
+
this.start = start;
|
|
839
|
+
this.end = end;
|
|
840
|
+
}
|
|
841
|
+
[Symbol.iterator]() {
|
|
842
|
+
let i = this.start;
|
|
843
|
+
const end = this.end;
|
|
844
|
+
return {
|
|
845
|
+
next() {
|
|
846
|
+
return i < end ? { value: i++, done: false } : { value: undefined, done: true };
|
|
847
|
+
},
|
|
848
|
+
};
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
console.log([...new Range(1, 4)].join(","));
|
|
852
|
+
const walked: number[] = [];
|
|
853
|
+
for (const x of new Range(10, 13)) walked.push(x);
|
|
854
|
+
console.log(walked.join(","));
|
|
855
|
+
|
|
856
|
+
function* delegates() { yield* new Range(5, 7); }
|
|
857
|
+
console.log([...delegates()].join(","));
|
|
858
|
+
`;
|
|
859
|
+
expect(runProgram(source)).toBe("function symbol true false\n" +
|
|
860
|
+
"Symbol(desc) Symbol(desc) desc Symbol()\n" +
|
|
861
|
+
"Symbol(Symbol.iterator) symbol\n" +
|
|
862
|
+
"x\n2\n1 2 undefined\n" +
|
|
863
|
+
'{"x":3} undefined [null,1]\n' +
|
|
864
|
+
"{ x: 3, Symbol(desc): 1, Symbol(desc): 2 }\n" +
|
|
865
|
+
"true shared undefined\n" +
|
|
866
|
+
"1,2,3\n10,11,12\n5,6");
|
|
867
|
+
});
|
|
405
868
|
});
|
|
406
869
|
//# sourceMappingURL=compile.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.test.js","sourceRoot":"","sources":["../../../tests/e2e/compile.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,WAAW,CAAC,wBAAwB,EAAE,CAAC,OAAO,EAAE,EAAE;IAChD,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IAE/C,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,UAAU,CAAC,gCAAgC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAG;;;;;;;;KAQd,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAC7B;YACE,8DAA8D;YAC9D,4BAA4B;YAC5B,SAAS;YACT,+CAA+C;YAC/C,iBAAiB;YACjB,eAAe;SAChB,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG;;;;KAId,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,MAAM,GAAG;;;;;;KAMd,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,MAAM,GAAG;;;;;;;KAOd,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,MAAM,GAAG;;;;;;;;;;KAUd,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,MAAM,GAAG;;;KAGd,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"compile.test.js","sourceRoot":"","sources":["../../../tests/e2e/compile.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Differential tests: compile a program with xbintsc, run it, and compare the
|
|
3
|
+
* output byte-for-byte with the same program executed by Node. Every program
|
|
4
|
+
* prints canonical `JSON.stringify` lines so console formatting never masks a
|
|
5
|
+
* real semantic difference.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|