semantifold 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/README.md +10 -7
  2. package/build/src/backends/android.js +7 -3
  3. package/build/src/backends/identifiers.d.ts +6 -0
  4. package/build/src/backends/identifiers.d.ts.map +1 -1
  5. package/build/src/backends/identifiers.js +24 -1
  6. package/build/src/backends/ios.js +2 -2
  7. package/build/src/backends/native-validation.d.ts +2 -2
  8. package/build/src/backends/native-validation.d.ts.map +1 -1
  9. package/build/src/backends/native-validation.js +2 -2
  10. package/build/src/backends/scalars.d.ts.map +1 -1
  11. package/build/src/backends/scalars.js +2 -1
  12. package/build/src/backends/shared.js +4 -4
  13. package/build/src/backends/zig-runtime.d.ts +5 -0
  14. package/build/src/backends/zig-runtime.d.ts.map +1 -0
  15. package/build/src/backends/zig-runtime.js +92 -0
  16. package/build/src/backends/zig-validation.d.ts +9 -0
  17. package/build/src/backends/zig-validation.d.ts.map +1 -0
  18. package/build/src/backends/zig-validation.js +73 -0
  19. package/build/src/backends/zig.d.ts +42 -0
  20. package/build/src/backends/zig.d.ts.map +1 -0
  21. package/build/src/backends/zig.js +584 -0
  22. package/build/src/frontends/scalars.d.ts.map +1 -1
  23. package/build/src/frontends/scalars.js +2 -1
  24. package/build/src/frontends/zig-parser.d.ts +31 -0
  25. package/build/src/frontends/zig-parser.d.ts.map +1 -0
  26. package/build/src/frontends/zig-parser.js +17 -0
  27. package/build/src/frontends/zig.d.ts +14 -0
  28. package/build/src/frontends/zig.d.ts.map +1 -0
  29. package/build/src/frontends/zig.js +970 -0
  30. package/build/src/language-registry.d.ts.map +1 -1
  31. package/build/src/language-registry.js +30 -1
  32. package/build/src/mapping.js +2 -2
  33. package/build/src/semantic/provenance.js +3 -3
  34. package/build/src/semantic/types.d.ts +2 -2
  35. package/build/src/semantic/types.d.ts.map +1 -1
  36. package/build/src/semantic/types.js +2 -2
  37. package/build/src/semantic/validate.js +2 -2
  38. package/build/src/toolchains.d.ts +6 -0
  39. package/build/src/toolchains.d.ts.map +1 -1
  40. package/build/src/toolchains.js +2 -1
  41. package/build/src/zig-bindings.d.ts +10 -0
  42. package/build/src/zig-bindings.d.ts.map +1 -0
  43. package/build/src/zig-bindings.js +54 -0
  44. package/docs/android.md +2 -2
  45. package/docs/architecture.md +11 -5
  46. package/docs/goals.md +1 -1
  47. package/docs/language-support.md +8 -4
  48. package/docs/parser-qualification.md +31 -1
  49. package/docs/source-maps.md +5 -3
  50. package/docs/testing.md +26 -4
  51. package/docs/zig.md +33 -0
  52. package/node_modules/semantifold-tree-sitter-zig-internal/LICENSE +15 -0
  53. package/node_modules/semantifold-tree-sitter-zig-internal/README.md +5 -0
  54. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/LICENSE +21 -0
  55. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/README.md +21 -0
  56. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/binding.gyp +29 -0
  57. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/binding.cc +20 -0
  58. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/binding_test.js +9 -0
  59. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/index.d.ts +28 -0
  60. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/bindings/node/index.js +11 -0
  61. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/grammar.js +900 -0
  62. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/package.json +57 -0
  63. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/darwin-arm64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
  64. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/darwin-x64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
  65. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/linux-arm64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
  66. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/linux-x64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
  67. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/win32-arm64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
  68. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/prebuilds/win32-x64/@tree-sitter-grammars+tree-sitter-zig.node +0 -0
  69. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/folds.scm +23 -0
  70. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/highlights.scm +291 -0
  71. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/indents.scm +22 -0
  72. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/queries/injections.scm +10 -0
  73. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/grammar.json +6570 -0
  74. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/node-types.json +3178 -0
  75. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/parser.c +169829 -0
  76. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/tree_sitter/alloc.h +54 -0
  77. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/tree_sitter/array.h +291 -0
  78. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/src/tree_sitter/parser.h +266 -0
  79. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/tree-sitter-zig.wasm +0 -0
  80. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/@tree-sitter-grammars/tree-sitter-zig/tree-sitter.json +38 -0
  81. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/LICENSE +21 -0
  82. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/README.md +128 -0
  83. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/binding.gyp +80 -0
  84. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/index.js +916 -0
  85. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/package.json +76 -0
  86. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
  87. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
  88. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/linux-arm64/tree-sitter.node +0 -0
  89. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
  90. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/win32-arm64/tree-sitter.node +0 -0
  91. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
  92. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/addon_data.h +47 -0
  93. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/binding.cc +35 -0
  94. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/conversions.cc +140 -0
  95. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/conversions.h +22 -0
  96. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/language.cc +106 -0
  97. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/language.h +17 -0
  98. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/logger.cc +70 -0
  99. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/logger.h +19 -0
  100. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
  101. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
  102. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/node.cc +1088 -0
  103. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/node.h +30 -0
  104. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/parser.cc +306 -0
  105. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/parser.h +35 -0
  106. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/query.cc +397 -0
  107. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/query.h +40 -0
  108. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree.cc +316 -0
  109. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree.h +45 -0
  110. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
  111. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/src/tree_cursor.h +52 -0
  112. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/tree-sitter.d.ts +1042 -0
  113. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1318 -0
  114. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
  115. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
  116. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +291 -0
  117. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
  118. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
  119. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
  120. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +501 -0
  121. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
  122. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
  123. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +223 -0
  124. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +297 -0
  125. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
  126. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +435 -0
  127. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +49 -0
  128. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +12 -0
  129. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +920 -0
  130. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2165 -0
  131. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +266 -0
  132. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +62 -0
  133. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +206 -0
  134. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4187 -0
  135. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
  136. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
  137. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +899 -0
  138. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +130 -0
  139. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1066 -0
  140. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +399 -0
  141. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +170 -0
  142. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
  143. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +712 -0
  144. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
  145. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +11 -0
  146. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
  147. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
  148. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
  149. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
  150. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
  151. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
  152. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
  153. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
  154. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
  155. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +83 -0
  156. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +24 -0
  157. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +109 -0
  158. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1302 -0
  159. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1859 -0
  160. package/node_modules/semantifold-tree-sitter-zig-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
  161. package/node_modules/semantifold-tree-sitter-zig-internal/package.json +21 -0
  162. package/node_modules/semantifold-tree-sitter-zig-internal/src/zig.js +134 -0
  163. package/package.json +11 -6
  164. package/src/backends/android.js +6 -2
  165. package/src/backends/identifiers.js +24 -0
  166. package/src/backends/ios.js +1 -1
  167. package/src/backends/native-validation.js +1 -1
  168. package/src/backends/scalars.js +1 -0
  169. package/src/backends/shared.js +3 -3
  170. package/src/backends/zig-runtime.js +93 -0
  171. package/src/backends/zig-validation.js +68 -0
  172. package/src/backends/zig.js +579 -0
  173. package/src/frontends/scalars.js +1 -0
  174. package/src/frontends/zig-parser.js +20 -0
  175. package/src/frontends/zig.js +994 -0
  176. package/src/language-registry.js +30 -0
  177. package/src/mapping.js +1 -1
  178. package/src/semantic/provenance.js +2 -2
  179. package/src/semantic/types.js +1 -1
  180. package/src/semantic/validate.js +1 -1
  181. package/src/toolchains.js +1 -0
  182. package/src/zig-bindings.js +46 -0
@@ -0,0 +1,31 @@
1
+ #ifndef TREE_SITTER_WASM_H_
2
+ #define TREE_SITTER_WASM_H_
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ #include "tree_sitter/api.h"
9
+ #include "./parser.h"
10
+
11
+ bool ts_wasm_store_start(TSWasmStore *self, TSLexer *lexer, const TSLanguage *language);
12
+ void ts_wasm_store_reset(TSWasmStore *self);
13
+ bool ts_wasm_store_has_error(const TSWasmStore *self);
14
+
15
+ bool ts_wasm_store_call_lex_main(TSWasmStore *self, TSStateId state);
16
+ bool ts_wasm_store_call_lex_keyword(TSWasmStore *self, TSStateId state);
17
+
18
+ uint32_t ts_wasm_store_call_scanner_create(TSWasmStore *self);
19
+ void ts_wasm_store_call_scanner_destroy(TSWasmStore *self, uint32_t scanner_address);
20
+ bool ts_wasm_store_call_scanner_scan(TSWasmStore *self, uint32_t scanner_address, uint32_t valid_tokens_ix);
21
+ uint32_t ts_wasm_store_call_scanner_serialize(TSWasmStore *self, uint32_t scanner_address, char *buffer);
22
+ void ts_wasm_store_call_scanner_deserialize(TSWasmStore *self, uint32_t scanner, const char *buffer, unsigned length);
23
+
24
+ void ts_wasm_language_retain(const TSLanguage *self);
25
+ void ts_wasm_language_release(const TSLanguage *self);
26
+
27
+ #ifdef __cplusplus
28
+ }
29
+ #endif
30
+
31
+ #endif // TREE_SITTER_WASM_H_
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "semantifold-tree-sitter-zig-internal",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "description": "Private parser-neutral Zig snapshots using Semantifold's isolated Tree-sitter runtime",
6
+ "type": "module",
7
+ "main": "./src/zig.js",
8
+ "files": [
9
+ "src/zig.js",
10
+ "LICENSE",
11
+ "README.md"
12
+ ],
13
+ "engines": {
14
+ "node": ">=24"
15
+ },
16
+ "license": "ISC",
17
+ "dependencies": {
18
+ "@tree-sitter-grammars/tree-sitter-zig": "1.1.2",
19
+ "tree-sitter": "0.22.4"
20
+ }
21
+ }
@@ -0,0 +1,134 @@
1
+ // @ts-check
2
+
3
+ import Parser from "tree-sitter"
4
+ import ZigLanguage from "@tree-sitter-grammars/tree-sitter-zig"
5
+
6
+ /** @typedef {Readonly<{row: number, column: number}>} CstPosition */
7
+ /** @typedef {Readonly<{field: string | null, node: CstNode}>} CstChild */
8
+ /**
9
+ * @typedef {Readonly<{
10
+ * type: string,
11
+ * named: boolean,
12
+ * extra: boolean,
13
+ * error: boolean,
14
+ * missing: boolean,
15
+ * hasError: boolean,
16
+ * startIndex: number,
17
+ * endIndex: number,
18
+ * startPosition: CstPosition,
19
+ * endPosition: CstPosition,
20
+ * children: readonly CstChild[]
21
+ * }>} CstNode
22
+ */
23
+ /** @typedef {Readonly<{schema: "semantifold.parser-cst", version: 1, language: "zig", root: CstNode}>} CstSnapshot */
24
+
25
+ /**
26
+ * Parses the pinned Zig grammar with its isolated compatible runtime.
27
+ * @param {string} source - Caller-owned source text.
28
+ * @returns {CstSnapshot} Recursively frozen parser-neutral CST data.
29
+ */
30
+ export function parseCst(source) {
31
+ const parser = new Parser()
32
+
33
+ // The grammar's declaration intentionally hides its native language handle as unknown.
34
+ parser.setLanguage(/** @type {Parser.Language} */ (/** @type {unknown} */ (ZigLanguage)))
35
+ const tree = parser.parse(source)
36
+ const convertIndex = createIndexConverter(source, tree.rootNode.endIndex)
37
+ const lineStarts = createLineStarts(source)
38
+ const root = snapshotNode(tree.rootNode, convertIndex, lineStarts)
39
+
40
+ parser.reset()
41
+ return Object.freeze({language: "zig", root, schema: "semantifold.parser-cst", version: 1})
42
+ }
43
+
44
+ /**
45
+ * @param {import("tree-sitter").SyntaxNode} node
46
+ * @param {(index: number) => number} convertIndex
47
+ * @param {readonly number[]} lineStarts
48
+ * @returns {CstNode}
49
+ */
50
+ function snapshotNode(node, convertIndex, lineStarts) {
51
+ /** @type {CstChild[]} */
52
+ const children = []
53
+
54
+ for (let index = 0; index < node.childCount; index += 1) {
55
+ const child = node.child(index)
56
+
57
+ if (!child) throw new Error(`Zig Tree-sitter returned no child at index ${index}`)
58
+ children.push(Object.freeze({
59
+ field: node.fieldNameForChild(index) ?? null,
60
+ node: snapshotNode(child, convertIndex, lineStarts)
61
+ }))
62
+ }
63
+ const startIndex = convertIndex(node.startIndex)
64
+ const endIndex = convertIndex(node.endIndex)
65
+
66
+ return Object.freeze({
67
+ children: Object.freeze(children),
68
+ endIndex,
69
+ endPosition: positionForIndex(endIndex, lineStarts),
70
+ error: node.isError,
71
+ extra: node.isExtra,
72
+ hasError: node.hasError,
73
+ missing: node.isMissing,
74
+ named: node.isNamed,
75
+ startIndex,
76
+ startPosition: positionForIndex(startIndex, lineStarts),
77
+ type: node.type
78
+ })
79
+ }
80
+
81
+ /**
82
+ * Normalizes either UTF-8 byte offsets or UTF-16 offsets to UTF-16.
83
+ * @param {string} source
84
+ * @param {number} rootEndIndex
85
+ * @returns {(index: number) => number}
86
+ */
87
+ function createIndexConverter(source, rootEndIndex) {
88
+ if (rootEndIndex == source.length) return (index) => index
89
+ const utf8Length = Buffer.byteLength(source, "utf8")
90
+
91
+ if (rootEndIndex != utf8Length) throw new Error(`Unsupported Zig Tree-sitter index extent ${rootEndIndex} for source length ${source.length}`)
92
+ /** @type {Map<number, number>} */
93
+ const byteToUtf16 = new Map([[0, 0]])
94
+ let byteIndex = 0
95
+
96
+ for (let utf16Index = 0; utf16Index < source.length;) {
97
+ const codePoint = source.codePointAt(utf16Index)
98
+
99
+ if (codePoint == null) throw new Error(`Cannot read source code point at index ${utf16Index}`)
100
+ const character = String.fromCodePoint(codePoint)
101
+
102
+ byteIndex += Buffer.byteLength(character, "utf8")
103
+ utf16Index += character.length
104
+ byteToUtf16.set(byteIndex, utf16Index)
105
+ }
106
+ return (index) => {
107
+ const converted = byteToUtf16.get(index)
108
+
109
+ if (converted == null) throw new Error(`Zig Tree-sitter returned a non-boundary byte index ${index}`)
110
+ return converted
111
+ }
112
+ }
113
+
114
+ /** @param {string} source @returns {readonly number[]} */
115
+ function createLineStarts(source) {
116
+ const starts = [0]
117
+
118
+ for (let index = 0; index < source.length; index += 1) if (source[index] == "\n") starts.push(index + 1)
119
+ return starts
120
+ }
121
+
122
+ /** @param {number} index @param {readonly number[]} lineStarts @returns {CstPosition} */
123
+ function positionForIndex(index, lineStarts) {
124
+ let low = 0
125
+ let high = lineStarts.length
126
+
127
+ while (low + 1 < high) {
128
+ const middle = Math.floor((low + high) / 2)
129
+
130
+ if (/** @type {number} */ (lineStarts[middle]) <= index) low = middle
131
+ else high = middle
132
+ }
133
+ return Object.freeze({column: index - /** @type {number} */ (lineStarts[low]), row: low})
134
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "semantifold",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Language-neutral semantic code analysis, transformation, generation, and execution toolkit",
5
5
  "type": "module",
6
6
  "main": "build/index.js",
@@ -21,17 +21,18 @@
21
21
  "tsconfig.json"
22
22
  ],
23
23
  "workspaces": [
24
- "packages/tree-sitter-legacy"
24
+ "packages/tree-sitter-legacy",
25
+ "packages/tree-sitter-zig"
25
26
  ],
26
27
  "scripts": {
27
28
  "all-checks": "npm run lint && npm test",
28
- "build": "node scripts/clean-build.js && tsc && npm run build --workspace=semantifold-tree-sitter-legacy-workspace",
29
+ "build": "node scripts/clean-build.js && tsc && npm run build --workspace=semantifold-tree-sitter-legacy-workspace && npm run build --workspace=semantifold-tree-sitter-zig-workspace",
29
30
  "eslint": "eslint --max-warnings 0 .",
30
31
  "lint": "npm run verify:legacy-runtime && npm run eslint && npm run typecheck",
31
32
  "prepack": "npm run verify:legacy-runtime && npm run build",
32
- "pretest": "npm run verify:legacy-runtime && npm run build --workspace=semantifold-tree-sitter-legacy-workspace",
33
+ "pretest": "npm run verify:legacy-runtime && npm run build --workspace=semantifold-tree-sitter-legacy-workspace && npm run build --workspace=semantifold-tree-sitter-zig-workspace",
33
34
  "test": "velocious-test spec",
34
- "typecheck": "tsc --noEmit && npm run typecheck --workspace=semantifold-tree-sitter-legacy-workspace",
35
+ "typecheck": "tsc --noEmit && npm run typecheck --workspace=semantifold-tree-sitter-legacy-workspace && npm run typecheck --workspace=semantifold-tree-sitter-zig-workspace",
35
36
  "verify:legacy-runtime": "node scripts/verify-legacy-runtime.js"
36
37
  },
37
38
  "engines": {
@@ -58,6 +59,7 @@
58
59
  "comment-parser": "^1.4.1",
59
60
  "php-parser": "^3.7.0",
60
61
  "semantifold-tree-sitter-legacy-internal": "file:packages/tree-sitter-legacy/runtime",
62
+ "semantifold-tree-sitter-zig-internal": "file:packages/tree-sitter-zig/runtime",
61
63
  "tree-sitter": "0.25.1",
62
64
  "tree-sitter-c-sharp": "0.23.5",
63
65
  "tree-sitter-dart-orchard": "0.7.0",
@@ -68,10 +70,12 @@
68
70
  },
69
71
  "bundleDependencies": [
70
72
  "semantifold-tree-sitter-legacy-internal",
73
+ "semantifold-tree-sitter-zig-internal",
71
74
  "tree-sitter"
72
75
  ],
73
76
  "acceptDependencies": {
74
- "semantifold-tree-sitter-legacy-internal": "0.1.0"
77
+ "semantifold-tree-sitter-legacy-internal": "0.1.0",
78
+ "semantifold-tree-sitter-zig-internal": "0.1.0"
75
79
  },
76
80
  "devDependencies": {
77
81
  "@eslint/js": "^10.0.1",
@@ -84,6 +88,7 @@
84
88
  "eslint-plugin-jsdoc-tag-lines": "^1.0.1",
85
89
  "globals": "^17.0.0",
86
90
  "semantifold-tree-sitter-legacy-workspace": "0.1.0",
91
+ "semantifold-tree-sitter-zig-workspace": "0.1.0",
87
92
  "typescript": "^7.0.0",
88
93
  "yaml": "^2.9.0"
89
94
  }
@@ -17,7 +17,7 @@ const projectRoot = "generated/android-app"
17
17
  const generatorVersion = "0.4.0"
18
18
  /** @type {Readonly<Set<import("../semantic/types.js").SemanticLanguage>>} */
19
19
  const androidSourceLanguages = new Set([
20
- "php", "ruby", "javascript", "typescript", "java", "kotlin", "python", "csharp", "go", "c", "cpp", "rust", "swift", "dart"
20
+ "php", "ruby", "javascript", "typescript", "java", "kotlin", "python", "csharp", "go", "c", "cpp", "rust", "swift", "dart", "zig"
21
21
  ])
22
22
  const requestFields = new Set(["assets", "configuration", "language", "module", "program", "resources", "role"])
23
23
  const configurationFields = new Set([
@@ -440,7 +440,11 @@ val semantifoldKotlinHome = providers.environmentVariable("SEMANTIFOLD_KOTLIN_HO
440
440
  ?: throw GradleException("SEMANTIFOLD_ANDROID_INFRASTRUCTURE: SEMANTIFOLD_KOTLIN_HOME is required")
441
441
  val semantifoldKotlinStdlib = file("$semantifoldKotlinHome/lib/kotlin-stdlib.jar")
442
442
  if (!semantifoldKotlinStdlib.isFile) {
443
- throw GradleException("SEMANTIFOLD_ANDROID_INFRASTRUCTURE: pinned Kotlin compile library is missing")
443
+ throw GradleException("SEMANTIFOLD_ANDROID_INFRASTRUCTURE: pinned Kotlin stdlib is missing")
444
+ }
445
+
446
+ dependencies {
447
+ androidTestImplementation(files(semantifoldKotlinStdlib))
444
448
  }
445
449
  val semantifoldAcceptanceRoot = providers.environmentVariable("SEMANTIFOLD_ANDROID_ACCEPTANCE_ROOT").orNull
446
450
  ?: throw GradleException("SEMANTIFOLD_ANDROID_INFRASTRUCTURE: SEMANTIFOLD_ANDROID_ACCEPTANCE_ROOT is required")
@@ -9,6 +9,7 @@ const identifierPatterns = {
9
9
  kotlin: /^(?:_|\p{L})(?:_|\p{L}|\p{Nd})*$/u,
10
10
  swift: /^(?:_|\p{XID_Start})(?:_|\p{XID_Continue})*$/u,
11
11
  rust: /^[A-Za-z_][A-Za-z0-9_]*$/u,
12
+ zig: /^[A-Za-z_][A-Za-z0-9_]*$/u,
12
13
  cpp: /^[A-Za-z][A-Za-z0-9_]*$/u,
13
14
  c: /^[A-Za-z][A-Za-z0-9_]*$/u,
14
15
  csharp: /^[A-Za-z_][A-Za-z0-9_]*$/u,
@@ -60,6 +61,18 @@ const reservedWords = {
60
61
  "unsafe", "use", "where", "while", "abstract", "become", "box", "do", "final", "macro", "override", "priv", "typeof", "unsized", "virtual",
61
62
  "yield", "try", "union", "_", "main", "String", "std", "i64", "bool"
62
63
  ]),
64
+ zig: new Set([
65
+ "addrspace", "align", "allowzero", "and", "anyerror", "anyframe", "anyopaque", "anytype", "asm", "async", "await", "break", "callconv",
66
+ "catch", "comptime", "const", "continue", "defer", "else", "enum", "errdefer", "error", "export", "extern", "false",
67
+ "fn", "for", "if", "inline", "linksection", "noalias", "noinline", "nosuspend", "null", "opaque", "or", "orelse",
68
+ "packed", "pub", "resume", "return", "struct", "suspend", "switch", "test", "threadlocal", "true", "try", "union",
69
+ "unreachable", "usingnamespace", "var", "volatile", "while", "_", "main", "std", "bool", "c_char", "c_int", "c_long",
70
+ "c_longdouble", "c_longlong", "c_short", "c_uint", "c_ulong", "c_ulonglong", "c_ushort", "comptime_float",
71
+ "comptime_int", "f16", "f32", "f64", "f80", "f128", "isize", "noreturn", "type", "undefined", "usize", "void",
72
+ "semantifold_arena", "semantifold_fail", "semantifold_integer_add", "semantifold_integer_subtract",
73
+ "semantifold_integer_multiply", "semantifold_integer_negate", "semantifold_string_concat", "semantifold_string_equal",
74
+ "semantifold_string_not_equal", "semantifold_print_integer", "semantifold_print_boolean", "semantifold_print_string"
75
+ ]),
63
76
  cpp: new Set([
64
77
  "alignas", "alignof", "and", "and_eq", "asm", "auto", "bitand", "bitor", "bool", "break", "case", "catch", "char", "char8_t", "char16_t", "char32_t", "class", "compl", "concept", "const", "consteval", "constexpr", "constinit", "const_cast", "continue", "co_await", "co_return", "co_yield", "decltype", "default", "delete", "do", "double", "dynamic_cast", "else", "enum", "explicit", "export", "extern", "false", "float", "for", "friend", "goto", "if", "inline", "int", "long", "mutable", "namespace", "new", "noexcept", "not", "not_eq", "nullptr", "operator", "or", "or_eq", "private", "protected", "public", "register", "reinterpret_cast", "requires", "return", "short", "signed", "sizeof", "static", "static_assert", "static_cast", "struct", "switch", "template", "this", "thread_local", "throw", "true", "try", "typedef", "typeid", "typename", "union", "unsigned", "using", "virtual", "void", "volatile", "wchar_t", "while", "xor", "xor_eq", "std", "string", "numeric_limits",
65
78
  // The qualified libstdc++ <string> include chain also exposes these global names.
@@ -229,6 +242,7 @@ export function validateTargetIdentifier(language, name, role, location) {
229
242
  language == "python" && name.normalize("NFKC") != name ||
230
243
  language == "c" && !isCIdentifier(name) ||
231
244
  language == "rust" && !isRustIdentifier(name) ||
245
+ language == "zig" && !isZigIdentifier(name) ||
232
246
  language == "cpp" && !isCppIdentifier(name) ||
233
247
  language == "dart" && !isDartIdentifier(name) ||
234
248
  language == "swift" && (!isSwiftIdentifier(name) || name.normalize("NFC") != name) ||
@@ -307,6 +321,16 @@ export function isRustIdentifier(name) {
307
321
  return identifierPatterns.rust.test(name) && !reservedWords.rust.has(name) && !name.startsWith("semantifold_")
308
322
  }
309
323
 
324
+ /**
325
+ * Protects Zig keywords, scalar names, entry plumbing, builtins, and the support namespace.
326
+ * @param {string} name - Caller-owned function or binding name.
327
+ * @returns {boolean} Whether ordinary unquoted Zig syntax can preserve the name.
328
+ */
329
+ export function isZigIdentifier(name) {
330
+ return identifierPatterns.zig.test(name) && !reservedWords.zig.has(name) && !/^[iu][0-9]+$/u.test(name) &&
331
+ !name.startsWith("semantifold_")
332
+ }
333
+
310
334
  /**
311
335
  * Protects Swift keywords, scalar names, entry plumbing, and target-only helper names.
312
336
  * @param {string} name - Caller-owned function or binding name.
@@ -13,7 +13,7 @@ import {SourceWriter} from "./writer.js"
13
13
 
14
14
  /** @type {Readonly<Set<import("../semantic/types.js").SemanticLanguage>>} */
15
15
  const iosSourceLanguages = new Set([
16
- "php", "ruby", "javascript", "typescript", "java", "kotlin", "python", "csharp", "go", "c", "cpp", "rust", "swift", "dart"
16
+ "php", "ruby", "javascript", "typescript", "java", "kotlin", "python", "csharp", "go", "c", "cpp", "rust", "swift", "dart", "zig"
17
17
  ])
18
18
  const configurationFields = new Set([
19
19
  "bundleIdentifier", "capabilities", "deploymentTarget", "displayName", "entitlements", "infoPlist", "lifecycle",
@@ -10,7 +10,7 @@ const semanticEdges = new Set(["functions", "entryPoint", "body", "parameters",
10
10
  /**
11
11
  * Bounds a native occurrence plan and rejects cycles before recursive shared validation.
12
12
  * @param {unknown} module - Untrusted backend request.
13
- * @param {"c" | "cpp" | "kotlin" | "rust" | "swift" | "wasm"} [language] - Backend diagnostic language.
13
+ * @param {"c" | "cpp" | "kotlin" | "rust" | "swift" | "wasm" | "zig"} [language] - Backend diagnostic language.
14
14
  * @returns {void}
15
15
  */
16
16
  export function validateNativeGraph(module, language = "c") {
@@ -2,6 +2,7 @@
2
2
 
3
3
  /** @type {Readonly<Record<import("../semantic/types.js").TextBackendLanguage, Readonly<Record<import("../semantic/types.js").FunctionReturnTypeName, string>>>>} */
4
4
  const targetScalarTypes = Object.freeze({
5
+ zig: Object.freeze({boolean: "bool", integer: "i64", string: "[]const u8", void: "void"}),
5
6
  dart: Object.freeze({boolean: "bool", integer: "int", string: "String", void: "void"}),
6
7
  swift: Object.freeze({boolean: "Bool", integer: "Int64", string: "String", void: "Void"}),
7
8
  rust: Object.freeze({boolean: "bool", integer: "i64", string: "String", void: "()"}),
@@ -27,7 +27,7 @@ const binaryOperationSyntax = Object.freeze({
27
27
  StringEqual: Object.freeze({default: "==", strict: "==="}),
28
28
  StringNotEqual: Object.freeze({default: "!=", strict: "!=="})
29
29
  })
30
- const task005Languages = new Set(["php", "ruby", "javascript", "typescript", "java", "dart"])
30
+ const task005Languages = new Set(["php", "ruby", "javascript", "typescript", "java", "dart", "zig"])
31
31
  const task006Languages = new Set(["php", "ruby", "javascript", "typescript", "java"])
32
32
  const task007Languages = new Set(["php", "ruby", "javascript", "typescript", "java"])
33
33
  const task008Languages = new Set(["php", "ruby", "javascript", "typescript", "java"])
@@ -1952,9 +1952,9 @@ function validateKnownTargetInteger(expression, language, location) {
1952
1952
  if (language == "java" && value !== undefined && (value < -2147483648n || value > 2147483647n)) {
1953
1953
  unsupportedCapability(language, "compile-time-known integer operation outside signed 32-bit int range", location)
1954
1954
  }
1955
- if ((language == "csharp" || language == "go" || language == "c" || language == "cpp" || language == "rust" || language == "swift" || language == "wasm") && value !== undefined &&
1955
+ if ((language == "csharp" || language == "go" || language == "c" || language == "cpp" || language == "rust" || language == "swift" || language == "wasm" || language == "zig") && value !== undefined &&
1956
1956
  (value < -9223372036854775808n || value > 9223372036854775807n)) {
1957
- const scalar = language == "wasm" ? "i64" : language == "swift" ? "Int64" : "long"
1957
+ const scalar = language == "wasm" || language == "zig" ? "i64" : language == "swift" ? "Int64" : "long"
1958
1958
 
1959
1959
  unsupportedCapability(language, `compile-time-known integer operation outside signed 64-bit ${scalar} range`, location)
1960
1960
  }
@@ -0,0 +1,93 @@
1
+ // @ts-check
2
+
3
+ /** Exact Zig 0.15.2 standard-library-only support; the frontend checks every token before collapse. */
4
+ export const zigRuntime = `const std = @import("std");
5
+
6
+ var semantifold_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
7
+
8
+ fn semantifold_fail(message: []const u8) noreturn {
9
+ std.fs.File.stderr().writeAll(message) catch {};
10
+ std.process.exit(70);
11
+ }
12
+
13
+ fn semantifold_integer_add(left: i64, right: i64) i64 {
14
+ const result = @addWithOverflow(left, right);
15
+ if (result[1] != 0) semantifold_fail("semantifold: integer overflow\\n");
16
+ return result[0];
17
+ }
18
+
19
+ fn semantifold_integer_subtract(left: i64, right: i64) i64 {
20
+ const result = @subWithOverflow(left, right);
21
+ if (result[1] != 0) semantifold_fail("semantifold: integer overflow\\n");
22
+ return result[0];
23
+ }
24
+
25
+ fn semantifold_integer_multiply(left: i64, right: i64) i64 {
26
+ const result = @mulWithOverflow(left, right);
27
+ if (result[1] != 0) semantifold_fail("semantifold: integer overflow\\n");
28
+ return result[0];
29
+ }
30
+
31
+ fn semantifold_integer_negate(value: i64) i64 {
32
+ return semantifold_integer_subtract(0, value);
33
+ }
34
+
35
+ fn semantifold_string_concat(left: []const u8, right: []const u8) []const u8 {
36
+ const size = @addWithOverflow(left.len, right.len);
37
+ if (size[1] != 0) semantifold_fail("semantifold: allocation failure\\n");
38
+ const bytes = semantifold_arena.allocator().alloc(u8, size[0]) catch semantifold_fail("semantifold: allocation failure\\n");
39
+ @memcpy(bytes[0..left.len], left);
40
+ @memcpy(bytes[left.len..], right);
41
+ return bytes;
42
+ }
43
+
44
+ fn semantifold_string_equal(left: []const u8, right: []const u8) bool {
45
+ return std.mem.eql(u8, left, right);
46
+ }
47
+
48
+ fn semantifold_string_not_equal(left: []const u8, right: []const u8) bool {
49
+ return !std.mem.eql(u8, left, right);
50
+ }
51
+
52
+ fn semantifold_write(value: []const u8) void {
53
+ const stdout = std.fs.File.stdout();
54
+ stdout.writeAll(value) catch semantifold_fail("semantifold: output failure\\n");
55
+ stdout.writeAll("\\n") catch semantifold_fail("semantifold: output failure\\n");
56
+ }
57
+
58
+ fn semantifold_print_integer(value: i64) void {
59
+ var buffer: [20]u8 = undefined;
60
+ const bytes = std.fmt.bufPrint(&buffer, "{d}", .{value}) catch semantifold_fail("semantifold: output failure\\n");
61
+ semantifold_write(bytes);
62
+ }
63
+
64
+ fn semantifold_print_boolean(value: bool) void {
65
+ semantifold_write(if (value) "true" else "false");
66
+ }
67
+
68
+ fn semantifold_print_string(value: []const u8) void {
69
+ semantifold_write(value);
70
+ }
71
+ `
72
+
73
+ /** Fixed native-host Zig build with only the selected optimization option and no package resolution. */
74
+ export const zigBuild = `const std = @import("std");
75
+
76
+ pub fn build(b: *std.Build) void {
77
+ const optimize = b.standardOptimizeOption(.{});
78
+ const executable = b.addExecutable(.{
79
+ .name = "semantifold-generated",
80
+ .root_module = b.createModule(.{
81
+ .root_source_file = b.path("src/main.zig"),
82
+ .target = b.graph.host,
83
+ .optimize = optimize,
84
+ }),
85
+ });
86
+ b.installArtifact(executable);
87
+
88
+ const tests = b.addTest(.{ .root_module = executable.root_module });
89
+ const run_tests = b.addRunArtifact(tests);
90
+ const test_step = b.step("test", "Compile and run tests");
91
+ test_step.dependOn(&run_tests.step);
92
+ }
93
+ `
@@ -0,0 +1,68 @@
1
+ // @ts-check
2
+
3
+ import {unsupportedCapability} from "../diagnostic.js"
4
+
5
+ /** Repository-owned bound for frozen CST traversal and deterministic project generation. */
6
+ export const maximumZigSourceLength = 1_000_000
7
+
8
+ /**
9
+ * Rejects statically impossible UTF-8 arena sizes without changing the semantic graph.
10
+ * @param {import("../semantic/types.js").SemanticModule} module - Fully validated module.
11
+ * @returns {void}
12
+ */
13
+ export function validateZigValues(module) {
14
+ /**
15
+ * Infers a known UTF-8 byte size while validating literal shape.
16
+ * @param {import("../semantic/types.js").Expression} expression - Expression to inspect.
17
+ * @param {Map<string, bigint | undefined>} sizes - Known binding sizes.
18
+ * @returns {bigint | undefined} Known byte size when statically available.
19
+ */
20
+ const size = (expression, sizes) => {
21
+ if (expression.kind == "IntegerLiteral" && (!Number.isSafeInteger(expression.value) || expression.value < 0 || Object.is(expression.value, -0))) {
22
+ unsupportedCapability("zig", "non-safe or noncanonical i64 literal", expression.location)
23
+ }
24
+ if (expression.kind == "StringLiteral") return BigInt(Buffer.byteLength(expression.value, "utf8"))
25
+ if (expression.kind == "IdentifierExpression") return sizes.get(expression.name)
26
+ if (expression.kind == "CallExpression") expression.arguments.forEach(argument => size(argument, sizes))
27
+ else if (expression.kind == "UnaryExpression") size(expression.operand, sizes)
28
+ else if (expression.kind == "BinaryExpression") {
29
+ const left = size(expression.left, sizes)
30
+ const right = size(expression.right, sizes)
31
+
32
+ if (expression.operation == "StringConcat") {
33
+ if ((left ?? 0n) + (right ?? 0n) > 9223372036854775807n) {
34
+ unsupportedCapability("zig", "known immutable UTF-8 slice exceeds the qualified native allocation limit", expression.location)
35
+ }
36
+ if (left !== undefined && right !== undefined) return left + right
37
+ }
38
+ }
39
+ return undefined
40
+ }
41
+ /**
42
+ * Propagates conservative known string sizes through one block.
43
+ * @param {import("../semantic/types.js").Block} block - Block to inspect.
44
+ * @param {Map<string, bigint | undefined>} inherited - Sizes visible on entry.
45
+ * @returns {Map<string, bigint | undefined>} Sizes known after the block.
46
+ */
47
+ const visit = (block, inherited) => {
48
+ const sizes = new Map(inherited)
49
+
50
+ for (const statement of block.statements) {
51
+ if (statement.kind == "LocalDeclaration") sizes.set(statement.name, size(statement.initializer, sizes))
52
+ else if (statement.kind == "AssignmentStatement") sizes.set(statement.target.name, size(statement.expression, sizes))
53
+ else if (statement.kind == "IfStatement") {
54
+ size(statement.condition, sizes)
55
+ const left = visit(statement.consequent, sizes)
56
+ const right = statement.alternate ? visit(statement.alternate, sizes) : sizes
57
+
58
+ for (const name of sizes.keys()) sizes.set(name, left.get(name) === right.get(name) ? left.get(name) : undefined)
59
+ } else if (statement.kind == "ExpressionStatement" || statement.kind == "PrintStatement" || statement.kind == "ReturnStatement") {
60
+ if (statement.expression) size(statement.expression, sizes)
61
+ }
62
+ }
63
+ return sizes
64
+ }
65
+
66
+ for (const declaration of module.functions) visit(declaration.body, new Map())
67
+ visit(module.entryPoint.body, new Map())
68
+ }