xbintsc 0.3.4 → 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/codegen/generator/calls/invocation.js +9 -0
- package/dist/src/codegen/generator/calls/invocation.js.map +1 -1
- package/dist/src/codegen/generator/context.d.ts +15 -1
- package/dist/src/codegen/generator/context.js +29 -4
- package/dist/src/codegen/generator/context.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/e2e/compile-node.test.js +11 -0
- package/dist/tests/e2e/compile-node.test.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 +1 -1
- package/src/codegen/generator/calls/invocation.ts +8 -0
- package/src/codegen/generator/context.ts +30 -4
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { compileToIr } from "../helpers.js";
|
|
3
|
+
import { DiagnosticCode } from "../../src/diagnostics/diagnostic.js";
|
|
4
|
+
import { createDefaultRegistry } from "../../src/extensions/registry.js";
|
|
5
|
+
import { nodeExtension } from "../../src/extensions/node/index.js";
|
|
6
|
+
function errorsOf(source) {
|
|
7
|
+
return compileToIr(source).diagnostics.filter((d) => d.category === "error");
|
|
8
|
+
}
|
|
9
|
+
function irOf(source) {
|
|
10
|
+
const { ir, diagnostics } = compileToIr(source);
|
|
11
|
+
expect(diagnostics.filter((d) => d.category === "error")).toHaveLength(0);
|
|
12
|
+
return ir;
|
|
13
|
+
}
|
|
14
|
+
function irWithNodeExtension(source) {
|
|
15
|
+
const registry = createDefaultRegistry();
|
|
16
|
+
registry.register(nodeExtension);
|
|
17
|
+
const { ir, diagnostics } = compileToIr(source, registry);
|
|
18
|
+
expect(diagnostics.filter((d) => d.category === "error")).toHaveLength(0);
|
|
19
|
+
return ir;
|
|
20
|
+
}
|
|
21
|
+
describe("codegen optional chaining", () => {
|
|
22
|
+
it("short-circuits optional property access", () => {
|
|
23
|
+
const ir = irOf("const o: any = {};\nconst v = o?.a;");
|
|
24
|
+
expect(ir).toContain("@xt_is_nullish");
|
|
25
|
+
expect(ir).toContain("optchain.end");
|
|
26
|
+
});
|
|
27
|
+
it("short-circuits optional element access", () => {
|
|
28
|
+
const ir = irOf('const o: any = {};\nconst k = "a";\nconst v = o?.[k];');
|
|
29
|
+
expect(ir).toContain("optchain.end");
|
|
30
|
+
expect(ir).toContain("@xt_is_nullish");
|
|
31
|
+
});
|
|
32
|
+
it("short-circuits a longer optional chain", () => {
|
|
33
|
+
const ir = irOf("const o: any = {};\nconst v = o?.a.b;");
|
|
34
|
+
expect(ir).toContain("optchain.end");
|
|
35
|
+
});
|
|
36
|
+
it("guards an optional call to a plain function value", () => {
|
|
37
|
+
const ir = irOf("const f: any = () => 1;\nf?.();");
|
|
38
|
+
expect(ir).toContain("optchain.end");
|
|
39
|
+
expect(ir).toContain("@xt_closure_call");
|
|
40
|
+
});
|
|
41
|
+
it("binds `this` for an optional method call", () => {
|
|
42
|
+
const ir = irOf("const o: any = {};\no.m?.();");
|
|
43
|
+
expect(ir).toContain("optchain.end");
|
|
44
|
+
expect(ir).toContain("@xt_call_with_this");
|
|
45
|
+
});
|
|
46
|
+
it("guards a receiver before calling a method", () => {
|
|
47
|
+
const ir = irOf("const o: any = {};\no?.m();");
|
|
48
|
+
expect(ir).toContain("optchain.end");
|
|
49
|
+
expect(ir).toContain("@xt_call_method");
|
|
50
|
+
});
|
|
51
|
+
it("dispatches calls through an element access", () => {
|
|
52
|
+
const ir = irOf('const o: any = {};\no["m"](1);');
|
|
53
|
+
expect(ir).toContain("@xt_call_method");
|
|
54
|
+
});
|
|
55
|
+
it("binds `this` for an optional element method call", () => {
|
|
56
|
+
const ir = irOf('const a: any = {};\nconst k = "m";\na[k]?.();');
|
|
57
|
+
expect(ir).toContain("@xt_call_with_this");
|
|
58
|
+
expect(ir).toContain("optchain.end");
|
|
59
|
+
});
|
|
60
|
+
it("guards a receiver for an optional element call", () => {
|
|
61
|
+
const ir = irOf('const a: any = {};\nconst k = "m";\na?.[k]();');
|
|
62
|
+
expect(ir).toContain("@xt_call_method");
|
|
63
|
+
expect(ir).toContain("optchain.end");
|
|
64
|
+
});
|
|
65
|
+
it("invokes the result of an optional chain as a closure", () => {
|
|
66
|
+
const ir = irOf("const a: any = {};\na?.b()();");
|
|
67
|
+
expect(ir).toContain("@xt_closure_call");
|
|
68
|
+
expect(ir).toContain("optchain.end");
|
|
69
|
+
});
|
|
70
|
+
it("reads a `super` property through the prototype chain", () => {
|
|
71
|
+
const ir = irOf("class A { x = 1; } class B extends A { m() { return super.x; } }");
|
|
72
|
+
expect(ir).toContain("@xt_object_get_prototype");
|
|
73
|
+
});
|
|
74
|
+
it("routes global namespace properties through their runtime getter", () => {
|
|
75
|
+
const ir = irOf("const p = process.pid;");
|
|
76
|
+
expect(ir).toContain("@xt_process_get");
|
|
77
|
+
});
|
|
78
|
+
it("routes imported namespace properties through their runtime getter", () => {
|
|
79
|
+
const ir = irWithNodeExtension('import * as proc from "process";\nconst p = proc.pid;');
|
|
80
|
+
expect(ir).toContain("@xt_process_get");
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe("codegen delete", () => {
|
|
84
|
+
it("lowers delete of a property and an element", () => {
|
|
85
|
+
const ir = irOf('const o: any = { a: 1 };\ndelete o.a;\ndelete o["b"];');
|
|
86
|
+
expect(ir).toContain("@xt_delete");
|
|
87
|
+
});
|
|
88
|
+
it("treats delete of a bare identifier as a no-op", () => {
|
|
89
|
+
const ir = irOf("let y = 1;\ndelete y;");
|
|
90
|
+
// No runtime delete call is emitted for a plain binding.
|
|
91
|
+
expect(ir).toContain("define i32 @main");
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
describe("codegen assignment", () => {
|
|
95
|
+
it("lowers compound assignment through the binary runtime", () => {
|
|
96
|
+
const ir = irOf("let a = 1;\na += 2;");
|
|
97
|
+
expect(ir).toContain("@xt_add");
|
|
98
|
+
});
|
|
99
|
+
it("lowers &&=, ||= and ??= with explicit blocks", () => {
|
|
100
|
+
const ir = irOf("let a: any = 1;\na &&= 2;\na ||= 3;\na ??= 4;");
|
|
101
|
+
expect(ir).toContain("assign.right");
|
|
102
|
+
expect(ir).toContain("assign.end");
|
|
103
|
+
expect(ir).toContain("@xt_is_nullish");
|
|
104
|
+
});
|
|
105
|
+
it("destructures an array assignment through runtime reads", () => {
|
|
106
|
+
const ir = irOf("let a: any;\nlet b: any;\n[a, b] = [1, 2];");
|
|
107
|
+
expect(ir).toContain("@xt_get");
|
|
108
|
+
});
|
|
109
|
+
it("supports default values and rest in array assignments", () => {
|
|
110
|
+
const ir = irOf("let a: any;\nlet rest: any;\n[a = 5, ...rest] = [1, 2, 3];");
|
|
111
|
+
expect(ir).toContain("@xt_get");
|
|
112
|
+
expect(ir).toContain("@xt_call_method");
|
|
113
|
+
});
|
|
114
|
+
it("destructures object shorthand, renamed and computed targets", () => {
|
|
115
|
+
const sources = [
|
|
116
|
+
"let a: any;\n({ a } = { a: 1 });",
|
|
117
|
+
"let o: any = {};\n({ x: o.y } = { x: 1 });",
|
|
118
|
+
'let k = "x";\nlet o: any = {};\n({ [k]: o.y } = { x: 1 });',
|
|
119
|
+
];
|
|
120
|
+
for (const source of sources) {
|
|
121
|
+
const { ir, diagnostics } = compileToIr(source);
|
|
122
|
+
expect(diagnostics.filter((d) => d.category === "error")).toHaveLength(0);
|
|
123
|
+
expect(ir).toMatch(/@xt_(get|set)/);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
it("supports defaults in object shorthand assignment", () => {
|
|
127
|
+
const ir = irOf("let a: any;\n({ a = 1 } = {});");
|
|
128
|
+
expect(ir).toContain("@xt_get");
|
|
129
|
+
});
|
|
130
|
+
it("reports object rest destructuring as unsupported", () => {
|
|
131
|
+
const diagnostics = errorsOf("let o: any;\n({ ...o } = { a: 1 });");
|
|
132
|
+
expect(diagnostics.some((d) => d.code === DiagnosticCode.UnsupportedFeature)).toBe(true);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
describe("codegen unary operators", () => {
|
|
136
|
+
it("lowers logical, bitwise and arithmetic unary operators", () => {
|
|
137
|
+
const ir = irOf("let x = 1;\nconst a = !x;\nconst b = ~x;\nconst c = +x;\nconst d = -x;");
|
|
138
|
+
expect(ir).toContain("@xt_not");
|
|
139
|
+
expect(ir).toContain("@xt_bit_not");
|
|
140
|
+
expect(ir).toContain("@xt_pos");
|
|
141
|
+
expect(ir).toContain("@xt_neg");
|
|
142
|
+
});
|
|
143
|
+
it("lowers prefix and postfix increments", () => {
|
|
144
|
+
const ir = irOf("let x = 1;\nx++;\n++x;\nx--;\n--x;");
|
|
145
|
+
expect(ir).toContain("@xt_add");
|
|
146
|
+
expect(ir).toContain("@xt_sub");
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=expressions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expressions.test.js","sourceRoot":"","sources":["../../../tests/codegen/expressions.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -107,6 +107,20 @@ describe("codegen", () => {
|
|
|
107
107
|
const { ir } = compileToIr('import * as path from "path";\npath.join("a", "b");', registry);
|
|
108
108
|
expect(ir).toMatch(/call i64 @xt_path_static\(i64 %\w+, i32 2, i64\* %\w+\)/);
|
|
109
109
|
});
|
|
110
|
+
it("resolves default and namespace imports of dispatcher-less node modules", () => {
|
|
111
|
+
const registry = createDefaultRegistry().register(nodeExtension);
|
|
112
|
+
const sources = [
|
|
113
|
+
'import fs from "node:fs";\nfs.readFileSync("f.txt");',
|
|
114
|
+
'import * as fs from "node:fs";\nfs.readFileSync("f.txt");',
|
|
115
|
+
'import cp from "node:child_process";\ncp.spawnSync("ls");',
|
|
116
|
+
];
|
|
117
|
+
for (const source of sources) {
|
|
118
|
+
const { diagnostics } = compileToIr(source, registry);
|
|
119
|
+
expect(diagnostics.filter((d) => d.category === "error")).toHaveLength(0);
|
|
120
|
+
}
|
|
121
|
+
const { ir } = compileToIr('import fs from "node:fs";\nfs.readFileSync("f.txt");', registry);
|
|
122
|
+
expect(ir).toMatch(/call i64 @xt_node_read_text_file\(i32 \d+, i64\* %\w+\)/);
|
|
123
|
+
});
|
|
110
124
|
it("reports unsupported syntax instead of crashing", () => {
|
|
111
125
|
const { diagnostics } = compileToIr("tag`x`;");
|
|
112
126
|
expect(diagnostics.some((d) => d.category === "error")).toBe(true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llvm.test.js","sourceRoot":"","sources":["../../../tests/codegen/llvm.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"llvm.test.js","sourceRoot":"","sources":["../../../tests/codegen/llvm.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { booleanLiteral, i64, numberLiteral, XT_FALSE, XT_TRUE } from "../../src/codegen/values.js";
|
|
3
|
+
/** The 64-bit pattern of a double as LLVM would spell it. */
|
|
4
|
+
function bits(value) {
|
|
5
|
+
const view = new DataView(new ArrayBuffer(8));
|
|
6
|
+
view.setFloat64(0, value);
|
|
7
|
+
const raw = (BigInt(view.getUint32(0)) << 32n) | BigInt(view.getUint32(4));
|
|
8
|
+
return BigInt.asIntN(64, raw).toString();
|
|
9
|
+
}
|
|
10
|
+
describe("numberLiteral", () => {
|
|
11
|
+
const values = [
|
|
12
|
+
0,
|
|
13
|
+
-0,
|
|
14
|
+
1,
|
|
15
|
+
-1,
|
|
16
|
+
0.5,
|
|
17
|
+
3.14159,
|
|
18
|
+
1e100,
|
|
19
|
+
-1e-100,
|
|
20
|
+
1 / 3,
|
|
21
|
+
Number.MIN_VALUE, // subnormal
|
|
22
|
+
5e-324, // smallest subnormal
|
|
23
|
+
2.2250738585072014e-308, // smallest normal
|
|
24
|
+
1.9999999999999998, // rounding overflows the mantissa
|
|
25
|
+
Number.MAX_VALUE,
|
|
26
|
+
Infinity,
|
|
27
|
+
-Infinity,
|
|
28
|
+
NaN,
|
|
29
|
+
];
|
|
30
|
+
for (const value of values) {
|
|
31
|
+
it(`encodes ${Object.is(value, -0) ? "-0" : String(value)}`, () => {
|
|
32
|
+
expect(numberLiteral(value)).toBe(bits(value));
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
describe("booleanLiteral", () => {
|
|
37
|
+
it("encodes true and false with their tagged words", () => {
|
|
38
|
+
expect(booleanLiteral(true)).toBe(i64(XT_TRUE));
|
|
39
|
+
expect(booleanLiteral(false)).toBe(i64(XT_FALSE));
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
describe("i64", () => {
|
|
43
|
+
it("normalises unsigned patterns to signed decimals", () => {
|
|
44
|
+
expect(i64(0xffffffffffffffffn)).toBe("-1");
|
|
45
|
+
expect(i64(0x8000000000000000n)).toBe("-9223372036854775808");
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=values.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"values.test.js","sourceRoot":"","sources":["../../../tests/codegen/values.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAEpG,6DAA6D;AAC7D,SAAS,IAAI,CAAC,KAAa;IACzB,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1B,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC3C,CAAC;AAED,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,MAAM,GAAG;QACb,CAAC;QACD,CAAC,CAAC;QACF,CAAC;QACD,CAAC,CAAC;QACF,GAAG;QACH,OAAO;QACP,KAAK;QACL,CAAC,MAAM;QACP,CAAC,GAAG,CAAC;QACL,MAAM,CAAC,SAAS,EAAE,YAAY;QAC9B,MAAM,EAAE,qBAAqB;QAC7B,uBAAuB,EAAE,kBAAkB;QAC3C,kBAAkB,EAAE,kCAAkC;QACtD,MAAM,CAAC,SAAS;QAChB,QAAQ;QACR,CAAC,QAAQ;QACT,GAAG;KACJ,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,EAAE,CAAC,WAAW,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE;YAChE,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;IACnB,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { DiagnosticBag, DiagnosticCode, DiagnosticError, formatDiagnostic, formatDiagnostics, } from "../../src/diagnostics/diagnostic.js";
|
|
3
|
+
import { SourceFile } from "../../src/diagnostics/source.js";
|
|
4
|
+
describe("DiagnosticBag", () => {
|
|
5
|
+
it("records errors and warnings with optional locations", () => {
|
|
6
|
+
const bag = new DiagnosticBag();
|
|
7
|
+
bag.error(DiagnosticCode.UnexpectedToken, "boom", { start: 1, end: 3 }, "a.ts");
|
|
8
|
+
bag.warning(DiagnosticCode.UnsupportedFeature, "careful");
|
|
9
|
+
expect(bag.diagnostics).toHaveLength(2);
|
|
10
|
+
expect(bag.diagnostics[0]).toMatchObject({
|
|
11
|
+
category: "error",
|
|
12
|
+
code: DiagnosticCode.UnexpectedToken,
|
|
13
|
+
message: "boom",
|
|
14
|
+
fileName: "a.ts",
|
|
15
|
+
start: 1,
|
|
16
|
+
end: 3,
|
|
17
|
+
});
|
|
18
|
+
expect(bag.diagnostics[1]).toMatchObject({ category: "warning", message: "careful" });
|
|
19
|
+
});
|
|
20
|
+
it("tracks whether any error has been reported", () => {
|
|
21
|
+
const bag = new DiagnosticBag();
|
|
22
|
+
expect(bag.hasErrors).toBe(false);
|
|
23
|
+
bag.warning(DiagnosticCode.UnsupportedFeature, "just a warning");
|
|
24
|
+
expect(bag.hasErrors).toBe(false);
|
|
25
|
+
bag.error(DiagnosticCode.CodegenError, "real error");
|
|
26
|
+
expect(bag.hasErrors).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
it("marks and rolls back speculative diagnostics", () => {
|
|
29
|
+
const bag = new DiagnosticBag();
|
|
30
|
+
bag.error(DiagnosticCode.ExpectedToken, "first");
|
|
31
|
+
const mark = bag.mark();
|
|
32
|
+
bag.error(DiagnosticCode.ExpectedToken, "speculative");
|
|
33
|
+
bag.warning(DiagnosticCode.ExpectedToken, "speculative warning");
|
|
34
|
+
expect(bag.diagnostics).toHaveLength(3);
|
|
35
|
+
bag.reset(mark);
|
|
36
|
+
expect(bag.diagnostics).toHaveLength(1);
|
|
37
|
+
expect(bag.diagnostics[0].message).toBe("first");
|
|
38
|
+
});
|
|
39
|
+
it("adds pre-built diagnostics individually and in bulk", () => {
|
|
40
|
+
const first = { category: "error", code: DiagnosticCode.TypeMismatch, message: "one" };
|
|
41
|
+
const second = { category: "info", code: DiagnosticCode.TypeMismatch, message: "two" };
|
|
42
|
+
const bag = new DiagnosticBag();
|
|
43
|
+
bag.add(first);
|
|
44
|
+
bag.addAll([second]);
|
|
45
|
+
expect(bag.diagnostics).toEqual([first, second]);
|
|
46
|
+
});
|
|
47
|
+
it("throws a DiagnosticError only when errors are present", () => {
|
|
48
|
+
const clean = new DiagnosticBag();
|
|
49
|
+
clean.warning(DiagnosticCode.UnsupportedFeature, "no throw");
|
|
50
|
+
expect(() => clean.throwIfErrors()).not.toThrow();
|
|
51
|
+
const dirty = new DiagnosticBag();
|
|
52
|
+
dirty.error(DiagnosticCode.CodegenError, "kaboom");
|
|
53
|
+
expect(() => dirty.throwIfErrors()).toThrow(DiagnosticError);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe("DiagnosticError", () => {
|
|
57
|
+
it("collects a single diagnostic into an array", () => {
|
|
58
|
+
const error = new DiagnosticError({ category: "error", code: DiagnosticCode.IOError, message: "io" });
|
|
59
|
+
expect(error.name).toBe("DiagnosticError");
|
|
60
|
+
expect(error.diagnostics).toHaveLength(1);
|
|
61
|
+
expect(error.message).toContain("TS6002");
|
|
62
|
+
});
|
|
63
|
+
it("accepts multiple diagnostics and joins their text", () => {
|
|
64
|
+
const error = new DiagnosticError([
|
|
65
|
+
{ category: "error", code: DiagnosticCode.IOError, message: "one" },
|
|
66
|
+
{ category: "error", code: DiagnosticCode.CodegenError, message: "two" },
|
|
67
|
+
]);
|
|
68
|
+
expect(error.diagnostics).toHaveLength(2);
|
|
69
|
+
expect(error.message.split("\n")).toHaveLength(2);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe("formatDiagnostic", () => {
|
|
73
|
+
it("falls back to <unknown> when there is no file name", () => {
|
|
74
|
+
const text = formatDiagnostic({ category: "error", code: DiagnosticCode.CodegenError, message: "oops" });
|
|
75
|
+
expect(text).toBe("<unknown> - error TS5001: oops");
|
|
76
|
+
});
|
|
77
|
+
it("uses the diagnostic file name when no source is available", () => {
|
|
78
|
+
const text = formatDiagnostic({
|
|
79
|
+
category: "warning",
|
|
80
|
+
code: DiagnosticCode.UnsupportedFeature,
|
|
81
|
+
message: "hmm",
|
|
82
|
+
fileName: "b.ts",
|
|
83
|
+
});
|
|
84
|
+
expect(text).toBe("b.ts - warning TS4005: hmm");
|
|
85
|
+
});
|
|
86
|
+
it("renders a source excerpt with a caret underline", () => {
|
|
87
|
+
const source = new SourceFile("a.ts", "let a = 1;\nlet b = 2;");
|
|
88
|
+
const text = formatDiagnostic({ category: "error", code: DiagnosticCode.CannotFindName, message: "no b", start: 15, end: 16 }, source);
|
|
89
|
+
expect(text).toContain("a.ts:2:5 - error TS3002: no b");
|
|
90
|
+
expect(text).toContain("let b = 2;");
|
|
91
|
+
expect(text).toContain("\n ^");
|
|
92
|
+
});
|
|
93
|
+
it("widens the caret to cover the diagnostic range", () => {
|
|
94
|
+
const source = new SourceFile("a.ts", "abcdef");
|
|
95
|
+
const text = formatDiagnostic({ category: "error", code: DiagnosticCode.CodegenError, message: "wide", start: 1, end: 4 }, source);
|
|
96
|
+
expect(text).toContain("\n ^^^");
|
|
97
|
+
});
|
|
98
|
+
it("omits the excerpt when the source has no start offset", () => {
|
|
99
|
+
const source = new SourceFile("a.ts", "abc");
|
|
100
|
+
const text = formatDiagnostic({ category: "error", code: DiagnosticCode.CodegenError, message: "no pos", fileName: "a.ts" }, source);
|
|
101
|
+
expect(text).toBe("a.ts - error TS5001: no pos");
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe("formatDiagnostics", () => {
|
|
105
|
+
it("looks up each source by file name", () => {
|
|
106
|
+
const source = new SourceFile("a.ts", "let x = ;");
|
|
107
|
+
const sources = new Map([["a.ts", source]]);
|
|
108
|
+
const text = formatDiagnostics([
|
|
109
|
+
{ category: "error", code: DiagnosticCode.ExpectedToken, message: "missing", fileName: "a.ts", start: 8 },
|
|
110
|
+
{ category: "info", code: DiagnosticCode.ExpectedToken, message: "other" },
|
|
111
|
+
], sources);
|
|
112
|
+
const lines = text.split("\n");
|
|
113
|
+
expect(lines[0]).toContain("a.ts:1:9 - error TS2002: missing");
|
|
114
|
+
expect(text).toContain("<unknown> - info TS2002: other");
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
//# sourceMappingURL=diagnostic.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostic.test.js","sourceRoot":"","sources":["../../../tests/diagnostics/diagnostic.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { SourceFile, combineHashes, hashText } from "../../src/diagnostics/source.js";
|
|
3
|
+
describe("SourceFile", () => {
|
|
4
|
+
it("normalizes a leading BOM and CRLF/CR line endings", () => {
|
|
5
|
+
const source = new SourceFile("a.ts", "\uFEFFa\r\nb\rc\n");
|
|
6
|
+
expect(source.text).toBe("a\nb\nc\n");
|
|
7
|
+
expect(source.fileName).toBe("a.ts");
|
|
8
|
+
});
|
|
9
|
+
it("reports its length from the normalized text", () => {
|
|
10
|
+
expect(new SourceFile("a.ts", "abc").length).toBe(3);
|
|
11
|
+
expect(new SourceFile("a.ts", "\uFEFFabc").length).toBe(3);
|
|
12
|
+
});
|
|
13
|
+
it("maps offsets to 1-based line/column pairs", () => {
|
|
14
|
+
const source = new SourceFile("a.ts", "a\nbb\nccc");
|
|
15
|
+
expect(source.positionAt(0)).toEqual({ line: 1, column: 1 });
|
|
16
|
+
expect(source.positionAt(1)).toEqual({ line: 1, column: 2 });
|
|
17
|
+
expect(source.positionAt(2)).toEqual({ line: 2, column: 1 });
|
|
18
|
+
expect(source.positionAt(3)).toEqual({ line: 2, column: 2 });
|
|
19
|
+
expect(source.positionAt(5)).toEqual({ line: 3, column: 1 });
|
|
20
|
+
expect(source.positionAt(7)).toEqual({ line: 3, column: 3 });
|
|
21
|
+
});
|
|
22
|
+
it("clamps out-of-range and negative offsets", () => {
|
|
23
|
+
const source = new SourceFile("a.ts", "abc");
|
|
24
|
+
expect(source.positionAt(-5)).toEqual({ line: 1, column: 1 });
|
|
25
|
+
expect(source.positionAt(100)).toEqual({ line: 1, column: 4 });
|
|
26
|
+
});
|
|
27
|
+
it("slices the raw text of a range", () => {
|
|
28
|
+
const source = new SourceFile("a.ts", "hello world");
|
|
29
|
+
expect(source.slice({ start: 0, end: 5 })).toBe("hello");
|
|
30
|
+
expect(source.slice({ start: 6, end: 11 })).toBe("world");
|
|
31
|
+
});
|
|
32
|
+
it("exposes a stable content hash on the instance", () => {
|
|
33
|
+
expect(new SourceFile("a.ts", "same").hash).toBe(hashText("same"));
|
|
34
|
+
expect(new SourceFile("a.ts", "same").hash).not.toBe(new SourceFile("a.ts", "other").hash);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe("hashText", () => {
|
|
38
|
+
it("is deterministic and zero-padded to 16 hex chars", () => {
|
|
39
|
+
const hash = hashText("hello");
|
|
40
|
+
expect(hash).toBe(hashText("hello"));
|
|
41
|
+
expect(hash).toMatch(/^[0-9a-f]{16}$/);
|
|
42
|
+
});
|
|
43
|
+
it("changes with the input and respects a seed", () => {
|
|
44
|
+
expect(hashText("a")).not.toBe(hashText("b"));
|
|
45
|
+
expect(hashText("a", 1n)).not.toBe(hashText("a"));
|
|
46
|
+
});
|
|
47
|
+
it("treats empty input as the seed", () => {
|
|
48
|
+
expect(hashText("", 0n)).toBe("0000000000000000");
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe("combineHashes", () => {
|
|
52
|
+
it("combines parts without collisions between orderings", () => {
|
|
53
|
+
expect(combineHashes(["a", "b"])).toBe(combineHashes(["a", "b"]));
|
|
54
|
+
expect(combineHashes(["a", "b"])).not.toBe(combineHashes(["b", "a"]));
|
|
55
|
+
expect(combineHashes([])).toBe(hashText(""));
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=source.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.test.js","sourceRoot":"","sources":["../../../tests/diagnostics/source.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
5
|
+
import { bundleModules } from "../../src/driver/modules.js";
|
|
6
|
+
import { DiagnosticBag, DiagnosticCode } from "../../src/diagnostics/diagnostic.js";
|
|
7
|
+
import { walk } from "../../src/ast/visitor.js";
|
|
8
|
+
import { SyntaxKind } from "../../src/ast/nodes.js";
|
|
9
|
+
const directories = [];
|
|
10
|
+
function temporaryDirectory() {
|
|
11
|
+
const directory = mkdtempSync(join(tmpdir(), "xbintsc-modules-"));
|
|
12
|
+
directories.push(directory);
|
|
13
|
+
return directory;
|
|
14
|
+
}
|
|
15
|
+
function writeFiles(files) {
|
|
16
|
+
const directory = temporaryDirectory();
|
|
17
|
+
for (const [name, content] of Object.entries(files))
|
|
18
|
+
writeFileSync(join(directory, name), content);
|
|
19
|
+
return directory;
|
|
20
|
+
}
|
|
21
|
+
function bundle(entry) {
|
|
22
|
+
const bag = new DiagnosticBag();
|
|
23
|
+
const result = bundleModules(entry, bag);
|
|
24
|
+
return { result, bag };
|
|
25
|
+
}
|
|
26
|
+
function identifierTexts(node) {
|
|
27
|
+
const texts = [];
|
|
28
|
+
walk(node, (current) => {
|
|
29
|
+
if (current.kind === SyntaxKind.Identifier)
|
|
30
|
+
texts.push(current.text);
|
|
31
|
+
});
|
|
32
|
+
return texts;
|
|
33
|
+
}
|
|
34
|
+
afterEach(() => {
|
|
35
|
+
while (directories.length > 0)
|
|
36
|
+
rmSync(directories.pop(), { recursive: true, force: true });
|
|
37
|
+
});
|
|
38
|
+
describe("bundleModules", () => {
|
|
39
|
+
it("loads dependencies before the entry module and renames top-level bindings", () => {
|
|
40
|
+
const directory = writeFiles({
|
|
41
|
+
"util.ts": "export function add(a: number, b: number) { return a + b; }",
|
|
42
|
+
"main.ts": 'import { add } from "./util";\nconsole.log(add(1, 2));',
|
|
43
|
+
});
|
|
44
|
+
const { result, bag } = bundle(join(directory, "main.ts"));
|
|
45
|
+
expect(bag.hasErrors).toBe(false);
|
|
46
|
+
expect(result?.moduleCount).toBe(2);
|
|
47
|
+
const names = identifierTexts(result.sourceFile);
|
|
48
|
+
// Both the declaration and its use get the unique module-prefixed name.
|
|
49
|
+
const renamed = names.filter((name) => name.endsWith("add"));
|
|
50
|
+
expect(renamed.length).toBeGreaterThanOrEqual(2);
|
|
51
|
+
expect(new Set(renamed).size).toBe(1);
|
|
52
|
+
});
|
|
53
|
+
it("rewrites default imports to the dependency's default export", () => {
|
|
54
|
+
const directory = writeFiles({
|
|
55
|
+
"util.ts": "export default function make() { return 1; }",
|
|
56
|
+
"main.ts": 'import make from "./util";\nmake();',
|
|
57
|
+
});
|
|
58
|
+
const { result, bag } = bundle(join(directory, "main.ts"));
|
|
59
|
+
expect(bag.hasErrors).toBe(false);
|
|
60
|
+
const names = identifierTexts(result.sourceFile);
|
|
61
|
+
expect(names.some((name) => name.endsWith("make"))).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
it("lowers `export default <expression>` into a synthetic const", () => {
|
|
64
|
+
const directory = writeFiles({ "main.ts": "export default 42;" });
|
|
65
|
+
const { result, bag } = bundle(join(directory, "main.ts"));
|
|
66
|
+
expect(bag.hasErrors).toBe(false);
|
|
67
|
+
const statements = result.sourceFile.statements;
|
|
68
|
+
expect(statements).toHaveLength(1);
|
|
69
|
+
expect(statements[0].kind).toBe(SyntaxKind.VariableStatement);
|
|
70
|
+
const names = identifierTexts(result.sourceFile);
|
|
71
|
+
expect(names.some((name) => name.endsWith("default"))).toBe(true);
|
|
72
|
+
});
|
|
73
|
+
it("lowers namespace imports into an object literal", () => {
|
|
74
|
+
const directory = writeFiles({
|
|
75
|
+
"util.ts": "export const x = 1;\nexport function add() { return 1; }",
|
|
76
|
+
"main.ts": 'import * as util from "./util";\nutil.x;',
|
|
77
|
+
});
|
|
78
|
+
const { result, bag } = bundle(join(directory, "main.ts"));
|
|
79
|
+
expect(bag.hasErrors).toBe(false);
|
|
80
|
+
let hasObjectLiteral = false;
|
|
81
|
+
walk(result.sourceFile, (node) => {
|
|
82
|
+
if (node.kind === SyntaxKind.ObjectLiteralExpression)
|
|
83
|
+
hasObjectLiteral = true;
|
|
84
|
+
});
|
|
85
|
+
expect(hasObjectLiteral).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
it("resolves named re-exports from another module", () => {
|
|
88
|
+
const directory = writeFiles({
|
|
89
|
+
"math.ts": "export function add() { return 1; }",
|
|
90
|
+
"index.ts": 'export { add as plus } from "./math";',
|
|
91
|
+
"main.ts": 'import { plus } from "./index";\nplus();',
|
|
92
|
+
});
|
|
93
|
+
const { result, bag } = bundle(join(directory, "main.ts"));
|
|
94
|
+
expect(bag.hasErrors).toBe(false);
|
|
95
|
+
expect(result?.moduleCount).toBe(3);
|
|
96
|
+
});
|
|
97
|
+
it("resolves `export *` re-exports", () => {
|
|
98
|
+
const directory = writeFiles({
|
|
99
|
+
"math.ts": "export const two = 2;",
|
|
100
|
+
"index.ts": 'export * from "./math";',
|
|
101
|
+
"main.ts": 'import { two } from "./index";\ntwo;',
|
|
102
|
+
});
|
|
103
|
+
const { result, bag } = bundle(join(directory, "main.ts"));
|
|
104
|
+
expect(bag.hasErrors).toBe(false);
|
|
105
|
+
expect(result?.moduleCount).toBe(3);
|
|
106
|
+
});
|
|
107
|
+
it("keeps external (extension) imports in place", () => {
|
|
108
|
+
const directory = writeFiles({
|
|
109
|
+
"main.ts": 'import fs from "node:fs";\nfs.readFileSync("f.txt");',
|
|
110
|
+
});
|
|
111
|
+
const { result, bag } = bundle(join(directory, "main.ts"));
|
|
112
|
+
expect(bag.hasErrors).toBe(false);
|
|
113
|
+
expect(result.sourceFile.statements[0].kind).toBe(SyntaxKind.ImportDeclaration);
|
|
114
|
+
});
|
|
115
|
+
it("terminates on a circular import graph", () => {
|
|
116
|
+
const directory = writeFiles({
|
|
117
|
+
"a.ts": 'import { b } from "./b";\nexport const a = 1;',
|
|
118
|
+
"b.ts": 'import { a } from "./a";\nexport const b = 2;',
|
|
119
|
+
});
|
|
120
|
+
const { result, bag } = bundle(join(directory, "a.ts"));
|
|
121
|
+
// Modules are cached before their imports are walked, so a cycle is bundled
|
|
122
|
+
// once rather than recursing forever.
|
|
123
|
+
expect(bag.hasErrors).toBe(false);
|
|
124
|
+
expect(result?.moduleCount).toBe(2);
|
|
125
|
+
});
|
|
126
|
+
it("reports a dependency that cannot be resolved", () => {
|
|
127
|
+
const directory = writeFiles({ "main.ts": 'import { x } from "./missing";\nx;' });
|
|
128
|
+
const { result, bag } = bundle(join(directory, "main.ts"));
|
|
129
|
+
expect(result).toBeUndefined();
|
|
130
|
+
expect(bag.diagnostics.some((d) => d.message.includes("Cannot resolve module"))).toBe(true);
|
|
131
|
+
});
|
|
132
|
+
it("reports an entry file that does not exist", () => {
|
|
133
|
+
const directory = temporaryDirectory();
|
|
134
|
+
const { result, bag } = bundle(join(directory, "nope.ts"));
|
|
135
|
+
expect(result).toBeUndefined();
|
|
136
|
+
expect(bag.diagnostics.some((d) => d.code === DiagnosticCode.CodegenError)).toBe(true);
|
|
137
|
+
expect(bag.diagnostics.some((d) => d.message.includes("Cannot find module"))).toBe(true);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
//# sourceMappingURL=modules.test.js.map
|