xbintsc 0.1.0

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 (124) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +191 -0
  3. package/bin/xbintsc.js +26 -0
  4. package/dist/src/ast/factory.d.ts +11 -0
  5. package/dist/src/ast/factory.js +36 -0
  6. package/dist/src/ast/factory.js.map +1 -0
  7. package/dist/src/ast/nodes.d.ts +848 -0
  8. package/dist/src/ast/nodes.js +247 -0
  9. package/dist/src/ast/nodes.js.map +1 -0
  10. package/dist/src/ast/visitor.d.ts +18 -0
  11. package/dist/src/ast/visitor.js +52 -0
  12. package/dist/src/ast/visitor.js.map +1 -0
  13. package/dist/src/binder/binder.d.ts +82 -0
  14. package/dist/src/binder/binder.js +443 -0
  15. package/dist/src/binder/binder.js.map +1 -0
  16. package/dist/src/cli/main.d.ts +16 -0
  17. package/dist/src/cli/main.js +191 -0
  18. package/dist/src/cli/main.js.map +1 -0
  19. package/dist/src/codegen/llvm.d.ts +31 -0
  20. package/dist/src/codegen/llvm.js +1178 -0
  21. package/dist/src/codegen/llvm.js.map +1 -0
  22. package/dist/src/codegen/values.d.ts +23 -0
  23. package/dist/src/codegen/values.js +32 -0
  24. package/dist/src/codegen/values.js.map +1 -0
  25. package/dist/src/diagnostics/diagnostic.d.ts +69 -0
  26. package/dist/src/diagnostics/diagnostic.js +104 -0
  27. package/dist/src/diagnostics/diagnostic.js.map +1 -0
  28. package/dist/src/diagnostics/source.d.ts +43 -0
  29. package/dist/src/diagnostics/source.js +73 -0
  30. package/dist/src/diagnostics/source.js.map +1 -0
  31. package/dist/src/driver/cache.d.ts +37 -0
  32. package/dist/src/driver/cache.js +82 -0
  33. package/dist/src/driver/cache.js.map +1 -0
  34. package/dist/src/driver/compiler.d.ts +41 -0
  35. package/dist/src/driver/compiler.js +128 -0
  36. package/dist/src/driver/compiler.js.map +1 -0
  37. package/dist/src/driver/index.d.ts +4 -0
  38. package/dist/src/driver/index.js +5 -0
  39. package/dist/src/driver/index.js.map +1 -0
  40. package/dist/src/driver/paths.d.ts +4 -0
  41. package/dist/src/driver/paths.js +22 -0
  42. package/dist/src/driver/paths.js.map +1 -0
  43. package/dist/src/driver/toolchain.d.ts +43 -0
  44. package/dist/src/driver/toolchain.js +76 -0
  45. package/dist/src/driver/toolchain.js.map +1 -0
  46. package/dist/src/extensions/node.d.ts +9 -0
  47. package/dist/src/extensions/node.js +20 -0
  48. package/dist/src/extensions/node.js.map +1 -0
  49. package/dist/src/extensions/registry.d.ts +45 -0
  50. package/dist/src/extensions/registry.js +76 -0
  51. package/dist/src/extensions/registry.js.map +1 -0
  52. package/dist/src/index.d.ts +18 -0
  53. package/dist/src/index.js +19 -0
  54. package/dist/src/index.js.map +1 -0
  55. package/dist/src/lexer/scanner.d.ts +48 -0
  56. package/dist/src/lexer/scanner.js +650 -0
  57. package/dist/src/lexer/scanner.js.map +1 -0
  58. package/dist/src/lexer/token.d.ts +170 -0
  59. package/dist/src/lexer/token.js +250 -0
  60. package/dist/src/lexer/token.js.map +1 -0
  61. package/dist/src/parser/parser.d.ts +127 -0
  62. package/dist/src/parser/parser.js +2334 -0
  63. package/dist/src/parser/parser.js.map +1 -0
  64. package/dist/tests/binder/binder.test.d.ts +1 -0
  65. package/dist/tests/binder/binder.test.js +89 -0
  66. package/dist/tests/binder/binder.test.js.map +1 -0
  67. package/dist/tests/cli/main.test.d.ts +1 -0
  68. package/dist/tests/cli/main.test.js +68 -0
  69. package/dist/tests/cli/main.test.js.map +1 -0
  70. package/dist/tests/cli/process.test.d.ts +9 -0
  71. package/dist/tests/cli/process.test.js +57 -0
  72. package/dist/tests/cli/process.test.js.map +1 -0
  73. package/dist/tests/codegen/llvm.test.d.ts +1 -0
  74. package/dist/tests/codegen/llvm.test.js +93 -0
  75. package/dist/tests/codegen/llvm.test.js.map +1 -0
  76. package/dist/tests/driver/cache.test.d.ts +1 -0
  77. package/dist/tests/driver/cache.test.js +66 -0
  78. package/dist/tests/driver/cache.test.js.map +1 -0
  79. package/dist/tests/driver/compiler.test.d.ts +1 -0
  80. package/dist/tests/driver/compiler.test.js +80 -0
  81. package/dist/tests/driver/compiler.test.js.map +1 -0
  82. package/dist/tests/driver/toolchain.test.d.ts +1 -0
  83. package/dist/tests/driver/toolchain.test.js +60 -0
  84. package/dist/tests/driver/toolchain.test.js.map +1 -0
  85. package/dist/tests/e2e/compile.test.d.ts +5 -0
  86. package/dist/tests/e2e/compile.test.js +93 -0
  87. package/dist/tests/e2e/compile.test.js.map +1 -0
  88. package/dist/tests/extensions/registry.test.d.ts +1 -0
  89. package/dist/tests/extensions/registry.test.js +47 -0
  90. package/dist/tests/extensions/registry.test.js.map +1 -0
  91. package/dist/tests/helpers.d.ts +23 -0
  92. package/dist/tests/helpers.js +41 -0
  93. package/dist/tests/helpers.js.map +1 -0
  94. package/dist/tests/lexer/scanner.test.d.ts +1 -0
  95. package/dist/tests/lexer/scanner.test.js +95 -0
  96. package/dist/tests/lexer/scanner.test.js.map +1 -0
  97. package/dist/tests/parser/parser.test.d.ts +1 -0
  98. package/dist/tests/parser/parser.test.js +137 -0
  99. package/dist/tests/parser/parser.test.js.map +1 -0
  100. package/package.json +49 -0
  101. package/runtime/ext_node.c +42 -0
  102. package/runtime/rt.h +177 -0
  103. package/runtime/xt_runtime.c +682 -0
  104. package/scripts/build-runtime.mjs +34 -0
  105. package/src/ast/factory.ts +37 -0
  106. package/src/ast/nodes.ts +1111 -0
  107. package/src/ast/visitor.ts +60 -0
  108. package/src/binder/binder.ts +549 -0
  109. package/src/cli/main.ts +210 -0
  110. package/src/codegen/llvm.ts +1324 -0
  111. package/src/codegen/values.ts +36 -0
  112. package/src/diagnostics/diagnostic.ts +132 -0
  113. package/src/diagnostics/source.ts +97 -0
  114. package/src/driver/cache.ts +96 -0
  115. package/src/driver/compiler.ts +197 -0
  116. package/src/driver/index.ts +4 -0
  117. package/src/driver/paths.ts +24 -0
  118. package/src/driver/toolchain.ts +103 -0
  119. package/src/extensions/node.ts +23 -0
  120. package/src/extensions/registry.ts +101 -0
  121. package/src/index.ts +33 -0
  122. package/src/lexer/scanner.ts +650 -0
  123. package/src/lexer/token.ts +266 -0
  124. package/src/parser/parser.ts +2396 -0
@@ -0,0 +1,443 @@
1
+ /**
2
+ * The binder walks the AST once and answers two questions the code generator
3
+ * and checker depend on:
4
+ *
5
+ * 1. Which declaration does every identifier refer to? (scopes + symbols)
6
+ * 2. Which variables are captured by nested functions? (closure conversion)
7
+ *
8
+ * The result is deliberately plain data — maps and records — so it can be
9
+ * cached, serialized for the incremental build, and unit tested in isolation.
10
+ */
11
+ import { SyntaxKind, } from "../ast/nodes.js";
12
+ export var SymbolKind;
13
+ (function (SymbolKind) {
14
+ SymbolKind["Var"] = "var";
15
+ SymbolKind["Let"] = "let";
16
+ SymbolKind["Const"] = "const";
17
+ SymbolKind["Function"] = "function";
18
+ SymbolKind["Parameter"] = "parameter";
19
+ SymbolKind["Class"] = "class";
20
+ SymbolKind["Interface"] = "interface";
21
+ SymbolKind["TypeAlias"] = "type";
22
+ SymbolKind["Enum"] = "enum";
23
+ SymbolKind["Import"] = "import";
24
+ SymbolKind["Namespace"] = "namespace";
25
+ })(SymbolKind || (SymbolKind = {}));
26
+ export var ScopeKind;
27
+ (function (ScopeKind) {
28
+ ScopeKind["Module"] = "module";
29
+ ScopeKind["Function"] = "function";
30
+ ScopeKind["Block"] = "block";
31
+ ScopeKind["For"] = "for";
32
+ ScopeKind["Catch"] = "catch";
33
+ })(ScopeKind || (ScopeKind = {}));
34
+ export function bind(sourceFile) {
35
+ const binder = new Binder(sourceFile);
36
+ return binder.bind();
37
+ }
38
+ class Binder {
39
+ sourceFile;
40
+ functions = [];
41
+ symbolOfDeclaration = new Map();
42
+ symbolOfIdentifier = new Map();
43
+ scopes = new Map();
44
+ unresolved = [];
45
+ nextSymbolId = 1;
46
+ nextFunctionId = 1;
47
+ current;
48
+ constructor(sourceFile) {
49
+ this.sourceFile = sourceFile;
50
+ }
51
+ bind() {
52
+ this.current = this.createFunction("(module)", this.sourceFile, undefined, true, false);
53
+ const scope = this.createScope(ScopeKind.Module, this.sourceFile, undefined);
54
+ this.current.scope = scope;
55
+ this.scopes.set(this.sourceFile, scope);
56
+ this.predeclareStatements(this.sourceFile.statements, scope);
57
+ this.collectFunctionScoped(this.sourceFile.statements, this.current);
58
+ this.bindStatements(this.sourceFile.statements, scope);
59
+ return {
60
+ moduleFunction: this.current,
61
+ functions: this.functions,
62
+ functionOfNode: new Map(this.functions.map((fn) => [fn.node, fn])),
63
+ symbolOfDeclaration: this.symbolOfDeclaration,
64
+ symbolOfIdentifier: this.symbolOfIdentifier,
65
+ scopes: this.scopes,
66
+ unresolved: this.unresolved,
67
+ };
68
+ }
69
+ // -- construction helpers ------------------------------------------------
70
+ createFunction(name, node, parent, isModule, isArrow) {
71
+ const fn = {
72
+ id: this.nextFunctionId++,
73
+ name,
74
+ node,
75
+ parent,
76
+ scope: undefined,
77
+ params: [],
78
+ locals: [],
79
+ captures: [],
80
+ captureIndex: new Map(),
81
+ isModule,
82
+ isArrow,
83
+ };
84
+ this.functions.push(fn);
85
+ return fn;
86
+ }
87
+ createScope(kind, node, parent) {
88
+ return { kind, node, parent, fn: this.current, symbols: new Map() };
89
+ }
90
+ declare(name, kind, node, scope, mutable) {
91
+ const existing = scope.symbols.get(name);
92
+ if (existing) {
93
+ // `var` redeclarations and duplicate functions merge into one symbol.
94
+ if ((kind === SymbolKind.Var && existing.kind === SymbolKind.Var) ||
95
+ (kind === SymbolKind.Function && existing.kind === SymbolKind.Function)) {
96
+ existing.declarations.push(node);
97
+ }
98
+ this.symbolOfDeclaration.set(node, existing);
99
+ return existing;
100
+ }
101
+ const symbol = {
102
+ id: this.nextSymbolId++,
103
+ name,
104
+ kind,
105
+ mutable,
106
+ fn: this.current,
107
+ declarations: [node],
108
+ references: [],
109
+ captured: false,
110
+ boxed: false,
111
+ };
112
+ scope.symbols.set(name, symbol);
113
+ this.symbolOfDeclaration.set(node, symbol);
114
+ if (scope.fn === this.current)
115
+ this.current.locals.push(symbol);
116
+ return symbol;
117
+ }
118
+ // -- declaration passes --------------------------------------------------
119
+ /** Pre-declare block-scoped bindings that appear directly in `statements`. */
120
+ predeclareStatements(statements, scope) {
121
+ for (const statement of statements) {
122
+ switch (statement.kind) {
123
+ case SyntaxKind.VariableStatement: {
124
+ this.predeclareVariableList(statement.declarationList, scope);
125
+ break;
126
+ }
127
+ case SyntaxKind.FunctionDeclaration:
128
+ this.declare(statement.name?.text ?? "(anonymous)", SymbolKind.Function, statement, scope, true);
129
+ break;
130
+ case SyntaxKind.ClassDeclaration:
131
+ this.declare(statement.name.text, SymbolKind.Class, statement, scope, false);
132
+ break;
133
+ case SyntaxKind.InterfaceDeclaration:
134
+ this.declare(statement.name.text, SymbolKind.Interface, statement, scope, false);
135
+ break;
136
+ case SyntaxKind.TypeAliasDeclaration:
137
+ this.declare(statement.name.text, SymbolKind.TypeAlias, statement, scope, false);
138
+ break;
139
+ case SyntaxKind.EnumDeclaration:
140
+ this.declare(statement.name.text, SymbolKind.Enum, statement, scope, true);
141
+ break;
142
+ case SyntaxKind.ImportDeclaration:
143
+ this.predeclareImport(statement, scope);
144
+ break;
145
+ case SyntaxKind.ExportDeclaration: {
146
+ const exported = statement;
147
+ if (exported.exportClause && exported.exportClause.kind === SyntaxKind.NamedExports) {
148
+ for (const specifier of exported.exportClause.elements) {
149
+ if (specifier.propertyName)
150
+ this.reference(specifier.propertyName, scope);
151
+ }
152
+ }
153
+ break;
154
+ }
155
+ case SyntaxKind.ModuleDeclaration:
156
+ this.declare(statement.name.text, SymbolKind.Namespace, statement, scope, false);
157
+ break;
158
+ default:
159
+ break;
160
+ }
161
+ }
162
+ }
163
+ predeclareVariableList(list, scope) {
164
+ const kind = list.declarationKind === "const"
165
+ ? SymbolKind.Const
166
+ : list.declarationKind === "var"
167
+ ? SymbolKind.Var
168
+ : SymbolKind.Let;
169
+ for (const declaration of list.declarations) {
170
+ this.declare(declaration.name.text, kind, declaration, scope, kind !== SymbolKind.Const);
171
+ }
172
+ }
173
+ predeclareImport(node, scope) {
174
+ const clause = node.importClause;
175
+ if (!clause)
176
+ return;
177
+ if (clause.name)
178
+ this.declare(clause.name.text, SymbolKind.Import, clause.name, scope, false);
179
+ const bindings = clause.namedBindings;
180
+ if (bindings && bindings.kind === SyntaxKind.NamedImports) {
181
+ for (const specifier of bindings.elements) {
182
+ this.declare(specifier.name.text, SymbolKind.Import, specifier.name, scope, false);
183
+ }
184
+ }
185
+ else if (bindings && bindings.kind === SyntaxKind.NamespaceImport) {
186
+ this.declare(bindings.name.text, SymbolKind.Import, bindings.name, scope, false);
187
+ }
188
+ }
189
+ /**
190
+ * Collect `var` and function declarations from nested blocks into the
191
+ * enclosing function scope, without crossing function boundaries.
192
+ */
193
+ collectFunctionScoped(statements, fn) {
194
+ const visit = (node) => {
195
+ switch (node.kind) {
196
+ case SyntaxKind.FunctionDeclaration:
197
+ case SyntaxKind.FunctionExpression:
198
+ case SyntaxKind.ArrowFunction:
199
+ case SyntaxKind.ClassDeclaration:
200
+ case SyntaxKind.ClassExpression:
201
+ return; // opaque, except we still want the declaration name handled at its site
202
+ case SyntaxKind.VariableStatement: {
203
+ const decl = node;
204
+ if (decl.declarationList.declarationKind === "var") {
205
+ for (const d of decl.declarationList.declarations) {
206
+ const existing = fn.scope.symbols.get(d.name.text);
207
+ if (!existing)
208
+ this.declare(d.name.text, SymbolKind.Var, d, fn.scope, true);
209
+ else
210
+ this.symbolOfDeclaration.set(d, existing);
211
+ }
212
+ }
213
+ return;
214
+ }
215
+ default:
216
+ break;
217
+ }
218
+ for (const child of childNodes(node))
219
+ visit(child);
220
+ };
221
+ for (const statement of statements) {
222
+ if (statement.kind === SyntaxKind.FunctionDeclaration ||
223
+ statement.kind === SyntaxKind.ClassDeclaration) {
224
+ const name = statement.name.text;
225
+ if (!fn.scope.symbols.has(name)) {
226
+ this.declare(name, statement.kind === SyntaxKind.FunctionDeclaration ? SymbolKind.Function : SymbolKind.Class, statement, fn.scope, statement.kind === SyntaxKind.FunctionDeclaration);
227
+ }
228
+ continue;
229
+ }
230
+ visit(statement);
231
+ }
232
+ }
233
+ // -- reference pass ------------------------------------------------------
234
+ bindStatements(statements, scope) {
235
+ for (const statement of statements)
236
+ this.bindNode(statement, scope);
237
+ }
238
+ bindBlock(block, scope) {
239
+ const blockScope = this.createScope(ScopeKind.Block, block, scope);
240
+ this.scopes.set(block, blockScope);
241
+ this.predeclareStatements(block.statements, blockScope);
242
+ this.bindStatements(block.statements, blockScope);
243
+ }
244
+ bindNode(node, scope) {
245
+ if (!node)
246
+ return;
247
+ switch (node.kind) {
248
+ case SyntaxKind.Block:
249
+ this.bindBlock(node, scope);
250
+ return;
251
+ case SyntaxKind.VariableStatement:
252
+ this.bindVariableList(node.declarationList, scope);
253
+ return;
254
+ case SyntaxKind.FunctionDeclaration: {
255
+ const fn = node;
256
+ const symbol = this.symbolOfDeclaration.get(fn);
257
+ if (symbol)
258
+ symbol.declarations.length; // keep declaration mapping warm
259
+ this.bindFunction(fn, scope, symbol);
260
+ return;
261
+ }
262
+ case SyntaxKind.FunctionExpression:
263
+ case SyntaxKind.ArrowFunction:
264
+ this.bindFunction(node, scope, undefined);
265
+ return;
266
+ case SyntaxKind.Identifier:
267
+ this.reference(node, scope);
268
+ return;
269
+ case SyntaxKind.InterfaceDeclaration:
270
+ case SyntaxKind.TypeAliasDeclaration:
271
+ // Type-only: skip the body entirely.
272
+ return;
273
+ case SyntaxKind.ImportDeclaration:
274
+ return;
275
+ case SyntaxKind.ExportDeclaration: {
276
+ const exported = node;
277
+ if (exported.exportClause && exported.exportClause.kind === SyntaxKind.NamedExports) {
278
+ for (const specifier of exported.exportClause.elements) {
279
+ if (specifier.propertyName)
280
+ this.reference(specifier.propertyName, scope);
281
+ }
282
+ }
283
+ return;
284
+ }
285
+ case SyntaxKind.ExportAssignment:
286
+ this.bindNode(node.expression, scope);
287
+ return;
288
+ case SyntaxKind.ForStatement: {
289
+ const forNode = node;
290
+ const forScope = this.createScope(ScopeKind.For, forNode, scope);
291
+ this.scopes.set(forNode, forScope);
292
+ if (forNode.initializer) {
293
+ if (forNode.initializer.kind === SyntaxKind.VariableDeclarationList) {
294
+ this.predeclareVariableList(forNode.initializer, forScope);
295
+ this.bindVariableList(forNode.initializer, forScope);
296
+ }
297
+ else {
298
+ this.bindNode(forNode.initializer, forScope);
299
+ }
300
+ }
301
+ this.bindNode(forNode.condition, forScope);
302
+ this.bindNode(forNode.incrementor, forScope);
303
+ this.bindNode(forNode.statement, forScope);
304
+ return;
305
+ }
306
+ case SyntaxKind.ForOfStatement:
307
+ case SyntaxKind.ForInStatement: {
308
+ const loop = node;
309
+ const loopScope = this.createScope(ScopeKind.For, loop, scope);
310
+ this.scopes.set(loop, loopScope);
311
+ if (loop.initializer.kind === SyntaxKind.VariableDeclarationList) {
312
+ this.predeclareVariableList(loop.initializer, loopScope);
313
+ this.bindVariableList(loop.initializer, loopScope);
314
+ }
315
+ else {
316
+ this.bindNode(loop.initializer, loopScope);
317
+ }
318
+ this.bindNode(loop.expression, loopScope);
319
+ this.bindNode(loop.statement, loopScope);
320
+ return;
321
+ }
322
+ case SyntaxKind.CatchClause: {
323
+ const clause = node;
324
+ const catchScope = this.createScope(ScopeKind.Catch, clause, scope);
325
+ this.scopes.set(clause, catchScope);
326
+ if (clause.variable)
327
+ this.declare(clause.variable.text, SymbolKind.Let, clause.variable, catchScope, true);
328
+ this.bindBlock(clause.block, catchScope);
329
+ return;
330
+ }
331
+ default:
332
+ break;
333
+ }
334
+ for (const child of childNodes(node))
335
+ this.bindNode(child, scope);
336
+ }
337
+ bindVariableList(list, scope) {
338
+ for (const declaration of list.declarations) {
339
+ const symbol = this.symbolOfDeclaration.get(declaration);
340
+ if (declaration.name)
341
+ this.symbolOfDeclaration.set(declaration.name, symbol ?? this.symbolOfDeclaration.get(declaration));
342
+ this.bindNode(declaration.initializer, scope);
343
+ }
344
+ }
345
+ bindFunction(node, parentScope, symbol) {
346
+ const name = node.kind === SyntaxKind.FunctionDeclaration
347
+ ? node.name?.text ?? "(anonymous)"
348
+ : node.kind === SyntaxKind.FunctionExpression
349
+ ? node.name?.text ?? "(anonymous)"
350
+ : "(arrow)";
351
+ const parentFn = this.current;
352
+ const fn = this.createFunction(name, node, parentFn, false, node.kind === SyntaxKind.ArrowFunction);
353
+ this.current = fn;
354
+ const scope = this.createScope(ScopeKind.Function, node, parentScope);
355
+ fn.scope = scope;
356
+ this.scopes.set(node, scope);
357
+ // Parameters live in the function scope.
358
+ const params = [];
359
+ for (const parameter of node.parameters) {
360
+ const paramSymbol = this.declare(parameter.name.text, SymbolKind.Parameter, parameter, scope, true);
361
+ params.push(paramSymbol);
362
+ if (parameter.initializer)
363
+ this.bindNode(parameter.initializer, scope);
364
+ }
365
+ fn.params = params;
366
+ // Initialize a named function expression's own name inside its scope.
367
+ if (node.kind === SyntaxKind.FunctionExpression && node.name) {
368
+ const selfName = node.name;
369
+ this.declare(selfName.text, SymbolKind.Const, selfName, scope, false);
370
+ }
371
+ if (symbol)
372
+ this.symbolOfDeclaration.set(node, symbol);
373
+ const body = node.body;
374
+ if (body) {
375
+ this.collectFunctionScoped([body.kind === SyntaxKind.Block ? body : { kind: SyntaxKind.Block, statements: [], start: body.start, end: body.end }], fn);
376
+ if (body.kind === SyntaxKind.Block) {
377
+ this.predeclareStatements(body.statements, scope);
378
+ this.bindStatements(body.statements, scope);
379
+ }
380
+ else {
381
+ this.bindNode(body, scope);
382
+ }
383
+ }
384
+ this.current = parentFn;
385
+ }
386
+ reference(identifier, scope) {
387
+ let current = scope;
388
+ while (current) {
389
+ const symbol = current.symbols.get(identifier.text);
390
+ if (symbol) {
391
+ symbol.references.push(identifier);
392
+ this.symbolOfIdentifier.set(identifier, symbol);
393
+ // Functions, classes and type-only names are resolved to their
394
+ // declaration sites by codegen; they are never captured as values.
395
+ if (symbol.fn !== this.current && isCapturable(symbol.kind))
396
+ this.markCaptured(symbol);
397
+ return;
398
+ }
399
+ current = current.parent;
400
+ }
401
+ this.unresolved.push(identifier);
402
+ }
403
+ /** Record that `symbol` escapes into `this.current`, threading it through every intermediate closure. */
404
+ markCaptured(symbol) {
405
+ symbol.captured = true;
406
+ symbol.boxed = true;
407
+ let fn = this.current;
408
+ while (fn && fn !== symbol.fn) {
409
+ if (!fn.captureIndex.has(symbol.id)) {
410
+ fn.captureIndex.set(symbol.id, fn.captures.length);
411
+ fn.captures.push(symbol);
412
+ }
413
+ fn = fn.parent;
414
+ }
415
+ }
416
+ }
417
+ /** Direct AST children, tolerant of both arrays and single nodes. */
418
+ function childNodes(node) {
419
+ const result = [];
420
+ const n = node;
421
+ for (const key of Object.keys(n)) {
422
+ if (key === "kind" || key === "start" || key === "end")
423
+ continue;
424
+ const value = n[key];
425
+ if (Array.isArray(value)) {
426
+ for (const item of value)
427
+ if (item && typeof item === "object" && "kind" in item)
428
+ result.push(item);
429
+ }
430
+ else if (value && typeof value === "object" && "kind" in value) {
431
+ result.push(value);
432
+ }
433
+ }
434
+ return result;
435
+ }
436
+ /** Only value bindings participate in closure capture. */
437
+ function isCapturable(kind) {
438
+ return (kind === SymbolKind.Var ||
439
+ kind === SymbolKind.Let ||
440
+ kind === SymbolKind.Const ||
441
+ kind === SymbolKind.Parameter);
442
+ }
443
+ //# sourceMappingURL=binder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binder.js","sourceRoot":"","sources":["../../../src/binder/binder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Command line interface.
3
+ *
4
+ * Commands are intentionally small and composable so the same operations are
5
+ * available programmatically through the driver API:
6
+ *
7
+ * xbintsc build <file> [-o out] [--emit ir|obj|exe] [-O0..3] [--ext node]
8
+ * xbintsc run <file> [-- args...]
9
+ * xbintsc emit <file> # print LLVM IR to stdout
10
+ * xbintsc version
11
+ */
12
+ export interface CliIo {
13
+ readonly stdout: (text: string) => void;
14
+ readonly stderr: (text: string) => void;
15
+ }
16
+ export declare function run(argv: readonly string[], io?: CliIo): number;
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Command line interface.
3
+ *
4
+ * Commands are intentionally small and composable so the same operations are
5
+ * available programmatically through the driver API:
6
+ *
7
+ * xbintsc build <file> [-o out] [--emit ir|obj|exe] [-O0..3] [--ext node]
8
+ * xbintsc run <file> [-- args...]
9
+ * xbintsc emit <file> # print LLVM IR to stdout
10
+ * xbintsc version
11
+ */
12
+ import { spawnSync } from "node:child_process";
13
+ import { readFileSync } from "node:fs";
14
+ import { resolve } from "node:path";
15
+ import { pathToFileURL } from "node:url";
16
+ import { formatDiagnostic } from "../diagnostics/diagnostic.js";
17
+ import { SourceFile } from "../diagnostics/source.js";
18
+ import { build, compileString, COMPILER_VERSION } from "../driver/compiler.js";
19
+ import { createDefaultRegistry } from "../extensions/registry.js";
20
+ import { nodeExtension } from "../extensions/node.js";
21
+ const defaultIo = {
22
+ stdout: (text) => process.stdout.write(text),
23
+ stderr: (text) => process.stderr.write(text),
24
+ };
25
+ const VALUE_FLAGS = new Set(["output", "out", "emit", "optimize", "ext"]);
26
+ function parseArgs(argv) {
27
+ const positionals = [];
28
+ const flags = new Map();
29
+ const passthrough = [];
30
+ let afterSeparator = false;
31
+ for (let index = 0; index < argv.length; index++) {
32
+ const arg = argv[index];
33
+ if (afterSeparator) {
34
+ passthrough.push(arg);
35
+ continue;
36
+ }
37
+ if (arg === "--") {
38
+ afterSeparator = true;
39
+ continue;
40
+ }
41
+ if (arg.startsWith("--")) {
42
+ const [name, inlineValue] = arg.slice(2).split("=", 2);
43
+ if (inlineValue !== undefined) {
44
+ flags.set(name, inlineValue);
45
+ }
46
+ else if (VALUE_FLAGS.has(name)) {
47
+ const next = argv[index + 1];
48
+ if (next !== undefined && !next.startsWith("-")) {
49
+ flags.set(name, next);
50
+ index++;
51
+ }
52
+ else {
53
+ flags.set(name, true);
54
+ }
55
+ }
56
+ else {
57
+ flags.set(name, true);
58
+ }
59
+ }
60
+ else if (arg.startsWith("-") && arg.length > 1 && !/^-\d/.test(arg)) {
61
+ const name = arg.slice(1);
62
+ if (name.startsWith("O")) {
63
+ flags.set("optimize", name.slice(1) || "2");
64
+ }
65
+ else if (name === "o") {
66
+ const next = argv[index + 1];
67
+ if (next !== undefined) {
68
+ flags.set("output", next);
69
+ index++;
70
+ }
71
+ }
72
+ else {
73
+ flags.set(name, true);
74
+ }
75
+ }
76
+ else {
77
+ positionals.push(arg);
78
+ }
79
+ }
80
+ return { command: positionals.shift(), positionals, flags, passthrough };
81
+ }
82
+ function buildRegistry(flags) {
83
+ const registry = createDefaultRegistry();
84
+ const requested = flags.get("ext");
85
+ if (typeof requested === "string") {
86
+ for (const name of requested.split(",").map((n) => n.trim()).filter(Boolean)) {
87
+ if (name === "node")
88
+ registry.register(nodeExtension);
89
+ else
90
+ throw new Error(`Unknown extension '${name}'`);
91
+ }
92
+ }
93
+ return registry;
94
+ }
95
+ function printDiagnostics(diagnostics, fileName, io) {
96
+ let source;
97
+ try {
98
+ source = new SourceFile(fileName, readFileSync(fileName, "utf8"));
99
+ }
100
+ catch {
101
+ source = undefined;
102
+ }
103
+ for (const diagnostic of diagnostics) {
104
+ io.stderr(formatDiagnostic(diagnostic, source) + "\n");
105
+ }
106
+ }
107
+ const HELP = `xbintsc ${COMPILER_VERSION} - TypeScript binary compiler
108
+
109
+ Usage:
110
+ xbintsc build <file.ts> [options] Compile to a native binary
111
+ xbintsc run <file.ts> [-- args] Compile and execute
112
+ xbintsc emit <file.ts> Print LLVM IR
113
+ xbintsc version Print the version
114
+ xbintsc help Show this message
115
+
116
+ Options:
117
+ -o, --output <path> Output path
118
+ --out <dir> Output directory (default: build/)
119
+ --emit <kind> exe | obj | ir (default: exe)
120
+ -O0..-O3 Optimization level (default: -O2)
121
+ --ext <names> Comma separated extensions (e.g. node)
122
+ --force Ignore the incremental cache
123
+ --verbose Print progress information
124
+ `;
125
+ export function run(argv, io = defaultIo) {
126
+ const args = parseArgs(argv);
127
+ const command = args.command;
128
+ if (!command || command === "help" || args.flags.has("help")) {
129
+ io.stdout(HELP);
130
+ return 0;
131
+ }
132
+ if (command === "version" || args.flags.has("version")) {
133
+ io.stdout(`xbintsc ${COMPILER_VERSION}\n`);
134
+ return 0;
135
+ }
136
+ if (command === "emit") {
137
+ const entry = args.positionals[0];
138
+ if (!entry) {
139
+ io.stderr("xbintsc: emit requires a source file\n");
140
+ return 1;
141
+ }
142
+ const source = readFileSync(resolve(entry), "utf8");
143
+ const registry = buildRegistry(args.flags);
144
+ const { ir, diagnostics } = compileString(source, entry, registry);
145
+ if (diagnostics.some((d) => d.category === "error")) {
146
+ printDiagnostics(diagnostics, entry, io);
147
+ return 1;
148
+ }
149
+ io.stdout(ir);
150
+ return 0;
151
+ }
152
+ if (command === "build" || command === "run") {
153
+ const entry = args.positionals[0];
154
+ if (!entry) {
155
+ io.stderr(`xbintsc: ${command} requires a source file\n`);
156
+ return 1;
157
+ }
158
+ const emit = args.flags.get("emit") ?? "exe";
159
+ const optimize = args.flags.get("optimize") ?? "2";
160
+ const result = build(entry, {
161
+ output: typeof args.flags.get("output") === "string" ? args.flags.get("output") : undefined,
162
+ outDir: typeof args.flags.get("out") === "string" ? args.flags.get("out") : undefined,
163
+ emit,
164
+ optimize: optimize,
165
+ force: Boolean(args.flags.get("force")),
166
+ verbose: Boolean(args.flags.get("verbose")),
167
+ extensions: buildRegistry(args.flags),
168
+ });
169
+ if (result.diagnostics.some((d) => d.category === "error")) {
170
+ printDiagnostics(result.diagnostics, entry, io);
171
+ return 1;
172
+ }
173
+ if (command === "build") {
174
+ io.stdout(`xbintsc: wrote ${result.outputPath}${result.cached ? " (cached)" : ""}\n`);
175
+ return 0;
176
+ }
177
+ if (emit !== "exe") {
178
+ io.stderr("xbintsc: run requires --emit exe\n");
179
+ return 1;
180
+ }
181
+ const executed = spawnSync(result.outputPath, args.passthrough, { stdio: "inherit" });
182
+ return executed.status ?? 0;
183
+ }
184
+ io.stderr(`xbintsc: unknown command '${command}'\n\n${HELP}`);
185
+ return 1;
186
+ }
187
+ const isMain = process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href;
188
+ if (isMain) {
189
+ process.exit(run(process.argv.slice(2)));
190
+ }
191
+ //# sourceMappingURL=main.js.map