xbintsc 0.5.6 → 0.5.21

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 (490) hide show
  1. package/AGENTS.md +20 -10
  2. package/README.md +8 -7
  3. package/README.zh-CN.md +6 -6
  4. package/dist/src/binder/declarations.js +14 -3
  5. package/dist/src/binder/declarations.js.map +1 -1
  6. package/dist/src/cli/hints.js +7 -1
  7. package/dist/src/cli/hints.js.map +1 -1
  8. package/dist/src/cli/main.js +115 -15
  9. package/dist/src/cli/main.js.map +1 -1
  10. package/dist/src/cli/watch.d.ts +25 -0
  11. package/dist/src/cli/watch.js +93 -0
  12. package/dist/src/cli/watch.js.map +1 -0
  13. package/dist/src/codegen/generator/calls/access.js +11 -2
  14. package/dist/src/codegen/generator/calls/access.js.map +1 -1
  15. package/dist/src/codegen/generator/calls/closures.js +12 -4
  16. package/dist/src/codegen/generator/calls/closures.js.map +1 -1
  17. package/dist/src/codegen/generator/context.d.ts +8 -0
  18. package/dist/src/codegen/generator/context.js +22 -3
  19. package/dist/src/codegen/generator/context.js.map +1 -1
  20. package/dist/src/codegen/generator/expressions/operators.js +17 -15
  21. package/dist/src/codegen/generator/expressions/operators.js.map +1 -1
  22. package/dist/src/codegen/generator/expressions/primary.js +5 -0
  23. package/dist/src/codegen/generator/expressions/primary.js.map +1 -1
  24. package/dist/src/codegen/generator/module.js +0 -7
  25. package/dist/src/codegen/generator/module.js.map +1 -1
  26. package/dist/src/codegen/generator/numeric.d.ts +6 -3
  27. package/dist/src/codegen/generator/numeric.js +54 -11
  28. package/dist/src/codegen/generator/numeric.js.map +1 -1
  29. package/dist/src/codegen/generator/state.js +23 -0
  30. package/dist/src/codegen/generator/state.js.map +1 -1
  31. package/dist/src/codegen/generator/statements/control-flow.js +1 -4
  32. package/dist/src/codegen/generator/statements/control-flow.js.map +1 -1
  33. package/dist/src/codegen/generator/statements/loops.js +48 -16
  34. package/dist/src/codegen/generator/statements/loops.js.map +1 -1
  35. package/dist/src/codegen/generator/tables.js +26 -1
  36. package/dist/src/codegen/generator/tables.js.map +1 -1
  37. package/dist/src/diagnostics/diagnostic.d.ts +3 -1
  38. package/dist/src/diagnostics/diagnostic.js +23 -3
  39. package/dist/src/diagnostics/diagnostic.js.map +1 -1
  40. package/dist/src/driver/app-artifacts.d.ts +42 -0
  41. package/dist/src/driver/app-artifacts.js +53 -0
  42. package/dist/src/driver/app-artifacts.js.map +1 -0
  43. package/dist/src/driver/build-key.d.ts +29 -0
  44. package/dist/src/driver/build-key.js +35 -0
  45. package/dist/src/driver/build-key.js.map +1 -0
  46. package/dist/src/driver/bundler/graph.js +61 -12
  47. package/dist/src/driver/bundler/graph.js.map +1 -1
  48. package/dist/src/driver/bundler/merge.js +7 -1
  49. package/dist/src/driver/bundler/merge.js.map +1 -1
  50. package/dist/src/driver/compiler.d.ts +10 -67
  51. package/dist/src/driver/compiler.js +95 -234
  52. package/dist/src/driver/compiler.js.map +1 -1
  53. package/dist/src/driver/config.d.ts +3 -0
  54. package/dist/src/driver/config.js +8 -0
  55. package/dist/src/driver/config.js.map +1 -1
  56. package/dist/src/driver/frontend.d.ts +37 -0
  57. package/dist/src/driver/frontend.js +92 -0
  58. package/dist/src/driver/frontend.js.map +1 -0
  59. package/dist/src/driver/index.d.ts +1 -1
  60. package/dist/src/driver/index.js.map +1 -1
  61. package/dist/src/driver/options.d.ts +64 -0
  62. package/dist/src/driver/options.js +9 -0
  63. package/dist/src/driver/options.js.map +1 -0
  64. package/dist/src/driver/runtime-objects.d.ts +38 -0
  65. package/dist/src/driver/runtime-objects.js +112 -0
  66. package/dist/src/driver/runtime-objects.js.map +1 -0
  67. package/dist/src/driver/toolchain-provider.d.ts +4 -0
  68. package/dist/src/driver/toolchain-provider.js +4 -0
  69. package/dist/src/driver/toolchain-provider.js.map +1 -1
  70. package/dist/src/driver/toolchain.d.ts +32 -1
  71. package/dist/src/driver/toolchain.js +115 -11
  72. package/dist/src/driver/toolchain.js.map +1 -1
  73. package/dist/src/driver/version.d.ts +12 -0
  74. package/dist/src/driver/version.js +13 -0
  75. package/dist/src/driver/version.js.map +1 -0
  76. package/dist/src/driver/win-icon.d.ts +7 -9
  77. package/dist/src/driver/win-icon.js +37 -35
  78. package/dist/src/driver/win-icon.js.map +1 -1
  79. package/dist/src/extensions/node/fs/index.d.ts +4 -3
  80. package/dist/src/extensions/node/fs/index.js +12 -3
  81. package/dist/src/extensions/node/fs/index.js.map +1 -1
  82. package/dist/src/extensions/node/fs-promises/index.d.ts +5 -5
  83. package/dist/src/extensions/node/fs-promises/index.js +15 -6
  84. package/dist/src/extensions/node/fs-promises/index.js.map +1 -1
  85. package/dist/src/parser/declarations/classes.js +5 -0
  86. package/dist/src/parser/declarations/classes.js.map +1 -1
  87. package/dist/src/parser/declarations/functions.js +13 -1
  88. package/dist/src/parser/declarations/functions.js.map +1 -1
  89. package/dist/src/parser/modules.js +8 -3
  90. package/dist/src/parser/modules.js.map +1 -1
  91. package/dist/src/parser/parser.d.ts +1 -0
  92. package/dist/src/parser/parser.js +23 -0
  93. package/dist/src/parser/parser.js.map +1 -1
  94. package/dist/tests/cli/check.test.d.ts +6 -0
  95. package/dist/tests/cli/check.test.js +68 -0
  96. package/dist/tests/cli/check.test.js.map +1 -0
  97. package/dist/tests/cli/main.test.js +19 -0
  98. package/dist/tests/cli/main.test.js.map +1 -1
  99. package/dist/tests/cli/watch.test.d.ts +6 -0
  100. package/dist/tests/cli/watch.test.js +72 -0
  101. package/dist/tests/cli/watch.test.js.map +1 -0
  102. package/dist/tests/codegen/expressions.test.js +15 -3
  103. package/dist/tests/codegen/expressions.test.js.map +1 -1
  104. package/dist/tests/codegen/llvm.test.js +16 -0
  105. package/dist/tests/codegen/llvm.test.js.map +1 -1
  106. package/dist/tests/diagnostics/diagnostic.test.js +8 -0
  107. package/dist/tests/diagnostics/diagnostic.test.js.map +1 -1
  108. package/dist/tests/docs/structure.test.d.ts +1 -0
  109. package/dist/tests/docs/structure.test.js +92 -0
  110. package/dist/tests/docs/structure.test.js.map +1 -0
  111. package/dist/tests/driver/compiler.test.js +6 -0
  112. package/dist/tests/driver/compiler.test.js.map +1 -1
  113. package/dist/tests/driver/config.test.js +9 -0
  114. package/dist/tests/driver/config.test.js.map +1 -1
  115. package/dist/tests/driver/icon.test.js +19 -32
  116. package/dist/tests/driver/icon.test.js.map +1 -1
  117. package/dist/tests/driver/invalid-input.test.d.ts +10 -0
  118. package/dist/tests/driver/invalid-input.test.js +29 -0
  119. package/dist/tests/driver/invalid-input.test.js.map +1 -0
  120. package/dist/tests/driver/modules.test.js +42 -3
  121. package/dist/tests/driver/modules.test.js.map +1 -1
  122. package/dist/tests/driver/toolchain-provider.test.js +27 -1
  123. package/dist/tests/driver/toolchain-provider.test.js.map +1 -1
  124. package/dist/tests/driver/toolchain.test.js +60 -2
  125. package/dist/tests/driver/toolchain.test.js.map +1 -1
  126. package/dist/tests/e2e/array-buffer.test.d.ts +5 -0
  127. package/dist/tests/e2e/array-buffer.test.js +38 -0
  128. package/dist/tests/e2e/array-buffer.test.js.map +1 -0
  129. package/dist/tests/e2e/array-from-iterables.test.d.ts +7 -0
  130. package/dist/tests/e2e/array-from-iterables.test.js +34 -0
  131. package/dist/tests/e2e/array-from-iterables.test.js.map +1 -0
  132. package/dist/tests/e2e/array-symbol-iterator.test.d.ts +8 -0
  133. package/dist/tests/e2e/array-symbol-iterator.test.js +42 -0
  134. package/dist/tests/e2e/array-symbol-iterator.test.js.map +1 -0
  135. package/dist/tests/e2e/async-await.test.js +1 -1
  136. package/dist/tests/e2e/async-fs.test.d.ts +9 -0
  137. package/dist/tests/e2e/async-fs.test.js +119 -0
  138. package/dist/tests/e2e/async-fs.test.js.map +1 -0
  139. package/dist/tests/e2e/async-generators.test.d.ts +1 -0
  140. package/dist/tests/e2e/async-generators.test.js +154 -0
  141. package/dist/tests/e2e/async-generators.test.js.map +1 -0
  142. package/dist/tests/e2e/await-ordering.test.d.ts +5 -0
  143. package/dist/tests/e2e/await-ordering.test.js +37 -0
  144. package/dist/tests/e2e/await-ordering.test.js.map +1 -0
  145. package/dist/tests/e2e/compile-builtins.test.js +1 -1
  146. package/dist/tests/e2e/compile-modules.test.js +7 -0
  147. package/dist/tests/e2e/compile-modules.test.js.map +1 -1
  148. package/dist/tests/e2e/date-parse.test.d.ts +8 -0
  149. package/dist/tests/e2e/date-parse.test.js +38 -0
  150. package/dist/tests/e2e/date-parse.test.js.map +1 -0
  151. package/dist/tests/e2e/default-anonymous-exports.test.d.ts +7 -0
  152. package/dist/tests/e2e/default-anonymous-exports.test.js +23 -0
  153. package/dist/tests/e2e/default-anonymous-exports.test.js.map +1 -0
  154. package/dist/tests/e2e/fetch.test.js +24 -0
  155. package/dist/tests/e2e/fetch.test.js.map +1 -1
  156. package/dist/tests/e2e/globals-microtask.test.d.ts +9 -0
  157. package/dist/tests/e2e/globals-microtask.test.js +37 -0
  158. package/dist/tests/e2e/globals-microtask.test.js.map +1 -0
  159. package/dist/tests/e2e/gui-inline-svg.test.d.ts +11 -0
  160. package/dist/tests/e2e/gui-inline-svg.test.js +160 -0
  161. package/dist/tests/e2e/gui-inline-svg.test.js.map +1 -0
  162. package/dist/tests/e2e/gui-media.test.js +8 -1
  163. package/dist/tests/e2e/gui-media.test.js.map +1 -1
  164. package/dist/tests/e2e/inspect-builtins.test.d.ts +10 -0
  165. package/dist/tests/e2e/inspect-builtins.test.js +43 -0
  166. package/dist/tests/e2e/inspect-builtins.test.js.map +1 -0
  167. package/dist/tests/e2e/json-builtin-objects.test.d.ts +9 -0
  168. package/dist/tests/e2e/json-builtin-objects.test.js +23 -0
  169. package/dist/tests/e2e/json-builtin-objects.test.js.map +1 -0
  170. package/dist/tests/e2e/json-circular.test.d.ts +6 -0
  171. package/dist/tests/e2e/json-circular.test.js +43 -0
  172. package/dist/tests/e2e/json-circular.test.js.map +1 -0
  173. package/dist/tests/e2e/json-parse-reviver.test.d.ts +6 -0
  174. package/dist/tests/e2e/json-parse-reviver.test.js +29 -0
  175. package/dist/tests/e2e/json-parse-reviver.test.js.map +1 -0
  176. package/dist/tests/e2e/json-stringify-replacer.test.d.ts +6 -0
  177. package/dist/tests/e2e/json-stringify-replacer.test.js +27 -0
  178. package/dist/tests/e2e/json-stringify-replacer.test.js.map +1 -0
  179. package/dist/tests/e2e/json-stringify-space.test.d.ts +6 -0
  180. package/dist/tests/e2e/json-stringify-space.test.js +23 -0
  181. package/dist/tests/e2e/json-stringify-space.test.js.map +1 -0
  182. package/dist/tests/e2e/method-dispatch-errors.test.d.ts +9 -0
  183. package/dist/tests/e2e/method-dispatch-errors.test.js +38 -0
  184. package/dist/tests/e2e/method-dispatch-errors.test.js.map +1 -0
  185. package/dist/tests/e2e/native-extensions.test.js +1 -1
  186. package/dist/tests/e2e/native-extensions.test.js.map +1 -1
  187. package/dist/tests/e2e/promise-with-resolvers.test.d.ts +5 -0
  188. package/dist/tests/e2e/promise-with-resolvers.test.js +20 -0
  189. package/dist/tests/e2e/promise-with-resolvers.test.js.map +1 -0
  190. package/dist/tests/e2e/property-descriptors.test.d.ts +5 -0
  191. package/dist/tests/e2e/property-descriptors.test.js +25 -0
  192. package/dist/tests/e2e/property-descriptors.test.js.map +1 -0
  193. package/dist/tests/e2e/property-ic.test.d.ts +1 -0
  194. package/dist/tests/e2e/property-ic.test.js +55 -0
  195. package/dist/tests/e2e/property-ic.test.js.map +1 -0
  196. package/dist/tests/e2e/runtime-errors.test.d.ts +10 -0
  197. package/dist/tests/e2e/runtime-errors.test.js +52 -0
  198. package/dist/tests/e2e/runtime-errors.test.js.map +1 -0
  199. package/dist/tests/e2e/structured-clone.test.d.ts +6 -0
  200. package/dist/tests/e2e/structured-clone.test.js +49 -0
  201. package/dist/tests/e2e/structured-clone.test.js.map +1 -0
  202. package/dist/tests/e2e/text-codec.test.d.ts +6 -0
  203. package/dist/tests/e2e/text-codec.test.js +24 -0
  204. package/dist/tests/e2e/text-codec.test.js.map +1 -0
  205. package/dist/tests/e2e/typed-array-views.test.d.ts +6 -0
  206. package/dist/tests/e2e/typed-array-views.test.js +39 -0
  207. package/dist/tests/e2e/typed-array-views.test.js.map +1 -0
  208. package/dist/tests/e2e/url-search-params.test.d.ts +5 -0
  209. package/dist/tests/e2e/url-search-params.test.js +30 -0
  210. package/dist/tests/e2e/url-search-params.test.js.map +1 -0
  211. package/dist/tests/e2e/weak-collections.test.d.ts +1 -0
  212. package/dist/tests/e2e/weak-collections.test.js +88 -0
  213. package/dist/tests/e2e/weak-collections.test.js.map +1 -0
  214. package/dist/tests/parser/declarations.test.js +12 -0
  215. package/dist/tests/parser/declarations.test.js.map +1 -1
  216. package/dist/tests/parser/module-syntax.test.js +9 -0
  217. package/dist/tests/parser/module-syntax.test.js.map +1 -1
  218. package/dist/tests/parser/parser.test.js +7 -0
  219. package/dist/tests/parser/parser.test.js.map +1 -1
  220. package/dist/tests/version.test.js +5 -1
  221. package/dist/tests/version.test.js.map +1 -1
  222. package/doc/ai/README.md +4 -3
  223. package/doc/ai/cli.md +41 -0
  224. package/doc/ai/contributing.md +20 -16
  225. package/doc/ai/extensions.md +13 -10
  226. package/doc/ai/language-support.md +19 -14
  227. package/doc/ai/troubleshooting.md +11 -9
  228. package/doc/ai/zh-CN/README.md +3 -2
  229. package/doc/ai/zh-CN/cli.md +35 -0
  230. package/doc/ai/zh-CN/contributing.md +16 -15
  231. package/doc/ai/zh-CN/extensions.md +12 -9
  232. package/doc/ai/zh-CN/language-support.md +19 -15
  233. package/doc/ai/zh-CN/troubleshooting.md +9 -8
  234. package/doc/gui/api.md +8 -0
  235. package/doc/gui/build.md +13 -4
  236. package/doc/gui/known-issues.md +19 -14
  237. package/doc/gui/media.md +32 -3
  238. package/doc/gui/rendering.md +3 -1
  239. package/doc/gui.md +28 -5
  240. package/doc/icon.md +5 -4
  241. package/doc/implemented/async.md +51 -0
  242. package/doc/implemented/binder.md +13 -0
  243. package/doc/implemented/cli.md +47 -0
  244. package/doc/implemented/codegen.md +33 -0
  245. package/doc/implemented/collections.md +26 -0
  246. package/doc/implemented/driver.md +19 -0
  247. package/doc/implemented/extensions.md +19 -0
  248. package/doc/implemented/fetch.md +44 -0
  249. package/doc/implemented/lexer.md +23 -0
  250. package/doc/implemented/modules.md +28 -0
  251. package/doc/implemented/node/assert.md +17 -0
  252. package/doc/implemented/node/buffer.md +29 -0
  253. package/doc/implemented/node/child-process.md +29 -0
  254. package/doc/implemented/node/crypto.md +9 -0
  255. package/doc/implemented/node/dgram.md +15 -0
  256. package/doc/implemented/node/events.md +37 -0
  257. package/doc/implemented/node/fs-promises.md +49 -0
  258. package/doc/implemented/node/fs.md +112 -0
  259. package/doc/implemented/node/http.md +21 -0
  260. package/doc/implemented/node/net.md +17 -0
  261. package/doc/implemented/node/os.md +22 -0
  262. package/doc/implemented/node/path.md +33 -0
  263. package/doc/implemented/node/process.md +23 -0
  264. package/doc/implemented/node/querystring.md +20 -0
  265. package/doc/implemented/node/stream-promises.md +8 -0
  266. package/doc/implemented/node/stream.md +19 -0
  267. package/doc/implemented/node/test.md +10 -0
  268. package/doc/implemented/node/url.md +8 -0
  269. package/doc/implemented/node/util.md +25 -0
  270. package/doc/implemented/node/worker-threads.md +10 -0
  271. package/doc/implemented/node/zlib.md +8 -0
  272. package/doc/implemented/node.md +48 -0
  273. package/doc/implemented/operators.md +38 -0
  274. package/doc/implemented/parser.md +58 -0
  275. package/doc/implemented/pipeline.md +28 -0
  276. package/doc/implemented/runtime-core.md +32 -0
  277. package/doc/implemented/stdlib.md +78 -0
  278. package/doc/implemented/strings.md +27 -0
  279. package/doc/implemented/tests.md +10 -0
  280. package/doc/implemented/typed-arrays.md +26 -0
  281. package/doc/implemented/value-model.md +18 -0
  282. package/doc/implemented.md +54 -355
  283. package/doc/node-implemented.md +3 -585
  284. package/doc/node-unimplemented.md +3 -164
  285. package/doc/requirements.md +23 -8
  286. package/doc/unimplemented/classes.md +22 -0
  287. package/doc/unimplemented/deviations.md +27 -0
  288. package/doc/unimplemented/expressions.md +26 -0
  289. package/doc/unimplemented/functions.md +21 -0
  290. package/doc/unimplemented/modules.md +22 -0
  291. package/doc/unimplemented/node/async.md +20 -0
  292. package/doc/unimplemented/node/bun.md +9 -0
  293. package/doc/unimplemented/node/fs-promises.md +20 -0
  294. package/doc/unimplemented/node/fs.md +30 -0
  295. package/doc/unimplemented/node/globals.md +23 -0
  296. package/doc/unimplemented/node/modules.md +21 -0
  297. package/doc/unimplemented/node.md +21 -0
  298. package/doc/unimplemented/statements.md +18 -0
  299. package/doc/unimplemented/stdlib.md +54 -0
  300. package/doc/unimplemented/toolchain.md +14 -0
  301. package/doc/unimplemented/types.md +12 -0
  302. package/doc/unimplemented.md +18 -275
  303. package/doc/xbintsc.config.schema.json +12 -0
  304. package/doc/zh-CN/gui/api.md +7 -0
  305. package/doc/zh-CN/gui/build.md +11 -3
  306. package/doc/zh-CN/gui/known-issues.md +17 -11
  307. package/doc/zh-CN/gui/media.md +26 -2
  308. package/doc/zh-CN/gui/rendering.md +2 -1
  309. package/doc/zh-CN/gui.md +21 -3
  310. package/doc/zh-CN/icon.md +5 -4
  311. package/doc/zh-CN/implemented/async.md +49 -0
  312. package/doc/zh-CN/implemented/binder.md +13 -0
  313. package/doc/zh-CN/implemented/cli.md +46 -0
  314. package/doc/zh-CN/implemented/codegen.md +33 -0
  315. package/doc/zh-CN/implemented/collections.md +26 -0
  316. package/doc/zh-CN/implemented/driver.md +19 -0
  317. package/doc/zh-CN/implemented/extensions.md +19 -0
  318. package/doc/zh-CN/implemented/fetch.md +31 -0
  319. package/doc/zh-CN/implemented/lexer.md +23 -0
  320. package/doc/zh-CN/implemented/modules.md +28 -0
  321. package/doc/zh-CN/implemented/node/assert.md +17 -0
  322. package/doc/zh-CN/implemented/node/buffer.md +25 -0
  323. package/doc/zh-CN/implemented/node/child-process.md +27 -0
  324. package/doc/zh-CN/implemented/node/crypto.md +9 -0
  325. package/doc/zh-CN/implemented/node/dgram.md +15 -0
  326. package/doc/zh-CN/implemented/node/events.md +36 -0
  327. package/doc/zh-CN/implemented/node/fs-promises.md +30 -0
  328. package/doc/zh-CN/implemented/node/fs.md +105 -0
  329. package/doc/zh-CN/implemented/node/http.md +17 -0
  330. package/doc/zh-CN/implemented/node/net.md +17 -0
  331. package/doc/zh-CN/implemented/node/os.md +21 -0
  332. package/doc/zh-CN/implemented/node/path.md +26 -0
  333. package/doc/zh-CN/implemented/node/process.md +23 -0
  334. package/doc/zh-CN/implemented/node/querystring.md +20 -0
  335. package/doc/zh-CN/implemented/node/stream-promises.md +8 -0
  336. package/doc/zh-CN/implemented/node/stream.md +15 -0
  337. package/doc/zh-CN/implemented/node/test.md +10 -0
  338. package/doc/zh-CN/implemented/node/url.md +8 -0
  339. package/doc/zh-CN/implemented/node/util.md +25 -0
  340. package/doc/zh-CN/implemented/node/worker-threads.md +9 -0
  341. package/doc/zh-CN/implemented/node/zlib.md +8 -0
  342. package/doc/zh-CN/implemented/node.md +45 -0
  343. package/doc/zh-CN/implemented/operators.md +38 -0
  344. package/doc/zh-CN/implemented/parser.md +58 -0
  345. package/doc/zh-CN/implemented/pipeline.md +25 -0
  346. package/doc/zh-CN/implemented/runtime-core.md +31 -0
  347. package/doc/zh-CN/implemented/stdlib.md +76 -0
  348. package/doc/zh-CN/implemented/strings.md +27 -0
  349. package/doc/zh-CN/implemented/tests.md +10 -0
  350. package/doc/zh-CN/implemented/typed-arrays.md +26 -0
  351. package/doc/zh-CN/implemented/value-model.md +18 -0
  352. package/doc/zh-CN/implemented.md +50 -350
  353. package/doc/zh-CN/node-implemented.md +4 -531
  354. package/doc/zh-CN/node-unimplemented.md +4 -139
  355. package/doc/zh-CN/plan-require-node-modules.md +4 -4
  356. package/doc/zh-CN/requirements.md +20 -6
  357. package/doc/zh-CN/unimplemented/classes.md +22 -0
  358. package/doc/zh-CN/unimplemented/deviations.md +24 -0
  359. package/doc/zh-CN/unimplemented/expressions.md +24 -0
  360. package/doc/zh-CN/unimplemented/functions.md +21 -0
  361. package/doc/zh-CN/unimplemented/modules.md +19 -0
  362. package/doc/zh-CN/unimplemented/node/async.md +20 -0
  363. package/doc/zh-CN/unimplemented/node/bun.md +8 -0
  364. package/doc/zh-CN/unimplemented/node/fs-promises.md +12 -0
  365. package/doc/zh-CN/unimplemented/node/fs.md +24 -0
  366. package/doc/zh-CN/unimplemented/node/globals.md +14 -0
  367. package/doc/zh-CN/unimplemented/node/modules.md +15 -0
  368. package/doc/zh-CN/unimplemented/node.md +18 -0
  369. package/doc/zh-CN/unimplemented/statements.md +15 -0
  370. package/doc/zh-CN/unimplemented/stdlib.md +54 -0
  371. package/doc/zh-CN/unimplemented/toolchain.md +14 -0
  372. package/doc/zh-CN/unimplemented/types.md +11 -0
  373. package/doc/zh-CN/unimplemented.md +14 -237
  374. package/llms.txt +32 -4
  375. package/package.json +1 -1
  376. package/runtime/ext_gui/inline_svg.cpp +219 -0
  377. package/runtime/ext_gui/inline_svg.h +41 -0
  378. package/runtime/ext_gui/layout.cpp +18 -0
  379. package/runtime/ext_gui/layout.h +7 -0
  380. package/runtime/ext_gui/layout_flow.cpp +4 -3
  381. package/runtime/ext_gui/paint.cpp +14 -0
  382. package/runtime/ext_gui/paint.h +5 -1
  383. package/runtime/ext_gui/renderer_image.cpp +53 -25
  384. package/runtime/ext_gui/renderer_shaders.h +2 -2
  385. package/runtime/ext_gui/stb_image.h +1 -17
  386. package/runtime/ext_gui/style_ua.cpp +3 -0
  387. package/runtime/ext_gui/svg.cpp +122 -39
  388. package/runtime/ext_gui/svg.h +14 -3
  389. package/runtime/ext_gui/window.cpp +28 -0
  390. package/runtime/ext_node/child_process/child_process.c +173 -73
  391. package/runtime/ext_node/fs/async_api.c +314 -0
  392. package/runtime/ext_node/fs/async_complete.c +99 -0
  393. package/runtime/ext_node/fs/async_fh.c +206 -0
  394. package/runtime/ext_node/fs/async_job.c +81 -0
  395. package/runtime/ext_node/fs/async_job.h +132 -0
  396. package/runtime/ext_node/fs/async_worker.c +534 -0
  397. package/runtime/ext_node/fs/async_worker_dir.c +439 -0
  398. package/runtime/ext_node/fs/async_worker_dir.h +33 -0
  399. package/runtime/ext_node/fs/async_worker_fd.c +74 -0
  400. package/runtime/ext_node/fs/dir.c +60 -15
  401. package/runtime/ext_node/fs/fs_common.h +9 -0
  402. package/runtime/ext_node/fs/fs_ops.c +18 -29
  403. package/runtime/ext_node/fs/parts/builtins.inc +34 -0
  404. package/runtime/ext_node/fs/parts/platform.inc +66 -0
  405. package/runtime/ext_node/fs/promises.c +44 -234
  406. package/runtime/rt.h +15 -0
  407. package/runtime/rt_internal.h +108 -0
  408. package/runtime/xt_alloc.c +43 -7
  409. package/runtime/xt_array_buffer.c +284 -0
  410. package/runtime/xt_async.c +46 -21
  411. package/runtime/xt_async_io.c +333 -0
  412. package/runtime/xt_async_io.h +47 -0
  413. package/runtime/xt_bigint/helpers.inc +3 -3
  414. package/runtime/xt_builtins.c +21 -17
  415. package/runtime/xt_constructors.c +12 -2
  416. package/runtime/xt_containers/access.inc +148 -3
  417. package/runtime/xt_containers/objects.inc +26 -2
  418. package/runtime/xt_containers/shapes.inc +71 -0
  419. package/runtime/xt_containers.c +1 -0
  420. package/runtime/xt_coroutine.c +17 -0
  421. package/runtime/xt_fetch/async.inc +295 -0
  422. package/runtime/xt_fetch/request.inc +6 -183
  423. package/runtime/xt_fetch/socket.inc +5 -4
  424. package/runtime/xt_fetch.c +6 -4
  425. package/runtime/xt_generator.c +299 -10
  426. package/runtime/xt_io/inspect.inc +112 -0
  427. package/runtime/xt_loop.c +79 -7
  428. package/runtime/xt_performance.c +37 -0
  429. package/runtime/xt_promise.c +63 -1
  430. package/runtime/xt_stdlib/arrays.inc +1 -1
  431. package/runtime/xt_stdlib/dispatch.inc +46 -11
  432. package/runtime/xt_stdlib/strings.inc +1 -1
  433. package/runtime/xt_stdlib2/array-statics.inc +25 -0
  434. package/runtime/xt_stdlib2/arrays.inc +5 -3
  435. package/runtime/xt_stdlib2/container.inc +5 -0
  436. package/runtime/xt_stdlib2/date.inc +111 -3
  437. package/runtime/xt_stdlib2/error.inc +24 -0
  438. package/runtime/xt_stdlib2/json.inc +310 -19
  439. package/runtime/xt_stdlib2/number-string-statics.inc +1 -1
  440. package/runtime/xt_stdlib2/objects.inc +122 -0
  441. package/runtime/xt_stdlib2/set.inc +1 -1
  442. package/runtime/xt_structured_clone.c +159 -0
  443. package/runtime/xt_symbol.c +2 -2
  444. package/runtime/xt_text_codec.c +69 -0
  445. package/runtime/xt_typed_array/construction.inc +35 -5
  446. package/runtime/xt_typed_array/elements.inc +159 -0
  447. package/runtime/xt_typed_array/methods.inc +21 -5
  448. package/runtime/xt_typed_array.c +7 -10
  449. package/runtime/xt_url.c +375 -0
  450. package/runtime/xt_values/arithmetic.inc +2 -2
  451. package/runtime/xt_values/conversions.inc +1 -1
  452. package/runtime/xt_weak.c +281 -0
  453. package/scripts/build-gui.ts +133 -60
  454. package/scripts/check-version.ts +3 -3
  455. package/src/binder/declarations.ts +14 -3
  456. package/src/cli/hints.ts +8 -1
  457. package/src/cli/main.ts +119 -18
  458. package/src/cli/watch.ts +101 -0
  459. package/src/codegen/generator/calls/access.ts +10 -2
  460. package/src/codegen/generator/calls/closures.ts +12 -4
  461. package/src/codegen/generator/context.ts +23 -3
  462. package/src/codegen/generator/expressions/operators.ts +27 -13
  463. package/src/codegen/generator/expressions/primary.ts +4 -0
  464. package/src/codegen/generator/module.ts +0 -7
  465. package/src/codegen/generator/numeric.ts +85 -11
  466. package/src/codegen/generator/state.ts +23 -0
  467. package/src/codegen/generator/statements/control-flow.ts +1 -4
  468. package/src/codegen/generator/statements/loops.ts +50 -16
  469. package/src/codegen/generator/tables.ts +26 -1
  470. package/src/diagnostics/diagnostic.ts +23 -3
  471. package/src/driver/app-artifacts.ts +77 -0
  472. package/src/driver/build-key.ts +55 -0
  473. package/src/driver/bundler/graph.ts +63 -13
  474. package/src/driver/bundler/merge.ts +4 -1
  475. package/src/driver/compiler.ts +94 -328
  476. package/src/driver/config.ts +11 -0
  477. package/src/driver/frontend.ts +120 -0
  478. package/src/driver/index.ts +0 -1
  479. package/src/driver/options.ts +70 -0
  480. package/src/driver/runtime-objects.ts +134 -0
  481. package/src/driver/toolchain-provider.ts +4 -0
  482. package/src/driver/toolchain.ts +154 -10
  483. package/src/driver/version.ts +12 -0
  484. package/src/driver/win-icon.ts +36 -36
  485. package/src/extensions/node/fs/index.ts +12 -3
  486. package/src/extensions/node/fs-promises/index.ts +15 -6
  487. package/src/parser/declarations/classes.ts +4 -0
  488. package/src/parser/declarations/functions.ts +12 -1
  489. package/src/parser/modules.ts +8 -4
  490. package/src/parser/parser.ts +28 -0
@@ -1,7 +1,5 @@
1
1
  # xbintsc 未实现语法与功能
2
2
 
3
- > 语言 / Language:[English](../unimplemented.md) | **简体中文**
4
-
5
3
  本文档基于对源码(`src/`、`runtime/`)与测试(`tests/`)的逐文件核对整理,列出**当前未实现 / 仅部分实现 / 语义与标准不符**的语法与功能。
6
4
 
7
5
  判定标准(按严重程度):
@@ -10,240 +8,19 @@
10
8
  2. **解析但代码生成报错**:AST / 绑定能建立,但 `codegen` 报 `UnsupportedFeature`。
11
9
  3. **解析且能编译,但语义未实现或有偏差**:能产出二进制,但运行结果不符合 ECMAScript / TypeScript 语义。
12
10
 
13
- > 近期已补齐:**ECMAScript 语义 + 差分测试** —— 数字格式化 / 强制转换(`toFixed` / `toPrecision` / `toExponential`、十六 / 八 / 二进制解析、完整的 `+` 与关系运算 `ToPrimitive`)、`JSON.stringify` 省略规则、`Array.prototype.sort` 默认稳定字符串序、整数键插入序、整链可选链短路、`finally` 在提前 `return` / `break` / `continue` 时执行、对象键插入序、感知 UTF-8 且能展示循环引用的 `console` 输出、`Array.prototype.splice`、`String.prototype.match` / `lastIndexOf` / 带 limit 的 `split`、正则捕获组(`exec` / `match` / `replace` / `split` / `search`)、不可变数组方法(`toReversed` / `toSorted` / `toSpliced` / `with`)、`Object.getOwnPropertyNames` / `groupBy`、全局 URI 函数、标签语句、`#private` 字段 / 方法 / 静态成员、标记模板(含 raw 字符串与 `String.raw`)、相对模块的 `import * as ns`。测试套件新增了**差分测试脚手架**:每个用例同时经 xbintsc 与 Node 运行并逐字节比较输出。
14
-
15
- > 更早已补齐:`class` 声明 / 类表达式、`new` / `this`、继承 `extends` / `super`、`instanceof`、方法 / 静态成员 / 实例字段 / getter 与 setter / 构造器参数属性、`async` / `await` + `Promise`、`import` / `export` 多文件打包(含 `.js` → `.ts` 说明符解析与命名空间导入)、`Map` / `Set` / `Date` / `RegExp` / `JSON` / `BigInt`、解构绑定与解构参数、`enum` / `const enum`,以及**自举**(产出的 LLVM IR 达到逐字节不动点)。
16
-
17
- ---
18
-
19
- ## 1. 语句层未实现
20
-
21
- ### 1.1 解析但代码生成报 `UnsupportedFeature`
22
-
23
- | 语法 | 现状 | 说明 |
24
- | --- | --- | --- |
25
- | `namespace` / `module` 声明 | 解析 ✓,代码生成 ✗ | → "does not yet support this statement (module declaration)" |
26
-
27
- > 标签语句(`label: statement`、`break label`、`continue label`)已实现,包括非循环语句上的标签。
28
-
29
- ### 1.2 解析器不支持(直接语法错误)
30
-
31
- 目前未知有语句级别的缺口。解析器有意保持宽松,接受绝大多数 TypeScript 语句语法;不支持的形式会在代码生成阶段报错(见上)。
32
-
33
- ---
34
-
35
- ## 2. 表达式层未实现
36
-
37
- ### 2.1 解析但代码生成报 `UnsupportedFeature`
38
-
39
- 无——生成器已实现。
40
-
41
- > 标记模板已实现,含 raw 字符串与 `String.raw`。生成器(`function*`、`yield`、`yield*`)
42
- > 基于有栈协程实现,支持 `next`/`throw`/`return`、`for...of`、展开与委托;
43
- > `import.meta` 提供 `url`、`dirname`、`filename`,由正在运行的可执行文件路径解析。
44
- > `async function*` 现在会以 `UnsupportedFeature` **明确拒绝**,不再静默产出同步生成器。
45
-
46
- ### 2.2 解析器不支持
47
-
48
- 目前未知有表达式级别的缺口。
49
-
50
- ### 2.3 运算符未实现
51
-
52
- | 运算符 | 现状 | 说明 |
53
- | --- | --- | --- |
54
- | `new.target` | ✗ | 已解析,但以 `UnsupportedFeature` 明确拒绝(无 `new.target` 语义) |
55
- | `typeof` / `void` / `in` / `delete` / `instanceof` | ✓ | 映射到运行时辅助函数(`xt_typeof`、`xt_in`、`xt_delete`、`xt_instance_of`) |
56
-
57
- ---
58
-
59
- ## 3. 标准库未实现
60
-
61
- ### 3.1 已实现(概要)
62
-
63
- - 数组:`push` `pop` `shift` `unshift` `join` `slice` `splice` `indexOf` `lastIndexOf` `includes` `concat` `reverse` `forEach` `map` `filter` `reduce` `reduceRight` `find` `findIndex` `findLast` `findLastIndex` `some` `every` `sort` `flat` `flatMap` `fill` `copyWithin` `at` `keys` `values` `entries`,以及不可变的 `toReversed` / `toSorted` / `toSpliced` / `with`
64
- - 字符串:`charAt` `charCodeAt` `codePointAt` `indexOf` `lastIndexOf` `includes` `startsWith` `endsWith` `slice` `substring` `substr` `split` `match` `replace` `replaceAll` `search` `toUpperCase` `toLowerCase` `trim` `trimStart` `trimEnd` `padStart` `padEnd` `repeat` `concat` `at` `localeCompare` `valueOf`
65
- - `Math`:完整函数与常量
66
- - `Object.keys` / `values` / `entries` / `assign` / `getOwnPropertyNames` / `groupBy`,对象展开 `{...obj}`
67
- - 全局函数:`parseInt` `parseFloat` `isNaN` `isFinite` `Number` `String` `Boolean` `encodeURI` `decodeURI` `encodeURIComponent` `decodeURIComponent`
68
- - `console.log` / `info` / `warn` / `error` / `dir` / `trace` / `assert` / `count` / `group` / `table` / `time`
69
-
70
- ### 3.2 已补齐
71
-
72
- - `JSON.parse` / `JSON.stringify`
73
- - `Date`、`RegExp`(POSIX ERE 子集,支持捕获组)、`Map`、`Set`、`Promise`、`BigInt`
74
- - `Array` 静态(`isArray/of/from`)、`Object` 静态、`Number` 静态、`String` 静态(`fromCharCode` / `fromCodePoint` / `raw`)
75
- - 一等公民内建构造器(`const A = Array`、`new A(...)`、`A.isArray`、`x instanceof A`)与 `Object.prototype`(`hasOwnProperty`、`toString`、`valueOf`、`isPrototypeOf`、`propertyIsEnumerable`、`__proto__`),且 `Object.getPrototypeOf({}) === Object.prototype`
76
- - `Error` 家族(`Error`、`TypeError`、`RangeError`、`SyntaxError`、`ReferenceError`、`EvalError`、`URIError`、`AggregateError`):支持 `new`、`instanceof`、`extends`、`String(err)` / `err.toString()` 与 `.stack`
77
-
78
- ### 3.3 仍未实现
79
-
80
- | 类别 | 现状 |
81
- | --- | --- |
82
- | `Symbol` 构造器与 symbol 原始值 | ✓ `Symbol(description)`、著名符号、`Symbol.for` / `Symbol.keyFor`、symbol 属性键与 `Object.getOwnPropertySymbols` |
83
- | `String.prototype.normalize` | ✗ 未实现 |
84
- | `structuredClone` | ✗ 未实现 |
85
- | 内置错误子类(`TypeError`、`RangeError` 等) | ✓ 一等公民构造器与原型;整个家族 `instanceof Error` 成立 |
86
- | `AggregateError` 构造器 | ✓ `new AggregateError(errors, message)`;`Promise.any` 现以其作为 rejection |
87
- | 迭代器协议 / `Symbol.iterator` / `for...of` 自定义可迭代 | ✓ 数组、字符串、`Map`、`Set`、生成器以及任何暴露 `[Symbol.iterator]()` 的对象均可在 `for...of` / 展开中使用 |
88
- | 生成器(`function*`、`yield`、`yield*`、`next`/`throw`/`return`) | ✓ 基于有栈协程实现;支持 `for...of`、展开与委托。`return()` 直接结束,不执行 `finally` |
89
- | 定时器 | ✓ 核心事件循环提供 `setTimeout` / `clearTimeout` / `setInterval` / `clearInterval`(返回数字 id,无 `Timeout` 对象;无 `setImmediate` / `queueMicrotask`)。定时器 settle 的 promise 可以被 await:async 函数体在 pending promise 上挂起,定时器触发时恢复 |
90
- | I/O / 进程等宿主 API | 仅通过扩展(如 Node `fs`)提供 |
91
-
92
- ### 3.4 类型化数组
93
-
94
- 已实现:`Uint8Array`、`Int8Array`、`Uint8ClampedArray`、`Uint16Array`、
95
- `Int16Array`、`Uint32Array`、`Int32Array`、`Float32Array`、`Float64Array`,支持
96
- `new X(n)` / `new X(数组样)`、`X.from` / `X.of`、`BYTES_PER_ELEMENT`、按类型强制的
97
- 元素写入,以及 `fill` / `set` / `slice` / `subarray` / `join` / `toString` /
98
- `indexOf` / `lastIndexOf` / `includes` / `forEach` / `map` / `filter` / `every` /
99
- `some` / `find` / `findIndex` / `reduce` / `reverse` / `sort` / `copyWithin` /
100
- `at` / `keys` / `values` / `entries`。已知差异:
101
-
102
- | 功能 | 现状 |
103
- | --- | --- |
104
- | `subarray` | ~ 返回副本,而非共享缓冲区上的视图 |
105
- | `keys` / `values` / `entries` | ~ 返回数组,而非迭代器对象 |
106
- | `ArrayBuffer` / `DataView` / `.buffer` / `.byteOffset` 语义 | ✗ 无底层缓冲区类型;`.byteOffset` 恒为 0 |
107
- | `BigInt64Array` / `BigUint64Array` | ✗ 未实现 |
108
- | `instanceof` 内建构造器 | ✓ `instanceof Array` / `Object` / `Map` / `Set` / `Date` / `RegExp` / `Promise` / `Error` 家族 / 类型化数组都能按名字识别,**也能通过一等公民构造器值判断**(`const A = Array; x instanceof A`);构造器可保存、传参、取别名、调用与 `new` |
109
- | 基于 `Buffer` / `ArrayBuffer` 的类型化数组视图 | ✗ 构造器仅能从长度 / 数组样 / 类型化数组复制 |
110
-
111
- ---
11
+ 文档按领域拆分为多个页面,某个功能的限制只记录在一个小文件里。限制解除后,把条目移到[已实现文档](../implemented.md)的对应页面;变更时间由 git 历史记录。
112
12
 
113
- ## 4. 模块系统
114
-
115
- | 功能 | 现状 |
116
- | --- | --- |
117
- | 多文件 / 模块解析与链接 | ✓ 驱动层 AST 打包(`src/driver/modules.ts`):解析每个模块、按模块前缀重命名顶层符号、改写引用后合并为单文件重新绑定 |
118
- | 具名导入导出 | ✓ `import { a, b as c }` / `export { a as b }` / `export const/let/var/function/class` |
119
- | 默认导入导出 | ✓ `export default` / `import d from` |
120
- | 再导出 `export { x } from` / `export * from` | ✓(`export *` 复制依赖模块的导出) |
121
- | 命名空间导入 `import * as ns` | ✓ 降级为持有全部导出的合成对象字面量 |
122
- | 循环依赖 | ✗ 直接报错(不做循环初始化语义) |
123
- | 实时绑定(live bindings) | ✗ 命名空间对象与导入绑定是模块求值时的快照 |
124
- | ESM `node_modules` 包 | ✓ 裸说明符沿目录树解析,支持 `exports` / `module` / `main`、作用域包与子路径;包源码与相对模块一样被打包 |
125
- | CommonJS `require` / `module.exports` | ✓ 仅限 `node_modules` 内:打包器为每个 CommonJS 包注入合成的 `module` / `exports`,将 `require("x")` 降级为依赖的导出对象,并把外部/内置 `require` 提升为 ESM `import`。用户代码(`node_modules` 之外)的 `require()` 仍会报错并提示改用 ESM `import` |
126
-
127
- > 扩展模块(如 `fs`)可通过裸名称或 `node:` 前缀的 `import` 引入 —— `import { readFileSync } from "fs"` / `import path from "path"` —— 并解析到运行时入口(具名、默认与命名空间形式均可)。相对模块与 `node_modules` 中的 ESM/CJS 包均在驱动层打包;CJS 包内的 `require` 会静态解析并内联。
128
-
129
- ---
130
-
131
- ## 5. 函数特性未实现(或语义缺失)
132
-
133
- | 特性 | 解析 | 语义 |
134
- | --- | --- | --- |
135
- | 默认参数 `function f(a = 5)` | ✓ | ✓ 已实现 |
136
- | 剩余参数 `function f(...args)` | ✓ | ✓ 已实现 |
137
- | 调用参数展开 `f(...args)` | ✓ | ✓ 已实现 |
138
- | 解构参数 / 解构绑定 | ✓ | ✓ 已实现 |
139
- | `arguments` 对象 | ✓(隐式) | ✓ 已实现(箭头函数取的是自身参数,而非外层函数的 `arguments`,与 JS 不同) |
140
- | `this` 绑定 / 方法调用语义 | ✓ | ✓ 已实现(`this` 作为函数首个 ABI 参数线程化;箭头函数词法继承) |
141
- | `async` / `await` / Promise | ✓ | ✓ 已实现:基于栈式协程的真实挂起;等待 pending promise 会暂停函数体并由事件循环恢复(剩余差异见偏差表) |
142
- | `new.target` | ✗ | 已解析,但以 `UnsupportedFeature` 明确拒绝(无 `new.target` 语义) |
143
- | 生成器 / 迭代器 / `yield` | ✓ 已实现 | `function*`、`yield`、`yield*`、`.next/.throw/.return`;异步生成器以 `UnsupportedFeature` 拒绝 |
144
- | 闭包 `arity` | — | `xt_closure_arity` 恒为 -1,未填充 |
145
- | `fn.call` / `fn.apply` / `fn.bind` | ✓ | ✓ 已实现(绑定闭包不跟踪部分参数的 `length`) |
146
- | `fn.name` / `fn.length` | ✓ | ✓ 已实现(从声明 / 赋值 / 属性键推断;绑定函数为 `"bound ..."` 并调整 arity) |
147
- | 内置方法一等公民(`typeof arr.map`、`const f = arr.push`、`obj.method?.()`) | ✓ | ✓ 作为**未绑定**方法值实现:读取 `arr.map` 得到函数,`arr.map?.(cb)` 与 `obj.method?.()` 会把接收者作为 `this` 绑定,脱离接收者调用(`const f = arr.map; f(cb)`)会像 JavaScript 一样抛错。方法的 `name`/`length` 也一并暴露 |
148
- | 内建构造器一等公民(`const A = Array`、`new A(...)`、`typeof Map`) | ✓ | ✓ 构造器是普通函数值,带 `name`/`length`、`prototype`、静态成员(`A.isArray`)与完整的 `instanceof` 协议 |
149
- | `fn.toString()` | ~ | 返回原生占位字符串(`function name() { [native code] }`),而非原始源码文本 |
150
-
151
- ---
152
-
153
- ## 6. 类与面向对象
154
-
155
- | 特性 | 现状 |
156
- | --- | --- |
157
- | `class` 声明 / 类表达式 | ✓ 已实现 |
158
- | 构造函数 `constructor` | ✓ |
159
- | 实例字段 / 属性声明 | ✓ |
160
- | 方法 | ✓ |
161
- | `static` 字段 / 方法 | ✓ |
162
- | 继承 `extends` / `super` | ✓(单级正确;`super` 取 `this` 原型的原型,理论缺陷见第 8 节) |
163
- | 原型链 / 方法查找 | ✓ |
164
- | `instanceof` | ✓ |
165
- | `new` / 实例化 | ✓ |
166
- | `get` / `set` 访问器 | ✓ 已实现 |
167
- | 参数属性 `constructor(public x: T)` | ✓ 已实现 |
168
- | 私有字段 `#x` | ✓ 已实现(以字面量 `#x` 作为键存储;无访问控制强制) |
169
- | `enum` / `const enum` | ✓ 已实现(正向 + 反向映射) |
170
- | `private` / `protected` / `public` / `readonly` 修饰符 | ✗ 无访问控制(擦除) |
171
- | `abstract` / `implements` | ✗(擦除) |
172
- | 父子类 `#x` 同名 | ✗ 可能混用(同一字面量键) |
173
-
174
- ---
175
-
176
- ## 7. 类型系统未实现(仅解析、不检查)
177
-
178
- 类型语法被解析为 AST 后在绑定 / 代码生成阶段**整体擦除**,不做任何类型检查:
179
-
180
- - 类型注解、返回类型、类型参数、类型别名、接口、泛型约束等:解析 ✓,检查 ✗。
181
- - 检查器诊断码(`TypeMismatch` `NotCallable` `PropertyNotFound` `ArgumentCountMismatch`)已定义但**未使用**。
182
- - `as` / `satisfies` / 非空断言 `!`:直接擦除,不做任何断言语义。
183
- - 泛型:无运行时实例化,类型参数被忽略。
184
- - 可选链 `?.` 的类型窄化:无(运行时短路已实现,但无类型层面的窄化)。
185
-
186
- ---
187
-
188
- ## 8. 运行时 / 语义与标准不符(已知偏差)
189
-
190
- 这些特性**能编译、能运行**,但结果不完全符合 ECMAScript:
191
-
192
- | 项 | 偏差 |
193
- | --- | --- |
194
- | 正则按字节匹配 | 引擎按 UTF-8 字节匹配:多字节字面量仍可匹配,但 `.` 与字符类每次只消费一个字节(`\d`/`\w` 仍是 ASCII)。`exec` / `search` / 替换回调返回的偏移会转换为 UTF-16 码元 |
195
- | 全局正则 `lastIndex` | `/g`、`/y` 正则的 `test` / `exec` 不推进也不读取调用方设置的 `lastIndex` |
196
- | `String.normalize` / `structuredClone` | 未实现 |
197
- | 内置方法一等公民 | 以未绑定方法值实现(见第 5 节);`fn.toString()` 返回占位字符串而非源码文本 |
198
- | `for...in` | 枚举对象 / 数组 / 字符串的自身键;不含原型链属性 |
199
- | 数组越界 / 稀疏 | 越界访问返回 `undefined`;对 `arr.length` 赋值会截断 / 扩展,但不区分稀疏空洞 |
200
- | 内存管理 | 非移动标记-清扫回收器(在 `xt_alloc` 之后):显式根、子系统根提供者与保守 C 栈扫描。单线程、stop-the-world;无移动/压缩与分代 |
201
- | 函数 `arity` / 调用参数个数 | 无参数个数校验;`fn.length` 报告声明的 arity,但调用不做校验 |
202
- | `async` / `await` | 已在栈式协程上真实挂起;但对**已 settle** 的值 `await` 会同步继续,而不是像规范要求那样排入微任务,因此与 pending `.then` 回调的交错顺序可能不同。顶层 `await` 会阻塞事件循环等待,而不是让出模块主体。`fs/promises` 仍在 settle 前同步完成 I/O;`fetch` 是阻塞的;不支持 `async` 生成器 |
203
- | `super` | `super.x` / `super(...)` 取 `this` 原型的原型;单级继承正确,继承深度 > 1 时可能不准确 |
204
- | `Error.stack` | 仅函数级帧:每帧为 `at 名称 (文件:行)`,行号取自函数声明(最内层帧会更新为错误构造处);没有列号,生成器 / `async` 函数体不产生帧(它们会切换栈) |
205
- | 模块实时绑定 | 命名空间导入与导入绑定为快照(见第 4 节) |
206
- | `import.meta` | ✓ `import.meta.url` / `.dirname` / `.filename`,由可执行文件路径解析 |
207
-
208
- > 数字格式化、宽松相等、`+` / 关系运算 `ToPrimitive`、整链可选链、`finally` 提前退出、对象键顺序等均已对齐 Node,并由差分测试覆盖,故不再列为偏差。
209
-
210
- ---
211
-
212
- ## 9. 工具链 / 平台 / 工程未实现
213
-
214
- | 项 | 现状 |
215
- | --- | --- |
216
- | GC(垃圾回收) | ✓ `xt_alloc.c` 中的非移动标记-清扫,按存活堆阈值(`XT_GC_THRESHOLD` 可固定该阈值)或 `xt_gc_collect()` 触发;每次回收后阈值变为存活堆的 2 倍(下限 1 MiB),因此常驻内存跟随存活集而不是只增不减;`XT_GC_TRACE=1` 会为每次回收向 stderr 打印一行统计。显式根 + 根提供者 + 保守活动栈扫描。无压缩、弱引用或后台回收(缺少弱引用意味着扩展必须对它缓存的每个值做强引用,例如 GUI 的元素句柄) |
217
- | 自举(self-hosting) | ✓ 编译器已能自编译:`xbintsc build src/cli/main.ts` 可产出可用二进制,且从第 1 代起产出的 IR 保持稳定。运行时仍为 C |
218
- | 类型检查器 | ✗ 仅定义诊断码,无 checker |
219
- | 完整标准库 | 部分:Math / JSON / Date / Map / Set / RegExp / `Error` / `BigInt` / `Symbol` 已实现;String.normalize / structuredClone 缺失 |
220
- | 多文件模块打包 | 部分:相对路径 `.ts` 打包、ESM `node_modules` 包、命名空间导入、裸说明符扩展模块导入已实现;循环依赖 / CommonJS / 实时绑定未实现 |
221
- | 异步运行时 | ✓ `async`/`await` 在 `select(2)` reactor 上对 pending promise 挂起:定时器、TCP 套接字与 promise 回调都能恢复协程。仍缺:真正的异步 I/O 调度(`fs/promises` 会先阻塞完成 I/O 再 settle)、非阻塞 `fetch` 与 worker 线程(worker 是子进程) |
222
- | Windows 二进制产物验证 | 构建层已适配(`.exe` 后缀、链接参数分支),并在 CI 中验证 |
223
- | 精确的 ECMAScript 数值 / 字符串 / 比较语义 | 部分,见第 8 节 |
224
-
225
- ---
226
-
227
- ## 10. 速查:未实现 / 部分实现清单
228
-
229
- ```
230
- 未实现(语句):namespace/module 声明
231
-
232
- 未实现(表达式):new.target(会给出明确的 UnsupportedFeature)
233
-
234
- 未实现(函数):`fn.toString()` 源码文本、异步生成器(已明确拒绝)
235
-
236
- 未实现(类/面向对象):abstract/implements、访问控制、父子类 #x 同名
237
-
238
- 未实现(标准库):String.normalize、structuredClone
239
-
240
- 未实现(模块):循环依赖、实时绑定、动态 `require(expr)`、
241
- `require.resolve` / `require.cache`、`__dirname` / `__filename`
242
-
243
- 未实现(类型系统):类型检查、泛型实例化、断言语义、可选链类型窄化
244
-
245
- 未实现(运行时):异步 I/O 调度、
246
- 全局正则 lastIndex
13
+ > 语言 / Language:[English](../unimplemented.md) | **简体中文**
247
14
 
248
- 未实现(工程):类型检查器
249
- ```
15
+ ## 目录
16
+
17
+ - [语句](./unimplemented/statements.md) —— 无法降级的语句形式
18
+ - [表达式与运算符](./unimplemented/expressions.md) —— 无法降级的表达式形式与运算符
19
+ - [标准库](./unimplemented/stdlib.md) —— 内建对象仍缺失的能力,含类型化数组
20
+ - [模块系统](./unimplemented/modules.md) —— 循环依赖、实时绑定、CommonJS 边界
21
+ - [函数](./unimplemented/functions.md) —— 缺失的函数语义
22
+ - [类与面向对象](./unimplemented/classes.md) —— 访问控制、`abstract`/`implements`、私有名冲突
23
+ - [类型系统](./unimplemented/types.md) —— 仅解析、从不检查
24
+ - [运行时偏差](./unimplemented/deviations.md) —— 能编译能运行,但与 ECMAScript 不同
25
+ - [工具链与平台](./unimplemented/toolchain.md) —— 类型检查器、异步 I/O、GC 模式、平台缺口
26
+ - [Node 扩展](./unimplemented/node.md) —— Node 模块缺口,按领域分页
package/llms.txt CHANGED
@@ -31,10 +31,38 @@
31
31
 
32
32
  - [doc/ai/contributing.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/ai/contributing.md): test suites, the self-hosting fixpoint invariant, the runtime ABI and value model, adding extensions or diagnostics, documentation duties
33
33
  - [doc/DESIGN.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/DESIGN.md): architecture and design rationale
34
- - [doc/implemented.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented.md): everything implemented, by compiler stage — the canonical reference
35
- - [doc/unimplemented.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/unimplemented.md): unsupported syntax, missing semantics and known deviations, with a quick-reference list
36
- - [doc/node-implemented.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/node-implemented.md): Node module coverage of the `node` extension
37
- - [doc/node-unimplemented.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/node-unimplemented.md): what the `node` extension is still missing
34
+ - [doc/implemented.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented.md): index of everything implemented — one page per compiler stage / feature area
35
+ - [doc/implemented/pipeline.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/pipeline.md): pipeline and self-hosting
36
+ - [doc/implemented/lexer.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/lexer.md): tokens, literals and lexical diagnostics
37
+ - [doc/implemented/parser.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/parser.md): statement, expression and type syntax
38
+ - [doc/implemented/binder.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/binder.md): scopes, symbols and capture
39
+ - [doc/implemented/operators.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/operators.md): operators and assignment
40
+ - [doc/implemented/value-model.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/value-model.md): NaN-boxing and the function ABI
41
+ - [doc/implemented/codegen.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/codegen.md): LLVM IR lowering
42
+ - [doc/implemented/runtime-core.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/runtime-core.md): allocator, values, exceptions
43
+ - [doc/implemented/strings.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/strings.md): the string model and text codecs
44
+ - [doc/implemented/stdlib.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/stdlib.md): Object/Array/Number/Math/JSON/Date/RegExp/Symbol/errors/console
45
+ - [doc/implemented/collections.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/collections.md): Map/Set/WeakMap/WeakSet/WeakRef
46
+ - [doc/implemented/typed-arrays.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/typed-arrays.md): typed arrays, ArrayBuffer and DataView
47
+ - [doc/implemented/async.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/async.md): async/await, promises, generators and timers
48
+ - [doc/implemented/fetch.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/fetch.md): the HTTP client
49
+ - [doc/implemented/modules.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/modules.md): import/export and bundling
50
+ - [doc/implemented/extensions.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/extensions.md): the extension registry and the `node` extension
51
+ - [doc/implemented/driver.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/driver.md): incremental cache, clang, LTO/PGO, config, icons
52
+ - [doc/implemented/cli.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/cli.md): CLI and the embedder API
53
+ - [doc/implemented/tests.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/tests.md): test suites and the differential harness
54
+ - [doc/unimplemented.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/unimplemented.md): index of unsupported syntax, missing semantics and known deviations
55
+ - [doc/unimplemented/statements.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/unimplemented/statements.md): statement gaps
56
+ - [doc/unimplemented/expressions.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/unimplemented/expressions.md): expression and operator gaps
57
+ - [doc/unimplemented/stdlib.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/unimplemented/stdlib.md): standard-library gaps, including typed arrays
58
+ - [doc/unimplemented/modules.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/unimplemented/modules.md): circular dependencies, live bindings, CommonJS boundaries
59
+ - [doc/unimplemented/functions.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/unimplemented/functions.md): function semantics
60
+ - [doc/unimplemented/classes.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/unimplemented/classes.md): class and OO gaps
61
+ - [doc/unimplemented/types.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/unimplemented/types.md): the erased type system
62
+ - [doc/unimplemented/deviations.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/unimplemented/deviations.md): runtime behaviour that differs from ECMAScript
63
+ - [doc/unimplemented/toolchain.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/unimplemented/toolchain.md): toolchain, platform and engineering gaps
64
+ - [doc/implemented/node.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/implemented/node.md): Node extension — index, one page per Node module under `doc/implemented/node/`
65
+ - [doc/unimplemented/node.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/unimplemented/node.md): what the `node` extension is still missing — per-module and cross-cutting pages under `doc/unimplemented/node/`
38
66
  - [doc/gui.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/gui.md): the self-hosted GPU HTML/CSS renderer — overview, architecture and roadmap
39
67
  - [doc/gui/api.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/gui/api.md): the TypeScript window API, events and diagnostics hooks
40
68
  - [doc/gui/dom.md](https://raw.githubusercontent.com/zy445566/xbintsc/main/doc/gui/dom.md): HTML/CSS parsing, the cascade, the interactive DOM and AOT scripts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xbintsc",
3
- "version": "0.5.6",
3
+ "version": "0.5.21",
4
4
  "description": "xbintsc - a TypeScript binary compiler (TypeScript -> LLVM IR -> native binary)",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -0,0 +1,219 @@
1
+ /*
2
+ * xbintsc GUI engine — inline `<svg>` serialization. See `inline_svg.h`.
3
+ */
4
+
5
+ #include "inline_svg.h"
6
+
7
+ #include <cctype>
8
+ #include <string>
9
+ #include <unordered_map>
10
+
11
+ namespace xtgui {
12
+ namespace {
13
+
14
+ /** SVG element names that are case-sensitive and contain an upper-case letter.
15
+ * The HTML parser lowercases tag names, so the serializer maps them back;
16
+ * everything not listed is already lower case in SVG (`path`, `rect`, `g`,
17
+ * `defs`, `stop`, …). */
18
+ const std::unordered_map<std::string, const char *> &canonicalTags() {
19
+ static const std::unordered_map<std::string, const char *> tags = {
20
+ {"altglyph", "altGlyph"},
21
+ {"altglyphdef", "altGlyphDef"},
22
+ {"altglyphitem", "altGlyphItem"},
23
+ {"animatecolor", "animateColor"},
24
+ {"animatemotion", "animateMotion"},
25
+ {"animatetransform", "animateTransform"},
26
+ {"clippath", "clipPath"},
27
+ {"feblend", "feBlend"},
28
+ {"fecolormatrix", "feColorMatrix"},
29
+ {"fecomponenttransfer", "feComponentTransfer"},
30
+ {"fecomposite", "feComposite"},
31
+ {"feconvolvematrix", "feConvolveMatrix"},
32
+ {"fediffuselighting", "feDiffuseLighting"},
33
+ {"fedisplacementmap", "feDisplacementMap"},
34
+ {"fedistantlight", "feDistantLight"},
35
+ {"fedropshadow", "feDropShadow"},
36
+ {"feflood", "feFlood"},
37
+ {"fefunca", "feFuncA"},
38
+ {"fefuncb", "feFuncB"},
39
+ {"fefuncg", "feFuncG"},
40
+ {"fefuncr", "feFuncR"},
41
+ {"fegaussianblur", "feGaussianBlur"},
42
+ {"feimage", "feImage"},
43
+ {"femerge", "feMerge"},
44
+ {"femergenode", "feMergeNode"},
45
+ {"femorphology", "feMorphology"},
46
+ {"feoffset", "feOffset"},
47
+ {"fepointlight", "fePointLight"},
48
+ {"fespecularlighting", "feSpecularLighting"},
49
+ {"fespotlight", "feSpotLight"},
50
+ {"fetile", "feTile"},
51
+ {"feturbulence", "feTurbulence"},
52
+ {"foreignobject", "foreignObject"},
53
+ {"glyphref", "glyphRef"},
54
+ {"lineargradient", "linearGradient"},
55
+ {"radialgradient", "radialGradient"},
56
+ {"textpath", "textPath"},
57
+ };
58
+ return tags;
59
+ }
60
+
61
+ /** The same for attributes: NanoSVG compares these names exactly, and the HTML
62
+ * parser delivers them in lower case. The table also covers the common SVG
63
+ * attributes NanoSVG does not read, so the markup it is handed stays faithful
64
+ * to what a browser would parse. */
65
+ const std::unordered_map<std::string, const char *> &canonicalAttrs() {
66
+ static const std::unordered_map<std::string, const char *> attrs = {
67
+ {"attributename", "attributeName"},
68
+ {"attributetype", "attributeType"},
69
+ {"basefrequency", "baseFrequency"},
70
+ {"baseprofile", "baseProfile"},
71
+ {"calcmode", "calcMode"},
72
+ {"clippathunits", "clipPathUnits"},
73
+ {"contentscripttype", "contentScriptType"},
74
+ {"contentstyletype", "contentStyleType"},
75
+ {"diffuseconstant", "diffuseConstant"},
76
+ {"edgemode", "edgeMode"},
77
+ {"filterunits", "filterUnits"},
78
+ {"gradienttransform", "gradientTransform"},
79
+ {"gradientunits", "gradientUnits"},
80
+ {"kernelmatrix", "kernelMatrix"},
81
+ {"kernelunitlength", "kernelUnitLength"},
82
+ {"keypoints", "keyPoints"},
83
+ {"keysplines", "keySplines"},
84
+ {"keytimes", "keyTimes"},
85
+ {"lengthadjust", "lengthAdjust"},
86
+ {"limitingconeangle", "limitingConeAngle"},
87
+ {"markerheight", "markerHeight"},
88
+ {"markerunits", "markerUnits"},
89
+ {"markerwidth", "markerWidth"},
90
+ {"maskcontentunits", "maskContentUnits"},
91
+ {"maskunits", "maskUnits"},
92
+ {"numoctaves", "numOctaves"},
93
+ {"pathlength", "pathLength"},
94
+ {"patterncontentunits", "patternContentUnits"},
95
+ {"patterntransform", "patternTransform"},
96
+ {"patternunits", "patternUnits"},
97
+ {"pointsatx", "pointsAtX"},
98
+ {"pointsaty", "pointsAtY"},
99
+ {"pointsatz", "pointsAtZ"},
100
+ {"preserveaspectratio", "preserveAspectRatio"},
101
+ {"primitiveunits", "primitiveUnits"},
102
+ {"refx", "refX"},
103
+ {"refy", "refY"},
104
+ {"repeatcount", "repeatCount"},
105
+ {"repeatdur", "repeatDur"},
106
+ {"requiredextensions", "requiredExtensions"},
107
+ {"requiredfeatures", "requiredFeatures"},
108
+ {"specularconstant", "specularConstant"},
109
+ {"specularexponent", "specularExponent"},
110
+ {"spreadmethod", "spreadMethod"},
111
+ {"startoffset", "startOffset"},
112
+ {"stddeviation", "stdDeviation"},
113
+ {"stitchtiles", "stitchTiles"},
114
+ {"surfacescale", "surfaceScale"},
115
+ {"systemlanguage", "systemLanguage"},
116
+ {"tablevalues", "tableValues"},
117
+ {"targetx", "targetX"},
118
+ {"targety", "targetY"},
119
+ {"textlength", "textLength"},
120
+ {"transformorigin", "transformOrigin"},
121
+ {"viewbox", "viewBox"},
122
+ {"viewtarget", "viewTarget"},
123
+ {"xchannelselector", "xChannelSelector"},
124
+ {"ychannelselector", "yChannelSelector"},
125
+ {"zoomandpan", "zoomAndPan"},
126
+ };
127
+ return attrs;
128
+ }
129
+
130
+ void escapeAttribute(const std::string &value, std::string *out) {
131
+ for (char c : value) {
132
+ switch (c) {
133
+ case '&': out->append("&amp;"); break;
134
+ case '<': out->append("&lt;"); break;
135
+ case '>': out->append("&gt;"); break;
136
+ case '"': out->append("&quot;"); break;
137
+ default: out->push_back(c); break;
138
+ }
139
+ }
140
+ }
141
+
142
+ std::string canonicalTag(const std::string &tag) {
143
+ const auto &tags = canonicalTags();
144
+ auto found = tags.find(tag);
145
+ return found == tags.end() ? tag : std::string(found->second);
146
+ }
147
+
148
+ const char *canonicalAttr(const std::string &name) {
149
+ const auto &attrs = canonicalAttrs();
150
+ auto found = attrs.find(name);
151
+ return found == attrs.end() ? nullptr : found->second;
152
+ }
153
+
154
+ bool isNamespaceAttr(const std::string &name) {
155
+ return name == "xmlns" || name.compare(0, 6, "xmlns:") == 0;
156
+ }
157
+
158
+ /** HTML-only attributes that must not reach the SVG reader (inline `style` and
159
+ * `class` are legitimate on SVG elements and stay). */
160
+ bool isHtmlAttr(const std::string &name) {
161
+ return name == "tabindex" || name == "role" || name == "contenteditable";
162
+ }
163
+
164
+ void serializeNode(const Node *node, std::string *out);
165
+
166
+ void serializeStyleText(const Node *node, std::string *out) {
167
+ for (const std::unique_ptr<Node> &child : node->children) {
168
+ if (child->isText()) {
169
+ out->append(child->text);
170
+ } else if (child->isElement()) {
171
+ serializeNode(child.get(), out);
172
+ }
173
+ }
174
+ }
175
+
176
+ void serializeNode(const Node *node, std::string *out) {
177
+ if (node == nullptr || !node->isElement()) return;
178
+ std::string tag = canonicalTag(node->tag);
179
+ out->push_back('<');
180
+ out->append(tag);
181
+ if (node->isTag("svg")) out->append(" xmlns=\"http://www.w3.org/2000/svg\"");
182
+ for (const Attr &attr : node->attrs) {
183
+ if (isNamespaceAttr(attr.name) || isHtmlAttr(attr.name)) continue;
184
+ /* The root's xmlns is emitted above, so a second copy would be an XML
185
+ * duplicate-attribute error. */
186
+ const char *name = canonicalAttr(attr.name);
187
+ out->push_back(' ');
188
+ out->append(name != nullptr ? name : attr.name);
189
+ out->append("=\"");
190
+ escapeAttribute(attr.value, out);
191
+ out->push_back('"');
192
+ }
193
+ out->push_back('>');
194
+ if (node->isTag("style")) {
195
+ serializeStyleText(node, out);
196
+ } else {
197
+ for (const std::unique_ptr<Node> &child : node->children) {
198
+ if (child->isElement()) serializeNode(child.get(), out);
199
+ }
200
+ }
201
+ out->append("</");
202
+ out->append(tag);
203
+ out->push_back('>');
204
+ }
205
+
206
+ } // namespace
207
+
208
+ bool xt_inline_svg_is_root(const Node *node) {
209
+ return node != nullptr && node->isElement() && node->isTag("svg");
210
+ }
211
+
212
+ std::string xt_inline_svg_serialize(const Node *node) {
213
+ if (!xt_inline_svg_is_root(node)) return std::string();
214
+ std::string out;
215
+ serializeNode(node, &out);
216
+ return out;
217
+ }
218
+
219
+ } // namespace xtgui
@@ -0,0 +1,41 @@
1
+ /*
2
+ * xbintsc GUI engine — inline `<svg>` elements.
3
+ *
4
+ * An SVG that arrives as a file is decoded by `svg.h` (`<img src="logo.svg">`).
5
+ * An inline `<svg>` tree is already part of the document, so this module turns
6
+ * the subtree back into a standalone SVG document and hands it to the same
7
+ * NanoSVG parser/rasteriser. Layout then treats `<svg>` as a replaced element
8
+ * (its intrinsic size comes from the parsed document) and paint emits an image
9
+ * op carrying the markup, so the renderer rasterises it at the drawn device
10
+ * pixel size — vector art stays crisp exactly like an SVG file.
11
+ *
12
+ * The HTML parser lowercases element and attribute names (so `viewBox` arrives
13
+ * as `viewbox`), while NanoSVG matches SVG's case-sensitive spellings. The
14
+ * serializer therefore restores the canonical names of the elements and
15
+ * attributes NanoSVG understands, and drops the HTML-only ones that would
16
+ * confuse the XML reader.
17
+ */
18
+ #ifndef XT_GUI_INLINE_SVG_H
19
+ #define XT_GUI_INLINE_SVG_H
20
+
21
+ #include <string>
22
+
23
+ #include "dom.h"
24
+ #include "svg.h"
25
+
26
+ namespace xtgui {
27
+
28
+ /** True when `node` is an `<svg>` element (an inline SVG root). */
29
+ bool xt_inline_svg_is_root(const Node *node);
30
+
31
+ /** Serialize an `<svg>` DOM subtree into a standalone SVG document: the root
32
+ * element, its descendants (including `<defs>`, gradients and `<style>` text)
33
+ * and the canonical `width`/`height`/`viewBox`/`gradient*` spellings NanoSVG
34
+ * expects. Text outside `<style>` is dropped (NanoSVG renders shapes, not
35
+ * `<text>`), and HTML-only attributes are skipped. Returns an empty string when
36
+ * `node` is not an `<svg>` element. */
37
+ std::string xt_inline_svg_serialize(const Node *node);
38
+
39
+ } // namespace xtgui
40
+
41
+ #endif /* XT_GUI_INLINE_SVG_H */
@@ -19,6 +19,7 @@
19
19
  #include <cstring>
20
20
 
21
21
  #include "image.h"
22
+ #include "inline_svg.h"
22
23
  #include "style_internal.h"
23
24
 
24
25
  namespace xtgui {
@@ -104,7 +105,24 @@ std::unique_ptr<LayoutBox> buildBoxTree(const Node *node,
104
105
  }
105
106
  }
106
107
  }
108
+ } else if (node->isElement() && node->isTag("svg")) {
109
+ /* An inline `<svg>` is a replaced element: the subtree is vector art, not
110
+ * HTML boxes. Serialize it once, take the intrinsic size from the parsed
111
+ * document (width/height attributes, else the viewBox, else 300x150), and
112
+ * let paint/rasterisation handle the children — the normal box walk must
113
+ * not descend into them. */
114
+ box->is_inline_svg = true;
115
+ box->svg_markup = xt_inline_svg_serialize(node);
116
+ int width = 0;
117
+ int height = 0;
118
+ if (xt_svg_markup_size(box->svg_markup, &width, &height)) {
119
+ box->intrinsic_width = (float)width;
120
+ box->intrinsic_height = (float)height;
121
+ }
122
+ if (box->intrinsic_width <= 0.0f) box->intrinsic_width = 300.0f;
123
+ if (box->intrinsic_height <= 0.0f) box->intrinsic_height = 150.0f;
107
124
  }
125
+ if (box->is_inline_svg) return box;
108
126
  for (const std::unique_ptr<Node> &child : node->children) {
109
127
  std::unique_ptr<LayoutBox> childBox =
110
128
  buildBoxTree(child.get(), styles, style, media, canvases);
@@ -83,6 +83,13 @@ struct LayoutBox {
83
83
  bool is_canvas = false;
84
84
  uint64_t canvas_id = 0;
85
85
 
86
+ /* Inline `<svg>`: a replaced element whose pixels are the serialized subtree
87
+ * (`svg_markup`), rasterised like an SVG file at the drawn device size. The
88
+ * normal box walk does not descend into its children — they are vector art,
89
+ * not HTML boxes. */
90
+ bool is_inline_svg = false;
91
+ std::string svg_markup;
92
+
86
93
  Display display = Display::Inline;
87
94
 
88
95
  /* Resolved (px) box edges. */