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
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { parse } from "../helpers.js";
|
|
4
|
+
import { SyntaxKind } from "../../src/ast/nodes.js";
|
|
5
|
+
function statements(source) {
|
|
6
|
+
const { file, diagnostics } = parse(source);
|
|
7
|
+
return { stmts: file.statements, diagnostics };
|
|
8
|
+
}
|
|
9
|
+
describe("statement parsing", () => {
|
|
10
|
+
it("parses empty and debugger statements", () => {
|
|
11
|
+
const { stmts, diagnostics } = statements(";\ndebugger;");
|
|
12
|
+
expect(diagnostics).toHaveLength(0);
|
|
13
|
+
expect(stmts[0].kind).toBe(SyntaxKind.EmptyStatement);
|
|
14
|
+
expect(stmts[1].kind).toBe(SyntaxKind.DebuggerStatement);
|
|
15
|
+
});
|
|
16
|
+
it("parses const enums", () => {
|
|
17
|
+
const { stmts, diagnostics } = statements("const enum E { A, B }");
|
|
18
|
+
expect(diagnostics).toHaveLength(0);
|
|
19
|
+
expect(stmts[0].kind).toBe(SyntaxKind.EnumDeclaration);
|
|
20
|
+
});
|
|
21
|
+
it("parses labeled statements", () => {
|
|
22
|
+
const { stmts, diagnostics } = statements("outer: for (;;) { break outer; }");
|
|
23
|
+
expect(diagnostics).toHaveLength(0);
|
|
24
|
+
expect(stmts[0].kind).toBe(SyntaxKind.LabeledStatement);
|
|
25
|
+
});
|
|
26
|
+
it("parses interface, type alias, enum and namespace declarations", () => {
|
|
27
|
+
const cases = [
|
|
28
|
+
"interface I { x: number; }",
|
|
29
|
+
"type T = number | string;",
|
|
30
|
+
"enum E { A, B }",
|
|
31
|
+
"namespace N { export const x = 1; }",
|
|
32
|
+
'module "m" { export const y = 2; }',
|
|
33
|
+
];
|
|
34
|
+
for (const source of cases) {
|
|
35
|
+
const { diagnostics } = statements(source);
|
|
36
|
+
expect(diagnostics, source).toHaveLength(0);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
it("parses declare modifiers on every declaration kind", () => {
|
|
40
|
+
const cases = [
|
|
41
|
+
"declare const x: number;",
|
|
42
|
+
"declare let y: number;",
|
|
43
|
+
"declare const enum E { A }",
|
|
44
|
+
"declare function f(): void;",
|
|
45
|
+
"declare class C {}",
|
|
46
|
+
"declare interface I {}",
|
|
47
|
+
"declare type T = number;",
|
|
48
|
+
"declare enum E { A }",
|
|
49
|
+
"declare namespace N {}",
|
|
50
|
+
'declare module "m" {}',
|
|
51
|
+
];
|
|
52
|
+
for (const source of cases) {
|
|
53
|
+
const { diagnostics } = statements(source);
|
|
54
|
+
expect(diagnostics, source).toHaveLength(0);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
it("parses export default function and class declarations", () => {
|
|
58
|
+
expect(statements("export default function f() {}").diagnostics).toHaveLength(0);
|
|
59
|
+
expect(statements("export default class C {}").diagnostics).toHaveLength(0);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe("class member parsing", () => {
|
|
63
|
+
it("skips stray semicolons", () => {
|
|
64
|
+
const { stmts, diagnostics } = statements("class C { ; x = 1; }");
|
|
65
|
+
expect(diagnostics).toHaveLength(0);
|
|
66
|
+
expect(stmts[0].members).toHaveLength(1);
|
|
67
|
+
});
|
|
68
|
+
it("parses member modifiers", () => {
|
|
69
|
+
const source = "class C { public x = 1; private y = 2; protected z = 3; readonly w = 4; static s = 5; abstract m(): void; }";
|
|
70
|
+
const { diagnostics } = statements(source);
|
|
71
|
+
expect(diagnostics).toHaveLength(0);
|
|
72
|
+
});
|
|
73
|
+
it("parses optional and definite-assignment properties", () => {
|
|
74
|
+
const { stmts, diagnostics } = statements("class C { a?: number; b!: number; }");
|
|
75
|
+
expect(diagnostics).toHaveLength(0);
|
|
76
|
+
expect(stmts[0].members[0].questionToken).toBe(true);
|
|
77
|
+
expect(stmts[0].members[1].exclamationToken).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
it("parses bodyless accessor, method and constructor signatures", () => {
|
|
80
|
+
const source = "class C { get x(): number; set x(v: number); constructor(); m(): void; }";
|
|
81
|
+
const { diagnostics } = statements(source);
|
|
82
|
+
expect(diagnostics).toHaveLength(0);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=statements.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statements.test.js","sourceRoot":"","sources":["../../../tests/parser/statements.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { parse } from "../helpers.js";
|
|
3
|
+
import { SyntaxKind } from "../../src/ast/nodes.js";
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
5
|
+
function first(source) {
|
|
6
|
+
const { file, diagnostics } = parse(source);
|
|
7
|
+
expect(diagnostics.filter((d) => d.category === "error")).toHaveLength(0);
|
|
8
|
+
return file.statements[0];
|
|
9
|
+
}
|
|
10
|
+
function members(source) {
|
|
11
|
+
return first(source).members;
|
|
12
|
+
}
|
|
13
|
+
describe("parser type members", () => {
|
|
14
|
+
it("parses call signatures", () => {
|
|
15
|
+
const [member] = members("interface I { (x: number): string; }");
|
|
16
|
+
expect(member.kind).toBe(SyntaxKind.MethodSignature);
|
|
17
|
+
expect(member.name.text).toBe("__call");
|
|
18
|
+
expect(member.parameters).toHaveLength(1);
|
|
19
|
+
expect(member.returnType.kind).toBe(SyntaxKind.StringKeywordType);
|
|
20
|
+
});
|
|
21
|
+
it("parses generic call signatures with type parameters", () => {
|
|
22
|
+
const [member] = members("interface I { <T>(x: T): T; }");
|
|
23
|
+
expect(member.kind).toBe(SyntaxKind.MethodSignature);
|
|
24
|
+
expect(member.typeParameters).toHaveLength(1);
|
|
25
|
+
expect(member.returnType.kind).toBe(SyntaxKind.TypeReference);
|
|
26
|
+
});
|
|
27
|
+
it("parses index signatures", () => {
|
|
28
|
+
const [member] = members("interface I { [key: string]: number; }");
|
|
29
|
+
expect(member.kind).toBe(SyntaxKind.IndexSignature);
|
|
30
|
+
expect(member.parameters[0].name.text).toBe("key");
|
|
31
|
+
expect(member.parameters[0].type.kind).toBe(SyntaxKind.StringKeywordType);
|
|
32
|
+
expect(member.type.kind).toBe(SyntaxKind.NumberKeywordType);
|
|
33
|
+
});
|
|
34
|
+
it("falls back to a property signature for an invalid index signature", () => {
|
|
35
|
+
const [member] = members("interface I { [key]: number; }");
|
|
36
|
+
expect(member.kind).toBe(SyntaxKind.PropertySignature);
|
|
37
|
+
});
|
|
38
|
+
it("parses method signatures", () => {
|
|
39
|
+
const [member] = members("interface I { greet(name: string): void; }");
|
|
40
|
+
expect(member.kind).toBe(SyntaxKind.MethodSignature);
|
|
41
|
+
expect(member.name.text).toBe("greet");
|
|
42
|
+
expect(member.questionToken).toBe(false);
|
|
43
|
+
expect(member.returnType.kind).toBe(SyntaxKind.VoidKeywordType);
|
|
44
|
+
});
|
|
45
|
+
it("parses generic method signatures", () => {
|
|
46
|
+
const [member] = members("interface I { map<T>(fn: (x: T) => T): T; }");
|
|
47
|
+
expect(member.kind).toBe(SyntaxKind.MethodSignature);
|
|
48
|
+
expect(member.typeParameters).toHaveLength(1);
|
|
49
|
+
});
|
|
50
|
+
it("parses optional, readonly and untyped property signatures", () => {
|
|
51
|
+
const [readonly, plain, untyped] = members("interface I { readonly a?: number; b: string; c; }");
|
|
52
|
+
expect(readonly.kind).toBe(SyntaxKind.PropertySignature);
|
|
53
|
+
expect(readonly.readonlyToken).toBe(true);
|
|
54
|
+
expect(readonly.questionToken).toBe(true);
|
|
55
|
+
expect(readonly.type.kind).toBe(SyntaxKind.NumberKeywordType);
|
|
56
|
+
expect(plain.readonlyToken).toBe(false);
|
|
57
|
+
expect(plain.questionToken).toBe(false);
|
|
58
|
+
expect(untyped.kind).toBe(SyntaxKind.PropertySignature);
|
|
59
|
+
expect(untyped.type).toBeUndefined();
|
|
60
|
+
});
|
|
61
|
+
it("parses multiple members separated by commas", () => {
|
|
62
|
+
const parsed = members("interface I { a: number, b: string, }");
|
|
63
|
+
expect(parsed).toHaveLength(2);
|
|
64
|
+
});
|
|
65
|
+
it("parses module declarations with a block body", () => {
|
|
66
|
+
const declaration = first("module Foo { const x = 1; }");
|
|
67
|
+
expect(declaration.kind).toBe(SyntaxKind.ModuleDeclaration);
|
|
68
|
+
expect(declaration.name.kind).toBe(SyntaxKind.Identifier);
|
|
69
|
+
expect(declaration.name.text).toBe("Foo");
|
|
70
|
+
expect(declaration.body.kind).toBe(SyntaxKind.Block);
|
|
71
|
+
});
|
|
72
|
+
it("parses dotted namespace declarations without a body", () => {
|
|
73
|
+
const declaration = first("namespace A.B.C;");
|
|
74
|
+
expect(declaration.kind).toBe(SyntaxKind.ModuleDeclaration);
|
|
75
|
+
expect(declaration.name.text).toBe("A");
|
|
76
|
+
expect(declaration.body).toBeUndefined();
|
|
77
|
+
});
|
|
78
|
+
it("parses string-named ambient modules", () => {
|
|
79
|
+
const declaration = first('declare module "foo" { }');
|
|
80
|
+
expect(declaration.kind).toBe(SyntaxKind.ModuleDeclaration);
|
|
81
|
+
expect(declaration.name.kind).toBe(SyntaxKind.StringLiteral);
|
|
82
|
+
expect(declaration.name.value).toBe("foo");
|
|
83
|
+
expect(declaration.body.kind).toBe(SyntaxKind.Block);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=type-members.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-members.test.js","sourceRoot":"","sources":["../../../tests/parser/type-members.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,uDAAuD;AACvD,SAAS,KAAK,CAAC,MAAc;IAC3B,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,OAAO,CAAC,MAAc;IAC7B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;AAC/B,CAAC;AAED,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,sCAAsC,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,wCAAwC,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAC1E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,gCAAgC,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,4CAA4C,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,6CAA6C,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,oDAAoD,CAAC,CAAC;QACjG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACzD,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAE9D,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAExC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,OAAO,CAAC,uCAAuC,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,WAAW,GAAG,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACzD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAC5D,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,WAAW,GAAG,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC9C,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAC5D,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,WAAW,GAAG,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACtD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAC5D,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAC7D,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { parse } from "../helpers.js";
|
|
3
|
+
import { SyntaxKind } from "../../src/ast/nodes.js";
|
|
4
|
+
import { TypeOperator } from "../../src/ast/operators.js";
|
|
5
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
6
|
+
function aliasType(source) {
|
|
7
|
+
const { file, diagnostics } = parse(source);
|
|
8
|
+
expect(diagnostics.filter((d) => d.category === "error")).toHaveLength(0);
|
|
9
|
+
return file.statements[0].type;
|
|
10
|
+
}
|
|
11
|
+
describe("parser type syntax", () => {
|
|
12
|
+
it("parses intersection types", () => {
|
|
13
|
+
const type = aliasType("type T = A & B & C;");
|
|
14
|
+
expect(type.kind).toBe(SyntaxKind.IntersectionType);
|
|
15
|
+
expect(type.types).toHaveLength(3);
|
|
16
|
+
expect(type.types.map((t) => t.kind)).toEqual([
|
|
17
|
+
SyntaxKind.TypeReference,
|
|
18
|
+
SyntaxKind.TypeReference,
|
|
19
|
+
SyntaxKind.TypeReference,
|
|
20
|
+
]);
|
|
21
|
+
});
|
|
22
|
+
it("tolerates leading union and intersection bars", () => {
|
|
23
|
+
const union = aliasType("type T = | A | B;");
|
|
24
|
+
expect(union.kind).toBe(SyntaxKind.UnionType);
|
|
25
|
+
expect(union.types).toHaveLength(2);
|
|
26
|
+
const intersection = aliasType("type T = & A & B;");
|
|
27
|
+
expect(intersection.kind).toBe(SyntaxKind.IntersectionType);
|
|
28
|
+
expect(intersection.types).toHaveLength(2);
|
|
29
|
+
});
|
|
30
|
+
it("parses keyof, unique and readonly type operators", () => {
|
|
31
|
+
const keyof = aliasType("type T = keyof Foo;");
|
|
32
|
+
expect(keyof.kind).toBe(SyntaxKind.TypeOperator);
|
|
33
|
+
expect(keyof.operator).toBe(TypeOperator.KeyOf);
|
|
34
|
+
const unique = aliasType("type T = unique symbol;");
|
|
35
|
+
expect(unique.kind).toBe(SyntaxKind.TypeOperator);
|
|
36
|
+
expect(unique.operator).toBe(TypeOperator.Unique);
|
|
37
|
+
const readonly = aliasType("type T = readonly number[];");
|
|
38
|
+
expect(readonly.kind).toBe(SyntaxKind.TypeOperator);
|
|
39
|
+
expect(readonly.operator).toBe(TypeOperator.Readonly);
|
|
40
|
+
});
|
|
41
|
+
it("parses infer types with and without a constraint", () => {
|
|
42
|
+
const plain = aliasType("type T = infer R;");
|
|
43
|
+
expect(plain.kind).toBe(SyntaxKind.InferType);
|
|
44
|
+
expect(plain.typeParameter.name.text).toBe("R");
|
|
45
|
+
expect(plain.typeParameter.constraint).toBeUndefined();
|
|
46
|
+
const constrained = aliasType("type T = infer R extends string;");
|
|
47
|
+
expect(constrained.kind).toBe(SyntaxKind.InferType);
|
|
48
|
+
expect(constrained.typeParameter.constraint.kind).toBe(SyntaxKind.StringKeywordType);
|
|
49
|
+
});
|
|
50
|
+
it("parses every keyword type", () => {
|
|
51
|
+
const cases = [
|
|
52
|
+
["bigint", SyntaxKind.BigIntKeywordType],
|
|
53
|
+
["boolean", SyntaxKind.BooleanKeywordType],
|
|
54
|
+
["symbol", SyntaxKind.SymbolKeywordType],
|
|
55
|
+
["undefined", SyntaxKind.UndefinedKeywordType],
|
|
56
|
+
["null", SyntaxKind.NullKeywordType],
|
|
57
|
+
["never", SyntaxKind.NeverKeywordType],
|
|
58
|
+
["object", SyntaxKind.ObjectKeywordType],
|
|
59
|
+
["this", SyntaxKind.ThisKeywordType],
|
|
60
|
+
];
|
|
61
|
+
for (const [text, kind] of cases) {
|
|
62
|
+
expect(aliasType(`type T = ${text};`).kind).toBe(kind);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
it("parses typeof queries with and without type arguments", () => {
|
|
66
|
+
const plain = aliasType("type T = typeof foo.bar;");
|
|
67
|
+
expect(plain.kind).toBe(SyntaxKind.TypeQuery);
|
|
68
|
+
expect(plain.exprName.kind).toBe(SyntaxKind.QualifiedName);
|
|
69
|
+
expect(plain.typeArguments).toEqual([]);
|
|
70
|
+
const generic = aliasType("type T = typeof foo<number>;");
|
|
71
|
+
expect(generic.kind).toBe(SyntaxKind.TypeQuery);
|
|
72
|
+
expect(generic.typeArguments).toHaveLength(1);
|
|
73
|
+
});
|
|
74
|
+
it("parses parenthesized and function types", () => {
|
|
75
|
+
expect(aliasType("type T = (number);").kind).toBe(SyntaxKind.ParenthesizedType);
|
|
76
|
+
expect(aliasType("type T = (x: number) => string;").kind).toBe(SyntaxKind.FunctionType);
|
|
77
|
+
expect(aliasType("type T = <U>(x: U) => U;").kind).toBe(SyntaxKind.FunctionType);
|
|
78
|
+
expect(aliasType("type T = new (x: number) => Foo;").kind).toBe(SyntaxKind.FunctionType);
|
|
79
|
+
});
|
|
80
|
+
it("parses literal types including booleans and negatives", () => {
|
|
81
|
+
const trueType = aliasType("type T = true;");
|
|
82
|
+
expect(trueType.kind).toBe(SyntaxKind.LiteralType);
|
|
83
|
+
expect(trueType.literal.kind).toBe(SyntaxKind.TrueKeyword);
|
|
84
|
+
const falseType = aliasType("type T = false;");
|
|
85
|
+
expect(falseType.literal.kind).toBe(SyntaxKind.FalseKeyword);
|
|
86
|
+
const negative = aliasType("type T = -1;");
|
|
87
|
+
expect(negative.kind).toBe(SyntaxKind.LiteralType);
|
|
88
|
+
expect(negative.literal.text).toBe("-1");
|
|
89
|
+
expect(negative.literal.value).toBe(-1);
|
|
90
|
+
expect(aliasType('type T = "x";').literal.value).toBe("x");
|
|
91
|
+
expect(aliasType("type T = 3;").literal.value).toBe(3);
|
|
92
|
+
});
|
|
93
|
+
it("parses import types, degrading them to a loose node", () => {
|
|
94
|
+
const type = aliasType('type T = import("./m").Foo;');
|
|
95
|
+
expect(type.kind).toBe(SyntaxKind.AnyKeywordType);
|
|
96
|
+
});
|
|
97
|
+
it("parses indexed access types", () => {
|
|
98
|
+
const type = aliasType('type T = Foo["bar"];');
|
|
99
|
+
expect(type.kind).toBe(SyntaxKind.IndexedAccessType);
|
|
100
|
+
expect(type.objectType.kind).toBe(SyntaxKind.TypeReference);
|
|
101
|
+
expect(type.indexType.kind).toBe(SyntaxKind.LiteralType);
|
|
102
|
+
});
|
|
103
|
+
it("parses tuple types with rest and optional members", () => {
|
|
104
|
+
const type = aliasType("type T = [number, string?, ...boolean[]];");
|
|
105
|
+
expect(type.kind).toBe(SyntaxKind.TupleType);
|
|
106
|
+
expect(type.elements.map((e) => e.kind)).toEqual([
|
|
107
|
+
SyntaxKind.NumberKeywordType,
|
|
108
|
+
SyntaxKind.OptionalType,
|
|
109
|
+
SyntaxKind.RestType,
|
|
110
|
+
]);
|
|
111
|
+
});
|
|
112
|
+
it("parses mapped types with question modifiers", () => {
|
|
113
|
+
const optional = aliasType("type T = { [K in keyof U]?: U[K] };");
|
|
114
|
+
expect(optional.kind).toBe(SyntaxKind.MappedType);
|
|
115
|
+
expect(optional.questionToken).toBe(true);
|
|
116
|
+
const added = aliasType("type T = { [K in keyof U]+?: U[K] };");
|
|
117
|
+
expect(added.kind).toBe(SyntaxKind.MappedType);
|
|
118
|
+
expect(added.questionToken).toBe("+");
|
|
119
|
+
const removed = aliasType("type T = { [K in keyof U]-?: U[K] };");
|
|
120
|
+
expect(removed.kind).toBe(SyntaxKind.MappedType);
|
|
121
|
+
expect(removed.questionToken).toBe("-");
|
|
122
|
+
});
|
|
123
|
+
it("parses conditional types", () => {
|
|
124
|
+
const type = aliasType("type T = A extends B ? C : D;");
|
|
125
|
+
expect(type.kind).toBe(SyntaxKind.ConditionalType);
|
|
126
|
+
expect(type.checkType.kind).toBe(SyntaxKind.TypeReference);
|
|
127
|
+
expect(type.trueType.kind).toBe(SyntaxKind.TypeReference);
|
|
128
|
+
expect(type.falseType.kind).toBe(SyntaxKind.TypeReference);
|
|
129
|
+
});
|
|
130
|
+
it("parses generic type references and qualified names", () => {
|
|
131
|
+
const generic = aliasType("type T = Map<string, number>;");
|
|
132
|
+
expect(generic.kind).toBe(SyntaxKind.TypeReference);
|
|
133
|
+
expect(generic.typeArguments).toHaveLength(2);
|
|
134
|
+
const qualified = aliasType("type T = A.B.C;");
|
|
135
|
+
expect(qualified.kind).toBe(SyntaxKind.TypeReference);
|
|
136
|
+
expect(qualified.typeName.kind).toBe(SyntaxKind.QualifiedName);
|
|
137
|
+
});
|
|
138
|
+
it("reports invalid type syntax", () => {
|
|
139
|
+
const { diagnostics } = parse("type T = @;");
|
|
140
|
+
expect(diagnostics.some((d) => d.category === "error")).toBe(true);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
//# sourceMappingURL=types.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../../tests/parser/types.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xbintsc",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"description": "xbintsc - a TypeScript binary compiler (TypeScript -> LLVM IR -> native binary)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -38,15 +38,20 @@
|
|
|
38
38
|
"runtime:clean": "node -e \"require('fs').rmSync('build/runtime-obj',{recursive:true,force:true});require('fs').rmSync('runtime/lib',{recursive:true,force:true})\"",
|
|
39
39
|
"xbintsc": "tsx src/cli/main.ts",
|
|
40
40
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
41
|
+
"lint": "eslint .",
|
|
41
42
|
"test": "vitest run",
|
|
42
43
|
"test:watch": "vitest",
|
|
43
44
|
"test:e2e": "vitest run tests/e2e",
|
|
44
45
|
"coverage": "vitest run --coverage"
|
|
45
46
|
},
|
|
46
47
|
"devDependencies": {
|
|
48
|
+
"@eslint/js": "^9.39.5",
|
|
47
49
|
"@types/node": "^22.20.4",
|
|
50
|
+
"@vitest/coverage-v8": "^2.1.9",
|
|
51
|
+
"eslint": "^9.39.5",
|
|
48
52
|
"tsx": "^4.19.2",
|
|
49
53
|
"typescript": "^5.7.2",
|
|
54
|
+
"typescript-eslint": "^8.70.1",
|
|
50
55
|
"vitest": "^2.1.8"
|
|
51
56
|
},
|
|
52
57
|
"engines": {
|
|
@@ -131,11 +131,46 @@ xt_value xt_node_exists(int32_t argc, xt_value *argv) {
|
|
|
131
131
|
/* readdirSync */
|
|
132
132
|
/* ------------------------------------------------------------------------- */
|
|
133
133
|
|
|
134
|
+
/* Defined alongside `statSync` further down; the `Dirent` objects built for
|
|
135
|
+
`readdirSync(path, { withFileTypes: true })` reuse the same closures. */
|
|
136
|
+
static void xt_fs_define_stat_method(xt_value object, const char *name, unsigned int mode);
|
|
137
|
+
|
|
138
|
+
/* Build the Node `Dirent`-shaped object (`name` plus stat predicates) for a
|
|
139
|
+
single directory entry. Types come from `lstat`, matching Node's `d_type`
|
|
140
|
+
based `Dirent` (a symlink reports `isSymbolicLink()` true). */
|
|
141
|
+
static xt_value xt_node_dirent_result(const char *dir, const char *name) {
|
|
142
|
+
size_t size = strlen(dir) + strlen(name) + 2;
|
|
143
|
+
char *full = (char *)malloc(size);
|
|
144
|
+
unsigned int mode = 0;
|
|
145
|
+
if (full) {
|
|
146
|
+
snprintf(full, size, "%s/%s", dir, name);
|
|
147
|
+
xt_fs_stat_t info;
|
|
148
|
+
if (xt_fs_lstat_fn(full, &info) == 0) mode = (unsigned int)info.st_mode;
|
|
149
|
+
free(full);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
xt_value object = xt_object_new();
|
|
153
|
+
xt_object_set(object, xt_string_from_cstr("name"), xt_string_from_cstr(name));
|
|
154
|
+
xt_fs_define_stat_method(object, "isFile", mode);
|
|
155
|
+
xt_fs_define_stat_method(object, "isDirectory", mode);
|
|
156
|
+
xt_fs_define_stat_method(object, "isSymbolicLink", mode);
|
|
157
|
+
xt_fs_define_stat_method(object, "isFIFO", mode);
|
|
158
|
+
xt_fs_define_stat_method(object, "isSocket", mode);
|
|
159
|
+
xt_fs_define_stat_method(object, "isBlockDevice", mode);
|
|
160
|
+
xt_fs_define_stat_method(object, "isCharacterDevice", mode);
|
|
161
|
+
return object;
|
|
162
|
+
}
|
|
163
|
+
|
|
134
164
|
xt_value xt_node_read_dir(int32_t argc, xt_value *argv) {
|
|
135
165
|
if (argc < 1) return xt_undefined();
|
|
136
166
|
const char *path = xt_string_data(xt_to_string(argv[0]));
|
|
137
167
|
if (!path) return xt_undefined();
|
|
138
168
|
|
|
169
|
+
/* `readdirSync(path, { withFileTypes: true })` yields `Dirent` objects;
|
|
170
|
+
without the option the result is a plain array of entry names. */
|
|
171
|
+
int withFileTypes =
|
|
172
|
+
argc > 1 && XT_IS_OBJECT(argv[1]) && xt_truthy(xt_object_get_cstr(argv[1], "withFileTypes"));
|
|
173
|
+
|
|
139
174
|
xt_fs_dir dir;
|
|
140
175
|
if (!xt_fs_dir_open(&dir, path)) {
|
|
141
176
|
xt_fs_error("open directory", path);
|
|
@@ -159,7 +194,7 @@ xt_value xt_node_read_dir(int32_t argc, xt_value *argv) {
|
|
|
159
194
|
if (!grown) break;
|
|
160
195
|
items = grown;
|
|
161
196
|
}
|
|
162
|
-
items[count++] = xt_string_from_cstr(name);
|
|
197
|
+
items[count++] = withFileTypes ? xt_node_dirent_result(path, name) : xt_string_from_cstr(name);
|
|
163
198
|
}
|
|
164
199
|
xt_fs_dir_close(&dir);
|
|
165
200
|
|
package/runtime/rt.h
CHANGED
|
@@ -107,6 +107,7 @@ xt_value xt_closure_call(xt_value fn, int32_t argc, xt_value *argv);
|
|
|
107
107
|
xt_value xt_call_with_this(xt_value fn, xt_value thisValue, int32_t argc, xt_value *argv);
|
|
108
108
|
xt_value xt_closure_env(xt_value fn, int32_t index);
|
|
109
109
|
int32_t xt_closure_arity(xt_value fn);
|
|
110
|
+
xt_value xt_function_set_metadata(xt_value fn, xt_value name, int32_t arity);
|
|
110
111
|
xt_value xt_this(void);
|
|
111
112
|
xt_value xt_new(xt_value ctor, int32_t argc, xt_value *argv);
|
|
112
113
|
xt_value xt_instance_of(xt_value value, xt_value ctor);
|
|
@@ -169,6 +170,14 @@ xt_value xt_object_entries(xt_value obj);
|
|
|
169
170
|
xt_value xt_object_assign(int32_t argc, xt_value *argv);
|
|
170
171
|
xt_value xt_object_spread(xt_value target, xt_value source);
|
|
171
172
|
|
|
173
|
+
/* -- symbols -------------------------------------------------------------- */
|
|
174
|
+
/** Implements `Symbol(description)`. */
|
|
175
|
+
xt_value xt_symbol(int32_t argc, xt_value *argv);
|
|
176
|
+
/** Implements `Symbol.<name>(...)` statics (`for`, `keyFor`). */
|
|
177
|
+
xt_value xt_symbol_static(xt_value name, int32_t argc, xt_value *argv);
|
|
178
|
+
/** Reads a well-known symbol (`Symbol.iterator`, ...). */
|
|
179
|
+
xt_value xt_symbol_get(xt_value name);
|
|
180
|
+
|
|
172
181
|
/* -- standard library dispatch -------------------------------------------- */
|
|
173
182
|
/** Call `target[name](...)`, falling back to built-in Array/String methods. */
|
|
174
183
|
xt_value xt_call_method(xt_value target, xt_value name, int32_t argc, xt_value *argv);
|
|
@@ -229,6 +238,10 @@ xt_value xt_parse_int(int32_t argc, xt_value *argv);
|
|
|
229
238
|
xt_value xt_parse_float(int32_t argc, xt_value *argv);
|
|
230
239
|
xt_value xt_is_nan(int32_t argc, xt_value *argv);
|
|
231
240
|
xt_value xt_is_finite(int32_t argc, xt_value *argv);
|
|
241
|
+
xt_value xt_encode_uri_component(int32_t argc, xt_value *argv);
|
|
242
|
+
xt_value xt_encode_uri(int32_t argc, xt_value *argv);
|
|
243
|
+
xt_value xt_decode_uri_component(int32_t argc, xt_value *argv);
|
|
244
|
+
xt_value xt_decode_uri(int32_t argc, xt_value *argv);
|
|
232
245
|
xt_value xt_number_ctor(int32_t argc, xt_value *argv);
|
|
233
246
|
xt_value xt_string_ctor(int32_t argc, xt_value *argv);
|
|
234
247
|
xt_value xt_boolean_ctor(int32_t argc, xt_value *argv);
|
|
@@ -263,6 +276,10 @@ xt_value xt_iter_value(xt_value value, xt_value index);
|
|
|
263
276
|
/* -- generic member access ------------------------------------------------ */
|
|
264
277
|
xt_value xt_get(xt_value target, xt_value key);
|
|
265
278
|
xt_value xt_set(xt_value target, xt_value key, xt_value value);
|
|
279
|
+
/* Materialise a first-class runtime method value (`arr.map`) as an unbound
|
|
280
|
+
* closure that expects the receiver through `this`. Returns `XT_UNDEFINED` when
|
|
281
|
+
* `name` is not a method of `target`, so it can be used as a property fallback. */
|
|
282
|
+
xt_value xt_method_value(xt_value target, xt_value name);
|
|
266
283
|
|
|
267
284
|
/* -- boxes (used for captured variables) ---------------------------------- */
|
|
268
285
|
xt_value xt_box_new(xt_value value);
|
package/runtime/rt_internal.h
CHANGED
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
|
|
33
33
|
#include "rt.h"
|
|
34
34
|
|
|
35
|
+
#include <setjmp.h>
|
|
35
36
|
#include <stddef.h>
|
|
36
37
|
#include <stdint.h>
|
|
37
38
|
|
|
@@ -47,6 +48,9 @@
|
|
|
47
48
|
#define XT_OBJECT_KIND_REGEXP 9
|
|
48
49
|
#define XT_OBJECT_KIND_SYMBOL 10
|
|
49
50
|
#define XT_OBJECT_KIND_BIGINT 11
|
|
51
|
+
#define XT_OBJECT_KIND_ERROR 12
|
|
52
|
+
#define XT_OBJECT_KIND_GENERATOR 13
|
|
53
|
+
#define XT_OBJECT_KIND_ITERATOR 14
|
|
50
54
|
|
|
51
55
|
/* Common header for every heap object. */
|
|
52
56
|
typedef struct xt_header {
|
|
@@ -74,7 +78,8 @@ typedef struct {
|
|
|
74
78
|
} xt_bigint;
|
|
75
79
|
|
|
76
80
|
typedef struct {
|
|
77
|
-
|
|
81
|
+
/* String or Symbol value (see `xt_to_property_key`). */
|
|
82
|
+
xt_value key;
|
|
78
83
|
xt_value value;
|
|
79
84
|
/* Accessor properties (`get x()` / `set x(v)`) store the functions here;
|
|
80
85
|
* when set, `value` is ignored and property access invokes the getter. */
|
|
@@ -98,6 +103,9 @@ typedef struct {
|
|
|
98
103
|
uint32_t length;
|
|
99
104
|
uint32_t capacity;
|
|
100
105
|
xt_value *items;
|
|
106
|
+
/* Named (non-index) properties such as `raw` on template strings or
|
|
107
|
+
* `index`/`input` on RegExp match results, stored in an `xt_object`. */
|
|
108
|
+
xt_value extra;
|
|
101
109
|
} xt_array;
|
|
102
110
|
|
|
103
111
|
typedef struct {
|
|
@@ -109,6 +117,9 @@ typedef struct {
|
|
|
109
117
|
xt_string *name;
|
|
110
118
|
xt_object *properties;
|
|
111
119
|
xt_value prototype;
|
|
120
|
+
/* Set on generator function objects: calling the closure does not run the
|
|
121
|
+
* body, it creates a suspended generator (see xt_generator.c). */
|
|
122
|
+
uint8_t is_generator;
|
|
112
123
|
} xt_function;
|
|
113
124
|
|
|
114
125
|
/* Allocation (xt_alloc.c). */
|
|
@@ -121,6 +132,12 @@ int32_t xt_string_length(xt_string *s);
|
|
|
121
132
|
int xt_string_equals(xt_string *a, xt_string *b);
|
|
122
133
|
int32_t xt_to_int32(xt_value v);
|
|
123
134
|
|
|
135
|
+
/* ECMAScript number formatting (xt_values.c). */
|
|
136
|
+
void xt_number_to_js_string(double d, char *buffer, size_t size);
|
|
137
|
+
void xt_number_to_exponential(double d, int precision, char *buffer, size_t size);
|
|
138
|
+
void xt_number_to_precision(double d, int precision, char *buffer, size_t size);
|
|
139
|
+
void xt_number_to_fixed(double d, int precision, char *buffer, size_t size);
|
|
140
|
+
|
|
124
141
|
/* BigInt runtime (xt_bigint.c). */
|
|
125
142
|
int xt_is_bigint(xt_value value);
|
|
126
143
|
double xt_bigint_to_double_value(xt_value value);
|
|
@@ -150,7 +167,19 @@ void xt_array_reserve(xt_array *array, uint32_t needed);
|
|
|
150
167
|
|
|
151
168
|
/* Object helpers used by the standard library. */
|
|
152
169
|
xt_object *xt_as_object(xt_value value);
|
|
153
|
-
xt_property *xt_object_find_property(xt_object *obj,
|
|
170
|
+
xt_property *xt_object_find_property(xt_object *obj, xt_value key);
|
|
171
|
+
|
|
172
|
+
/* Property keys are either strings or symbols. */
|
|
173
|
+
xt_value xt_to_property_key(xt_value key);
|
|
174
|
+
int xt_property_key_equals(xt_value a, xt_value b);
|
|
175
|
+
|
|
176
|
+
/* Symbols (xt_symbol.c). */
|
|
177
|
+
int xt_is_symbol(xt_value value);
|
|
178
|
+
xt_value xt_symbol_new(xt_value description);
|
|
179
|
+
xt_value xt_symbol_description(xt_value value);
|
|
180
|
+
xt_value xt_symbol_to_string(xt_value value);
|
|
181
|
+
xt_value xt_symbol_well_known(const char *name);
|
|
182
|
+
xt_value xt_object_own_property_symbols(xt_value value);
|
|
154
183
|
|
|
155
184
|
/* Map / Set / Promise / Date / RegExp live in xt_stdlib.c and xt_promise.c. */
|
|
156
185
|
int xt_is_promise(xt_value value);
|
|
@@ -160,13 +189,66 @@ int xt_is_date(xt_value value);
|
|
|
160
189
|
int xt_is_regexp(xt_value value);
|
|
161
190
|
int xt_regexp_find(xt_value regexp, xt_value input, int32_t start, int32_t *matchStart, int32_t *matchEnd);
|
|
162
191
|
xt_value xt_regexp_exec(xt_value regexp, xt_value input);
|
|
192
|
+
xt_value xt_regexp_match(xt_value input, xt_value regexp);
|
|
163
193
|
xt_value xt_regexp_replace(xt_value value, xt_value regexp, xt_value replacement);
|
|
194
|
+
xt_value xt_regexp_split(xt_value value, xt_value regexp, xt_value limit);
|
|
164
195
|
xt_value xt_regexp_get_property(xt_value regexp, xt_value key);
|
|
165
196
|
int32_t xt_map_size(xt_value value);
|
|
166
197
|
int32_t xt_set_size(xt_value value);
|
|
167
198
|
/* `for...of` iteration: dispatch over arrays, strings, Maps and Sets. */
|
|
168
199
|
xt_value xt_iter_length(xt_value value);
|
|
169
200
|
xt_value xt_iter_value(xt_value value, xt_value index);
|
|
201
|
+
/* Per-step iteration check. Generators pull the next value here; the index is
|
|
202
|
+
* ignored because the value is cached until `xt_iter_value` reads it. */
|
|
203
|
+
xt_value xt_iter_has(xt_value value, xt_value index);
|
|
204
|
+
/* Resolve the iteration protocol once: returns `value` for the built-in index
|
|
205
|
+
* protocols, or a wrapper around `value[Symbol.iterator]()` otherwise. */
|
|
206
|
+
xt_value xt_iter_open(xt_value value);
|
|
207
|
+
|
|
208
|
+
/* Stackful generators (xt_generator.c). */
|
|
209
|
+
int xt_is_generator(xt_value value);
|
|
210
|
+
xt_value xt_generator_new(xt_value function, xt_value thisValue, int32_t argc, xt_value *argv);
|
|
211
|
+
xt_value xt_generator_next(xt_value generator, xt_value sent);
|
|
212
|
+
xt_value xt_generator_return(xt_value generator, xt_value value);
|
|
213
|
+
xt_value xt_generator_throw(xt_value generator, xt_value error);
|
|
214
|
+
xt_value xt_yield(xt_value value);
|
|
215
|
+
xt_value xt_yield_star(xt_value delegate);
|
|
216
|
+
int xt_generator_has_next(xt_value generator);
|
|
217
|
+
xt_value xt_generator_iter_value(xt_value generator);
|
|
218
|
+
|
|
219
|
+
/* Exception-frame plumbing shared with the generator runtime. The struct is
|
|
220
|
+
* public so a coroutine can `_setjmp` its own boundary directly (a `setjmp`
|
|
221
|
+
* must run in the frame it returns to, never in a helper). */
|
|
222
|
+
typedef struct xt_try_frame {
|
|
223
|
+
jmp_buf buf;
|
|
224
|
+
struct xt_try_frame *prev;
|
|
225
|
+
xt_value exception;
|
|
226
|
+
} xt_try_frame;
|
|
227
|
+
/* Call `_setjmp` the way the active `<setjmp.h>` declares it. The two Windows
|
|
228
|
+
* C runtimes differ:
|
|
229
|
+
*
|
|
230
|
+
* - MSVC/UCRT declares `_setjmp(jmp_buf)` with one visible argument and lets
|
|
231
|
+
* clang treat it as a built-in that injects the caller's frame address
|
|
232
|
+
* (`@llvm.frameaddress(0)`) as a hidden second argument. Writing the frame
|
|
233
|
+
* by hand is a compile error ("too many arguments to function call").
|
|
234
|
+
* - MinGW-w64 (the vendored llvm-mingw toolchain) declares
|
|
235
|
+
* `_setjmp(jmp_buf, void *frame)` itself, so the frame must be passed
|
|
236
|
+
* explicitly -- exactly what its own `setjmp` macro does.
|
|
237
|
+
*
|
|
238
|
+
* The generated IR always emits the two-argument form, because it is already
|
|
239
|
+
* IR and clang will not rewrite it. `_setjmp` (rather than the `setjmp` macro)
|
|
240
|
+
* is used so it pairs with the plain `longjmp` in `xt_throw`. */
|
|
241
|
+
#if defined(_WIN32) && !defined(__MINGW32__)
|
|
242
|
+
#define xt_try_setjmp(framePtr) _setjmp(((xt_try_frame *)(framePtr))->buf)
|
|
243
|
+
#elif defined(_WIN32) && defined(__aarch64__)
|
|
244
|
+
#define xt_try_setjmp(framePtr) _setjmpex(((xt_try_frame *)(framePtr))->buf, __builtin_sponentry())
|
|
245
|
+
#elif defined(_WIN32)
|
|
246
|
+
#define xt_try_setjmp(framePtr) _setjmp(((xt_try_frame *)(framePtr))->buf, __builtin_frame_address(0))
|
|
247
|
+
#else
|
|
248
|
+
#define xt_try_setjmp(framePtr) _setjmp(((xt_try_frame *)(framePtr))->buf)
|
|
249
|
+
#endif
|
|
250
|
+
void *xt_try_mark(void);
|
|
251
|
+
void xt_try_restore(void *mark);
|
|
170
252
|
|
|
171
253
|
/* -- collection / date / regexp representations --------------------------- */
|
|
172
254
|
typedef struct {
|
|
@@ -201,6 +283,10 @@ xt_value xt_ext_array_method(xt_value target, const char *method, int32_t argc,
|
|
|
201
283
|
xt_value xt_ext_string_method(xt_value target, const char *method, int32_t argc, xt_value *argv, int *handled);
|
|
202
284
|
xt_value xt_ext_number_method(xt_value target, const char *method, int32_t argc, xt_value *argv, int *handled);
|
|
203
285
|
xt_value xt_ext_object_method(xt_value target, const char *method, int32_t argc, xt_value *argv, int *handled);
|
|
286
|
+
|
|
287
|
+
/* Error family helpers (xt_stdlib2.c). */
|
|
288
|
+
xt_value xt_error_to_string(xt_value error);
|
|
289
|
+
xt_value xt_aggregate_error_ctor(int32_t argc, xt_value *argv);
|
|
204
290
|
xt_value xt_ext_container_method(xt_value target, const char *method, int32_t argc, xt_value *argv, int *handled);
|
|
205
291
|
xt_value xt_promise_method(xt_value target, const char *method, int32_t argc, xt_value *argv, int *handled);
|
|
206
292
|
|