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.
Files changed (81) hide show
  1. package/dist/src/codegen/generator/calls/invocation.js +9 -0
  2. package/dist/src/codegen/generator/calls/invocation.js.map +1 -1
  3. package/dist/src/codegen/generator/context.d.ts +15 -1
  4. package/dist/src/codegen/generator/context.js +29 -4
  5. package/dist/src/codegen/generator/context.js.map +1 -1
  6. package/dist/tests/ast/factory.test.d.ts +1 -0
  7. package/dist/tests/ast/factory.test.js +35 -0
  8. package/dist/tests/ast/factory.test.js.map +1 -0
  9. package/dist/tests/ast/visitor.test.d.ts +1 -0
  10. package/dist/tests/ast/visitor.test.js +53 -0
  11. package/dist/tests/ast/visitor.test.js.map +1 -0
  12. package/dist/tests/cli/main.test.js +109 -9
  13. package/dist/tests/cli/main.test.js.map +1 -1
  14. package/dist/tests/codegen/closures.test.d.ts +1 -0
  15. package/dist/tests/codegen/closures.test.js +32 -0
  16. package/dist/tests/codegen/closures.test.js.map +1 -0
  17. package/dist/tests/codegen/expressions.test.d.ts +1 -0
  18. package/dist/tests/codegen/expressions.test.js +149 -0
  19. package/dist/tests/codegen/expressions.test.js.map +1 -0
  20. package/dist/tests/codegen/llvm.test.js +14 -0
  21. package/dist/tests/codegen/llvm.test.js.map +1 -1
  22. package/dist/tests/codegen/values.test.d.ts +1 -0
  23. package/dist/tests/codegen/values.test.js +48 -0
  24. package/dist/tests/codegen/values.test.js.map +1 -0
  25. package/dist/tests/diagnostics/diagnostic.test.d.ts +1 -0
  26. package/dist/tests/diagnostics/diagnostic.test.js +117 -0
  27. package/dist/tests/diagnostics/diagnostic.test.js.map +1 -0
  28. package/dist/tests/diagnostics/source.test.d.ts +1 -0
  29. package/dist/tests/diagnostics/source.test.js +58 -0
  30. package/dist/tests/diagnostics/source.test.js.map +1 -0
  31. package/dist/tests/driver/modules.test.d.ts +1 -0
  32. package/dist/tests/driver/modules.test.js +140 -0
  33. package/dist/tests/driver/modules.test.js.map +1 -0
  34. package/dist/tests/driver/paths.test.js +17 -1
  35. package/dist/tests/driver/paths.test.js.map +1 -1
  36. package/dist/tests/driver/runtime-lib.test.d.ts +1 -0
  37. package/dist/tests/driver/runtime-lib.test.js +19 -0
  38. package/dist/tests/driver/runtime-lib.test.js.map +1 -0
  39. package/dist/tests/driver/toolchain-provider.test.js +91 -0
  40. package/dist/tests/driver/toolchain-provider.test.js.map +1 -1
  41. package/dist/tests/e2e/compile-node.test.js +11 -0
  42. package/dist/tests/e2e/compile-node.test.js.map +1 -1
  43. package/dist/tests/extensions/node.test.d.ts +1 -0
  44. package/dist/tests/extensions/node.test.js +32 -0
  45. package/dist/tests/extensions/node.test.js.map +1 -0
  46. package/dist/tests/lexer/identifiers.test.d.ts +1 -0
  47. package/dist/tests/lexer/identifiers.test.js +13 -0
  48. package/dist/tests/lexer/identifiers.test.js.map +1 -0
  49. package/dist/tests/lexer/numbers.test.d.ts +1 -0
  50. package/dist/tests/lexer/numbers.test.js +23 -0
  51. package/dist/tests/lexer/numbers.test.js.map +1 -0
  52. package/dist/tests/lexer/strings.test.d.ts +1 -0
  53. package/dist/tests/lexer/strings.test.js +72 -0
  54. package/dist/tests/lexer/strings.test.js.map +1 -0
  55. package/dist/tests/parser/declarations.test.d.ts +1 -0
  56. package/dist/tests/parser/declarations.test.js +70 -0
  57. package/dist/tests/parser/declarations.test.js.map +1 -0
  58. package/dist/tests/parser/expressions.test.d.ts +1 -0
  59. package/dist/tests/parser/expressions.test.js +47 -0
  60. package/dist/tests/parser/expressions.test.js.map +1 -0
  61. package/dist/tests/parser/helpers.test.d.ts +1 -0
  62. package/dist/tests/parser/helpers.test.js +58 -0
  63. package/dist/tests/parser/helpers.test.js.map +1 -0
  64. package/dist/tests/parser/literals.test.d.ts +1 -0
  65. package/dist/tests/parser/literals.test.js +70 -0
  66. package/dist/tests/parser/literals.test.js.map +1 -0
  67. package/dist/tests/parser/module-syntax.test.d.ts +1 -0
  68. package/dist/tests/parser/module-syntax.test.js +91 -0
  69. package/dist/tests/parser/module-syntax.test.js.map +1 -0
  70. package/dist/tests/parser/statements.test.d.ts +1 -0
  71. package/dist/tests/parser/statements.test.js +85 -0
  72. package/dist/tests/parser/statements.test.js.map +1 -0
  73. package/dist/tests/parser/type-members.test.d.ts +1 -0
  74. package/dist/tests/parser/type-members.test.js +86 -0
  75. package/dist/tests/parser/type-members.test.js.map +1 -0
  76. package/dist/tests/parser/types.test.d.ts +1 -0
  77. package/dist/tests/parser/types.test.js +143 -0
  78. package/dist/tests/parser/types.test.js.map +1 -0
  79. package/package.json +1 -1
  80. package/src/codegen/generator/calls/invocation.ts +8 -0
  81. package/src/codegen/generator/context.ts +30 -4
@@ -0,0 +1,58 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { expressionToPropertyName, isAssignmentTarget, propertyNameText, } from "../../src/parser/helpers.js";
3
+ import { SyntaxKind } from "../../src/ast/nodes.js";
4
+ const expr = (kind, extra = {}) => ({ kind, ...extra });
5
+ const name = (kind, extra = {}) => ({ kind, ...extra });
6
+ describe("parser helpers", () => {
7
+ describe("expressionToPropertyName", () => {
8
+ it("accepts string, numeric and identifier expressions", () => {
9
+ const string = expr(SyntaxKind.StringLiteral, { value: "a" });
10
+ const numeric = expr(SyntaxKind.NumericLiteral, { text: "1" });
11
+ const identifier = expr(SyntaxKind.Identifier, { text: "x" });
12
+ expect(expressionToPropertyName(string)).toBe(string);
13
+ expect(expressionToPropertyName(numeric)).toBe(numeric);
14
+ expect(expressionToPropertyName(identifier)).toBe(identifier);
15
+ });
16
+ it("unwraps a property access to its name", () => {
17
+ const inner = name(SyntaxKind.Identifier, { text: "b" });
18
+ const access = expr(SyntaxKind.PropertyAccessExpression, { name: inner });
19
+ expect(expressionToPropertyName(access)).toBe(inner);
20
+ });
21
+ it("returns undefined for anything that is not a property name", () => {
22
+ expect(expressionToPropertyName(expr(SyntaxKind.CallExpression))).toBeUndefined();
23
+ expect(expressionToPropertyName(expr(SyntaxKind.BinaryExpression))).toBeUndefined();
24
+ expect(expressionToPropertyName(expr(SyntaxKind.ObjectLiteralExpression))).toBeUndefined();
25
+ });
26
+ });
27
+ describe("propertyNameText", () => {
28
+ it("reads identifiers and private identifiers", () => {
29
+ expect(propertyNameText(name(SyntaxKind.Identifier, { text: "value" }))).toBe("value");
30
+ expect(propertyNameText(name(SyntaxKind.PrivateIdentifier, { text: "#secret" }))).toBe("#secret");
31
+ });
32
+ it("reads string literal values and numeric literal text", () => {
33
+ expect(propertyNameText(name(SyntaxKind.StringLiteral, { value: "key" }))).toBe("key");
34
+ expect(propertyNameText(name(SyntaxKind.NumericLiteral, { text: "0x10" }))).toBe("0x10");
35
+ });
36
+ it("falls back to an empty string for computed names", () => {
37
+ expect(propertyNameText(name(SyntaxKind.ComputedPropertyName))).toBe("");
38
+ });
39
+ });
40
+ describe("isAssignmentTarget", () => {
41
+ it("accepts identifiers and access expressions", () => {
42
+ expect(isAssignmentTarget(expr(SyntaxKind.Identifier))).toBe(true);
43
+ expect(isAssignmentTarget(expr(SyntaxKind.PropertyAccessExpression))).toBe(true);
44
+ expect(isAssignmentTarget(expr(SyntaxKind.ElementAccessExpression))).toBe(true);
45
+ });
46
+ it("accepts parenthesized expressions and destructuring patterns", () => {
47
+ expect(isAssignmentTarget(expr(SyntaxKind.ParenthesizedExpression))).toBe(true);
48
+ expect(isAssignmentTarget(expr(SyntaxKind.ArrayLiteralExpression))).toBe(true);
49
+ expect(isAssignmentTarget(expr(SyntaxKind.ObjectLiteralExpression))).toBe(true);
50
+ });
51
+ it("rejects values that cannot be assigned to", () => {
52
+ expect(isAssignmentTarget(expr(SyntaxKind.CallExpression))).toBe(false);
53
+ expect(isAssignmentTarget(expr(SyntaxKind.NumericLiteral))).toBe(false);
54
+ expect(isAssignmentTarget(expr(SyntaxKind.BinaryExpression))).toBe(false);
55
+ });
56
+ });
57
+ });
58
+ //# sourceMappingURL=helpers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.test.js","sourceRoot":"","sources":["../../../tests/parser/helpers.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,70 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { describe, expect, it } from "vitest";
3
+ import { parse } from "../helpers.js";
4
+ import { NodeFlags, SyntaxKind } from "../../src/ast/nodes.js";
5
+ import { DiagnosticCode } from "../../src/diagnostics/diagnostic.js";
6
+ function initializerOf(source) {
7
+ const { file, diagnostics } = parse(source);
8
+ const declaration = file.statements[0].declarationList.declarations[0];
9
+ return { init: declaration.initializer, diagnostics };
10
+ }
11
+ describe("literal expressions", () => {
12
+ it("represents array holes as undefined literals", () => {
13
+ const { init, diagnostics } = initializerOf("const a = [1, , 2];");
14
+ expect(diagnostics).toHaveLength(0);
15
+ expect(init.kind).toBe(SyntaxKind.ArrayLiteralExpression);
16
+ expect(init.elements).toHaveLength(3);
17
+ expect(init.elements[1].kind).toBe(SyntaxKind.UndefinedKeyword);
18
+ });
19
+ it("parses object-literal generator methods with return types", () => {
20
+ const { init, diagnostics } = initializerOf("const o = { *gen(): number { yield 1; } };");
21
+ expect(diagnostics).toHaveLength(0);
22
+ const fn = init.properties[0].initializer;
23
+ expect(fn.flags & NodeFlags.Generator).toBe(NodeFlags.Generator);
24
+ expect(fn.returnType.kind).toBe(SyntaxKind.NumberKeywordType);
25
+ });
26
+ it("reports invalid object literal members", () => {
27
+ const { diagnostics } = parse("const o = { 1 2 };");
28
+ expect(diagnostics.some((d) => d.code === DiagnosticCode.UnexpectedToken)).toBe(true);
29
+ });
30
+ it("parses generator function expressions", () => {
31
+ const { init } = initializerOf("const f = function* () { yield 1; };");
32
+ expect(init.kind).toBe(SyntaxKind.FunctionExpression);
33
+ expect(init.flags & NodeFlags.Generator).toBe(NodeFlags.Generator);
34
+ });
35
+ it("parses anonymous and named class expressions", () => {
36
+ const { init: anonymous } = initializerOf("const C = class {};");
37
+ expect(anonymous.kind).toBe(SyntaxKind.ClassExpression);
38
+ expect(anonymous.name).toBeUndefined();
39
+ const { init: named, diagnostics } = initializerOf("const C = class Named<T> extends Object {};");
40
+ expect(diagnostics).toHaveLength(0);
41
+ expect(named.name.text).toBe("Named");
42
+ expect(named.typeParameters).toHaveLength(1);
43
+ });
44
+ it("parses regular expression literals with flags", () => {
45
+ const { init } = initializerOf("const r = /ab+c/gi;");
46
+ expect(init.kind).toBe(SyntaxKind.RegularExpressionLiteral);
47
+ expect(init.pattern).toBe("ab+c");
48
+ expect(init.flags).toBe("gi");
49
+ });
50
+ it("reports an unterminated regular expression", () => {
51
+ const { diagnostics } = parse("const r = /abc;");
52
+ expect(diagnostics.some((d) => d.code === DiagnosticCode.InvalidCharacter)).toBe(true);
53
+ });
54
+ it("parses template literals with substitutions", () => {
55
+ const { init, diagnostics } = initializerOf("const s = `a${1 + 1}b`;");
56
+ expect(diagnostics).toHaveLength(0);
57
+ expect(init.kind).toBe(SyntaxKind.TemplateLiteral);
58
+ expect(init.spans).toHaveLength(1);
59
+ expect(init.spans[0].isTail).toBe(true);
60
+ });
61
+ it("reports unterminated template substitutions", () => {
62
+ const { diagnostics } = parse("const s = `${1;");
63
+ expect(diagnostics.some((d) => d.code === DiagnosticCode.UnterminatedTemplate)).toBe(true);
64
+ });
65
+ it("reports an unterminated template literal", () => {
66
+ const { diagnostics } = parse("const s = `${1 `;");
67
+ expect(diagnostics.some((d) => d.code === DiagnosticCode.UnterminatedTemplate)).toBe(true);
68
+ });
69
+ });
70
+ //# sourceMappingURL=literals.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"literals.test.js","sourceRoot":"","sources":["../../../tests/parser/literals.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,91 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { parse } from "../helpers.js";
3
+ import { ModifierKind, SyntaxKind } from "../../src/ast/nodes.js";
4
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
+ function firstStatement(source) {
6
+ const { file, diagnostics } = parse(source);
7
+ expect(diagnostics.filter((d) => d.category === "error")).toHaveLength(0);
8
+ return file.statements[0];
9
+ }
10
+ describe("parser module declarations", () => {
11
+ it("parses type-only named imports", () => {
12
+ const declaration = firstStatement('import type { A, B } from "./a";');
13
+ expect(declaration.kind).toBe(SyntaxKind.ImportDeclaration);
14
+ expect(declaration.importClause.isTypeOnly).toBe(true);
15
+ expect(declaration.importClause.namedBindings.kind).toBe(SyntaxKind.NamedImports);
16
+ expect(declaration.importClause.namedBindings.elements).toHaveLength(2);
17
+ expect(declaration.moduleSpecifier.value).toBe("./a");
18
+ });
19
+ it("parses type-only default and namespace imports", () => {
20
+ const defaultImport = firstStatement('import type Foo from "./a";');
21
+ expect(defaultImport.importClause.isTypeOnly).toBe(true);
22
+ expect(defaultImport.importClause.name.text).toBe("Foo");
23
+ const namespaceImport = firstStatement('import type * as ns from "./a";');
24
+ expect(namespaceImport.importClause.isTypeOnly).toBe(true);
25
+ expect(namespaceImport.importClause.namedBindings.kind).toBe(SyntaxKind.NamespaceImport);
26
+ expect(namespaceImport.importClause.namedBindings.name.text).toBe("ns");
27
+ });
28
+ it("parses inline type specifiers and aliases in named imports", () => {
29
+ const declaration = firstStatement('import { type A, B as C } from "./m";');
30
+ const elements = declaration.importClause.namedBindings.elements;
31
+ expect(elements[0].isTypeOnly).toBe(true);
32
+ expect(elements[0].name.text).toBe("A");
33
+ expect(elements[1].propertyName.text).toBe("B");
34
+ expect(elements[1].name.text).toBe("C");
35
+ });
36
+ it("parses import attributes written with `with`", () => {
37
+ const declaration = firstStatement('import data from "./d.json" with { type: "json" };');
38
+ expect(declaration.attributes).toEqual([{ name: "type", value: "json" }]);
39
+ });
40
+ it("parses import assertions written with `assert`", () => {
41
+ const declaration = firstStatement('import data from "./d.json" assert { type: "json" };');
42
+ expect(declaration.attributes).toEqual([{ name: "type", value: "json" }]);
43
+ });
44
+ it("parses `export =` assignments", () => {
45
+ const assignment = firstStatement("export = foo;");
46
+ expect(assignment.kind).toBe(SyntaxKind.ExportAssignment);
47
+ expect(assignment.isExportEquals).toBe(true);
48
+ expect(assignment.expression.kind).toBe(SyntaxKind.Identifier);
49
+ });
50
+ it("parses default expression and declaration exports", () => {
51
+ const expression = firstStatement("export default 1 + 2;");
52
+ expect(expression.kind).toBe(SyntaxKind.ExportAssignment);
53
+ expect(expression.isExportEquals).toBe(false);
54
+ const declaration = firstStatement("export default function f() {}");
55
+ expect(declaration.kind).toBe(SyntaxKind.FunctionDeclaration);
56
+ expect(declaration.modifiers.map((m) => m.modifierKind)).toContain(ModifierKind.Default);
57
+ });
58
+ it("parses namespace and wildcard re-exports", () => {
59
+ const namespaced = firstStatement('export * as ns from "./m";');
60
+ expect(namespaced.kind).toBe(SyntaxKind.ExportDeclaration);
61
+ expect(namespaced.exportClause.kind).toBe(SyntaxKind.NamespaceImport);
62
+ expect(namespaced.exportClause.name.text).toBe("ns");
63
+ expect(namespaced.moduleSpecifier.value).toBe("./m");
64
+ const wildcard = firstStatement('export * from "./m";');
65
+ expect(wildcard.kind).toBe(SyntaxKind.ExportDeclaration);
66
+ expect(wildcard.exportClause).toBeUndefined();
67
+ expect(wildcard.moduleSpecifier.value).toBe("./m");
68
+ });
69
+ it("parses type-only wildcard re-exports", () => {
70
+ const declaration = firstStatement('export type * from "./m";');
71
+ expect(declaration.isTypeOnly).toBe(true);
72
+ expect(declaration.moduleSpecifier.value).toBe("./m");
73
+ });
74
+ it("parses named re-exports with aliases and inline types", () => {
75
+ const declaration = firstStatement('export { type A, B as C } from "./m";');
76
+ expect(declaration.kind).toBe(SyntaxKind.ExportDeclaration);
77
+ expect(declaration.exportClause.kind).toBe(SyntaxKind.NamedExports);
78
+ const elements = declaration.exportClause.elements;
79
+ expect(elements[0].isTypeOnly).toBe(true);
80
+ expect(elements[1].propertyName.text).toBe("B");
81
+ expect(elements[1].name.text).toBe("C");
82
+ expect(declaration.moduleSpecifier.value).toBe("./m");
83
+ });
84
+ it("parses type-only named re-exports without a source", () => {
85
+ const declaration = firstStatement("export type { A };");
86
+ expect(declaration.isTypeOnly).toBe(true);
87
+ expect(declaration.exportClause.elements[0].name.text).toBe("A");
88
+ expect(declaration.moduleSpecifier).toBeUndefined();
89
+ });
90
+ });
91
+ //# sourceMappingURL=module-syntax.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-syntax.test.js","sourceRoot":"","sources":["../../../tests/parser/module-syntax.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -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":"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"}
@@ -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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"}