xbintsc 0.5.22 → 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 (391) hide show
  1. package/AGENTS.md +12 -3
  2. package/README.md +46 -11
  3. package/README.zh-CN.md +32 -6
  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 +13 -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 +4 -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/catalog.js +2 -1
  122. package/dist/src/extensions/catalog.js.map +1 -1
  123. package/dist/src/extensions/gui/html.js +20 -6
  124. package/dist/src/extensions/gui/html.js.map +1 -1
  125. package/dist/src/extensions/gui/index.js +63 -0
  126. package/dist/src/extensions/gui/index.js.map +1 -1
  127. package/dist/src/extensions/media/index.d.ts +27 -0
  128. package/dist/src/extensions/media/index.js +60 -0
  129. package/dist/src/extensions/media/index.js.map +1 -0
  130. package/dist/src/extensions/registry.d.ts +50 -0
  131. package/dist/src/extensions/registry.js +26 -0
  132. package/dist/src/extensions/registry.js.map +1 -1
  133. package/dist/src/index.d.ts +2 -0
  134. package/dist/src/index.js +2 -0
  135. package/dist/src/index.js.map +1 -1
  136. package/dist/src/parser/declarations/classes.js +7 -0
  137. package/dist/src/parser/declarations/classes.js.map +1 -1
  138. package/dist/src/parser/expressions.js +14 -1
  139. package/dist/src/parser/expressions.js.map +1 -1
  140. package/dist/src/parser/literals.js +6 -2
  141. package/dist/src/parser/literals.js.map +1 -1
  142. package/dist/tests/binder/binder.test.js +29 -0
  143. package/dist/tests/binder/binder.test.js.map +1 -1
  144. package/dist/tests/canonical.test.d.ts +1 -0
  145. package/dist/tests/canonical.test.js +19 -0
  146. package/dist/tests/canonical.test.js.map +1 -0
  147. package/dist/tests/checker/checker.test.d.ts +1 -0
  148. package/dist/tests/checker/checker.test.js +245 -0
  149. package/dist/tests/checker/checker.test.js.map +1 -0
  150. package/dist/tests/cli/check.test.js +20 -0
  151. package/dist/tests/cli/check.test.js.map +1 -1
  152. package/dist/tests/cli/hints.test.js +15 -0
  153. package/dist/tests/cli/hints.test.js.map +1 -1
  154. package/dist/tests/cli/process.test.js +12 -0
  155. package/dist/tests/cli/process.test.js.map +1 -1
  156. package/dist/tests/conformance/matrix.test.d.ts +6 -0
  157. package/dist/tests/conformance/matrix.test.js +23 -0
  158. package/dist/tests/conformance/matrix.test.js.map +1 -0
  159. package/dist/tests/conformance/test262/manifest.d.ts +115 -0
  160. package/dist/tests/conformance/test262/manifest.js +257 -0
  161. package/dist/tests/conformance/test262/manifest.js.map +1 -0
  162. package/dist/tests/conformance/test262.test.d.ts +11 -0
  163. package/dist/tests/conformance/test262.test.js +74 -0
  164. package/dist/tests/conformance/test262.test.js.map +1 -0
  165. package/dist/tests/docs/structure.test.js +9 -11
  166. package/dist/tests/docs/structure.test.js.map +1 -1
  167. package/dist/tests/e2e/child-process.test.js +3 -2
  168. package/dist/tests/e2e/child-process.test.js.map +1 -1
  169. package/dist/tests/e2e/compile-builtins.test.js +21 -0
  170. package/dist/tests/e2e/compile-builtins.test.js.map +1 -1
  171. package/dist/tests/e2e/compile-objects-classes.test.js +54 -0
  172. package/dist/tests/e2e/compile-objects-classes.test.js.map +1 -1
  173. package/dist/tests/e2e/differential-syntax.test.d.ts +5 -0
  174. package/dist/tests/e2e/differential-syntax.test.js +95 -0
  175. package/dist/tests/e2e/differential-syntax.test.js.map +1 -0
  176. package/dist/tests/e2e/differential-values.test.js +15 -0
  177. package/dist/tests/e2e/differential-values.test.js.map +1 -1
  178. package/dist/tests/e2e/gui-browser.test.d.ts +13 -0
  179. package/dist/tests/e2e/gui-browser.test.js +163 -0
  180. package/dist/tests/e2e/gui-browser.test.js.map +1 -0
  181. package/dist/tests/e2e/gui-example-browser.test.js +2 -2
  182. package/dist/tests/e2e/gui-example-browser.test.js.map +1 -1
  183. package/dist/tests/e2e/gui-example-canvas.test.js +8 -5
  184. package/dist/tests/e2e/gui-example-canvas.test.js.map +1 -1
  185. package/dist/tests/e2e/gui-example-svg.test.js +4 -3
  186. package/dist/tests/e2e/gui-example-svg.test.js.map +1 -1
  187. package/dist/tests/e2e/gui-example.test.js +4 -3
  188. package/dist/tests/e2e/gui-example.test.js.map +1 -1
  189. package/dist/tests/e2e/gui-helpers.d.ts +3 -0
  190. package/dist/tests/e2e/gui-helpers.js +6 -3
  191. package/dist/tests/e2e/gui-helpers.js.map +1 -1
  192. package/dist/tests/e2e/gui-media-disabled.test.d.ts +9 -0
  193. package/dist/tests/e2e/gui-media-disabled.test.js +42 -0
  194. package/dist/tests/e2e/gui-media-disabled.test.js.map +1 -0
  195. package/dist/tests/e2e/gui-media.test.d.ts +6 -4
  196. package/dist/tests/e2e/gui-media.test.js +20 -16
  197. package/dist/tests/e2e/gui-media.test.js.map +1 -1
  198. package/dist/tests/e2e/harness.d.ts +9 -0
  199. package/dist/tests/e2e/harness.js +14 -2
  200. package/dist/tests/e2e/harness.js.map +1 -1
  201. package/dist/tests/e2e/native-extensions.test.js +2 -1
  202. package/dist/tests/e2e/native-extensions.test.js.map +1 -1
  203. package/dist/tests/e2e/property-descriptors.test.js +20 -0
  204. package/dist/tests/e2e/property-descriptors.test.js.map +1 -1
  205. package/dist/tests/e2e/unicode-output.test.d.ts +16 -0
  206. package/dist/tests/e2e/unicode-output.test.js +67 -0
  207. package/dist/tests/e2e/unicode-output.test.js.map +1 -0
  208. package/dist/tests/e2e/weak-collections.test.js +16 -2
  209. package/dist/tests/e2e/weak-collections.test.js.map +1 -1
  210. package/dist/tests/extensions/media.test.d.ts +1 -0
  211. package/dist/tests/extensions/media.test.js +58 -0
  212. package/dist/tests/extensions/media.test.js.map +1 -0
  213. package/dist/tests/extensions/registry.test.js +8 -0
  214. package/dist/tests/extensions/registry.test.js.map +1 -1
  215. package/dist/tests/helpers.d.ts +1 -0
  216. package/dist/tests/helpers.js +1 -0
  217. package/dist/tests/helpers.js.map +1 -1
  218. package/dist/tests/lexer/identifiers.test.js +12 -0
  219. package/dist/tests/lexer/identifiers.test.js.map +1 -1
  220. package/dist/tests/lexer/scanner.test.js +8 -0
  221. package/dist/tests/lexer/scanner.test.js.map +1 -1
  222. package/dist/tests/lexer/strings.test.js +30 -0
  223. package/dist/tests/lexer/strings.test.js.map +1 -1
  224. package/dist/tests/parser/declarations.test.js +20 -0
  225. package/dist/tests/parser/declarations.test.js.map +1 -1
  226. package/dist/tests/parser/expressions.test.js +36 -0
  227. package/dist/tests/parser/expressions.test.js.map +1 -1
  228. package/dist/tests/platform.d.ts +32 -0
  229. package/dist/tests/platform.js +40 -0
  230. package/dist/tests/platform.js.map +1 -0
  231. package/dist/tests/platform.test.d.ts +12 -0
  232. package/dist/tests/platform.test.js +51 -0
  233. package/dist/tests/platform.test.js.map +1 -0
  234. package/dist/tests/version.test.js +4 -4
  235. package/dist/tests/version.test.js.map +1 -1
  236. package/doc/ai/README.md +10 -4
  237. package/doc/ai/build-recipe.md +1 -0
  238. package/doc/ai/cli.md +18 -6
  239. package/doc/ai/contributing.md +59 -2
  240. package/doc/ai/extensions.md +46 -23
  241. package/doc/ai/language-support.md +25 -16
  242. package/doc/ai/troubleshooting.md +9 -0
  243. package/doc/ai/zh-CN/README.md +9 -4
  244. package/doc/ai/zh-CN/build-recipe.md +1 -0
  245. package/doc/ai/zh-CN/cli.md +14 -4
  246. package/doc/ai/zh-CN/contributing.md +49 -3
  247. package/doc/ai/zh-CN/extensions.md +29 -8
  248. package/doc/ai/zh-CN/language-support.md +23 -14
  249. package/doc/ai/zh-CN/troubleshooting.md +8 -0
  250. package/doc/gui/api.md +45 -0
  251. package/doc/gui/build.md +37 -21
  252. package/doc/gui/known-issues.md +17 -6
  253. package/doc/gui/media.md +26 -11
  254. package/doc/gui/runtime.md +18 -0
  255. package/doc/gui-scripts.md +7 -0
  256. package/doc/gui.md +43 -33
  257. package/doc/implemented/binder.md +2 -0
  258. package/doc/implemented/checker.md +117 -0
  259. package/doc/implemented/cli.md +13 -1
  260. package/doc/implemented/codegen.md +3 -2
  261. package/doc/implemented/driver.md +2 -2
  262. package/doc/implemented/operators.md +2 -1
  263. package/doc/implemented/parser.md +3 -2
  264. package/doc/implemented/pipeline.md +8 -1
  265. package/doc/implemented/stdlib.md +2 -1
  266. package/doc/implemented/tests.md +3 -1
  267. package/doc/implemented.md +2 -0
  268. package/doc/npm-package.md +417 -0
  269. package/doc/requirements.md +4 -1
  270. package/doc/support-matrix.md +83 -0
  271. package/doc/unimplemented/classes.md +3 -0
  272. package/doc/unimplemented/deviations.md +3 -2
  273. package/doc/unimplemented/toolchain.md +1 -1
  274. package/doc/unimplemented/types.md +24 -8
  275. package/doc/unimplemented.md +1 -1
  276. package/doc/zh-CN/gui/api.md +41 -0
  277. package/doc/zh-CN/gui/build.md +28 -16
  278. package/doc/zh-CN/gui/known-issues.md +13 -5
  279. package/doc/zh-CN/gui/media.md +21 -10
  280. package/doc/zh-CN/gui/runtime.md +16 -0
  281. package/doc/zh-CN/gui-scripts.md +5 -0
  282. package/doc/zh-CN/gui.md +37 -32
  283. package/doc/zh-CN/implemented/binder.md +2 -0
  284. package/doc/zh-CN/implemented/checker.md +99 -0
  285. package/doc/zh-CN/implemented/cli.md +12 -1
  286. package/doc/zh-CN/implemented/codegen.md +3 -2
  287. package/doc/zh-CN/implemented/driver.md +2 -2
  288. package/doc/zh-CN/implemented/operators.md +1 -1
  289. package/doc/zh-CN/implemented/parser.md +3 -2
  290. package/doc/zh-CN/implemented/pipeline.md +3 -1
  291. package/doc/zh-CN/implemented/stdlib.md +2 -1
  292. package/doc/zh-CN/implemented/tests.md +3 -1
  293. package/doc/zh-CN/implemented.md +2 -0
  294. package/doc/zh-CN/npm-package.md +391 -0
  295. package/doc/zh-CN/post/announce.md +47 -47
  296. package/doc/zh-CN/requirements.md +4 -1
  297. package/doc/zh-CN/support-matrix.md +82 -0
  298. package/doc/zh-CN/unimplemented/classes.md +3 -0
  299. package/doc/zh-CN/unimplemented/deviations.md +3 -2
  300. package/doc/zh-CN/unimplemented/toolchain.md +1 -1
  301. package/doc/zh-CN/unimplemented/types.md +16 -6
  302. package/doc/zh-CN/unimplemented.md +1 -1
  303. package/llms.txt +4 -1
  304. package/package.json +3 -1
  305. package/runtime/ext_gui/audio.cpp +316 -0
  306. package/runtime/ext_gui/browser.cpp +547 -0
  307. package/runtime/ext_gui/browser_escape.cpp +85 -0
  308. package/runtime/ext_gui/browser_loop.cpp +83 -0
  309. package/runtime/ext_gui/canvas.cpp +9 -3
  310. package/runtime/ext_gui/canvas_raster.cpp +19 -1
  311. package/runtime/ext_gui/dom_api.cpp +36 -0
  312. package/runtime/ext_gui/dom_api_document.cpp +96 -5
  313. package/runtime/ext_gui/dom_api_events.cpp +20 -0
  314. package/runtime/ext_gui/dom_api_internal.h +19 -0
  315. package/runtime/ext_gui/dom_api_proto.cpp +6 -0
  316. package/runtime/ext_gui/gui.cpp +90 -23
  317. package/runtime/ext_gui/gui_engine.h +44 -0
  318. package/runtime/ext_gui/gui_media.cpp +69 -2
  319. package/runtime/ext_gui/media.cpp +34 -488
  320. package/runtime/ext_gui/media.h +54 -19
  321. package/runtime/ext_gui/media_api.h +65 -0
  322. package/runtime/ext_gui/window.cpp +9 -0
  323. package/runtime/ext_media/media.cpp +507 -0
  324. package/runtime/ext_media/media_bridge.c +35 -0
  325. package/runtime/ext_node/path/path.c +7 -7
  326. package/runtime/ext_node/url/url.c +4 -2
  327. package/runtime/rt.h +15 -0
  328. package/runtime/xt_constructors.c +2 -1
  329. package/runtime/xt_containers/objects.inc +22 -2
  330. package/runtime/xt_io/exception.inc +4 -2
  331. package/runtime/xt_stdlib/math.inc +62 -0
  332. package/runtime/xt_stdlib2/date.inc +7 -1
  333. package/runtime/xt_stdlib2/objects.inc +14 -0
  334. package/scripts/build-gui.ts +6 -72
  335. package/scripts/build-media.ts +245 -0
  336. package/scripts/support-matrix.ts +167 -0
  337. package/src/ast/common.ts +2 -0
  338. package/src/ast/declarations.ts +12 -1
  339. package/src/ast/expressions.ts +6 -0
  340. package/src/ast/kinds.ts +2 -0
  341. package/src/binder/binder.ts +3 -0
  342. package/src/binder/declarations.ts +70 -0
  343. package/src/binder/references.ts +84 -3
  344. package/src/binder/types.ts +30 -0
  345. package/src/canonical.ts +37 -0
  346. package/src/checker/assignability.ts +134 -0
  347. package/src/checker/calls.ts +135 -0
  348. package/src/checker/checker.ts +47 -0
  349. package/src/checker/declarations.ts +26 -0
  350. package/src/checker/flow.ts +236 -0
  351. package/src/checker/globals.ts +40 -0
  352. package/src/checker/source.ts +53 -0
  353. package/src/checker/type-infer.ts +185 -0
  354. package/src/checker/type-model.ts +212 -0
  355. package/src/checker/type-system.ts +578 -0
  356. package/src/checker/typecheck-types.ts +112 -0
  357. package/src/checker/typecheck.ts +586 -0
  358. package/src/checker/undefined.ts +43 -0
  359. package/src/checker/walk.ts +16 -0
  360. package/src/cli/help.ts +65 -0
  361. package/src/cli/hints.ts +13 -1
  362. package/src/cli/main.ts +12 -49
  363. package/src/codegen/generator/calls/access.ts +8 -8
  364. package/src/codegen/generator/calls/invocation.ts +8 -5
  365. package/src/codegen/generator/calls/super.ts +67 -5
  366. package/src/codegen/generator/context.ts +31 -19
  367. package/src/codegen/generator/debug.ts +2 -1
  368. package/src/codegen/generator/expressions/primary.ts +84 -13
  369. package/src/codegen/generator/generator.ts +11 -1
  370. package/src/codegen/generator/module.ts +65 -24
  371. package/src/codegen/generator/state.ts +11 -1
  372. package/src/codegen/generator/statements/variables.ts +20 -3
  373. package/src/codegen/generator/tables.ts +5 -0
  374. package/src/driver/build-key.ts +3 -0
  375. package/src/driver/bundler/graph.ts +6 -2
  376. package/src/driver/bundler/merge.ts +14 -1
  377. package/src/driver/bundler/types.ts +13 -0
  378. package/src/driver/compiler.ts +5 -1
  379. package/src/driver/fingerprint.ts +2 -1
  380. package/src/driver/frontend.ts +13 -2
  381. package/src/driver/options.ts +6 -0
  382. package/src/driver/version.ts +1 -1
  383. package/src/extensions/catalog.ts +2 -1
  384. package/src/extensions/gui/html.ts +23 -10
  385. package/src/extensions/gui/index.ts +65 -0
  386. package/src/extensions/media/index.ts +67 -0
  387. package/src/extensions/registry.ts +72 -0
  388. package/src/index.ts +2 -0
  389. package/src/parser/declarations/classes.ts +7 -0
  390. package/src/parser/expressions.ts +13 -1
  391. package/src/parser/literals.ts +6 -2
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Call arity: `f(1)` where `f` declares two required parameters.
3
+ *
4
+ * Only calls whose callee the checker can resolve without inference are
5
+ * checked: a direct identifier bound to a function declaration, or to a
6
+ * `const` initialised with a function expression / arrow. Methods, imports,
7
+ * first-class re-exports and reassigned bindings are left alone — guessing
8
+ * there is how a checker produces false positives.
9
+ */
10
+ import { type SourceFileNode } from "../ast/nodes.js";
11
+ import { type BindResult } from "../binder/binder.js";
12
+ import { type DiagnosticBag } from "../diagnostics/diagnostic.js";
13
+ export declare function checkCallArity(sourceFile: SourceFileNode, binding: BindResult, diagnostics: DiagnosticBag): void;
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Call arity: `f(1)` where `f` declares two required parameters.
3
+ *
4
+ * Only calls whose callee the checker can resolve without inference are
5
+ * checked: a direct identifier bound to a function declaration, or to a
6
+ * `const` initialised with a function expression / arrow. Methods, imports,
7
+ * first-class re-exports and reassigned bindings are left alone — guessing
8
+ * there is how a checker produces false positives.
9
+ */
10
+ import { SyntaxKind, } from "../ast/nodes.js";
11
+ import { SymbolKind } from "../binder/binder.js";
12
+ import { DiagnosticCode } from "../diagnostics/diagnostic.js";
13
+ import { ASSIGNMENT_OPERATORS } from "../codegen/generator/tables.js";
14
+ import { fileNameOf, isUntypedNode } from "./source.js";
15
+ import { walk } from "./walk.js";
16
+ function arityOf(fn) {
17
+ const parameters = fn.node.parameters;
18
+ if (!parameters)
19
+ return undefined;
20
+ let required = 0;
21
+ let max = 0;
22
+ for (const parameter of parameters) {
23
+ if (parameter.dotDotDotToken)
24
+ return { required, max: Number.POSITIVE_INFINITY };
25
+ max++;
26
+ // A `this:` parameter is a type-only declaration: it is erased and never
27
+ // occupies an argument slot.
28
+ if (parameter.name.kind === SyntaxKind.Identifier && parameter.name.text === "this") {
29
+ max--;
30
+ continue;
31
+ }
32
+ if (!parameter.questionToken && !parameter.initializer)
33
+ required = max;
34
+ }
35
+ return { required, max };
36
+ }
37
+ /** Symbols written after their declaration (so their signature can change). */
38
+ function collectAssignedSymbols(sourceFile, binding) {
39
+ const assigned = new Set();
40
+ walk(sourceFile, (node) => {
41
+ if (node.kind !== SyntaxKind.BinaryExpression)
42
+ return;
43
+ const binary = node;
44
+ if (!ASSIGNMENT_OPERATORS.has(binary.operator))
45
+ return;
46
+ if (binary.left.kind !== SyntaxKind.Identifier)
47
+ return;
48
+ const symbol = binding.symbolOfIdentifier.get(binary.left);
49
+ if (symbol)
50
+ assigned.add(symbol.id);
51
+ });
52
+ return assigned;
53
+ }
54
+ function resolveCallee(binding, assigned, callee) {
55
+ if (callee.kind !== SyntaxKind.Identifier)
56
+ return undefined;
57
+ const symbol = binding.symbolOfIdentifier.get(callee);
58
+ if (!symbol || symbol.declarations.length !== 1 || assigned.has(symbol.id))
59
+ return undefined;
60
+ if (symbol.kind === SymbolKind.Function) {
61
+ return binding.functionOfNode.get(symbol.declarations[0]);
62
+ }
63
+ if (symbol.kind === SymbolKind.Const) {
64
+ const declaration = symbol.declarations[0];
65
+ if (declaration.kind !== SyntaxKind.VariableDeclaration)
66
+ return undefined;
67
+ const initializer = declaration.initializer;
68
+ if (!initializer)
69
+ return undefined;
70
+ if (initializer.kind !== SyntaxKind.ArrowFunction && initializer.kind !== SyntaxKind.FunctionExpression) {
71
+ return undefined;
72
+ }
73
+ return binding.functionOfNode.get(initializer);
74
+ }
75
+ return undefined;
76
+ }
77
+ function plural(count) {
78
+ return count === 1 ? "argument" : "arguments";
79
+ }
80
+ function expected(arity) {
81
+ if (arity.max === Number.POSITIVE_INFINITY)
82
+ return `at least ${arity.required} ${plural(arity.required)}`;
83
+ if (arity.required === arity.max)
84
+ return `${arity.required} ${plural(arity.required)}`;
85
+ return `${arity.required}-${arity.max} ${plural(arity.max)}`;
86
+ }
87
+ export function checkCallArity(sourceFile, binding, diagnostics) {
88
+ const assigned = collectAssignedSymbols(sourceFile, binding);
89
+ /* `function f() { return arguments.length; }` is a declared-zero-parameter
90
+ * function that legitimately accepts any number of arguments; its parameter
91
+ * list is not the whole signature. */
92
+ const argumentsUsers = new Map();
93
+ const usesArguments = (fn) => {
94
+ const cached = argumentsUsers.get(fn.id);
95
+ if (cached !== undefined)
96
+ return cached;
97
+ let found = false;
98
+ walk(fn.node, (node) => {
99
+ if (node.kind === SyntaxKind.Identifier && node.text === "arguments")
100
+ found = true;
101
+ });
102
+ argumentsUsers.set(fn.id, found);
103
+ return found;
104
+ };
105
+ walk(sourceFile, (node) => {
106
+ if (node.kind !== SyntaxKind.CallExpression)
107
+ return;
108
+ if (isUntypedNode(sourceFile, node))
109
+ return;
110
+ const call = node;
111
+ if (call.optional)
112
+ return;
113
+ if (call.arguments.some((argument) => argument.kind === SyntaxKind.SpreadElement))
114
+ return;
115
+ const fn = resolveCallee(binding, assigned, call.expression);
116
+ if (!fn || fn.isModule || usesArguments(fn))
117
+ return;
118
+ const arity = arityOf(fn);
119
+ if (!arity)
120
+ return;
121
+ const argc = call.arguments.length;
122
+ if (argc >= arity.required && argc <= arity.max)
123
+ return;
124
+ diagnostics.error(DiagnosticCode.ArgumentCountMismatch, `Expected ${expected(arity)}, but got ${argc}.`, call, fileNameOf(sourceFile, call));
125
+ });
126
+ }
127
+ //# sourceMappingURL=calls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calls.js","sourceRoot":"","sources":["../../../src/checker/calls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * The opt-out semantic checker (`--check` / `--no-check`).
3
+ *
4
+ * It runs after binding and before code generation. The first three passes are
5
+ * inference-free:
6
+ *
7
+ * 1. identifier references with no declaration and no runtime global,
8
+ * 2. same-scope declarations that cannot merge (`let x` twice, ...),
9
+ * 3. calls whose argument count cannot match a locally-visible signature.
10
+ *
11
+ * The fourth pass uses a deliberately small structural type model to check
12
+ * assignability, property existence and simple flow narrowing. It understands
13
+ * annotations, interfaces, classes, arrays, functions, unions and simple
14
+ * generics; anything else is `any`, so unsupported syntax can hide a bug but
15
+ * never reject working code.
16
+ */
17
+ import type { SourceFileNode } from "../ast/nodes.js";
18
+ import type { BindResult } from "../binder/binder.js";
19
+ import type { DiagnosticBag } from "../diagnostics/diagnostic.js";
20
+ export interface CheckOptions {
21
+ /** Globals supplied by the registered extensions (`print`, `__registerScript`, ...). */
22
+ readonly builtins?: Readonly<Record<string, unknown>>;
23
+ /** Global values supplied by the registered extensions (`window`, `document`). */
24
+ readonly globalValues?: Readonly<Record<string, unknown>>;
25
+ }
26
+ export declare function checkProgram(sourceFile: SourceFileNode, binding: BindResult, diagnostics: DiagnosticBag, options?: CheckOptions): void;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The opt-out semantic checker (`--check` / `--no-check`).
3
+ *
4
+ * It runs after binding and before code generation. The first three passes are
5
+ * inference-free:
6
+ *
7
+ * 1. identifier references with no declaration and no runtime global,
8
+ * 2. same-scope declarations that cannot merge (`let x` twice, ...),
9
+ * 3. calls whose argument count cannot match a locally-visible signature.
10
+ *
11
+ * The fourth pass uses a deliberately small structural type model to check
12
+ * assignability, property existence and simple flow narrowing. It understands
13
+ * annotations, interfaces, classes, arrays, functions, unions and simple
14
+ * generics; anything else is `any`, so unsupported syntax can hide a bug but
15
+ * never reject working code.
16
+ */
17
+ import { checkCallArity } from "./calls.js";
18
+ import { reportDeclarationConflicts } from "./declarations.js";
19
+ import { checkTypes } from "./typecheck.js";
20
+ import { checkUnresolvedNames } from "./undefined.js";
21
+ export function checkProgram(sourceFile, binding, diagnostics, options = {}) {
22
+ const builtinNames = new Set([
23
+ ...Object.keys(options.builtins ?? {}),
24
+ ...Object.keys(options.globalValues ?? {}),
25
+ ]);
26
+ checkUnresolvedNames(sourceFile, binding, diagnostics, builtinNames);
27
+ reportDeclarationConflicts(sourceFile, binding, diagnostics);
28
+ checkCallArity(sourceFile, binding, diagnostics);
29
+ checkTypes(sourceFile, binding, diagnostics);
30
+ }
31
+ //# sourceMappingURL=checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checker.js","sourceRoot":"","sources":["../../../src/checker/checker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAStD,MAAM,UAAU,YAAY,CAC1B,UAA0B,EAC1B,OAAmB,EACnB,WAA0B,EAC1B,UAAwB,EAAE;IAE1B,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS;QACnC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;QACtC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;KAC3C,CAAC,CAAC;IACH,oBAAoB,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACrE,0BAA0B,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAC7D,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACjD,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Redeclarations: the binder records same-scope declarations that cannot merge
3
+ * (`let x` twice, `function f` followed by `const f`, ...). This pass turns
4
+ * those facts into diagnostics.
5
+ */
6
+ import type { SourceFileNode } from "../ast/nodes.js";
7
+ import type { BindResult } from "../binder/binder.js";
8
+ import { type DiagnosticBag } from "../diagnostics/diagnostic.js";
9
+ export declare function reportDeclarationConflicts(sourceFile: SourceFileNode, binding: BindResult, diagnostics: DiagnosticBag): void;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Redeclarations: the binder records same-scope declarations that cannot merge
3
+ * (`let x` twice, `function f` followed by `const f`, ...). This pass turns
4
+ * those facts into diagnostics.
5
+ */
6
+ import { DiagnosticCode } from "../diagnostics/diagnostic.js";
7
+ import { fileNameOf, isDependencyNode } from "./source.js";
8
+ export function reportDeclarationConflicts(sourceFile, binding, diagnostics) {
9
+ for (const conflict of binding.conflicts) {
10
+ if (isDependencyNode(sourceFile, conflict.node))
11
+ continue;
12
+ diagnostics.error(DiagnosticCode.DuplicateIdentifier, `Duplicate identifier '${conflict.name}'.`, conflict.node, fileNameOf(sourceFile, conflict.node));
13
+ }
14
+ }
15
+ //# sourceMappingURL=declarations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"declarations.js","sourceRoot":"","sources":["../../../src/checker/declarations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,cAAc,EAAsB,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,UAAU,0BAA0B,CACxC,UAA0B,EAC1B,OAAmB,EACnB,WAA0B;IAE1B,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACzC,IAAI,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QAC1D,WAAW,CAAC,KAAK,CACf,cAAc,CAAC,mBAAmB,EAClC,yBAAyB,QAAQ,CAAC,IAAI,IAAI,EAC1C,QAAQ,CAAC,IAAI,EACb,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CACtC,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Lightweight control-flow narrowing.
3
+ *
4
+ * Only the predicates whose refinement is unambiguous are handled:
5
+ * `typeof x === "..."`, comparisons with `null`/`undefined`, `instanceof`,
6
+ * truthiness and the `&&` / `||` / `??` forms that combine them. Everything
7
+ * else leaves the flow untouched, so a missed narrowing can only hide an
8
+ * error, never invent one.
9
+ */
10
+ import { type Expression } from "../ast/nodes.js";
11
+ import { type Type } from "./type-model.js";
12
+ import type { TypeResolver } from "./type-system.js";
13
+ export declare class Flow {
14
+ readonly parent?: Flow | undefined;
15
+ readonly overrides: ReadonlyMap<number, Type>;
16
+ constructor(parent?: Flow | undefined, overrides?: ReadonlyMap<number, Type>);
17
+ typeOf(symbolId: number): Type | undefined;
18
+ with(overrides: ReadonlyMap<number, Type>): Flow;
19
+ }
20
+ export declare function withoutNullish(type: Type): Type;
21
+ export declare function narrow(condition: Expression, truthy: boolean, flow: Flow, resolver: TypeResolver): Flow;
@@ -0,0 +1,241 @@
1
+ /**
2
+ * Lightweight control-flow narrowing.
3
+ *
4
+ * Only the predicates whose refinement is unambiguous are handled:
5
+ * `typeof x === "..."`, comparisons with `null`/`undefined`, `instanceof`,
6
+ * truthiness and the `&&` / `||` / `??` forms that combine them. Everything
7
+ * else leaves the flow untouched, so a missed narrowing can only hide an
8
+ * error, never invent one.
9
+ */
10
+ import { SyntaxKind, } from "../ast/nodes.js";
11
+ import { primitive, unionMembers, unwrap } from "./type-model.js";
12
+ export class Flow {
13
+ parent;
14
+ overrides;
15
+ constructor(parent, overrides = new Map()) {
16
+ this.parent = parent;
17
+ this.overrides = overrides;
18
+ }
19
+ typeOf(symbolId) {
20
+ return this.overrides.get(symbolId) ?? this.parent?.typeOf(symbolId);
21
+ }
22
+ with(overrides) {
23
+ return new Flow(this, overrides);
24
+ }
25
+ }
26
+ function merge(...maps) {
27
+ const result = new Map();
28
+ for (const map of maps)
29
+ for (const [key, value] of map)
30
+ result.set(key, value);
31
+ return result;
32
+ }
33
+ function symbolIdOf(expression, resolver) {
34
+ const unwrapped = unwrap(expression);
35
+ if (unwrapped.kind !== SyntaxKind.Identifier)
36
+ return undefined;
37
+ return resolver.binding.symbolOfIdentifier.get(unwrapped)?.id;
38
+ }
39
+ function nullishKind(expression) {
40
+ const unwrapped = unwrap(expression);
41
+ if (unwrapped.kind === SyntaxKind.NullKeyword)
42
+ return "null";
43
+ if (unwrapped.kind === SyntaxKind.UndefinedKeyword)
44
+ return "undefined";
45
+ if (unwrapped.kind === SyntaxKind.Identifier && unwrapped.text === "undefined")
46
+ return "undefined";
47
+ return undefined;
48
+ }
49
+ function literalType(expression) {
50
+ const unwrapped = unwrap(expression);
51
+ switch (unwrapped.kind) {
52
+ case SyntaxKind.StringLiteral:
53
+ case SyntaxKind.NoSubstitutionTemplateLiteral:
54
+ return { kind: "literal", value: unwrapped.value, primitive: "string" };
55
+ case SyntaxKind.NumericLiteral:
56
+ return { kind: "literal", value: unwrapped.value, primitive: "number" };
57
+ case SyntaxKind.TrueKeyword:
58
+ return { kind: "literal", value: true, primitive: "boolean" };
59
+ case SyntaxKind.FalseKeyword:
60
+ return { kind: "literal", value: false, primitive: "boolean" };
61
+ default:
62
+ return undefined;
63
+ }
64
+ }
65
+ const TYPEOF_NAMES = {
66
+ string: "string",
67
+ number: "number",
68
+ boolean: "boolean",
69
+ bigint: "bigint",
70
+ symbol: "symbol",
71
+ undefined: "undefined",
72
+ };
73
+ function filterType(type, predicate) {
74
+ const kept = unionMembers(type).filter(predicate);
75
+ if (kept.length === 0)
76
+ return undefined;
77
+ if (kept.length === 1)
78
+ return kept[0];
79
+ return { kind: "union", members: kept };
80
+ }
81
+ export function withoutNullish(type) {
82
+ return filterType(type, (member) => !(member.kind === "primitive" && (member.name === "null" || member.name === "undefined"))) ?? type;
83
+ }
84
+ function refine(type, predicate) {
85
+ return filterType(type, predicate);
86
+ }
87
+ function positiveRefinement(expression, flow, resolver) {
88
+ const result = new Map();
89
+ const unwrapped = unwrap(expression);
90
+ if (unwrapped.kind === SyntaxKind.Identifier) {
91
+ const id = symbolIdOf(unwrapped, resolver);
92
+ if (id !== undefined) {
93
+ const type = flow.typeOf(id) ?? resolver.typeOfSymbolId(id);
94
+ if (type)
95
+ result.set(id, withoutNullish(type));
96
+ }
97
+ return result;
98
+ }
99
+ if (unwrapped.kind === SyntaxKind.PrefixUnaryExpression) {
100
+ const unary = unwrapped;
101
+ if (unary.operator === "!")
102
+ return negativeRefinement(unary.operand, flow, resolver);
103
+ return result;
104
+ }
105
+ if (unwrapped.kind !== SyntaxKind.BinaryExpression)
106
+ return result;
107
+ const binary = unwrapped;
108
+ const operator = binary.operator;
109
+ if (operator === "&&")
110
+ return merge(positiveRefinement(binary.left, flow, resolver), positiveRefinement(binary.right, flow, resolver));
111
+ if (operator === "||") {
112
+ // `a || b` is truthy when either side is; no single refinement to apply.
113
+ return result;
114
+ }
115
+ if (operator === "??")
116
+ return positiveRefinement(binary.left, flow, resolver);
117
+ const equality = operator === "===" || operator === "==";
118
+ const inequality = operator === "!==" || operator === "!=";
119
+ if (equality || inequality) {
120
+ const leftNullish = nullishKind(binary.left);
121
+ const rightNullish = nullishKind(binary.right);
122
+ const nullish = leftNullish ?? rightNullish;
123
+ const other = leftNullish ? binary.right : binary.left;
124
+ const id = symbolIdOf(other, resolver);
125
+ if (id !== undefined && nullish) {
126
+ if (equality) {
127
+ const target = nullish === "nullish" ? [primitive("null"), primitive("undefined")] : [primitive(nullish)];
128
+ for (const type of target)
129
+ result.set(id, type);
130
+ }
131
+ else {
132
+ const base = flow.typeOf(id) ?? resolver.typeOfSymbolId(id);
133
+ if (base) {
134
+ const narrowed = refine(base, (member) => !(member.kind === "primitive" && (member.name === "null" || member.name === "undefined")));
135
+ if (narrowed)
136
+ result.set(id, narrowed);
137
+ }
138
+ }
139
+ return result;
140
+ }
141
+ // `typeof x === "string"` and friends.
142
+ const typeofSide = unwrap(binary.left).kind === SyntaxKind.TypeOfExpression ? binary.left : unwrap(binary.right).kind === SyntaxKind.TypeOfExpression ? binary.right : undefined;
143
+ const literalSide = literalType(typeofSide === binary.left ? binary.right : binary.left);
144
+ if (typeofSide && literalSide?.kind === "literal" && typeof literalSide.value === "string") {
145
+ const name = TYPEOF_NAMES[literalSide.value];
146
+ const operand = unwrap(typeofSide).expression;
147
+ const operandId = symbolIdOf(operand, resolver);
148
+ if (name && operandId !== undefined) {
149
+ const base = flow.typeOf(operandId) ?? resolver.typeOfSymbolId(operandId);
150
+ if (base) {
151
+ const narrowed = refine(base, (member) => matchesTypeof(member, name));
152
+ if (narrowed)
153
+ result.set(operandId, narrowed);
154
+ }
155
+ }
156
+ return result;
157
+ }
158
+ // `x === "literal"` narrows to that literal.
159
+ const leftLiteral = literalType(binary.left);
160
+ const rightLiteral = literalType(binary.right);
161
+ if (leftLiteral && !rightLiteral) {
162
+ const id = symbolIdOf(binary.right, resolver);
163
+ if (id !== undefined)
164
+ result.set(id, leftLiteral);
165
+ }
166
+ else if (rightLiteral && !leftLiteral) {
167
+ const id = symbolIdOf(binary.left, resolver);
168
+ if (id !== undefined)
169
+ result.set(id, rightLiteral);
170
+ }
171
+ return result;
172
+ }
173
+ if (operator === "instanceof") {
174
+ const id = symbolIdOf(binary.left, resolver);
175
+ if (id === undefined)
176
+ return result;
177
+ const instance = resolver.classInstanceFromIdentifier(binary.right);
178
+ if (instance)
179
+ result.set(id, instance);
180
+ }
181
+ return result;
182
+ }
183
+ function negativeRefinement(expression, flow, resolver) {
184
+ const result = new Map();
185
+ const unwrapped = unwrap(expression);
186
+ if (unwrapped.kind === SyntaxKind.PrefixUnaryExpression) {
187
+ const unary = unwrapped;
188
+ if (unary.operator === "!")
189
+ return positiveRefinement(unary.operand, flow, resolver);
190
+ return result;
191
+ }
192
+ if (unwrapped.kind !== SyntaxKind.BinaryExpression)
193
+ return result;
194
+ const binary = unwrapped;
195
+ if (binary.operator === "&&") {
196
+ // `!(a && b)` does not refine either side on its own.
197
+ return result;
198
+ }
199
+ if (binary.operator === "||") {
200
+ return merge(negativeRefinement(binary.left, flow, resolver), negativeRefinement(binary.right, flow, resolver));
201
+ }
202
+ const equality = binary.operator === "===" || binary.operator === "==";
203
+ const inequality = binary.operator === "!==" || binary.operator === "!=";
204
+ if (!equality && !inequality)
205
+ return result;
206
+ const leftNullish = nullishKind(binary.left);
207
+ const rightNullish = nullishKind(binary.right);
208
+ const nullish = leftNullish ?? rightNullish;
209
+ const other = leftNullish ? binary.right : binary.left;
210
+ const id = symbolIdOf(other, resolver);
211
+ if (id === undefined || !nullish)
212
+ return result;
213
+ if (equality) {
214
+ // `!(x === null)` means x is non-null.
215
+ const base = flow.typeOf(id) ?? resolver.typeOfSymbolId(id);
216
+ if (!base)
217
+ return result;
218
+ const narrowed = refine(base, (member) => !(member.kind === "primitive" && (member.name === "null" || member.name === "undefined")));
219
+ if (narrowed)
220
+ result.set(id, narrowed);
221
+ }
222
+ else {
223
+ // `!(x !== null)` means x is null (or nullish for `!= null`).
224
+ const target = nullish === "nullish" ? [primitive("null"), primitive("undefined")] : [primitive(nullish)];
225
+ for (const type of target)
226
+ result.set(id, type);
227
+ }
228
+ return result;
229
+ }
230
+ function matchesTypeof(type, name) {
231
+ if (type.kind === "literal")
232
+ return type.primitive === name;
233
+ if (type.kind !== "primitive")
234
+ return false;
235
+ return type.name === name;
236
+ }
237
+ export function narrow(condition, truthy, flow, resolver) {
238
+ const overrides = truthy ? positiveRefinement(condition, flow, resolver) : negativeRefinement(condition, flow, resolver);
239
+ return overrides.size > 0 ? flow.with(overrides) : flow;
240
+ }
241
+ //# sourceMappingURL=flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/checker/flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,UAAU,GAMX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAa,MAAM,iBAAiB,CAAC;AAG7E,MAAM,OAAO,IAAI;IAEJ;IACA;IAFX,YACW,MAAa,EACb,YAAuC,IAAI,GAAG,EAAE;QADhD,WAAM,GAAN,MAAM,CAAO;QACb,cAAS,GAAT,SAAS,CAAuC;IACxD,CAAC;IAEJ,MAAM,CAAC,QAAgB;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,CAAC,SAAoC;QACvC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACnC,CAAC;CACF;AAED,SAAS,KAAK,CAAC,GAAG,IAAiC;IACjD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAgB,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,GAAG;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,UAAsB,EAAE,QAAsB;IAChE,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAC/D,OAAO,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAuB,CAAC,EAAE,EAAE,CAAC;AAC9E,CAAC;AAED,SAAS,WAAW,CAAC,UAAsB;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,WAAW;QAAE,OAAO,MAAM,CAAC;IAC7D,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,gBAAgB;QAAE,OAAO,WAAW,CAAC;IACvE,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,UAAU,IAAK,SAAwB,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IACnH,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,UAAsB;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACrC,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,UAAU,CAAC,aAAa,CAAC;QAC9B,KAAK,UAAU,CAAC,6BAA6B;YAC3C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAG,SAA+B,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QACjG,KAAK,UAAU,CAAC,cAAc;YAC5B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAG,SAA+B,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QACjG,KAAK,UAAU,CAAC,WAAW;YACzB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;QAChE,KAAK,UAAU,CAAC,YAAY;YAC1B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;QACjE;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,YAAY,GAAkG;IAClH,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,WAAW;CACvB,CAAC;AAEF,SAAS,UAAU,CAAC,IAAU,EAAE,SAAoC;IAClE,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,CAAE,CAAC;IACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAU;IACvC,OAAO,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACzI,CAAC;AAED,SAAS,MAAM,CAAC,IAAU,EAAE,SAAoC;IAC9D,OAAO,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAsB,EAAE,IAAU,EAAE,QAAsB;IACpF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAgB,CAAC;IACvC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAErC,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,UAAU,EAAE,CAAC;QAC7C,MAAM,EAAE,GAAG,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC3C,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAC5D,IAAI,IAAI;gBAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,qBAAqB,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,SAAkC,CAAC;QACjD,IAAI,KAAK,CAAC,QAAQ,KAAK,GAAG;YAAE,OAAO,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACrF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,gBAAgB;QAAE,OAAO,MAAM,CAAC;IAClE,MAAM,MAAM,GAAG,SAA6B,CAAC;IAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEjC,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACvI,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,yEAAyE;QACzE,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE9E,MAAM,QAAQ,GAAG,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,IAAI,CAAC;IACzD,MAAM,UAAU,GAAG,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,IAAI,CAAC;IAC3D,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,WAAW,IAAI,YAAY,CAAC;QAC5C,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QACvD,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACvC,IAAI,EAAE,KAAK,SAAS,IAAI,OAAO,EAAE,CAAC;YAChC,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,MAAM,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC1G,KAAK,MAAM,IAAI,IAAI,MAAM;oBAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBAC5D,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC;oBACrI,IAAI,QAAQ;wBAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,uCAAuC;QACvC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QACjL,MAAM,WAAW,GAAG,WAAW,CAAC,UAAU,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzF,IAAI,UAAU,IAAI,WAAW,EAAE,IAAI,KAAK,SAAS,IAAI,OAAO,WAAW,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC3F,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAI,MAAM,CAAC,UAAU,CAAsB,CAAC,UAAU,CAAC;YACpE,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAChD,IAAI,IAAI,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBACpC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;gBAC1E,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;oBACvE,IAAI,QAAQ;wBAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,6CAA6C;QAC7C,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,WAAW,IAAI,CAAC,YAAY,EAAE,CAAC;YACjC,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC9C,IAAI,EAAE,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,YAAY,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC7C,IAAI,EAAE,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7C,IAAI,EAAE,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QACpC,MAAM,QAAQ,GAAG,QAAQ,CAAC,2BAA2B,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpE,IAAI,QAAQ;YAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAsB,EAAE,IAAU,EAAE,QAAsB;IACpF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAgB,CAAC;IACvC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,qBAAqB,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,SAAkC,CAAC;QACjD,IAAI,KAAK,CAAC,QAAQ,KAAK,GAAG;YAAE,OAAO,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACrF,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,gBAAgB;QAAE,OAAO,MAAM,CAAC;IAClE,MAAM,MAAM,GAAG,SAA6B,CAAC;IAC7C,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC7B,sDAAsD;QACtD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAClH,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,KAAK,KAAK,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC;IACvE,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,KAAK,KAAK,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC;IACzE,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU;QAAE,OAAO,MAAM,CAAC;IAC5C,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,WAAW,IAAI,YAAY,CAAC;IAC5C,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IACvD,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACvC,IAAI,EAAE,KAAK,SAAS,IAAI,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC;IAChD,IAAI,QAAQ,EAAE,CAAC;QACb,uCAAuC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI;YAAE,OAAO,MAAM,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC;QACrI,IAAI,QAAQ;YAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,8DAA8D;QAC9D,MAAM,MAAM,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1G,KAAK,MAAM,IAAI,IAAI,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,IAAU,EAAE,IAAY;IAC7C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;IAC5D,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,SAAqB,EAAE,MAAe,EAAE,IAAU,EAAE,QAAsB;IAC/F,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzH,OAAO,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Names the compiler resolves without a user declaration.
3
+ *
4
+ * The tables are the same ones code generation uses, so "known global" and
5
+ * "codegen can lower it" cannot drift apart: a name added to a table becomes
6
+ * legal in the checker in the same commit.
7
+ */
8
+ /** True when `name` is a runtime global (or an extension-provided builtin). */
9
+ export declare function isKnownGlobalName(name: string, extensionBuiltins?: ReadonlySet<string>): boolean;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Names the compiler resolves without a user declaration.
3
+ *
4
+ * The tables are the same ones code generation uses, so "known global" and
5
+ * "codegen can lower it" cannot drift apart: a name added to a table becomes
6
+ * legal in the checker in the same commit.
7
+ */
8
+ import { BUILTIN_FUNCTION_VALUES, CTOR_FUNCTIONS, ERROR_CONSTRUCTORS, FIRST_CLASS_CONSTRUCTORS, GLOBAL_FUNCTIONS, NAMESPACE_PROPERTIES, NAMESPACE_STATICS, TYPED_ARRAYS, } from "../codegen/generator/tables.js";
9
+ const KNOWN_GLOBALS = new Set([
10
+ ...Object.keys(GLOBAL_FUNCTIONS),
11
+ ...Object.keys(BUILTIN_FUNCTION_VALUES),
12
+ ...Object.keys(ERROR_CONSTRUCTORS),
13
+ ...Object.keys(CTOR_FUNCTIONS),
14
+ ...Object.keys(TYPED_ARRAYS),
15
+ ...Object.keys(NAMESPACE_STATICS),
16
+ ...Object.keys(NAMESPACE_PROPERTIES),
17
+ ...FIRST_CLASS_CONSTRUCTORS,
18
+ // Handled directly in `emitIdentifier` rather than through a table.
19
+ "console",
20
+ "undefined",
21
+ "NaN",
22
+ "Infinity",
23
+ "arguments",
24
+ ]);
25
+ /** True when `name` is a runtime global (or an extension-provided builtin). */
26
+ export function isKnownGlobalName(name, extensionBuiltins) {
27
+ return KNOWN_GLOBALS.has(name) || (extensionBuiltins?.has(name) ?? false);
28
+ }
29
+ //# sourceMappingURL=globals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globals.js","sourceRoot":"","sources":["../../../src/checker/globals.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,kBAAkB,EAClB,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,GACb,MAAM,gCAAgC,CAAC;AAExC,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAS;IACzD,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;IAChC,GAAG,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC;IACvC,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC;IAClC,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC;IAC9B,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;IAC5B,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC;IACjC,GAAG,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC;IACpC,GAAG,wBAAwB;IAC3B,oEAAoE;IACpE,SAAS;IACT,WAAW;IACX,KAAK;IACL,UAAU;IACV,WAAW;CACZ,CAAC,CAAC;AAEH,+EAA+E;AAC/E,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,iBAAuC;IACrF,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Small source-location helpers shared by the checker.
3
+ */
4
+ import type { Node, SourceFileNode } from "../ast/nodes.js";
5
+ /**
6
+ * The file a node came from. Bundling merges every module into one
7
+ * `SourceFile` while keeping module-local offsets, so the origin map is what
8
+ * keeps a diagnostic pointing at the file the user actually wrote.
9
+ */
10
+ export declare function fileNameOf(sourceFile: SourceFileNode, node: Node): string;
11
+ /**
12
+ * True when a node came from a bundled package under `node_modules`.
13
+ *
14
+ * The checker is a gate for the code the user wrote, not for dependency
15
+ * internals: a package may legitimately use `globalThis`, call a function
16
+ * through a pattern the arity heuristic cannot see, or rely on its own
17
+ * transpiler's output. Reporting those would make enabling the checker break
18
+ * otherwise working builds.
19
+ */
20
+ export declare function isDependencyNode(sourceFile: SourceFileNode, node: Node): boolean;
21
+ /**
22
+ * True when a node came from a plain JavaScript file (`.js`, `.mjs`, `.cjs`,
23
+ * `.jsx`).
24
+ *
25
+ * A JavaScript program is untyped by definition: TypeScript only infers and
26
+ * reports on such files with `checkJs`, and xbintsc honours the same boundary.
27
+ * Inferring types from unannotated JavaScript rejects valid code — a flag
28
+ * assigned `false` then `true` narrows to `false`, a method installed on a
29
+ * state object after its literal (`Game.foo = …`) is not a property of the
30
+ * literal, a closure variable initialized to `null` is "not callable", a call
31
+ * that relies on default parameters looks like an arity error. Names are still
32
+ * resolved (that is what code generation needs), and redeclarations are still
33
+ * reported, but no type, arity or property diagnostic is produced.
34
+ */
35
+ export declare function isPlainJavaScriptNode(sourceFile: SourceFileNode, node: Node): boolean;
36
+ /** True when a node is exempt from type checking: plain JavaScript or a
37
+ * bundled dependency (see {@link isDependencyNode}). */
38
+ export declare function isUntypedNode(sourceFile: SourceFileNode, node: Node): boolean;