xbintsc 0.5.23 → 0.5.31

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 (347) hide show
  1. package/AGENTS.md +11 -2
  2. package/README.md +31 -6
  3. package/README.zh-CN.md +21 -2
  4. package/dist/scripts/support-matrix.d.ts +18 -0
  5. package/dist/scripts/support-matrix.js +141 -0
  6. package/dist/scripts/support-matrix.js.map +1 -0
  7. package/dist/src/ast/common.d.ts +2 -2
  8. package/dist/src/ast/declarations.d.ts +7 -1
  9. package/dist/src/ast/expressions.d.ts +5 -0
  10. package/dist/src/ast/kinds.d.ts +2 -0
  11. package/dist/src/ast/kinds.js +2 -0
  12. package/dist/src/ast/kinds.js.map +1 -1
  13. package/dist/src/binder/binder.d.ts +2 -1
  14. package/dist/src/binder/binder.js +2 -0
  15. package/dist/src/binder/binder.js.map +1 -1
  16. package/dist/src/binder/declarations.d.ts +9 -0
  17. package/dist/src/binder/declarations.js +64 -0
  18. package/dist/src/binder/declarations.js.map +1 -1
  19. package/dist/src/binder/references.js +85 -3
  20. package/dist/src/binder/references.js.map +1 -1
  21. package/dist/src/binder/types.d.ts +32 -0
  22. package/dist/src/binder/types.js.map +1 -1
  23. package/dist/src/canonical.d.ts +29 -0
  24. package/dist/src/canonical.js +35 -0
  25. package/dist/src/canonical.js.map +1 -0
  26. package/dist/src/checker/assignability.d.ts +13 -0
  27. package/dist/src/checker/assignability.js +146 -0
  28. package/dist/src/checker/assignability.js.map +1 -0
  29. package/dist/src/checker/calls.d.ts +13 -0
  30. package/dist/src/checker/calls.js +127 -0
  31. package/dist/src/checker/calls.js.map +1 -0
  32. package/dist/src/checker/checker.d.ts +26 -0
  33. package/dist/src/checker/checker.js +31 -0
  34. package/dist/src/checker/checker.js.map +1 -0
  35. package/dist/src/checker/declarations.d.ts +9 -0
  36. package/dist/src/checker/declarations.js +15 -0
  37. package/dist/src/checker/declarations.js.map +1 -0
  38. package/dist/src/checker/flow.d.ts +21 -0
  39. package/dist/src/checker/flow.js +241 -0
  40. package/dist/src/checker/flow.js.map +1 -0
  41. package/dist/src/checker/globals.d.ts +9 -0
  42. package/dist/src/checker/globals.js +29 -0
  43. package/dist/src/checker/globals.js.map +1 -0
  44. package/dist/src/checker/source.d.ts +38 -0
  45. package/dist/src/checker/source.js +48 -0
  46. package/dist/src/checker/source.js.map +1 -0
  47. package/dist/src/checker/type-infer.d.ts +18 -0
  48. package/dist/src/checker/type-infer.js +173 -0
  49. package/dist/src/checker/type-infer.js.map +1 -0
  50. package/dist/src/checker/type-model.d.ts +73 -0
  51. package/dist/src/checker/type-model.js +151 -0
  52. package/dist/src/checker/type-model.js.map +1 -0
  53. package/dist/src/checker/type-system.d.ts +58 -0
  54. package/dist/src/checker/type-system.js +569 -0
  55. package/dist/src/checker/type-system.js.map +1 -0
  56. package/dist/src/checker/typecheck-types.d.ts +22 -0
  57. package/dist/src/checker/typecheck-types.js +109 -0
  58. package/dist/src/checker/typecheck-types.js.map +1 -0
  59. package/dist/src/checker/typecheck.d.ts +62 -0
  60. package/dist/src/checker/typecheck.js +574 -0
  61. package/dist/src/checker/typecheck.js.map +1 -0
  62. package/dist/src/checker/undefined.d.ts +14 -0
  63. package/dist/src/checker/undefined.js +32 -0
  64. package/dist/src/checker/undefined.js.map +1 -0
  65. package/dist/src/checker/walk.d.ts +10 -0
  66. package/dist/src/checker/walk.js +15 -0
  67. package/dist/src/checker/walk.js.map +1 -0
  68. package/dist/src/cli/help.d.ts +7 -0
  69. package/dist/src/cli/help.js +64 -0
  70. package/dist/src/cli/help.js.map +1 -0
  71. package/dist/src/cli/hints.js +2 -1
  72. package/dist/src/cli/hints.js.map +1 -1
  73. package/dist/src/cli/main.js +12 -48
  74. package/dist/src/cli/main.js.map +1 -1
  75. package/dist/src/codegen/generator/calls/access.js +8 -8
  76. package/dist/src/codegen/generator/calls/access.js.map +1 -1
  77. package/dist/src/codegen/generator/calls/invocation.js +9 -4
  78. package/dist/src/codegen/generator/calls/invocation.js.map +1 -1
  79. package/dist/src/codegen/generator/calls/super.d.ts +9 -1
  80. package/dist/src/codegen/generator/calls/super.js +56 -5
  81. package/dist/src/codegen/generator/calls/super.js.map +1 -1
  82. package/dist/src/codegen/generator/context.d.ts +13 -2
  83. package/dist/src/codegen/generator/context.js +25 -19
  84. package/dist/src/codegen/generator/context.js.map +1 -1
  85. package/dist/src/codegen/generator/debug.js +2 -1
  86. package/dist/src/codegen/generator/debug.js.map +1 -1
  87. package/dist/src/codegen/generator/expressions/primary.d.ts +4 -1
  88. package/dist/src/codegen/generator/expressions/primary.js +68 -8
  89. package/dist/src/codegen/generator/expressions/primary.js.map +1 -1
  90. package/dist/src/codegen/generator/generator.js +11 -1
  91. package/dist/src/codegen/generator/generator.js.map +1 -1
  92. package/dist/src/codegen/generator/module.d.ts +2 -0
  93. package/dist/src/codegen/generator/module.js +62 -26
  94. package/dist/src/codegen/generator/module.js.map +1 -1
  95. package/dist/src/codegen/generator/state.d.ts +11 -1
  96. package/dist/src/codegen/generator/state.js.map +1 -1
  97. package/dist/src/codegen/generator/statements/variables.js +20 -3
  98. package/dist/src/codegen/generator/statements/variables.js.map +1 -1
  99. package/dist/src/codegen/generator/tables.d.ts +2 -0
  100. package/dist/src/codegen/generator/tables.js +4 -0
  101. package/dist/src/codegen/generator/tables.js.map +1 -1
  102. package/dist/src/driver/build-key.d.ts +2 -0
  103. package/dist/src/driver/build-key.js +1 -0
  104. package/dist/src/driver/build-key.js.map +1 -1
  105. package/dist/src/driver/bundler/graph.js +5 -1
  106. package/dist/src/driver/bundler/graph.js.map +1 -1
  107. package/dist/src/driver/bundler/merge.js +16 -1
  108. package/dist/src/driver/bundler/merge.js.map +1 -1
  109. package/dist/src/driver/bundler/types.d.ts +12 -0
  110. package/dist/src/driver/compiler.d.ts +1 -1
  111. package/dist/src/driver/compiler.js +3 -0
  112. package/dist/src/driver/compiler.js.map +1 -1
  113. package/dist/src/driver/fingerprint.js +2 -1
  114. package/dist/src/driver/fingerprint.js.map +1 -1
  115. package/dist/src/driver/frontend.d.ts +8 -6
  116. package/dist/src/driver/frontend.js +4 -0
  117. package/dist/src/driver/frontend.js.map +1 -1
  118. package/dist/src/driver/options.d.ts +6 -0
  119. package/dist/src/driver/version.d.ts +1 -1
  120. package/dist/src/driver/version.js +1 -1
  121. package/dist/src/extensions/gui/html.js +20 -6
  122. package/dist/src/extensions/gui/html.js.map +1 -1
  123. package/dist/src/extensions/gui/index.js +63 -0
  124. package/dist/src/extensions/gui/index.js.map +1 -1
  125. package/dist/src/extensions/registry.d.ts +38 -0
  126. package/dist/src/extensions/registry.js +10 -0
  127. package/dist/src/extensions/registry.js.map +1 -1
  128. package/dist/src/index.d.ts +1 -0
  129. package/dist/src/index.js +1 -0
  130. package/dist/src/index.js.map +1 -1
  131. package/dist/src/parser/declarations/classes.js +7 -0
  132. package/dist/src/parser/declarations/classes.js.map +1 -1
  133. package/dist/src/parser/expressions.js +14 -1
  134. package/dist/src/parser/expressions.js.map +1 -1
  135. package/dist/src/parser/literals.js +6 -2
  136. package/dist/src/parser/literals.js.map +1 -1
  137. package/dist/tests/binder/binder.test.js +29 -0
  138. package/dist/tests/binder/binder.test.js.map +1 -1
  139. package/dist/tests/canonical.test.d.ts +1 -0
  140. package/dist/tests/canonical.test.js +19 -0
  141. package/dist/tests/canonical.test.js.map +1 -0
  142. package/dist/tests/checker/checker.test.d.ts +1 -0
  143. package/dist/tests/checker/checker.test.js +245 -0
  144. package/dist/tests/checker/checker.test.js.map +1 -0
  145. package/dist/tests/cli/check.test.js +20 -0
  146. package/dist/tests/cli/check.test.js.map +1 -1
  147. package/dist/tests/conformance/matrix.test.d.ts +6 -0
  148. package/dist/tests/conformance/matrix.test.js +23 -0
  149. package/dist/tests/conformance/matrix.test.js.map +1 -0
  150. package/dist/tests/conformance/test262/manifest.d.ts +115 -0
  151. package/dist/tests/conformance/test262/manifest.js +257 -0
  152. package/dist/tests/conformance/test262/manifest.js.map +1 -0
  153. package/dist/tests/conformance/test262.test.d.ts +11 -0
  154. package/dist/tests/conformance/test262.test.js +74 -0
  155. package/dist/tests/conformance/test262.test.js.map +1 -0
  156. package/dist/tests/docs/structure.test.js +9 -11
  157. package/dist/tests/docs/structure.test.js.map +1 -1
  158. package/dist/tests/e2e/child-process.test.js +3 -2
  159. package/dist/tests/e2e/child-process.test.js.map +1 -1
  160. package/dist/tests/e2e/compile-builtins.test.js +21 -0
  161. package/dist/tests/e2e/compile-builtins.test.js.map +1 -1
  162. package/dist/tests/e2e/compile-objects-classes.test.js +54 -0
  163. package/dist/tests/e2e/compile-objects-classes.test.js.map +1 -1
  164. package/dist/tests/e2e/differential-syntax.test.d.ts +5 -0
  165. package/dist/tests/e2e/differential-syntax.test.js +95 -0
  166. package/dist/tests/e2e/differential-syntax.test.js.map +1 -0
  167. package/dist/tests/e2e/differential-values.test.js +15 -0
  168. package/dist/tests/e2e/differential-values.test.js.map +1 -1
  169. package/dist/tests/e2e/gui-browser.test.d.ts +13 -0
  170. package/dist/tests/e2e/gui-browser.test.js +163 -0
  171. package/dist/tests/e2e/gui-browser.test.js.map +1 -0
  172. package/dist/tests/e2e/gui-example-browser.test.js +2 -2
  173. package/dist/tests/e2e/gui-example-browser.test.js.map +1 -1
  174. package/dist/tests/e2e/gui-example-canvas.test.js +5 -4
  175. package/dist/tests/e2e/gui-example-canvas.test.js.map +1 -1
  176. package/dist/tests/e2e/gui-example-svg.test.js +4 -3
  177. package/dist/tests/e2e/gui-example-svg.test.js.map +1 -1
  178. package/dist/tests/e2e/gui-example.test.js +4 -3
  179. package/dist/tests/e2e/gui-example.test.js.map +1 -1
  180. package/dist/tests/e2e/gui-helpers.js +4 -3
  181. package/dist/tests/e2e/gui-helpers.js.map +1 -1
  182. package/dist/tests/e2e/gui-media.test.js +5 -4
  183. package/dist/tests/e2e/gui-media.test.js.map +1 -1
  184. package/dist/tests/e2e/harness.d.ts +9 -0
  185. package/dist/tests/e2e/harness.js +14 -2
  186. package/dist/tests/e2e/harness.js.map +1 -1
  187. package/dist/tests/e2e/native-extensions.test.js +2 -1
  188. package/dist/tests/e2e/native-extensions.test.js.map +1 -1
  189. package/dist/tests/e2e/property-descriptors.test.js +20 -0
  190. package/dist/tests/e2e/property-descriptors.test.js.map +1 -1
  191. package/dist/tests/e2e/unicode-output.test.js +5 -3
  192. package/dist/tests/e2e/unicode-output.test.js.map +1 -1
  193. package/dist/tests/e2e/weak-collections.test.js +16 -2
  194. package/dist/tests/e2e/weak-collections.test.js.map +1 -1
  195. package/dist/tests/helpers.d.ts +1 -0
  196. package/dist/tests/helpers.js +1 -0
  197. package/dist/tests/helpers.js.map +1 -1
  198. package/dist/tests/parser/declarations.test.js +20 -0
  199. package/dist/tests/parser/declarations.test.js.map +1 -1
  200. package/dist/tests/parser/expressions.test.js +36 -0
  201. package/dist/tests/parser/expressions.test.js.map +1 -1
  202. package/dist/tests/platform.d.ts +32 -0
  203. package/dist/tests/platform.js +40 -0
  204. package/dist/tests/platform.js.map +1 -0
  205. package/dist/tests/platform.test.d.ts +12 -0
  206. package/dist/tests/platform.test.js +51 -0
  207. package/dist/tests/platform.test.js.map +1 -0
  208. package/dist/tests/version.test.js +4 -4
  209. package/dist/tests/version.test.js.map +1 -1
  210. package/doc/ai/README.md +10 -4
  211. package/doc/ai/build-recipe.md +1 -0
  212. package/doc/ai/cli.md +17 -5
  213. package/doc/ai/contributing.md +59 -2
  214. package/doc/ai/extensions.md +11 -0
  215. package/doc/ai/language-support.md +25 -16
  216. package/doc/ai/zh-CN/README.md +9 -4
  217. package/doc/ai/zh-CN/build-recipe.md +1 -0
  218. package/doc/ai/zh-CN/cli.md +13 -3
  219. package/doc/ai/zh-CN/contributing.md +49 -3
  220. package/doc/ai/zh-CN/extensions.md +9 -0
  221. package/doc/ai/zh-CN/language-support.md +23 -14
  222. package/doc/gui/api.md +45 -0
  223. package/doc/gui/known-issues.md +10 -0
  224. package/doc/gui/runtime.md +18 -0
  225. package/doc/gui-scripts.md +7 -0
  226. package/doc/implemented/binder.md +2 -0
  227. package/doc/implemented/checker.md +117 -0
  228. package/doc/implemented/cli.md +13 -1
  229. package/doc/implemented/codegen.md +3 -2
  230. package/doc/implemented/driver.md +2 -2
  231. package/doc/implemented/operators.md +2 -1
  232. package/doc/implemented/parser.md +3 -2
  233. package/doc/implemented/pipeline.md +8 -1
  234. package/doc/implemented/stdlib.md +2 -1
  235. package/doc/implemented/tests.md +3 -1
  236. package/doc/implemented.md +2 -0
  237. package/doc/npm-package.md +417 -0
  238. package/doc/requirements.md +4 -1
  239. package/doc/support-matrix.md +83 -0
  240. package/doc/unimplemented/classes.md +3 -0
  241. package/doc/unimplemented/deviations.md +3 -2
  242. package/doc/unimplemented/toolchain.md +1 -1
  243. package/doc/unimplemented/types.md +24 -8
  244. package/doc/unimplemented.md +1 -1
  245. package/doc/zh-CN/gui/api.md +41 -0
  246. package/doc/zh-CN/gui/known-issues.md +7 -0
  247. package/doc/zh-CN/gui/runtime.md +16 -0
  248. package/doc/zh-CN/gui-scripts.md +5 -0
  249. package/doc/zh-CN/implemented/binder.md +2 -0
  250. package/doc/zh-CN/implemented/checker.md +99 -0
  251. package/doc/zh-CN/implemented/cli.md +12 -1
  252. package/doc/zh-CN/implemented/codegen.md +3 -2
  253. package/doc/zh-CN/implemented/driver.md +2 -2
  254. package/doc/zh-CN/implemented/operators.md +1 -1
  255. package/doc/zh-CN/implemented/parser.md +3 -2
  256. package/doc/zh-CN/implemented/pipeline.md +3 -1
  257. package/doc/zh-CN/implemented/stdlib.md +2 -1
  258. package/doc/zh-CN/implemented/tests.md +3 -1
  259. package/doc/zh-CN/implemented.md +2 -0
  260. package/doc/zh-CN/npm-package.md +391 -0
  261. package/doc/zh-CN/post/announce.md +47 -47
  262. package/doc/zh-CN/requirements.md +4 -1
  263. package/doc/zh-CN/support-matrix.md +82 -0
  264. package/doc/zh-CN/unimplemented/classes.md +3 -0
  265. package/doc/zh-CN/unimplemented/deviations.md +3 -2
  266. package/doc/zh-CN/unimplemented/toolchain.md +1 -1
  267. package/doc/zh-CN/unimplemented/types.md +16 -6
  268. package/doc/zh-CN/unimplemented.md +1 -1
  269. package/llms.txt +4 -1
  270. package/package.json +2 -1
  271. package/runtime/ext_gui/audio.cpp +316 -0
  272. package/runtime/ext_gui/browser.cpp +547 -0
  273. package/runtime/ext_gui/browser_escape.cpp +85 -0
  274. package/runtime/ext_gui/browser_loop.cpp +83 -0
  275. package/runtime/ext_gui/canvas.cpp +9 -3
  276. package/runtime/ext_gui/canvas_raster.cpp +19 -1
  277. package/runtime/ext_gui/dom_api.cpp +36 -0
  278. package/runtime/ext_gui/dom_api_document.cpp +96 -5
  279. package/runtime/ext_gui/dom_api_events.cpp +20 -0
  280. package/runtime/ext_gui/dom_api_internal.h +19 -0
  281. package/runtime/ext_gui/dom_api_proto.cpp +6 -0
  282. package/runtime/ext_gui/gui.cpp +90 -23
  283. package/runtime/ext_gui/gui_engine.h +44 -0
  284. package/runtime/ext_gui/window.cpp +9 -0
  285. package/runtime/ext_node/path/path.c +7 -7
  286. package/runtime/ext_node/url/url.c +4 -2
  287. package/runtime/rt.h +15 -0
  288. package/runtime/xt_constructors.c +2 -1
  289. package/runtime/xt_containers/objects.inc +22 -2
  290. package/runtime/xt_io/exception.inc +4 -2
  291. package/runtime/xt_stdlib/math.inc +62 -0
  292. package/runtime/xt_stdlib2/date.inc +7 -1
  293. package/runtime/xt_stdlib2/objects.inc +14 -0
  294. package/scripts/support-matrix.ts +167 -0
  295. package/src/ast/common.ts +2 -0
  296. package/src/ast/declarations.ts +12 -1
  297. package/src/ast/expressions.ts +6 -0
  298. package/src/ast/kinds.ts +2 -0
  299. package/src/binder/binder.ts +3 -0
  300. package/src/binder/declarations.ts +70 -0
  301. package/src/binder/references.ts +84 -3
  302. package/src/binder/types.ts +30 -0
  303. package/src/canonical.ts +37 -0
  304. package/src/checker/assignability.ts +134 -0
  305. package/src/checker/calls.ts +135 -0
  306. package/src/checker/checker.ts +47 -0
  307. package/src/checker/declarations.ts +26 -0
  308. package/src/checker/flow.ts +236 -0
  309. package/src/checker/globals.ts +40 -0
  310. package/src/checker/source.ts +53 -0
  311. package/src/checker/type-infer.ts +185 -0
  312. package/src/checker/type-model.ts +212 -0
  313. package/src/checker/type-system.ts +578 -0
  314. package/src/checker/typecheck-types.ts +112 -0
  315. package/src/checker/typecheck.ts +586 -0
  316. package/src/checker/undefined.ts +43 -0
  317. package/src/checker/walk.ts +16 -0
  318. package/src/cli/help.ts +65 -0
  319. package/src/cli/hints.ts +2 -1
  320. package/src/cli/main.ts +12 -49
  321. package/src/codegen/generator/calls/access.ts +8 -8
  322. package/src/codegen/generator/calls/invocation.ts +8 -5
  323. package/src/codegen/generator/calls/super.ts +67 -5
  324. package/src/codegen/generator/context.ts +31 -19
  325. package/src/codegen/generator/debug.ts +2 -1
  326. package/src/codegen/generator/expressions/primary.ts +84 -13
  327. package/src/codegen/generator/generator.ts +11 -1
  328. package/src/codegen/generator/module.ts +65 -24
  329. package/src/codegen/generator/state.ts +11 -1
  330. package/src/codegen/generator/statements/variables.ts +20 -3
  331. package/src/codegen/generator/tables.ts +5 -0
  332. package/src/driver/build-key.ts +3 -0
  333. package/src/driver/bundler/graph.ts +6 -2
  334. package/src/driver/bundler/merge.ts +14 -1
  335. package/src/driver/bundler/types.ts +13 -0
  336. package/src/driver/compiler.ts +4 -1
  337. package/src/driver/fingerprint.ts +2 -1
  338. package/src/driver/frontend.ts +13 -2
  339. package/src/driver/options.ts +6 -0
  340. package/src/driver/version.ts +1 -1
  341. package/src/extensions/gui/html.ts +23 -10
  342. package/src/extensions/gui/index.ts +65 -0
  343. package/src/extensions/registry.ts +48 -0
  344. package/src/index.ts +1 -0
  345. package/src/parser/declarations/classes.ts +7 -0
  346. package/src/parser/expressions.ts +13 -1
  347. package/src/parser/literals.ts +6 -2
@@ -17,6 +17,23 @@ export interface BuiltinFunction {
17
17
  readonly returnVoid?: boolean;
18
18
  }
19
19
 
20
+ /**
21
+ * A global *value* rather than a function: the name resolves to whatever a
22
+ * runtime getter returns, so `window`, `document` or a host constructor
23
+ * (`new AudioContext()`) can be reached without declaring them in the source.
24
+ *
25
+ * `symbol` has the usual `(int32_t argc, xt_value *argv)` ABI and is called
26
+ * with no arguments, or with one argument when `argument` is set (that is how
27
+ * a host hands a single getter a type name such as `"HTMLCanvasElement"`).
28
+ * `new Name(...)` lowers to the getter followed by an ordinary `xt_new`, so a
29
+ * host constructor is just a global value that returns a function.
30
+ */
31
+ export interface GlobalValue {
32
+ readonly symbol: string;
33
+ /** Passed as the only argument; omit to call the getter with none. */
34
+ readonly argument?: string;
35
+ }
36
+
20
37
  /**
21
38
  * One binding a Node-style module exports. It is either a direct runtime
22
39
  * function with the uniform `(argc, argv)` ABI (`symbol`), or a named method
@@ -59,6 +76,14 @@ export interface AssetLoadResult {
59
76
  * contain its own `import`/`export` statements, which are followed normally.
60
77
  */
61
78
  readonly moduleSource: string;
79
+ /**
80
+ * Ranges of `moduleSource` that were copied verbatim from *another* file —
81
+ * for instance the body of `<script src="app.js">` wrapped by the `gui`
82
+ * `.html` loader. Nodes inside a range keep that file as their origin, so
83
+ * diagnostics name the file the user actually wrote and the checker's
84
+ * plain-JavaScript exemption still applies to a `.js` script.
85
+ */
86
+ readonly sourceRanges?: readonly AssetSourceRange[];
62
87
  /**
63
88
  * Extra files the transformed module depends on that are *not* reached
64
89
  * through imports (for cache invalidation). Imported files are already
@@ -67,6 +92,13 @@ export interface AssetLoadResult {
67
92
  readonly dependencies?: readonly string[];
68
93
  }
69
94
 
95
+ /** A `[start, end)` span of a generated module copied from `file`. */
96
+ export interface AssetSourceRange {
97
+ readonly start: number;
98
+ readonly end: number;
99
+ readonly file: string;
100
+ }
101
+
70
102
  /** Rewrites an imported file (selected by extension) into a TS module. */
71
103
  export type AssetLoader = (path: string, source: string) => AssetLoadResult;
72
104
 
@@ -97,6 +129,12 @@ export interface Extension {
97
129
  linkerFlags?(): readonly string[];
98
130
  /** Global identifiers that resolve to runtime symbols when called. */
99
131
  builtins?(): Readonly<Record<string, BuiltinFunction>>;
132
+ /**
133
+ * Global identifiers that resolve to a runtime *value* (`window`,
134
+ * `document`, a host constructor). They need no declaration in the source
135
+ * and are not callable-by-name: reading the identifier calls the getter.
136
+ */
137
+ globalValues?(): Readonly<Record<string, GlobalValue>>;
100
138
  /** Modules importable as `import ... from "<specifier>"`. */
101
139
  modules?(): Readonly<Record<string, ExtensionModule>>;
102
140
  /**
@@ -191,6 +229,16 @@ export class ExtensionRegistry {
191
229
  return merged;
192
230
  }
193
231
 
232
+ /** Flatten every registered extension's global values into one lookup. */
233
+ globalValues(): Readonly<Record<string, GlobalValue>> {
234
+ const merged: Record<string, GlobalValue> = {};
235
+ for (const extension of this.extensions.values()) {
236
+ const values = extension.globalValues?.();
237
+ if (values) Object.assign(merged, values);
238
+ }
239
+ return merged;
240
+ }
241
+
194
242
  /** Flatten every registered extension's importable modules. */
195
243
  modules(): Readonly<Record<string, ExtensionModule>> {
196
244
  const merged: Record<string, ExtensionModule> = {};
package/src/index.ts CHANGED
@@ -19,6 +19,7 @@ export { TokenKind, KEYWORDS, type Token } from "./lexer/token.js";
19
19
  export * from "./ast/nodes.js";
20
20
  export { Parser } from "./parser/parser.js";
21
21
  export { bind, SymbolKind, ScopeKind, type BindResult, type FunctionInfo, type SymbolInfo } from "./binder/binder.js";
22
+ export { checkProgram, type CheckOptions } from "./checker/checker.js";
22
23
  export { generate, type CodegenResult, type CodegenOptions } from "./codegen/llvm.js";
23
24
  export {
24
25
  XT_UNDEFINED,
@@ -85,6 +85,13 @@ export const declarationClassMethods: DeclarationClassMethods = {
85
85
  this.nextToken();
86
86
  return undefined;
87
87
  }
88
+ /* `static { ... }`: a block that runs once while the class is defined. The
89
+ * `static` keyword was already consumed by `tryParseModifiers`, so the
90
+ * initializer position is the only way to tell it apart from a member. */
91
+ if (this.at(TokenKind.OpenBrace) && this.hasModifier(modifiers, ModifierKind.Static)) {
92
+ const body = this.parseBlock();
93
+ return { kind: SyntaxKind.ClassStaticBlockDeclaration, modifiers, body, start, end: body.end };
94
+ }
88
95
  if (
89
96
  (this.at(TokenKind.GetKeyword) || this.at(TokenKind.SetKeyword)) &&
90
97
  !this.atAhead(1, TokenKind.OpenParen) &&
@@ -61,7 +61,19 @@ export interface ExpressionMethods {
61
61
 
62
62
  export const expressionMethods: ExpressionMethods = {
63
63
  parseExpression(this: Parser, noIn = false): Expression {
64
- return this.parseAssignmentExpression(noIn);
64
+ const first = this.parseAssignmentExpression(noIn);
65
+ if (!this.at(TokenKind.Comma)) return first;
66
+ const expressions: Expression[] = [first];
67
+ while (this.at(TokenKind.Comma)) {
68
+ this.nextToken();
69
+ expressions.push(this.parseAssignmentExpression(noIn));
70
+ }
71
+ return {
72
+ kind: SyntaxKind.SequenceExpression,
73
+ expressions,
74
+ start: first.start,
75
+ end: expressions[expressions.length - 1]!.end,
76
+ };
65
77
  },
66
78
 
67
79
  parseAssignmentExpression(this: Parser, noIn = false): Expression {
@@ -159,8 +159,12 @@ export const literalMethods: LiteralMethods = {
159
159
  },
160
160
 
161
161
  parseFunctionExpression(this: Parser): FunctionExpression {
162
- const start = this.parseExpected(TokenKind.FunctionKeyword).start;
163
- let flags = NodeFlags.None;
162
+ /* `async function (...) {}` is an expression too; the `async` keyword is
163
+ * part of this node rather than a modifier list. */
164
+ const asyncToken = this.at(TokenKind.AsyncKeyword) ? this.nextToken() : undefined;
165
+ const functionToken = this.parseExpected(TokenKind.FunctionKeyword);
166
+ const start = asyncToken ? asyncToken.start : functionToken.start;
167
+ let flags = asyncToken ? NodeFlags.Async : NodeFlags.None;
164
168
  if (this.at(TokenKind.Asterisk)) {
165
169
  this.nextToken();
166
170
  flags |= NodeFlags.Generator;