gitnexus 1.6.11-rc.8 → 1.6.11

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 (531) hide show
  1. package/README.md +95 -26
  2. package/dist/_shared/graph/types.d.ts +81 -2
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
  5. package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
  6. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  7. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  8. package/dist/_shared/language-detection.d.ts.map +1 -1
  9. package/dist/_shared/language-detection.js +2 -0
  10. package/dist/_shared/language-detection.js.map +1 -1
  11. package/dist/_shared/languages.d.ts +2 -1
  12. package/dist/_shared/languages.d.ts.map +1 -1
  13. package/dist/_shared/languages.js +1 -0
  14. package/dist/_shared/languages.js.map +1 -1
  15. package/dist/_shared/lbug/schema-constants.d.ts +2 -2
  16. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  17. package/dist/_shared/lbug/schema-constants.js +4 -0
  18. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  19. package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
  20. package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -0
  21. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  22. package/dist/_shared/scope-resolution/language-classification.d.ts +3 -0
  23. package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
  24. package/dist/_shared/scope-resolution/language-classification.js +4 -0
  25. package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
  26. package/dist/_shared/scope-resolution/reference-site.d.ts +10 -0
  27. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  28. package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
  29. package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
  30. package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
  31. package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
  32. package/dist/_shared/scope-resolution/types.d.ts +15 -0
  33. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  34. package/dist/cli/ai-context.d.ts +4 -0
  35. package/dist/cli/ai-context.js +90 -14
  36. package/dist/cli/analyze-config.js +14 -0
  37. package/dist/cli/analyze-options.d.ts +14 -0
  38. package/dist/cli/analyze-watch.d.ts +20 -0
  39. package/dist/cli/analyze-watch.js +434 -0
  40. package/dist/cli/analyze.js +27 -9
  41. package/dist/cli/auto-sync.d.ts +1 -0
  42. package/dist/cli/auto-sync.js +107 -0
  43. package/dist/cli/command-banner.d.ts +15 -0
  44. package/dist/cli/command-banner.js +42 -0
  45. package/dist/cli/detect-changes-format.js +21 -0
  46. package/dist/cli/doctor.d.ts +7 -0
  47. package/dist/cli/doctor.js +14 -0
  48. package/dist/cli/group.js +7 -1
  49. package/dist/cli/help-i18n.js +4 -0
  50. package/dist/cli/i18n/en.d.ts +18 -3
  51. package/dist/cli/i18n/en.js +18 -3
  52. package/dist/cli/i18n/resources.d.ts +33 -3
  53. package/dist/cli/i18n/zh-CN.d.ts +15 -0
  54. package/dist/cli/i18n/zh-CN.js +18 -3
  55. package/dist/cli/index.js +34 -7
  56. package/dist/cli/mcp.d.ts +15 -0
  57. package/dist/cli/mcp.js +44 -0
  58. package/dist/cli/optional-grammars.d.ts +3 -2
  59. package/dist/cli/optional-grammars.js +19 -3
  60. package/dist/cli/setup.js +41 -15
  61. package/dist/cli/update-notice.d.ts +34 -0
  62. package/dist/cli/update-notice.js +91 -0
  63. package/dist/cli/update.d.ts +21 -0
  64. package/dist/cli/update.js +93 -0
  65. package/dist/cli/watch.d.ts +1 -20
  66. package/dist/cli/watch.js +5 -371
  67. package/dist/core/analysis-feature-registry.d.ts +2 -0
  68. package/dist/core/analysis-feature-registry.js +15 -0
  69. package/dist/core/analyzer-identity.js +21 -3
  70. package/dist/core/auto-sync/analysis-worker-launch.d.ts +30 -0
  71. package/dist/core/auto-sync/analysis-worker-launch.js +166 -0
  72. package/dist/core/auto-sync/config.d.ts +33 -0
  73. package/dist/core/auto-sync/config.js +320 -0
  74. package/dist/core/auto-sync/index.d.ts +6 -0
  75. package/dist/core/auto-sync/index.js +6 -0
  76. package/dist/core/auto-sync/path-security.d.ts +9 -0
  77. package/dist/core/auto-sync/path-security.js +251 -0
  78. package/dist/core/auto-sync/repo.d.ts +1 -0
  79. package/dist/core/auto-sync/repo.js +6 -0
  80. package/dist/core/auto-sync/runner.d.ts +44 -0
  81. package/dist/core/auto-sync/runner.js +428 -0
  82. package/dist/core/auto-sync/starter.d.ts +50 -0
  83. package/dist/core/auto-sync/starter.js +497 -0
  84. package/dist/core/auto-sync/state.d.ts +37 -0
  85. package/dist/core/auto-sync/state.js +119 -0
  86. package/dist/core/group/config-parser.js +8 -1
  87. package/dist/core/group/cross-impact.d.ts +3 -0
  88. package/dist/core/group/cross-impact.js +36 -4
  89. package/dist/core/group/extractors/http-patterns/java.js +22 -8
  90. package/dist/core/group/extractors/http-patterns/kotlin.js +86 -31
  91. package/dist/core/group/extractors/http-patterns/node.js +145 -8
  92. package/dist/core/group/extractors/http-patterns/python.js +11 -7
  93. package/dist/core/group/extractors/http-route-extractor.js +63 -17
  94. package/dist/core/group/extractors/java-workspace-extractor.js +244 -31
  95. package/dist/core/group/group-lock.js +5 -6
  96. package/dist/core/group/normalization.d.ts +38 -1
  97. package/dist/core/group/normalization.js +59 -3
  98. package/dist/core/group/service.d.ts +11 -0
  99. package/dist/core/group/service.js +13 -1
  100. package/dist/core/group/storage.js +2 -2
  101. package/dist/core/group/sync.d.ts +24 -1
  102. package/dist/core/group/sync.js +46 -8
  103. package/dist/core/group/types.d.ts +13 -0
  104. package/dist/core/incremental/derived-writeback.d.ts +36 -0
  105. package/dist/core/incremental/derived-writeback.js +68 -0
  106. package/dist/core/incremental/spring-config-drift.d.ts +12 -0
  107. package/dist/core/incremental/spring-config-drift.js +46 -0
  108. package/dist/core/incremental/subgraph-extract.d.ts +7 -4
  109. package/dist/core/incremental/subgraph-extract.js +30 -5
  110. package/dist/core/ingestion/asyncapi/document.d.ts +226 -0
  111. package/dist/core/ingestion/asyncapi/document.js +758 -0
  112. package/dist/core/ingestion/asyncapi/protocol.d.ts +79 -0
  113. package/dist/core/ingestion/asyncapi/protocol.js +203 -0
  114. package/dist/core/ingestion/call-extractors/configs/zig.d.ts +2 -0
  115. package/dist/core/ingestion/call-extractors/configs/zig.js +4 -0
  116. package/dist/core/ingestion/call-extractors/zig-static-gating.d.ts +100 -0
  117. package/dist/core/ingestion/call-extractors/zig-static-gating.js +319 -0
  118. package/dist/core/ingestion/call-processor.js +3 -1
  119. package/dist/core/ingestion/class-extractors/configs/zig.d.ts +2 -0
  120. package/dist/core/ingestion/class-extractors/configs/zig.js +32 -0
  121. package/dist/core/ingestion/class-extractors/generic.js +4 -1
  122. package/dist/core/ingestion/class-types.d.ts +6 -2
  123. package/dist/core/ingestion/destination-key.d.ts +59 -0
  124. package/dist/core/ingestion/destination-key.js +61 -0
  125. package/dist/core/ingestion/entry-point-scoring.d.ts +6 -2
  126. package/dist/core/ingestion/entry-point-scoring.js +8 -44
  127. package/dist/core/ingestion/export-detection.d.ts +37 -0
  128. package/dist/core/ingestion/export-detection.js +60 -0
  129. package/dist/core/ingestion/field-extractors/configs/zig.d.ts +8 -0
  130. package/dist/core/ingestion/field-extractors/configs/zig.js +49 -0
  131. package/dist/core/ingestion/field-extractors/generic.d.ts +1 -1
  132. package/dist/core/ingestion/field-extractors/generic.js +12 -1
  133. package/dist/core/ingestion/frameworks/spring/actuator-runtime.d.ts +26 -0
  134. package/dist/core/ingestion/frameworks/spring/actuator-runtime.js +843 -0
  135. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +5 -0
  136. package/dist/core/ingestion/frameworks/spring/analysis-features.js +9 -0
  137. package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +8 -1
  138. package/dist/core/ingestion/frameworks/spring/argument-facts.d.ts +80 -0
  139. package/dist/core/ingestion/frameworks/spring/argument-facts.js +85 -0
  140. package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +1 -0
  141. package/dist/core/ingestion/frameworks/spring/config-bindings.js +2 -1
  142. package/dist/core/ingestion/frameworks/spring/destinations.d.ts +539 -0
  143. package/dist/core/ingestion/frameworks/spring/destinations.js +840 -0
  144. package/dist/core/ingestion/frameworks/spring/dynamic-lookups.d.ts +22 -0
  145. package/dist/core/ingestion/frameworks/spring/dynamic-lookups.js +124 -0
  146. package/dist/core/ingestion/frameworks/spring/message-producers.d.ts +78 -0
  147. package/dist/core/ingestion/frameworks/spring/message-producers.js +90 -0
  148. package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +29 -0
  149. package/dist/core/ingestion/frameworks/spring/vendor-prefixes.d.ts +7 -0
  150. package/dist/core/ingestion/frameworks/spring/vendor-prefixes.js +22 -0
  151. package/dist/core/ingestion/import-resolvers/configs/zig.d.ts +13 -0
  152. package/dist/core/ingestion/import-resolvers/configs/zig.js +26 -0
  153. package/dist/core/ingestion/import-resolvers/zig.d.ts +34 -0
  154. package/dist/core/ingestion/import-resolvers/zig.js +193 -0
  155. package/dist/core/ingestion/language-config.d.ts +177 -0
  156. package/dist/core/ingestion/language-config.js +719 -0
  157. package/dist/core/ingestion/language-provider.d.ts +178 -1
  158. package/dist/core/ingestion/language-provider.js +22 -0
  159. package/dist/core/ingestion/languages/csharp/razor-view-components.d.ts +62 -0
  160. package/dist/core/ingestion/languages/csharp/razor-view-components.js +954 -0
  161. package/dist/core/ingestion/languages/csharp/resolution-config.d.ts +3 -0
  162. package/dist/core/ingestion/languages/csharp/resolution-config.js +6 -1
  163. package/dist/core/ingestion/languages/csharp/scope-resolver.js +8 -0
  164. package/dist/core/ingestion/languages/index.d.ts +1 -0
  165. package/dist/core/ingestion/languages/index.js +2 -0
  166. package/dist/core/ingestion/languages/java/analysis-features.d.ts +1 -1
  167. package/dist/core/ingestion/languages/java/analysis-features.js +14 -6
  168. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +8 -0
  169. package/dist/core/ingestion/languages/java/capture-side-channel.js +34 -0
  170. package/dist/core/ingestion/languages/java/captures.js +22 -1
  171. package/dist/core/ingestion/languages/java/lombok-synthesizer.d.ts +42 -0
  172. package/dist/core/ingestion/languages/java/lombok-synthesizer.js +439 -0
  173. package/dist/core/ingestion/languages/java/scope-resolver.js +2 -0
  174. package/dist/core/ingestion/languages/java/spring-actuator.d.ts +2 -0
  175. package/dist/core/ingestion/languages/java/spring-actuator.js +62 -0
  176. package/dist/core/ingestion/languages/java/spring-di.d.ts +17 -1
  177. package/dist/core/ingestion/languages/java/spring-di.js +44 -2
  178. package/dist/core/ingestion/languages/java/spring-dynamic-lookup.d.ts +8 -0
  179. package/dist/core/ingestion/languages/java/spring-dynamic-lookup.js +62 -0
  180. package/dist/core/ingestion/languages/java/spring-message-producers.d.ts +20 -0
  181. package/dist/core/ingestion/languages/java/spring-message-producers.js +83 -0
  182. package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +11 -1
  183. package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +13 -3
  184. package/dist/core/ingestion/languages/java.js +18 -8
  185. package/dist/core/ingestion/languages/jvm/accessor-synthesis.d.ts +99 -0
  186. package/dist/core/ingestion/languages/jvm/accessor-synthesis.js +173 -0
  187. package/dist/core/ingestion/languages/jvm/beanspec.d.ts +17 -0
  188. package/dist/core/ingestion/languages/jvm/beanspec.js +42 -0
  189. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
  190. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +50 -0
  191. package/dist/core/ingestion/languages/kotlin/captures.js +24 -1
  192. package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.d.ts +26 -0
  193. package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.js +417 -0
  194. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +4 -0
  195. package/dist/core/ingestion/languages/kotlin/spring-actuator.d.ts +4 -0
  196. package/dist/core/ingestion/languages/kotlin/spring-actuator.js +172 -0
  197. package/dist/core/ingestion/languages/kotlin/spring-config-bindings.d.ts +18 -0
  198. package/dist/core/ingestion/languages/kotlin/spring-config-bindings.js +411 -0
  199. package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +51 -1
  200. package/dist/core/ingestion/languages/kotlin/spring-di.js +86 -6
  201. package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.d.ts +8 -0
  202. package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.js +77 -0
  203. package/dist/core/ingestion/languages/kotlin/spring-message-producers.d.ts +17 -0
  204. package/dist/core/ingestion/languages/kotlin/spring-message-producers.js +119 -0
  205. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +16 -0
  206. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +77 -2
  207. package/dist/core/ingestion/languages/kotlin.js +24 -0
  208. package/dist/core/ingestion/languages/python.js +2 -0
  209. package/dist/core/ingestion/languages/rust/query.js +8 -8
  210. package/dist/core/ingestion/languages/zig/captures.d.ts +260 -0
  211. package/dist/core/ingestion/languages/zig/captures.js +2070 -0
  212. package/dist/core/ingestion/languages/zig/index.d.ts +4 -0
  213. package/dist/core/ingestion/languages/zig/index.js +4 -0
  214. package/dist/core/ingestion/languages/zig/interpret.d.ts +36 -0
  215. package/dist/core/ingestion/languages/zig/interpret.js +176 -0
  216. package/dist/core/ingestion/languages/zig/query.d.ts +3 -0
  217. package/dist/core/ingestion/languages/zig/query.js +426 -0
  218. package/dist/core/ingestion/languages/zig/range-binding.d.ts +37 -0
  219. package/dist/core/ingestion/languages/zig/range-binding.js +373 -0
  220. package/dist/core/ingestion/languages/zig/scope-resolver.d.ts +12 -0
  221. package/dist/core/ingestion/languages/zig/scope-resolver.js +58 -0
  222. package/dist/core/ingestion/languages/zig/simple-hooks.d.ts +25 -0
  223. package/dist/core/ingestion/languages/zig/simple-hooks.js +143 -0
  224. package/dist/core/ingestion/languages/zig.d.ts +32 -0
  225. package/dist/core/ingestion/languages/zig.js +130 -0
  226. package/dist/core/ingestion/method-extractors/configs/zig.d.ts +2 -0
  227. package/dist/core/ingestion/method-extractors/configs/zig.js +120 -0
  228. package/dist/core/ingestion/method-extractors/generic.js +16 -4
  229. package/dist/core/ingestion/method-types.d.ts +10 -4
  230. package/dist/core/ingestion/model/field-registry.d.ts +3 -3
  231. package/dist/core/ingestion/model/field-registry.js +11 -7
  232. package/dist/core/ingestion/model/method-registry.d.ts +3 -3
  233. package/dist/core/ingestion/model/method-registry.js +13 -8
  234. package/dist/core/ingestion/model/registration-table.js +3 -0
  235. package/dist/core/ingestion/model/type-registry.js +8 -4
  236. package/dist/core/ingestion/pipeline-phases/di.js +47 -14
  237. package/dist/core/ingestion/pipeline-phases/index.d.ts +1 -0
  238. package/dist/core/ingestion/pipeline-phases/index.js +1 -0
  239. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +7 -1
  240. package/dist/core/ingestion/pipeline-phases/parse-impl.js +79 -91
  241. package/dist/core/ingestion/pipeline-phases/parse.d.ts +17 -0
  242. package/dist/core/ingestion/pipeline-phases/processes.d.ts +2 -1
  243. package/dist/core/ingestion/pipeline-phases/processes.js +39 -4
  244. package/dist/core/ingestion/pipeline-phases/routes.js +27 -18
  245. package/dist/core/ingestion/pipeline-phases/runner.d.ts +4 -1
  246. package/dist/core/ingestion/pipeline-phases/runner.js +34 -14
  247. package/dist/core/ingestion/pipeline-phases/scan.js +82 -1
  248. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +2 -0
  249. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +8 -0
  250. package/dist/core/ingestion/pipeline-phases/spring-destinations.d.ts +123 -0
  251. package/dist/core/ingestion/pipeline-phases/spring-destinations.js +688 -0
  252. package/dist/core/ingestion/pipeline.d.ts +30 -1
  253. package/dist/core/ingestion/pipeline.js +52 -14
  254. package/dist/core/ingestion/resolve-references.js +5 -0
  255. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +16 -0
  256. package/dist/core/ingestion/route-extractors/constant-resolver.js +10 -0
  257. package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +27 -1
  258. package/dist/core/ingestion/route-extractors/java-const-resolver.js +161 -13
  259. package/dist/core/ingestion/route-extractors/kotlin-const-resolver.d.ts +12 -18
  260. package/dist/core/ingestion/route-extractors/kotlin-const-resolver.js +214 -33
  261. package/dist/core/ingestion/route-extractors/kotlin-spring.d.ts +13 -0
  262. package/dist/core/ingestion/route-extractors/kotlin-spring.js +259 -0
  263. package/dist/core/ingestion/route-extractors/python-decorator-handler.d.ts +6 -0
  264. package/dist/core/ingestion/route-extractors/python-decorator-handler.js +16 -0
  265. package/dist/core/ingestion/route-extractors/spring-shared.d.ts +30 -1
  266. package/dist/core/ingestion/route-extractors/spring-shared.js +77 -9
  267. package/dist/core/ingestion/route-extractors/spring.js +9 -5
  268. package/dist/core/ingestion/scope-extractor.js +8 -0
  269. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +62 -0
  270. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +4 -0
  271. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +2 -0
  272. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +28 -0
  273. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +11 -2
  274. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +23 -2
  275. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +24 -3
  276. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +11 -1
  277. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +26 -6
  278. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +11 -0
  279. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +29 -3
  280. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +8 -1
  281. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +35 -9
  282. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +1 -4
  283. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +277 -9
  284. package/dist/core/ingestion/scope-resolution/pipeline/registry.js +2 -0
  285. package/dist/core/ingestion/scope-resolution/pipeline/run.js +7 -3
  286. package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +43 -9
  287. package/dist/core/ingestion/scope-resolution/scope/walkers.js +71 -10
  288. package/dist/core/ingestion/tree-sitter-queries.d.ts +1 -0
  289. package/dist/core/ingestion/tree-sitter-queries.js +161 -0
  290. package/dist/core/ingestion/type-extractors/zig.d.ts +2 -0
  291. package/dist/core/ingestion/type-extractors/zig.js +17 -0
  292. package/dist/core/ingestion/utils/ast-helpers.d.ts +40 -1
  293. package/dist/core/ingestion/utils/ast-helpers.js +124 -6
  294. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +9 -0
  295. package/dist/core/ingestion/utils/callable-flow-captures.js +75 -14
  296. package/dist/core/ingestion/utils/test-file-path.d.ts +28 -0
  297. package/dist/core/ingestion/utils/test-file-path.js +87 -0
  298. package/dist/core/ingestion/variable-extractors/configs/zig.d.ts +2 -0
  299. package/dist/core/ingestion/variable-extractors/configs/zig.js +71 -0
  300. package/dist/core/ingestion/workers/parse-worker.js +85 -14
  301. package/dist/core/install-context.d.ts +4 -0
  302. package/dist/core/install-context.js +152 -0
  303. package/dist/core/lbug/csv-generator.d.ts +10 -1
  304. package/dist/core/lbug/csv-generator.js +92 -22
  305. package/dist/core/lbug/graph-emit-sink.d.ts +3 -2
  306. package/dist/core/lbug/graph-emit-sink.js +4 -2
  307. package/dist/core/lbug/lbug-adapter.d.ts +100 -5
  308. package/dist/core/lbug/lbug-adapter.js +236 -24
  309. package/dist/core/lbug/schema.d.ts +6 -5
  310. package/dist/core/lbug/schema.js +84 -22
  311. package/dist/core/net/url-guard.d.ts +6 -0
  312. package/dist/core/net/url-guard.js +147 -0
  313. package/dist/core/package-version.d.ts +5 -0
  314. package/dist/core/package-version.js +10 -0
  315. package/dist/core/run-analyze.d.ts +21 -4
  316. package/dist/core/run-analyze.js +426 -117
  317. package/dist/core/search/fts-indexes.d.ts +19 -1
  318. package/dist/core/search/fts-indexes.js +28 -1
  319. package/dist/core/tree-sitter/parser-loader.js +16 -0
  320. package/dist/core/update-cache.d.ts +39 -0
  321. package/dist/core/update-cache.js +141 -0
  322. package/dist/core/update-check.d.ts +31 -0
  323. package/dist/core/update-check.js +274 -0
  324. package/dist/mcp/local/local-backend.d.ts +27 -13
  325. package/dist/mcp/local/local-backend.js +148 -60
  326. package/dist/mcp/repository-policy.d.ts +5 -1
  327. package/dist/mcp/repository-policy.js +48 -4
  328. package/dist/mcp/resources.js +10 -1
  329. package/dist/mcp/server.js +8 -9
  330. package/dist/mcp/tools.js +32 -22
  331. package/dist/server/analyze-launch.d.ts +2 -0
  332. package/dist/server/analyze-launch.js +2 -0
  333. package/dist/server/analyze-worker-protocol.d.ts +6 -1
  334. package/dist/server/analyze-worker.d.ts +1 -0
  335. package/dist/server/analyze-worker.js +38 -20
  336. package/dist/server/api.d.ts +5 -1
  337. package/dist/server/api.js +105 -88
  338. package/dist/server/git-clone.d.ts +40 -16
  339. package/dist/server/git-clone.js +253 -199
  340. package/dist/server/grep-params.d.ts +18 -0
  341. package/dist/server/grep-params.js +83 -0
  342. package/dist/server/grep-scan.d.ts +23 -0
  343. package/dist/server/grep-scan.js +107 -0
  344. package/dist/server/grep-worker.d.ts +1 -0
  345. package/dist/server/grep-worker.js +12 -0
  346. package/dist/server/mcp-http.d.ts +8 -0
  347. package/dist/server/mcp-http.js +16 -1
  348. package/dist/server/update-controller.d.ts +29 -0
  349. package/dist/server/update-controller.js +82 -0
  350. package/dist/storage/file-lock.d.ts +15 -0
  351. package/dist/storage/file-lock.js +155 -0
  352. package/dist/storage/fs-atomic.d.ts +24 -0
  353. package/dist/storage/fs-atomic.js +86 -2
  354. package/dist/storage/global-dir.d.ts +2 -0
  355. package/dist/storage/global-dir.js +6 -0
  356. package/dist/storage/parse-cache.d.ts +45 -7
  357. package/dist/storage/parse-cache.js +189 -42
  358. package/dist/storage/parsedfile-store.d.ts +41 -60
  359. package/dist/storage/parsedfile-store.js +247 -171
  360. package/dist/storage/repo-manager.d.ts +10 -4
  361. package/dist/storage/repo-manager.js +35 -25
  362. package/dist/storage/repo-meta.d.ts +34 -0
  363. package/dist/storage/v8-sidecar.d.ts +48 -0
  364. package/dist/storage/v8-sidecar.js +347 -0
  365. package/dist/types/pipeline.d.ts +14 -0
  366. package/dist/utils/process-identity.d.ts +2 -0
  367. package/dist/utils/process-identity.js +35 -0
  368. package/package.json +10 -4
  369. package/scripts/assert-web-assets.mjs +35 -0
  370. package/scripts/build-web.js +72 -0
  371. package/scripts/build.js +31 -28
  372. package/scripts/cross-platform-tests.ts +5 -0
  373. package/skills/gitnexus-cli.md +5 -1
  374. package/web/assets/ProcessFlowModal-DAeX2BHW.js +24 -0
  375. package/web/assets/{abnfDiagram-QNN2D4NM-Cq2djWWe.js → abnfDiagram-PAR5IXJI-J3OdeHLl.js} +1 -1
  376. package/web/assets/{agent-BWAXPjC5.js → agent-BMRqXorA.js} +6 -4
  377. package/web/assets/architecture-7GRP2DOG-M7G3SWCO-G3sWyX6M.js +1 -0
  378. package/web/assets/architectureDiagram-2PNWDENW-ysKcRlGT.js +36 -0
  379. package/web/assets/blockDiagram-PUWGUBOA-oLXTa1lY.js +129 -0
  380. package/web/assets/c4Diagram-3NLNHZP5-D3iu4eC0.js +38 -0
  381. package/web/assets/{chunk-2SREHG4O-Dip42xOq.js → chunk-2NMSUPJH-B24w-wng.js} +1 -1
  382. package/web/assets/{chunk-VJFVEZTB-CX66F2ep.js → chunk-32MCUW2P-ByUyt0Sa.js} +3 -3
  383. package/web/assets/{chunk-4RFN2BYJ-DHHWuC-n.js → chunk-3NPNU5GP-DocZ07Sg.js} +1 -1
  384. package/web/assets/{chunk-XNMVGMAZ-Cg_LnPtj.js → chunk-3SMGFRGC-CAu4JRLv.js} +1 -1
  385. package/web/assets/{chunk-W44A43WB-BN8EQc_u.js → chunk-4CAJECRU-DRYMwG9z.js} +1 -1
  386. package/web/assets/chunk-4OADUZ5Q-CxrSvOwZ.js +10 -0
  387. package/web/assets/{chunk-DMV4VAQV-Bn6WXDSX.js → chunk-5IQCK5RY-CCMhl4so.js} +2 -2
  388. package/web/assets/{chunk-RRFMTAIC-CMN0wcYA.js → chunk-5MVFYWFU-Db9KvrYO.js} +1 -1
  389. package/web/assets/chunk-CLS4B6BI-Uvx5QNsu.js +168 -0
  390. package/web/assets/chunk-DZP67EKU-B3Mt380j.js +70 -0
  391. package/web/assets/{chunk-6L755F7B-CMhLBxi2.js → chunk-EICP7K5X-CqwE9hui.js} +1 -1
  392. package/web/assets/{chunk-BI6VK774-D0oaWk8V.js → chunk-GDY2UAB4-CtQQR0a8.js} +1 -1
  393. package/web/assets/chunk-H7VHZCWX-CE1nAmt6.js +1 -0
  394. package/web/assets/chunk-IJBDOHL6-BUKtY6oF.js +1 -0
  395. package/web/assets/{chunk-OIYT25JQ-CQ6KOZGX.js → chunk-JFFVMJIA-0fJenqia.js} +1 -1
  396. package/web/assets/{chunk-HNC4WDU7-DoU3KnA7.js → chunk-JZGDI5JK-BeTMSSkJ.js} +1 -1
  397. package/web/assets/{chunk-EQFTRU2I-1ix7TzW9.js → chunk-KD6SPIPN-Qp1Pflah.js} +1 -1
  398. package/web/assets/chunk-NF366YI6-CpSpya3n.js +231 -0
  399. package/web/assets/chunk-NUDPKBEF-CU1-BQIW.js +34 -0
  400. package/web/assets/{chunk-SATU7PGQ-B1zhgOvc.js → chunk-OJINMHTS-zOCQe4eI.js} +1 -1
  401. package/web/assets/{chunk-E5QJAATJ-dh-5CtIV.js → chunk-Q6NGPIAH-yyBomb63.js} +1 -1
  402. package/web/assets/chunk-QJSWEUOL-D_rf9gPD.js +128 -0
  403. package/web/assets/chunk-R7JDMUKV-CRoqKpD6.js +1 -0
  404. package/web/assets/{chunk-VE5CLXGZ-C1vB7wpY.js → chunk-RCXAM2GK-CUqrWQDV.js} +1 -1
  405. package/web/assets/{chunk-66DQ2XMT-CM0xjFAN.js → chunk-RT4MAWR3-zXy9-Lvt.js} +1 -1
  406. package/web/assets/{chunk-TZUXEDM2-B7p9AcTw.js → chunk-SFMINX4W-J2UrvMpD.js} +1 -1
  407. package/web/assets/{chunk-LORZLZWG-B57uGw2N.js → chunk-SLDQ463B-CHY6e_bQ.js} +2 -2
  408. package/web/assets/{chunk-FWYVLQTC-BgDItRzJ.js → chunk-TCEHX7R3-CXPDEVbm.js} +1 -1
  409. package/web/assets/{chunk-224SPVON-B8gxtXpy.js → chunk-VQC2EELJ-Dc8fIy4R.js} +1 -1
  410. package/web/assets/chunk-VRZKL3EH-DB3KixTQ.js +1 -0
  411. package/web/assets/{chunk-A7VWPJGB-B4O3oQdQ.js → chunk-VTHDQ7BV-b7FsPQZO.js} +1 -1
  412. package/web/assets/chunk-VY2OSTJR-Dkgc3Brg.js +2 -0
  413. package/web/assets/chunk-WUBWJARI-7FwILJ3k.js +2 -0
  414. package/web/assets/{chunk-D6VWDJW2-BxcBdZ9c.js → chunk-YBMQ5JGJ-BSnyWZmd.js} +1 -1
  415. package/web/assets/chunk-YDMLL4PJ-IHhMngTz.js +2 -0
  416. package/web/assets/chunk-Z6V44ARX-BjCEsF0Q.js +62 -0
  417. package/web/assets/chunk-ZJJ7VQJP-Dz089b-K.js +321 -0
  418. package/web/assets/chunk-ZNLK7HRR-B0iFpmW4.js +1 -0
  419. package/web/assets/chunk-ZQN7UHIL-Cy7KAjQt.js +1 -0
  420. package/web/assets/{chunk-L5GCOVLC-CE2w8Nm_.js → chunk-ZS6VBONO-DBjJO0w9.js} +2 -2
  421. package/web/assets/{chunk-NV3KIAZN-5yvcpMiu.js → chunk-ZUNWM646-DNRJyNPe.js} +1 -1
  422. package/web/assets/classDiagram-FGAMPOII-C5Ibyode.js +1 -0
  423. package/web/assets/classDiagram-v2-AI5RJEK4-C5Ibyode.js +1 -0
  424. package/web/assets/{cose-bilkent-RZA4XIPR-BHpK4Crp.js → cose-bilkent-Q72C2OJ3-DMeFXnK8.js} +1 -1
  425. package/web/assets/cynefin-OW5HDTMX-6OCTWOGG-vlqakYcO.js +1 -0
  426. package/web/assets/{cynefinDiagram-TR7LZUCG-C3Iar9lZ.js → cynefinDiagram-2OOWUY4M-BY6DZkTt.js} +1 -1
  427. package/web/assets/dagre-MPVFI544-DWO70fy_.js +4 -0
  428. package/web/assets/diagram-AE4NWXFW-f7JRVRUL.js +24 -0
  429. package/web/assets/{diagram-L7DVE3PN-GIRyVUtt.js → diagram-BUJID5UG-BXZv1rCS.js} +2 -2
  430. package/web/assets/{diagram-JCD7PQ7C-DC5-9FRr.js → diagram-C44CZ5NI-CRNfvjCq.js} +1 -1
  431. package/web/assets/diagram-EYOLEXXS-DZOjKQVE.js +30 -0
  432. package/web/assets/diagram-P7B6PWOJ-D3SQmw3_.js +3 -0
  433. package/web/assets/{ebnfDiagram-DRHRQJWO-D8_CI4ZF.js → ebnfDiagram-FTPZ3PV6-jKWpIDN2.js} +1 -1
  434. package/web/assets/erDiagram-H3ERR26V-BqJntEuJ.js +99 -0
  435. package/web/assets/eventmodeling-NTZA5JFV-WKSWQHFS-Bq4FqtBL.js +1 -0
  436. package/web/assets/flowDiagram-YHGXBVSY-Dnlk2bEu.js +1 -0
  437. package/web/assets/ganttDiagram-RWFTB7ED-Bl6Y1K5T.js +292 -0
  438. package/web/assets/gitGraph-4MIJSDKK-JH2HKYUO-B3yc4GkH.js +1 -0
  439. package/web/assets/gitGraphDiagram-MAR6GKOP-CkNvsrdw.js +106 -0
  440. package/web/assets/{index-CJDpyH-n.css → index-C2_aej58.css} +1 -1
  441. package/web/assets/{index-DDRie6_8.js → index-Dj3vQOHK.js} +51 -51
  442. package/web/assets/info-A6RAGUB7-3TX3OFWW-BM3N5_Dv.js +1 -0
  443. package/web/assets/infoDiagram-LV547AFH-COkFutAf.js +2 -0
  444. package/web/assets/{ishikawaDiagram-4JDSWWDM-DmqWtjkl.js → ishikawaDiagram-PUJQGNDS-Bb8FylSR.js} +2 -2
  445. package/web/assets/{journeyDiagram-QUS3FAKT-XAzVzrQW.js → journeyDiagram-EW5QJT4W-BzoHUBhM.js} +4 -4
  446. package/web/assets/{kanban-definition-D4L7SQKK-YurRnmYn.js → kanban-definition-JSQERAZB-Uy2Pi0yQ.js} +4 -4
  447. package/web/assets/katex-CZ4GXH2S-C0Fcou7U.js +257 -0
  448. package/web/assets/{mindmap-definition-66QP5TD6-ChrWWnil.js → mindmap-definition-VBJCLQLM-B-CnOnt_.js} +3 -3
  449. package/web/assets/packet-AYTQ26CC-MKII6P3Y-Bd52ZE3V.js +1 -0
  450. package/web/assets/{pegDiagram-YKIO5C6U-QGeQLEq2.js → pegDiagram-7WILOQTJ-D9sneKXg.js} +1 -1
  451. package/web/assets/pie-WAS4IAKB-6B4OPMJ5-DW5Xy69Z.js +1 -0
  452. package/web/assets/pieDiagram-EFA7CBSB-Dx2NQofL.js +39 -0
  453. package/web/assets/{quadrantDiagram-VO5QLCXA-B7098wSc.js → quadrantDiagram-WARVYA7P-DPKL9_0A.js} +3 -3
  454. package/web/assets/radar-RG4KPBEZ-UPTR3XUL-CkzibT2h.js +1 -0
  455. package/web/assets/railroad-74A4TZTK-MEFUPFMS-D9zF-mDN.js +1 -0
  456. package/web/assets/railroad-abnf-HS5TGJTU-R5YG2S5D-ruacjUbX.js +1 -0
  457. package/web/assets/railroad-ebnf-LZEXJU2U-G5QEX2L6-S1zc5OiO.js +1 -0
  458. package/web/assets/railroad-peg-WCYAUIDC-H5I2ZRY2-Cbcr0XzY.js +1 -0
  459. package/web/assets/{railroadDiagram-M77LTMSB-AXu4vxk_.js → railroadDiagram-5NIQVNLQ-DsweTo14.js} +1 -1
  460. package/web/assets/{requirementDiagram-RASO5HTO-B-l8InpK.js → requirementDiagram-SXREGOKZ-CXwdNSVR.js} +4 -4
  461. package/web/assets/{sankeyDiagram-F32LOJ6L-Kd7zjJgX.js → sankeyDiagram-VV74M2VP-CA6jtP9P.js} +3 -3
  462. package/web/assets/{sequenceDiagram-URATNSBD-BlcdY9DS.js → sequenceDiagram-52ZFIFDL-k_5rEbzm.js} +15 -15
  463. package/web/assets/src-Df5C1Nz4.js +1 -0
  464. package/web/assets/stateDiagram-3QAKPIVI-BejHTf31.js +1 -0
  465. package/web/assets/stateDiagram-v2-HN2P4RDZ-BrfoRuOc.js +1 -0
  466. package/web/assets/swimlanes-QLVP42QD-CQSVO5D6.js +1 -0
  467. package/web/assets/swimlanesDiagram-JKPDBFCN-DrWB9kcD.js +8 -0
  468. package/web/assets/{timeline-definition-WJXWRH4I-DUfp1R3E.js → timeline-definition-GS45XAXW-C0Ks8rPP.js} +4 -4
  469. package/web/assets/treeView-Q6P3EWNA-ZRJGANNQ-DmKOCo6L.js +1 -0
  470. package/web/assets/treemap-WGGIJYW6-K64VN5AS-DO3xY92U.js +1 -0
  471. package/web/assets/{vennDiagram-K3VCMQLI-Bj-FN-XS.js → vennDiagram-QIQU2ZRJ-rgPiS837.js} +3 -3
  472. package/web/assets/wardley-WFR3VGLG-D67OWCCH-DiDPBNft.js +1 -0
  473. package/web/assets/wardleyDiagram-U6YNM66N-DRVr7SPi.js +78 -0
  474. package/web/assets/{xychartDiagram-5VRUVLCW-CK_rbSWE.js → xychartDiagram-XJAZEDNM-COtlZzYb.js} +3 -3
  475. package/web/index.html +19 -17
  476. package/web/assets/ProcessFlowModal-Badh2Pbg.js +0 -24
  477. package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +0 -1
  478. package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +0 -36
  479. package/web/assets/blockDiagram-54WLDVWM-Dg_hrRWE.js +0 -132
  480. package/web/assets/c4Diagram-X2LASM7V-CnhoT4aV.js +0 -10
  481. package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +0 -127
  482. package/web/assets/chunk-5VCL7Z4A-CQ-2dYWj.js +0 -1
  483. package/web/assets/chunk-6BELYETK-ChsYtfHW.js +0 -1
  484. package/web/assets/chunk-7CWYLC5S-DRgGkkpF.js +0 -2
  485. package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +0 -32
  486. package/web/assets/chunk-KRXBNO2N-C-UNuKKf.js +0 -1
  487. package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +0 -321
  488. package/web/assets/chunk-LIEV3EAG-pyKGssV3.js +0 -1
  489. package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +0 -62
  490. package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +0 -10
  491. package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +0 -156
  492. package/web/assets/chunk-SZD42YQK-ijyKKVr1.js +0 -70
  493. package/web/assets/chunk-TFPGFQPA-Dj6a-0pC.js +0 -231
  494. package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +0 -2
  495. package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +0 -1
  496. package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +0 -1
  497. package/web/assets/chunk-WJBAP47W-BckNkuEN.js +0 -1
  498. package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +0 -1
  499. package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +0 -1
  500. package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +0 -1
  501. package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +0 -4
  502. package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +0 -30
  503. package/web/assets/diagram-KFBZAVDW-Dfmf_4ti.js +0 -3
  504. package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +0 -24
  505. package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +0 -85
  506. package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +0 -1
  507. package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +0 -1
  508. package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +0 -292
  509. package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +0 -1
  510. package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +0 -106
  511. package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +0 -1
  512. package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +0 -2
  513. package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +0 -257
  514. package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +0 -1
  515. package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +0 -1
  516. package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +0 -39
  517. package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +0 -1
  518. package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +0 -1
  519. package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +0 -1
  520. package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +0 -1
  521. package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +0 -1
  522. package/web/assets/src-C5sx_gMp.js +0 -1
  523. package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +0 -1
  524. package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +0 -1
  525. package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +0 -2
  526. package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +0 -8
  527. package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +0 -1
  528. package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +0 -1
  529. package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +0 -1
  530. package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +0 -78
  531. /package/web/assets/{sizeCapture-5GORAGP4-BEqQzsxs.js → sizeCapture-FGA5AGYP-BEqQzsxs.js} +0 -0
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Zig payload captures (F6): `for (items) |it|`, `if (opt) |v|`,
3
+ * `while (it.next()) |x|`. The captured name has no annotation anywhere — its
4
+ * type is the SUBJECT's type minus one layer (slice/array element, optional
5
+ * payload) — so the tree-sitter query cannot bind it; this post-finalize hook
6
+ * reads the subject's binding from the finished scope model and injects the
7
+ * payload's. Rust/Go do the same (`rust/range-binding.ts`,
8
+ * `go/range-binding.ts`).
9
+ *
10
+ * Deliberately narrow and honest: a payload binds only when the subject's
11
+ * WRITTEN type visibly has the layer the construct removes — `[]T` / `[N]T` /
12
+ * `[*]T` / `*[N]T` for `for`, `?T` (after any `E!`) for `if` / `while`. A
13
+ * subject typed `std.ArrayList(T)`, `anytype`, or anything unresolved binds
14
+ * nothing rather than guessing. `catch |err|` (an error, never a container
15
+ * receiver) and `switch` prongs are skipped. The same one-layer projection
16
+ * types `const t = items[i];` / `opt.?` / `ptr.*` (`bindProjectedLocal`).
17
+ *
18
+ * Runs after `propagateImportedReturnTypes`, so return bindings hoisted from
19
+ * other files are visible when a subject is a call.
20
+ */
21
+ import type { ParsedFile } from '../../../../_shared/index.js';
22
+ import type { ScopeResolutionIndexes } from '../../model/scope-resolution-indexes.js';
23
+ export declare function populateZigRangeBindings(parsedFiles: readonly ParsedFile[], indexes: ScopeResolutionIndexes, ctx: {
24
+ readonly fileContents: ReadonlyMap<string, string>;
25
+ readonly treeCache?: {
26
+ get(filePath: string): unknown;
27
+ };
28
+ }): void;
29
+ /** `*T` / `*const T` / `E!*T` → `T`; undefined when not visibly a pointer. */
30
+ export declare function zigPointeeSpelling(spelling: string): string | undefined;
31
+ /** `[]T` / `[]const T` / `[N]T` / `[*]T` / `[*:0]T` / `*[N]T` / `*const []T`
32
+ * → `T` (with `T`'s own sigils kept: `[]*Thing` → `*Thing`). Undefined when
33
+ * the written type has no slice/array layer to remove. */
34
+ export declare function zigElementSpelling(spelling: string): string | undefined;
35
+ /** `?T` / `?*T` / `E!?T` → `T` (sigils of `T` kept). Undefined when the
36
+ * written type is not visibly optional. */
37
+ export declare function zigOptionalPayloadSpelling(spelling: string): string | undefined;
@@ -0,0 +1,373 @@
1
+ /**
2
+ * Zig payload captures (F6): `for (items) |it|`, `if (opt) |v|`,
3
+ * `while (it.next()) |x|`. The captured name has no annotation anywhere — its
4
+ * type is the SUBJECT's type minus one layer (slice/array element, optional
5
+ * payload) — so the tree-sitter query cannot bind it; this post-finalize hook
6
+ * reads the subject's binding from the finished scope model and injects the
7
+ * payload's. Rust/Go do the same (`rust/range-binding.ts`,
8
+ * `go/range-binding.ts`).
9
+ *
10
+ * Deliberately narrow and honest: a payload binds only when the subject's
11
+ * WRITTEN type visibly has the layer the construct removes — `[]T` / `[N]T` /
12
+ * `[*]T` / `*[N]T` for `for`, `?T` (after any `E!`) for `if` / `while`. A
13
+ * subject typed `std.ArrayList(T)`, `anytype`, or anything unresolved binds
14
+ * nothing rather than guessing. `catch |err|` (an error, never a container
15
+ * receiver) and `switch` prongs are skipped. The same one-layer projection
16
+ * types `const t = items[i];` / `opt.?` / `ptr.*` (`bindProjectedLocal`).
17
+ *
18
+ * Runs after `propagateImportedReturnTypes`, so return bindings hoisted from
19
+ * other files are visible when a subject is a call.
20
+ */
21
+ import { getZigParser } from './query.js';
22
+ import { getTreeSitterBufferSize } from '../../constants.js';
23
+ import { parseSourceSafe, ParseTimeoutError } from '../../../tree-sitter/safe-parse.js';
24
+ import { logger } from '../../../logger.js';
25
+ import { findClassBindingInScope, findReceiverTypeBinding, isClassLike, } from '../../scope-resolution/scope/walkers.js';
26
+ import { isZigKeywordDeclaration, zigUnwrapValue } from './captures.js';
27
+ import { normalizeZigTypeName } from './interpret.js';
28
+ const PAYLOAD_HOSTS = new Set([
29
+ 'for_statement',
30
+ 'for_expression',
31
+ 'if_statement',
32
+ 'if_expression',
33
+ 'while_statement',
34
+ 'while_expression',
35
+ ]);
36
+ export function populateZigRangeBindings(parsedFiles, indexes, ctx) {
37
+ const parser = getZigParser();
38
+ // Class def nodeId → its Class scope (whose typeBindings hold the members'
39
+ // field types and the methods' return types). Same derivation as
40
+ // `buildWorkspaceResolutionIndex`, which this hook does not receive.
41
+ const classScopeByDefId = new Map();
42
+ for (const parsed of parsedFiles) {
43
+ for (const scope of parsed.scopes) {
44
+ if (scope.kind !== 'Class')
45
+ continue;
46
+ const cd = scope.ownedDefs.find((d) => isClassLike(d.type));
47
+ if (cd !== undefined)
48
+ classScopeByDefId.set(cd.nodeId, scope);
49
+ }
50
+ }
51
+ for (const parsed of parsedFiles) {
52
+ const sourceText = ctx.fileContents.get(parsed.filePath);
53
+ if (sourceText === undefined)
54
+ continue;
55
+ let tree = ctx.treeCache?.get(parsed.filePath);
56
+ if (tree === undefined) {
57
+ try {
58
+ tree = parseSourceSafe(parser, sourceText, undefined, {
59
+ bufferSize: getTreeSitterBufferSize(sourceText),
60
+ });
61
+ }
62
+ catch (err) {
63
+ if (err instanceof ParseTimeoutError) {
64
+ logger.warn({ file: parsed.filePath }, 'zig range-binding: parse timed out, skipping file');
65
+ continue;
66
+ }
67
+ throw err;
68
+ }
69
+ }
70
+ const scopes = parsed.scopes;
71
+ if (scopes.length === 0)
72
+ continue;
73
+ const resolver = new ZigSubjectTypeResolver(scopes, indexes, classScopeByDefId);
74
+ // Pre-order: an outer payload is bound before an inner construct reads it
75
+ // (`for (pages) |p| { if (p.frame) |f| … }`).
76
+ const visit = (node) => {
77
+ if (PAYLOAD_HOSTS.has(node.type))
78
+ bindPayloads(node, resolver);
79
+ else if (node.type === 'variable_declaration')
80
+ bindProjectedLocal(node, resolver);
81
+ for (let i = 0; i < node.namedChildCount; i++) {
82
+ const c = node.namedChild(i);
83
+ if (c !== null)
84
+ visit(c);
85
+ }
86
+ };
87
+ visit(tree.rootNode);
88
+ }
89
+ }
90
+ /** Bind the payload identifiers of one `for` / `if` / `while` node. */
91
+ function bindPayloads(node, resolver) {
92
+ const named = node.namedChildren.filter((c) => c !== null && c.type !== 'comment');
93
+ // The payload right after the subject(s); a trailing `else |err|` payload
94
+ // belongs to the else_clause and is not a child here.
95
+ const payload = named.find((c) => c.type === 'payload');
96
+ if (payload === undefined)
97
+ return;
98
+ const isFor = node.type === 'for_statement' || node.type === 'for_expression';
99
+ // A `for` lists its subjects BEFORE the payload; the body follows it.
100
+ const subjects = isFor
101
+ ? named.slice(0, named.indexOf(payload)).filter((c) => c.type !== 'block_label')
102
+ : [node.childForFieldName('condition')].filter((c) => c !== null);
103
+ if (subjects.length === 0)
104
+ return;
105
+ // For a `for` the payload names pair positionally with the subjects
106
+ // (`for (items, 0..) |it, i|`); `if` / `while` capture one value.
107
+ const captured = payload.namedChildren.filter((c) => c !== null && c.type === 'identifier');
108
+ const host = payloadHostScope(node, resolver);
109
+ if (host === undefined)
110
+ return;
111
+ for (let i = 0; i < captured.length && i < subjects.length; i++) {
112
+ const name = captured[i].text;
113
+ if (name === '_')
114
+ continue;
115
+ const subject = subjects[i];
116
+ if (subject.type === 'range_expression')
117
+ continue; // `0..` — an index
118
+ const spelling = resolver.spellingOf(subject);
119
+ if (spelling === undefined)
120
+ continue;
121
+ const projected = isFor ? zigElementSpelling(spelling) : zigOptionalPayloadSpelling(spelling);
122
+ if (projected === undefined)
123
+ continue;
124
+ // `|*p|` captures a POINTER to the element/payload (the `*` is an
125
+ // anonymous payload child right before the identifier). Keep the written
126
+ // `*` so a later deref projection (`const q = p.*;`) still sees the
127
+ // layer; `rawName` strips it again, so method dispatch is unchanged.
128
+ const element = captured[i].previousSibling?.type === '*' ? `*${projected}` : projected;
129
+ const rawName = normalizeZigTypeName(element);
130
+ if (rawName.length === 0 || rawName.startsWith('@'))
131
+ continue;
132
+ const existing = host.typeBindings.get(name);
133
+ // Zig forbids shadowing, so an existing binding of this name in the host
134
+ // can only be a sibling construct's payload (bare-expression bodies share
135
+ // the enclosing scope). Two different types for one name: decline both
136
+ // rather than let the last one type the first one's body.
137
+ if (existing !== undefined) {
138
+ if (existing.rawName !== rawName) {
139
+ host.typeBindings.delete(name);
140
+ }
141
+ continue;
142
+ }
143
+ const ref = element === rawName
144
+ ? { rawName, declaredAtScope: host.id, source: 'annotation' }
145
+ : { rawName, declaredSpelling: element, declaredAtScope: host.id, source: 'annotation' };
146
+ host.typeBindings.set(name, ref);
147
+ }
148
+ }
149
+ /** `const t = items[i];` / `const t = opt.?;` / `const t = ptr.*;` — a local
150
+ * bound to ONE LAYER under a typed subject: the element of a slice/array
151
+ * (not a `[a..b]` re-slice), the payload of an optional, the pointee of a
152
+ * pointer. Same honesty rule as the payloads: the subject's WRITTEN type
153
+ * must show the layer. Skipped when the name is already typed (an
154
+ * annotation, or a capture-time inference). */
155
+ function bindProjectedLocal(decl, resolver) {
156
+ if (!isZigKeywordDeclaration(decl))
157
+ return;
158
+ const named = decl.namedChildren.filter((c) => c !== null && c.type !== 'comment');
159
+ if (named.length < 2 || named[0].type !== 'identifier')
160
+ return;
161
+ const value = named[named.length - 1];
162
+ if (value.id === decl.childForFieldName('type')?.id)
163
+ return; // `const x: T;`
164
+ const inner = zigUnwrapValue(value);
165
+ let subject;
166
+ let project;
167
+ switch (inner.type) {
168
+ case 'index_expression':
169
+ if (inner.childForFieldName('index')?.type === 'range_expression')
170
+ return; // `a[0..n]`
171
+ subject = inner.childForFieldName('object');
172
+ project = zigElementSpelling;
173
+ break;
174
+ case 'null_coercion_expression':
175
+ subject = inner.namedChild(0);
176
+ project = zigOptionalPayloadSpelling;
177
+ break;
178
+ case 'dereference_expression':
179
+ subject = inner.namedChild(0);
180
+ project = zigPointeeSpelling;
181
+ break;
182
+ default:
183
+ return;
184
+ }
185
+ if (subject === null)
186
+ return;
187
+ const name = named[0].text;
188
+ const host = resolver.scopeAt(decl.startPosition.row + 1, decl.startPosition.column, false);
189
+ if (host === undefined || host.typeBindings.has(name))
190
+ return;
191
+ const spelling = resolver.spellingOf(subject);
192
+ if (spelling === undefined)
193
+ return;
194
+ const projected = project(spelling);
195
+ if (projected === undefined)
196
+ return;
197
+ const rawName = normalizeZigTypeName(projected);
198
+ if (rawName.length === 0 || rawName.startsWith('@'))
199
+ return;
200
+ const ref = projected === rawName
201
+ ? { rawName, declaredAtScope: host.id, source: 'assignment-inferred' }
202
+ : {
203
+ rawName,
204
+ declaredSpelling: projected,
205
+ declaredAtScope: host.id,
206
+ source: 'assignment-inferred',
207
+ };
208
+ host.typeBindings.set(name, ref);
209
+ }
210
+ /** `*T` / `*const T` / `E!*T` → `T`; undefined when not visibly a pointer. */
211
+ export function zigPointeeSpelling(spelling) {
212
+ let t = spelling.trim();
213
+ const bang = t.lastIndexOf('!');
214
+ if (bang !== -1)
215
+ t = t.slice(bang + 1).trim();
216
+ const m = /^\*(const\s+)?/.exec(t);
217
+ if (m === null)
218
+ return undefined;
219
+ const rest = t.slice(m[0].length).trim();
220
+ return rest.length > 0 ? rest : undefined;
221
+ }
222
+ function body(node) {
223
+ return node.childForFieldName('body');
224
+ }
225
+ /** The scope the payload name lives in: the body block's own scope when the
226
+ * body is a block (`|t| { … }`), otherwise the innermost scope enclosing the
227
+ * construct (a bare-expression body: `for (items) |t| t.run();`). */
228
+ function payloadHostScope(node, resolver) {
229
+ // for/if/while_statement carry `body:`; in the *_expression forms the
230
+ // body is the named child right after the payload.
231
+ let bodyNode = body(node);
232
+ if (bodyNode === null) {
233
+ const named = node.namedChildren.filter((c) => c !== null);
234
+ const at = named.findIndex((c) => c.type === 'payload');
235
+ bodyNode = at === -1 ? null : (named[at + 1] ?? null);
236
+ }
237
+ let block = bodyNode;
238
+ if (block?.type === 'block_expression')
239
+ block = block.namedChildren.find((c) => c?.type === 'block') ?? null;
240
+ if (block?.type === 'labeled_statement')
241
+ block = block.namedChildren.find((c) => c?.type === 'block') ?? null;
242
+ if (block?.type === 'block') {
243
+ const exact = resolver.scopeAt(block.startPosition.row + 1, block.startPosition.column, true);
244
+ if (exact !== undefined)
245
+ return exact;
246
+ }
247
+ return resolver.scopeAt(node.startPosition.row + 1, node.startPosition.column, false);
248
+ }
249
+ /** `[]T` / `[]const T` / `[N]T` / `[*]T` / `[*:0]T` / `*[N]T` / `*const []T`
250
+ * → `T` (with `T`'s own sigils kept: `[]*Thing` → `*Thing`). Undefined when
251
+ * the written type has no slice/array layer to remove. */
252
+ export function zigElementSpelling(spelling) {
253
+ let t = spelling.trim();
254
+ const bang = t.lastIndexOf('!');
255
+ if (bang !== -1)
256
+ t = t.slice(bang + 1).trim();
257
+ // A pointer TO an array/slice iterates the pointee.
258
+ t = t.replace(/^\*(const\s+)?(?=\[)/, '');
259
+ const m = /^\[[^\]]*\]\s*(const\s+)?/.exec(t);
260
+ if (m === null)
261
+ return undefined;
262
+ const rest = t.slice(m[0].length).trim();
263
+ return rest.length > 0 ? rest : undefined;
264
+ }
265
+ /** `?T` / `?*T` / `E!?T` → `T` (sigils of `T` kept). Undefined when the
266
+ * written type is not visibly optional. */
267
+ export function zigOptionalPayloadSpelling(spelling) {
268
+ let t = spelling.trim();
269
+ const bang = t.lastIndexOf('!');
270
+ if (bang !== -1)
271
+ t = t.slice(bang + 1).trim();
272
+ if (!t.startsWith('?'))
273
+ return undefined;
274
+ const rest = t.slice(1).trim();
275
+ return rest.length > 0 ? rest : undefined;
276
+ }
277
+ /** Resolves a subject expression to the WRITTEN type spelling of its binding
278
+ * (`declaredSpelling` when the capture layer reduced it, else `rawName`),
279
+ * through the finished scope model of one file. */
280
+ class ZigSubjectTypeResolver {
281
+ scopes;
282
+ indexes;
283
+ classScopeByDefId;
284
+ constructor(scopes, indexes, classScopeByDefId) {
285
+ this.scopes = scopes;
286
+ this.indexes = indexes;
287
+ this.classScopeByDefId = classScopeByDefId;
288
+ }
289
+ /** Innermost scope containing (line, col); with `exact`, only a scope
290
+ * STARTING there (a block's own scope). */
291
+ scopeAt(line, col, exact) {
292
+ let best;
293
+ for (const s of this.scopes) {
294
+ const r = s.range;
295
+ if (exact) {
296
+ if (r.startLine === line && r.startCol === col && s.kind === 'Block')
297
+ return s;
298
+ continue;
299
+ }
300
+ const startsBefore = r.startLine < line || (r.startLine === line && r.startCol <= col);
301
+ const endsAfter = r.endLine > line || (r.endLine === line && r.endCol >= col);
302
+ if (!startsBefore || !endsAfter)
303
+ continue;
304
+ if (best === undefined || contains(best.range, r))
305
+ best = s;
306
+ }
307
+ return best;
308
+ }
309
+ spellingOf(subject) {
310
+ const ref = this.typeRefOf(subject);
311
+ return ref === undefined ? undefined : (ref.declaredSpelling ?? ref.rawName);
312
+ }
313
+ typeRefOf(subjectRaw) {
314
+ const subject = zigUnwrapValue(subjectRaw);
315
+ const scope = this.scopeAt(subject.startPosition.row + 1, subject.startPosition.column, false);
316
+ if (scope === undefined)
317
+ return undefined;
318
+ switch (subject.type) {
319
+ case 'identifier':
320
+ return findReceiverTypeBinding(scope.id, subject.text, this.indexes);
321
+ case 'field_expression': {
322
+ // `self.items` / `page.session` — the member's binding on the
323
+ // object's class scope (field type, or a method's return type).
324
+ const object = subject.childForFieldName('object');
325
+ const member = subject.childForFieldName('member');
326
+ if (object === null || member === null)
327
+ return undefined;
328
+ return this.memberRefOf(object, member.text, scope.id);
329
+ }
330
+ case 'call_expression': {
331
+ const callee = subject.childForFieldName('function');
332
+ if (callee === null)
333
+ return undefined;
334
+ if (callee.type === 'identifier') {
335
+ // A free call: the fn's return binding, in the scope chain.
336
+ return findReceiverTypeBinding(scope.id, callee.text, this.indexes);
337
+ }
338
+ if (callee.type !== 'field_expression')
339
+ return undefined;
340
+ const object = callee.childForFieldName('object');
341
+ const member = callee.childForFieldName('member');
342
+ if (object === null || member === null)
343
+ return undefined;
344
+ return this.memberRefOf(object, member.text, scope.id);
345
+ }
346
+ default:
347
+ return undefined;
348
+ }
349
+ }
350
+ /** The binding of `member` on the class the `object` expression is typed
351
+ * by — recursively through field chains (`self.a.b`). */
352
+ memberRefOf(object, member, scopeId) {
353
+ const objectRef = this.typeRefOf(object);
354
+ if (objectRef === undefined)
355
+ return undefined;
356
+ // A compound rawName (`node.asElement()`, F6's member-call shape) needs
357
+ // the shared compound resolver; not walked here.
358
+ if (objectRef.rawName.includes('('))
359
+ return undefined;
360
+ const classDef = findClassBindingInScope(scopeId, objectRef.rawName, this.indexes);
361
+ if (classDef === undefined)
362
+ return undefined;
363
+ const classScope = this.classScopeByDefId.get(classDef.nodeId);
364
+ return classScope?.typeBindings.get(member);
365
+ }
366
+ }
367
+ function contains(outer, inner) {
368
+ const startsBefore = outer.startLine < inner.startLine ||
369
+ (outer.startLine === inner.startLine && outer.startCol <= inner.startCol);
370
+ const endsAfter = outer.endLine > inner.endLine ||
371
+ (outer.endLine === inner.endLine && outer.endCol >= inner.endCol);
372
+ return startsBefore && endsAfter;
373
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Zig `ScopeResolver` registered in `SCOPE_RESOLVERS` and consumed by the
3
+ * generic `runScopeResolution` orchestrator.
4
+ *
5
+ * Thin wiring: Zig has no inheritance (default MRO linearization over an
6
+ * empty heritage set), no `super`, and is statically typed (field-fallback
7
+ * heuristic off per the contract guidance). Import resolution reuses the
8
+ * same `resolveZigImportInternal` the legacy import-resolver config wraps,
9
+ * with `build.zig.zon` `.path` deps threaded through `loadResolutionConfig`.
10
+ */
11
+ import type { ScopeResolver } from '../../scope-resolution/contract/scope-resolver.js';
12
+ export declare const zigScopeResolver: ScopeResolver;
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Zig `ScopeResolver` registered in `SCOPE_RESOLVERS` and consumed by the
3
+ * generic `runScopeResolution` orchestrator.
4
+ *
5
+ * Thin wiring: Zig has no inheritance (default MRO linearization over an
6
+ * empty heritage set), no `super`, and is statically typed (field-fallback
7
+ * heuristic off per the contract guidance). Import resolution reuses the
8
+ * same `resolveZigImportInternal` the legacy import-resolver config wraps,
9
+ * with `build.zig.zon` `.path` deps threaded through `loadResolutionConfig`.
10
+ */
11
+ import { SupportedLanguages } from '../../../../_shared/index.js';
12
+ import { buildMro, defaultLinearize } from '../../scope-resolution/passes/mro.js';
13
+ import { populateClassOwnedMembers } from '../../scope-resolution/scope/walkers.js';
14
+ import { loadZigBuildConfig } from '../../language-config.js';
15
+ import { resolveZigImportInternal } from '../../import-resolvers/zig.js';
16
+ import { zigProvider } from '../zig.js';
17
+ import { expandZigWildcardNames, zigArityCompatibility, zigMergeBindings } from './index.js';
18
+ import { populateZigRangeBindings } from './range-binding.js';
19
+ export const zigScopeResolver = {
20
+ language: SupportedLanguages.Zig,
21
+ languageProvider: zigProvider,
22
+ importEdgeReason: 'zig-scope: import',
23
+ // A struct literal `T{ .f = x }` is a CALLS edge to the Struct node (the
24
+ // Rust `T { .. }` / Go `T{}` shape). Zig has no Constructor nodes, so
25
+ // nothing but this marker tells that edge from an invocation on the edge
26
+ // itself — `main → SpawnRequest` looked like a call to a function
27
+ // (PR #1432 review). Emits `local-call (constructor)` and friends.
28
+ markConstructionSites: true,
29
+ // Hub modules are how Zig projects publish their types: `pub const Terminal
30
+ // = @import("Terminal.zig");` / `pub const PRNG = @import("prng.zig");` in a
31
+ // file that declares nothing itself. Consumers then write
32
+ // `terminal.Terminal.init()`, `stdx.PRNG.from_seed()`, `t: stdx.Thing`.
33
+ // Measured on real projects before → after this flag: CALLS into ghostty's
34
+ // `src/terminal/` from outside it 46 → 253; into tigerbeetle's `stdx` hub
35
+ // from outside it 837 → 1500 (136 `stdx.Type.fn(` sites, 289 annotations).
36
+ namespaceExportsIncludeImportedNames: true,
37
+ // A qualified receiver is a chain of `const` handles — hub modules
38
+ // republishing modules (`hub.sub.Thing{}`), types nested in types
39
+ // (`mod.Outer.Inner{}`), enum variants through the module
40
+ // (`opmod.Op.lookup.event_max()`) — walked hop by hop from the verified
41
+ // import; a one-hop split at the last dot resolved none of them.
42
+ resolveNamespaceChains: true,
43
+ loadResolutionConfig: (repoPath) => loadZigBuildConfig(repoPath),
44
+ resolveImportTarget: (targetRaw, fromFile, allFilePaths, resolutionConfig) => resolveZigImportInternal(fromFile, targetRaw, allFilePaths, resolutionConfig ?? null),
45
+ // `pub usingnamespace @import("x.zig");` — target decls become local decls.
46
+ expandsWildcardTo: (targetModuleScope, parsedFiles) => expandZigWildcardNames(targetModuleScope, parsedFiles),
47
+ mergeBindings: zigMergeBindings,
48
+ arityCompatibility: zigArityCompatibility,
49
+ buildMro: (graph, parsedFiles, nodeLookup) => buildMro(graph, parsedFiles, nodeLookup, defaultLinearize),
50
+ populateOwners: (parsed) => populateClassOwnedMembers(parsed),
51
+ // Payload captures — `for (items) |it|`, `if (opt) |v|`, `while (it.next())
52
+ // |x|` — typed from the subject's binding after finalize (F6).
53
+ populateRangeBindings: populateZigRangeBindings,
54
+ // Zig has no `super`.
55
+ isSuperReceiver: () => false,
56
+ // Statically typed — the field-fallback heuristic over-connects.
57
+ fieldFallbackOnMethodLookup: false,
58
+ };
@@ -0,0 +1,25 @@
1
+ import type { BindingRef, Callsite, CaptureMatch, ParsedFile, Scope, ScopeId, ScopeTree, SymbolDefinition, TypeRef } from '../../../../_shared/index.js';
2
+ /** Keep parameter (incl. `self`) typeBindings in the function scope —
3
+ * hoisting them to Module would pollute other functions' receiver
4
+ * resolution (same rationale as `goBindingScopeFor`). */
5
+ export declare function zigBindingScopeFor(decl: CaptureMatch, innermost: Scope, tree: ScopeTree): ScopeId | null;
6
+ /** `pub usingnamespace @import("x.zig");` — every declaration of the target
7
+ * module becomes a declaration of the importer. Enumerates the target's
8
+ * module-level names for the finalize wildcard expansion (Dart pattern).
9
+ * Zig visibility (`pub`) is not recorded on scope-side defs, so this
10
+ * over-approximates to every top-level name; the structure phase's
11
+ * `isExported` is the authoritative visibility. */
12
+ export declare function expandZigWildcardNames(targetModuleScope: ScopeId, parsedFiles: readonly ParsedFile[]): readonly string[];
13
+ /** Zig's receiver convention is a FIRST parameter named `self`; the
14
+ * `self`-sourced typeBinding on the function scope carries its type.
15
+ * Position is enforced upstream, not here: `interpretZigTypeBinding` only
16
+ * sources a binding as `self` when `emitZigScopeCaptures` tagged it
17
+ * `@type-binding.first-parameter`, so a later parameter named `self`
18
+ * arrives as `parameter-annotation` and is never returned by this hook. */
19
+ export declare function zigReceiverBinding(functionScope: Scope): TypeRef | null;
20
+ /** Local declarations shadow imports; deterministic order within a tier. */
21
+ export declare function zigMergeBindings(existing: readonly BindingRef[], incoming: readonly BindingRef[], _scopeId: string): BindingRef[];
22
+ /** Zig has no overloading; without synthesized arity metadata on
23
+ * declarations the comparison is always 'unknown' — kept as a real
24
+ * bounds check so it turns on if arity captures are added later. */
25
+ export declare function zigArityCompatibility(callsite: Callsite, def: SymbolDefinition): 'compatible' | 'unknown' | 'incompatible';
@@ -0,0 +1,143 @@
1
+ /** Keep parameter (incl. `self`) typeBindings in the function scope —
2
+ * hoisting them to Module would pollute other functions' receiver
3
+ * resolution (same rationale as `goBindingScopeFor`). */
4
+ export function zigBindingScopeFor(decl, innermost, tree) {
5
+ if (decl['@type-binding.parameter'] !== undefined) {
6
+ return innermost.id;
7
+ }
8
+ // A container returned by a generic type constructor (`fn List(comptime T:
9
+ // type) type { return struct {…}; }`) is anchored on the container node,
10
+ // whose innermost enclosing scope is the FUNCTION BODY. Its name is only
11
+ // useful to callers (`List(u8){}`, `List(u8).init()`), so bind it in the
12
+ // module scope beside the Function def of the same name — `List` really is
13
+ // both a callable and a type. `zigTypeConstructorOf` in the walker decides
14
+ // WHICH containers get this rule; the marker capture carries the verdict.
15
+ if (decl['@declaration.type-constructor'] !== undefined) {
16
+ let scope = innermost;
17
+ while (scope !== undefined && scope.kind !== 'Module')
18
+ scope = tree.getParent(scope.id);
19
+ return scope?.id ?? null;
20
+ }
21
+ // File-struct members: the file's Class scope spans the whole file (same
22
+ // range as the Module scope, nested under it). Their DEFS stay owned by the
23
+ // Class scope (that is what makes them methods/fields of the file's Struct),
24
+ // but their NAMES must stay visible at module level — `Page.init()` from
25
+ // another file is a namespace-member lookup over the module scope's
26
+ // bindings, and `usingnamespace` expansion reads the same. Hoist every
27
+ // declaration binding hosted by an equal-range Class scope to its Module
28
+ // parent. Type bindings (`@type-binding.*`, incl. field types) are NOT
29
+ // hoisted: the compound resolver reads member types from the class scope.
30
+ const anchor = ZIG_DECLARATION_ANCHORS.map((k) => decl[k]).find((c) => c !== undefined);
31
+ if (anchor !== undefined) {
32
+ // Reproduce the extractor's auto-hoist (a scope-creating declaration is
33
+ // bound in the scope OUTSIDE its own body), then step past the file's
34
+ // Class scope when that is where the name would land.
35
+ let host = innermost;
36
+ if (host.parent !== null && sameRange(anchor.range, host.range)) {
37
+ host = tree.getParent(host.id);
38
+ }
39
+ if (host !== undefined && host.kind === 'Class' && host.parent !== null) {
40
+ const parent = tree.getParent(host.id);
41
+ if (parent !== undefined && parent.kind === 'Module' && sameRange(parent.range, host.range)) {
42
+ return parent.id;
43
+ }
44
+ }
45
+ }
46
+ return null; // default auto-hoist for other bindings
47
+ }
48
+ const ZIG_DECLARATION_ANCHORS = [
49
+ '@declaration.function',
50
+ '@declaration.method',
51
+ '@declaration.struct',
52
+ '@declaration.enum',
53
+ '@declaration.union',
54
+ '@declaration.field',
55
+ '@declaration.variable',
56
+ ];
57
+ function sameRange(a, b) {
58
+ return (a.startLine === b.startLine &&
59
+ a.startCol === b.startCol &&
60
+ a.endLine === b.endLine &&
61
+ a.endCol === b.endCol);
62
+ }
63
+ /** `pub usingnamespace @import("x.zig");` — every declaration of the target
64
+ * module becomes a declaration of the importer. Enumerates the target's
65
+ * module-level names for the finalize wildcard expansion (Dart pattern).
66
+ * Zig visibility (`pub`) is not recorded on scope-side defs, so this
67
+ * over-approximates to every top-level name; the structure phase's
68
+ * `isExported` is the authoritative visibility. */
69
+ export function expandZigWildcardNames(targetModuleScope, parsedFiles) {
70
+ const target = parsedFiles.find((p) => p.moduleScope === targetModuleScope);
71
+ if (target === undefined)
72
+ return [];
73
+ const seen = new Set();
74
+ const names = [];
75
+ for (const def of target.localDefs) {
76
+ const qn = def.qualifiedName;
77
+ if (qn === undefined || qn.length === 0 || qn.includes('.'))
78
+ continue; // top-level only
79
+ if (seen.has(qn))
80
+ continue;
81
+ seen.add(qn);
82
+ names.push(qn);
83
+ }
84
+ return names;
85
+ }
86
+ /** Zig's receiver convention is a FIRST parameter named `self`; the
87
+ * `self`-sourced typeBinding on the function scope carries its type.
88
+ * Position is enforced upstream, not here: `interpretZigTypeBinding` only
89
+ * sources a binding as `self` when `emitZigScopeCaptures` tagged it
90
+ * `@type-binding.first-parameter`, so a later parameter named `self`
91
+ * arrives as `parameter-annotation` and is never returned by this hook. */
92
+ export function zigReceiverBinding(functionScope) {
93
+ if (functionScope.kind !== 'Function')
94
+ return null;
95
+ for (const binding of functionScope.typeBindings.values()) {
96
+ if (binding.source === 'self')
97
+ return binding;
98
+ }
99
+ return null;
100
+ }
101
+ const TIER = {
102
+ local: 0,
103
+ namespace: 1,
104
+ import: 2,
105
+ reexport: 3,
106
+ wildcard: 4,
107
+ };
108
+ /** Local declarations shadow imports; deterministic order within a tier. */
109
+ export function zigMergeBindings(existing, incoming, _scopeId) {
110
+ const all = [...existing, ...incoming];
111
+ if (all.length === 0)
112
+ return [];
113
+ let bestTier = 99;
114
+ for (const b of all) {
115
+ const t = TIER[b.origin] ?? 99;
116
+ if (t < bestTier)
117
+ bestTier = t;
118
+ }
119
+ const byNode = new Map();
120
+ for (const b of all) {
121
+ if ((TIER[b.origin] ?? 99) !== bestTier)
122
+ continue;
123
+ if (!byNode.has(b.def.nodeId))
124
+ byNode.set(b.def.nodeId, b);
125
+ }
126
+ return [...byNode.values()].sort((a, b) => a.def.nodeId.localeCompare(b.def.nodeId));
127
+ }
128
+ /** Zig has no overloading; without synthesized arity metadata on
129
+ * declarations the comparison is always 'unknown' — kept as a real
130
+ * bounds check so it turns on if arity captures are added later. */
131
+ export function zigArityCompatibility(callsite, def) {
132
+ const max = def.parameterCount;
133
+ const min = def.requiredParameterCount;
134
+ if (max === undefined && min === undefined)
135
+ return 'unknown';
136
+ if (!Number.isFinite(callsite.arity) || callsite.arity < 0)
137
+ return 'unknown';
138
+ if (min !== undefined && callsite.arity < min)
139
+ return 'incompatible';
140
+ if (max !== undefined && callsite.arity > max)
141
+ return 'incompatible';
142
+ return 'compatible';
143
+ }