cgraphx 2.0.2 → 2.0.3

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 (680) hide show
  1. package/dist/core/code/engine/cli/analyze-config.js +320 -0
  2. package/dist/core/code/engine/cli/analyze.js +1086 -0
  3. package/dist/core/code/engine/cli/cli-message.js +83 -0
  4. package/dist/core/code/engine/cli/detect-changes-format.js +58 -0
  5. package/dist/core/code/engine/cli/embedding-dims.js +43 -0
  6. package/dist/core/code/engine/cli/format-elapsed.js +12 -0
  7. package/dist/core/code/engine/cli/help-i18n.js +144 -0
  8. package/dist/core/code/engine/cli/i18n/en.js +110 -0
  9. package/dist/core/code/engine/cli/i18n/index.js +47 -0
  10. package/dist/core/code/engine/cli/i18n/resources.js +9 -0
  11. package/dist/core/code/engine/cli/i18n/zh-CN.js +110 -0
  12. package/dist/core/code/engine/cli/lazy-action.js +67 -0
  13. package/dist/core/code/engine/cli/optional-grammars.js +136 -0
  14. package/dist/core/code/engine/cli/resolve-invocation.js +76 -0
  15. package/dist/core/code/engine/cli/status.js +156 -0
  16. package/dist/core/code/engine/cli/tool.js +384 -0
  17. package/dist/core/code/engine/config/ignore-service.js +511 -0
  18. package/dist/core/code/engine/config/supported-languages.js +17 -0
  19. package/dist/core/code/engine/core/analysis-features.js +64 -0
  20. package/dist/core/code/engine/core/analyzer-identity.js +2171 -0
  21. package/dist/core/code/engine/core/git-staleness.js +180 -0
  22. package/dist/core/code/engine/core/graph/graph.js +180 -0
  23. package/dist/core/code/engine/core/graph/import-cycles.js +106 -0
  24. package/dist/core/code/engine/core/graph/types.js +2 -0
  25. package/dist/core/code/engine/core/index-freshness.js +12 -0
  26. package/dist/core/code/engine/core/ingestion/binding-accumulator.js +341 -0
  27. package/dist/core/code/engine/core/ingestion/call-extractors/configs/c-cpp.js +168 -0
  28. package/dist/core/code/engine/core/ingestion/call-extractors/configs/csharp.js +9 -0
  29. package/dist/core/code/engine/core/ingestion/call-extractors/configs/dart.js +8 -0
  30. package/dist/core/code/engine/core/ingestion/call-extractors/configs/go.js +8 -0
  31. package/dist/core/code/engine/core/ingestion/call-extractors/configs/jvm.js +54 -0
  32. package/dist/core/code/engine/core/ingestion/call-extractors/configs/php.js +8 -0
  33. package/dist/core/code/engine/core/ingestion/call-extractors/configs/python.js +8 -0
  34. package/dist/core/code/engine/core/ingestion/call-extractors/configs/ruby.js +8 -0
  35. package/dist/core/code/engine/core/ingestion/call-extractors/configs/rust.js +8 -0
  36. package/dist/core/code/engine/core/ingestion/call-extractors/configs/swift.js +8 -0
  37. package/dist/core/code/engine/core/ingestion/call-extractors/configs/typescript-javascript.js +11 -0
  38. package/dist/core/code/engine/core/ingestion/call-extractors/generic.js +62 -0
  39. package/dist/core/code/engine/core/ingestion/call-processor.js +503 -0
  40. package/dist/core/code/engine/core/ingestion/call-routing.js +98 -0
  41. package/dist/core/code/engine/core/ingestion/call-types.js +3 -0
  42. package/dist/core/code/engine/core/ingestion/cfg/callee-cell-format.js +45 -0
  43. package/dist/core/code/engine/core/ingestion/cfg/cfg-builder.js +202 -0
  44. package/dist/core/code/engine/core/ingestion/cfg/collect.js +81 -0
  45. package/dist/core/code/engine/core/ingestion/cfg/control-dependence.js +185 -0
  46. package/dist/core/code/engine/core/ingestion/cfg/control-flow-context.js +130 -0
  47. package/dist/core/code/engine/core/ingestion/cfg/emit.js +646 -0
  48. package/dist/core/code/engine/core/ingestion/cfg/post-dominators.js +182 -0
  49. package/dist/core/code/engine/core/ingestion/cfg/reaching-def-reason-codec.js +139 -0
  50. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs-graph.js +322 -0
  51. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs.js +792 -0
  52. package/dist/core/code/engine/core/ingestion/cfg/synthetic-escape.js +305 -0
  53. package/dist/core/code/engine/core/ingestion/cfg/traversal-result.js +6 -0
  54. package/dist/core/code/engine/core/ingestion/cfg/types.js +14 -0
  55. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp-harvest.js +545 -0
  56. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp.js +590 -0
  57. package/dist/core/code/engine/core/ingestion/cfg/visitors/call-site-harvest.js +356 -0
  58. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp-harvest.js +593 -0
  59. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp.js +871 -0
  60. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart-harvest.js +874 -0
  61. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart.js +840 -0
  62. package/dist/core/code/engine/core/ingestion/cfg/visitors/go-harvest.js +625 -0
  63. package/dist/core/code/engine/core/ingestion/cfg/visitors/go.js +642 -0
  64. package/dist/core/code/engine/core/ingestion/cfg/visitors/java-harvest.js +517 -0
  65. package/dist/core/code/engine/core/ingestion/cfg/visitors/java.js +816 -0
  66. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin-harvest.js +723 -0
  67. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin.js +813 -0
  68. package/dist/core/code/engine/core/ingestion/cfg/visitors/php-harvest.js +630 -0
  69. package/dist/core/code/engine/core/ingestion/cfg/visitors/php.js +725 -0
  70. package/dist/core/code/engine/core/ingestion/cfg/visitors/python-harvest.js +776 -0
  71. package/dist/core/code/engine/core/ingestion/cfg/visitors/python.js +562 -0
  72. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby-harvest.js +591 -0
  73. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby.js +760 -0
  74. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust-harvest.js +877 -0
  75. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust.js +562 -0
  76. package/dist/core/code/engine/core/ingestion/cfg/visitors/scope-tree-harvest.js +120 -0
  77. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift-harvest.js +683 -0
  78. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift.js +791 -0
  79. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript-harvest.js +1060 -0
  80. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript.js +587 -0
  81. package/dist/core/code/engine/core/ingestion/class-extractors/configs/c-cpp.js +77 -0
  82. package/dist/core/code/engine/core/ingestion/class-extractors/configs/csharp.js +24 -0
  83. package/dist/core/code/engine/core/ingestion/class-extractors/configs/dart.js +10 -0
  84. package/dist/core/code/engine/core/ingestion/class-extractors/configs/go.js +28 -0
  85. package/dist/core/code/engine/core/ingestion/class-extractors/configs/jvm.js +67 -0
  86. package/dist/core/code/engine/core/ingestion/class-extractors/configs/php.js +10 -0
  87. package/dist/core/code/engine/core/ingestion/class-extractors/configs/python.js +10 -0
  88. package/dist/core/code/engine/core/ingestion/class-extractors/configs/ruby.js +13 -0
  89. package/dist/core/code/engine/core/ingestion/class-extractors/configs/rust.js +10 -0
  90. package/dist/core/code/engine/core/ingestion/class-extractors/configs/swift.js +21 -0
  91. package/dist/core/code/engine/core/ingestion/class-extractors/configs/typescript-javascript.js +31 -0
  92. package/dist/core/code/engine/core/ingestion/class-extractors/generic.js +144 -0
  93. package/dist/core/code/engine/core/ingestion/class-types.js +2 -0
  94. package/dist/core/code/engine/core/ingestion/cluster-enricher.js +174 -0
  95. package/dist/core/code/engine/core/ingestion/community-processor.js +604 -0
  96. package/dist/core/code/engine/core/ingestion/constants.js +26 -0
  97. package/dist/core/code/engine/core/ingestion/cpp-ue-preprocessor.js +263 -0
  98. package/dist/core/code/engine/core/ingestion/csharp-namespace-gate.js +133 -0
  99. package/dist/core/code/engine/core/ingestion/di-extractors/index.js +38 -0
  100. package/dist/core/code/engine/core/ingestion/di-extractors/spring.js +310 -0
  101. package/dist/core/code/engine/core/ingestion/emit-references.js +244 -0
  102. package/dist/core/code/engine/core/ingestion/entry-point-scoring.js +201 -0
  103. package/dist/core/code/engine/core/ingestion/export-detection.js +244 -0
  104. package/dist/core/code/engine/core/ingestion/field-extractor.js +29 -0
  105. package/dist/core/code/engine/core/ingestion/field-extractors/configs/c-cpp.js +107 -0
  106. package/dist/core/code/engine/core/ingestion/field-extractors/configs/csharp.js +124 -0
  107. package/dist/core/code/engine/core/ingestion/field-extractors/configs/dart.js +99 -0
  108. package/dist/core/code/engine/core/ingestion/field-extractors/configs/go.js +102 -0
  109. package/dist/core/code/engine/core/ingestion/field-extractors/configs/helpers.js +198 -0
  110. package/dist/core/code/engine/core/ingestion/field-extractors/configs/jvm.js +172 -0
  111. package/dist/core/code/engine/core/ingestion/field-extractors/configs/php.js +67 -0
  112. package/dist/core/code/engine/core/ingestion/field-extractors/configs/python.js +94 -0
  113. package/dist/core/code/engine/core/ingestion/field-extractors/configs/ruby.js +79 -0
  114. package/dist/core/code/engine/core/ingestion/field-extractors/configs/rust.js +55 -0
  115. package/dist/core/code/engine/core/ingestion/field-extractors/configs/swift.js +93 -0
  116. package/dist/core/code/engine/core/ingestion/field-extractors/configs/typescript-javascript.js +59 -0
  117. package/dist/core/code/engine/core/ingestion/field-extractors/generic.js +147 -0
  118. package/dist/core/code/engine/core/ingestion/field-extractors/typescript.js +266 -0
  119. package/dist/core/code/engine/core/ingestion/field-types.js +3 -0
  120. package/dist/core/code/engine/core/ingestion/filesystem-walker.js +136 -0
  121. package/dist/core/code/engine/core/ingestion/finalize-orchestrator.js +159 -0
  122. package/dist/core/code/engine/core/ingestion/framework-detection.js +432 -0
  123. package/dist/core/code/engine/core/ingestion/frameworks/spring/analysis-features.js +38 -0
  124. package/dist/core/code/engine/core/ingestion/frameworks/spring/annotation-arguments.js +234 -0
  125. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop-candidates.js +88 -0
  126. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop.js +487 -0
  127. package/dist/core/code/engine/core/ingestion/frameworks/spring/auto-configuration.js +21 -0
  128. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-candidates.js +189 -0
  129. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-catalog.js +32 -0
  130. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-factories.js +73 -0
  131. package/dist/core/code/engine/core/ingestion/frameworks/spring/conditionals.js +323 -0
  132. package/dist/core/code/engine/core/ingestion/frameworks/spring/config-bindings.js +119 -0
  133. package/dist/core/code/engine/core/ingestion/frameworks/spring/di-metadata.js +385 -0
  134. package/dist/core/code/engine/core/ingestion/frameworks/spring/resource-injection.js +96 -0
  135. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/c-cpp.js +17 -0
  136. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/csharp.js +46 -0
  137. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/dart.js +59 -0
  138. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/go.js +30 -0
  139. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/jvm.js +73 -0
  140. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/php.js +19 -0
  141. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/python.js +45 -0
  142. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/ruby.js +20 -0
  143. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/rust.js +58 -0
  144. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/swift.js +94 -0
  145. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/typescript-javascript.js +26 -0
  146. package/dist/core/code/engine/core/ingestion/import-resolvers/csharp.js +128 -0
  147. package/dist/core/code/engine/core/ingestion/import-resolvers/go.js +50 -0
  148. package/dist/core/code/engine/core/ingestion/import-resolvers/jvm.js +112 -0
  149. package/dist/core/code/engine/core/ingestion/import-resolvers/php.js +80 -0
  150. package/dist/core/code/engine/core/ingestion/import-resolvers/python.js +75 -0
  151. package/dist/core/code/engine/core/ingestion/import-resolvers/resolver-factory.js +36 -0
  152. package/dist/core/code/engine/core/ingestion/import-resolvers/ruby.js +20 -0
  153. package/dist/core/code/engine/core/ingestion/import-resolvers/rust.js +79 -0
  154. package/dist/core/code/engine/core/ingestion/import-resolvers/standard.js +180 -0
  155. package/dist/core/code/engine/core/ingestion/import-resolvers/types.js +7 -0
  156. package/dist/core/code/engine/core/ingestion/import-resolvers/utils.js +153 -0
  157. package/dist/core/code/engine/core/ingestion/import-target-adapter.js +99 -0
  158. package/dist/core/code/engine/core/ingestion/language-config.js +391 -0
  159. package/dist/core/code/engine/core/ingestion/language-provider.js +25 -0
  160. package/dist/core/code/engine/core/ingestion/languages/c/arity-metadata.js +98 -0
  161. package/dist/core/code/engine/core/ingestion/languages/c/arity.js +21 -0
  162. package/dist/core/code/engine/core/ingestion/languages/c/capture-side-channel.js +69 -0
  163. package/dist/core/code/engine/core/ingestion/languages/c/captures.js +189 -0
  164. package/dist/core/code/engine/core/ingestion/languages/c/header-scan.js +58 -0
  165. package/dist/core/code/engine/core/ingestion/languages/c/import-decomposer.js +68 -0
  166. package/dist/core/code/engine/core/ingestion/languages/c/import-target.js +103 -0
  167. package/dist/core/code/engine/core/ingestion/languages/c/index.js +33 -0
  168. package/dist/core/code/engine/core/ingestion/languages/c/interpret.js +53 -0
  169. package/dist/core/code/engine/core/ingestion/languages/c/merge-bindings.js +26 -0
  170. package/dist/core/code/engine/core/ingestion/languages/c/query.js +210 -0
  171. package/dist/core/code/engine/core/ingestion/languages/c/scope-resolver.js +112 -0
  172. package/dist/core/code/engine/core/ingestion/languages/c/simple-hooks.js +24 -0
  173. package/dist/core/code/engine/core/ingestion/languages/c/static-linkage.js +109 -0
  174. package/dist/core/code/engine/core/ingestion/languages/c-cpp.js +506 -0
  175. package/dist/core/code/engine/core/ingestion/languages/cpp/adl.js +804 -0
  176. package/dist/core/code/engine/core/ingestion/languages/cpp/arity-metadata.js +258 -0
  177. package/dist/core/code/engine/core/ingestion/languages/cpp/arity.js +37 -0
  178. package/dist/core/code/engine/core/ingestion/languages/cpp/capture-side-channel.js +89 -0
  179. package/dist/core/code/engine/core/ingestion/languages/cpp/captures.js +1975 -0
  180. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-extractor.js +311 -0
  181. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-filter.js +210 -0
  182. package/dist/core/code/engine/core/ingestion/languages/cpp/conversion-rank.js +163 -0
  183. package/dist/core/code/engine/core/ingestion/languages/cpp/file-local-linkage.js +327 -0
  184. package/dist/core/code/engine/core/ingestion/languages/cpp/header-scan.js +53 -0
  185. package/dist/core/code/engine/core/ingestion/languages/cpp/import-decomposer.js +134 -0
  186. package/dist/core/code/engine/core/ingestion/languages/cpp/import-target.js +16 -0
  187. package/dist/core/code/engine/core/ingestion/languages/cpp/index.js +33 -0
  188. package/dist/core/code/engine/core/ingestion/languages/cpp/inline-namespaces.js +379 -0
  189. package/dist/core/code/engine/core/ingestion/languages/cpp/interpret.js +239 -0
  190. package/dist/core/code/engine/core/ingestion/languages/cpp/member-lookup.js +470 -0
  191. package/dist/core/code/engine/core/ingestion/languages/cpp/merge-bindings.js +32 -0
  192. package/dist/core/code/engine/core/ingestion/languages/cpp/query.js +763 -0
  193. package/dist/core/code/engine/core/ingestion/languages/cpp/range-bindings.js +230 -0
  194. package/dist/core/code/engine/core/ingestion/languages/cpp/scope-resolver.js +354 -0
  195. package/dist/core/code/engine/core/ingestion/languages/cpp/simple-hooks.js +67 -0
  196. package/dist/core/code/engine/core/ingestion/languages/cpp/two-phase-lookup.js +348 -0
  197. package/dist/core/code/engine/core/ingestion/languages/cpp/type-classifier.js +56 -0
  198. package/dist/core/code/engine/core/ingestion/languages/cpp/user-defined-conversions.js +128 -0
  199. package/dist/core/code/engine/core/ingestion/languages/csharp/accessor-unwrap.js +67 -0
  200. package/dist/core/code/engine/core/ingestion/languages/csharp/arity-metadata.js +49 -0
  201. package/dist/core/code/engine/core/ingestion/languages/csharp/arity.js +40 -0
  202. package/dist/core/code/engine/core/ingestion/languages/csharp/cache-stats.js +32 -0
  203. package/dist/core/code/engine/core/ingestion/languages/csharp/captures.js +557 -0
  204. package/dist/core/code/engine/core/ingestion/languages/csharp/import-decomposer.js +96 -0
  205. package/dist/core/code/engine/core/ingestion/languages/csharp/import-target.js +176 -0
  206. package/dist/core/code/engine/core/ingestion/languages/csharp/index.js +95 -0
  207. package/dist/core/code/engine/core/ingestion/languages/csharp/interpret.js +150 -0
  208. package/dist/core/code/engine/core/ingestion/languages/csharp/merge-bindings.js +58 -0
  209. package/dist/core/code/engine/core/ingestion/languages/csharp/namespace-siblings.js +708 -0
  210. package/dist/core/code/engine/core/ingestion/languages/csharp/qualified-type-names.js +62 -0
  211. package/dist/core/code/engine/core/ingestion/languages/csharp/query.js +578 -0
  212. package/dist/core/code/engine/core/ingestion/languages/csharp/receiver-binding.js +142 -0
  213. package/dist/core/code/engine/core/ingestion/languages/csharp/resolution-config.js +18 -0
  214. package/dist/core/code/engine/core/ingestion/languages/csharp/scope-resolver.js +84 -0
  215. package/dist/core/code/engine/core/ingestion/languages/csharp/simple-hooks.js +81 -0
  216. package/dist/core/code/engine/core/ingestion/languages/csharp.js +204 -0
  217. package/dist/core/code/engine/core/ingestion/languages/dart/arity-metadata.js +38 -0
  218. package/dist/core/code/engine/core/ingestion/languages/dart/arity.js +34 -0
  219. package/dist/core/code/engine/core/ingestion/languages/dart/built-ins.js +37 -0
  220. package/dist/core/code/engine/core/ingestion/languages/dart/cache-stats.js +30 -0
  221. package/dist/core/code/engine/core/ingestion/languages/dart/captures.js +1096 -0
  222. package/dist/core/code/engine/core/ingestion/languages/dart/expand-wildcards.js +34 -0
  223. package/dist/core/code/engine/core/ingestion/languages/dart/extension-type-preprocess.js +33 -0
  224. package/dist/core/code/engine/core/ingestion/languages/dart/import-target.js +68 -0
  225. package/dist/core/code/engine/core/ingestion/languages/dart/index.js +45 -0
  226. package/dist/core/code/engine/core/ingestion/languages/dart/interpret.js +101 -0
  227. package/dist/core/code/engine/core/ingestion/languages/dart/merge-bindings.js +42 -0
  228. package/dist/core/code/engine/core/ingestion/languages/dart/query.js +246 -0
  229. package/dist/core/code/engine/core/ingestion/languages/dart/receiver-binding.js +90 -0
  230. package/dist/core/code/engine/core/ingestion/languages/dart/scope-resolver.js +197 -0
  231. package/dist/core/code/engine/core/ingestion/languages/dart/signature-bindings.js +54 -0
  232. package/dist/core/code/engine/core/ingestion/languages/dart/simple-hooks.js +61 -0
  233. package/dist/core/code/engine/core/ingestion/languages/dart.js +138 -0
  234. package/dist/core/code/engine/core/ingestion/languages/go/arity-metadata.js +71 -0
  235. package/dist/core/code/engine/core/ingestion/languages/go/arity.js +17 -0
  236. package/dist/core/code/engine/core/ingestion/languages/go/cache-stats.js +21 -0
  237. package/dist/core/code/engine/core/ingestion/languages/go/captures.js +492 -0
  238. package/dist/core/code/engine/core/ingestion/languages/go/expand-wildcards.js +97 -0
  239. package/dist/core/code/engine/core/ingestion/languages/go/generic-type-parameters.js +146 -0
  240. package/dist/core/code/engine/core/ingestion/languages/go/import-decomposer.js +47 -0
  241. package/dist/core/code/engine/core/ingestion/languages/go/import-target.js +70 -0
  242. package/dist/core/code/engine/core/ingestion/languages/go/index.js +39 -0
  243. package/dist/core/code/engine/core/ingestion/languages/go/interface-impls.js +955 -0
  244. package/dist/core/code/engine/core/ingestion/languages/go/interpret.js +177 -0
  245. package/dist/core/code/engine/core/ingestion/languages/go/merge-bindings.js +21 -0
  246. package/dist/core/code/engine/core/ingestion/languages/go/method-owners.js +131 -0
  247. package/dist/core/code/engine/core/ingestion/languages/go/namespace-mirror.js +56 -0
  248. package/dist/core/code/engine/core/ingestion/languages/go/package-clause.js +79 -0
  249. package/dist/core/code/engine/core/ingestion/languages/go/package-siblings.js +83 -0
  250. package/dist/core/code/engine/core/ingestion/languages/go/query.js +298 -0
  251. package/dist/core/code/engine/core/ingestion/languages/go/range-binding.js +127 -0
  252. package/dist/core/code/engine/core/ingestion/languages/go/receiver-binding.js +24 -0
  253. package/dist/core/code/engine/core/ingestion/languages/go/scope-resolver.js +75 -0
  254. package/dist/core/code/engine/core/ingestion/languages/go/simple-hooks.js +31 -0
  255. package/dist/core/code/engine/core/ingestion/languages/go/type-binding.js +279 -0
  256. package/dist/core/code/engine/core/ingestion/languages/go.js +160 -0
  257. package/dist/core/code/engine/core/ingestion/languages/index.js +66 -0
  258. package/dist/core/code/engine/core/ingestion/languages/java/analysis-features.js +16 -0
  259. package/dist/core/code/engine/core/ingestion/languages/java/arity-metadata.js +43 -0
  260. package/dist/core/code/engine/core/ingestion/languages/java/arity.js +27 -0
  261. package/dist/core/code/engine/core/ingestion/languages/java/cache-stats.js +32 -0
  262. package/dist/core/code/engine/core/ingestion/languages/java/capture-side-channel.js +123 -0
  263. package/dist/core/code/engine/core/ingestion/languages/java/captures.js +791 -0
  264. package/dist/core/code/engine/core/ingestion/languages/java/import-decomposer.js +88 -0
  265. package/dist/core/code/engine/core/ingestion/languages/java/import-target.js +103 -0
  266. package/dist/core/code/engine/core/ingestion/languages/java/index.js +43 -0
  267. package/dist/core/code/engine/core/ingestion/languages/java/interpret.js +146 -0
  268. package/dist/core/code/engine/core/ingestion/languages/java/merge-bindings.js +43 -0
  269. package/dist/core/code/engine/core/ingestion/languages/java/package-facts.js +16 -0
  270. package/dist/core/code/engine/core/ingestion/languages/java/package-siblings.js +11 -0
  271. package/dist/core/code/engine/core/ingestion/languages/java/query.js +319 -0
  272. package/dist/core/code/engine/core/ingestion/languages/java/receiver-binding.js +98 -0
  273. package/dist/core/code/engine/core/ingestion/languages/java/scope-resolver.js +213 -0
  274. package/dist/core/code/engine/core/ingestion/languages/java/simple-hooks.js +39 -0
  275. package/dist/core/code/engine/core/ingestion/languages/java/spring-aop.js +53 -0
  276. package/dist/core/code/engine/core/ingestion/languages/java/spring-bean-metadata.js +11 -0
  277. package/dist/core/code/engine/core/ingestion/languages/java/spring-conditionals.js +52 -0
  278. package/dist/core/code/engine/core/ingestion/languages/java/spring-config-bindings.js +222 -0
  279. package/dist/core/code/engine/core/ingestion/languages/java/spring-di.js +165 -0
  280. package/dist/core/code/engine/core/ingestion/languages/java.js +192 -0
  281. package/dist/core/code/engine/core/ingestion/languages/javascript/arity.js +15 -0
  282. package/dist/core/code/engine/core/ingestion/languages/javascript/captures.js +1122 -0
  283. package/dist/core/code/engine/core/ingestion/languages/javascript/import-target.js +56 -0
  284. package/dist/core/code/engine/core/ingestion/languages/javascript/index.js +109 -0
  285. package/dist/core/code/engine/core/ingestion/languages/javascript/interpret.js +45 -0
  286. package/dist/core/code/engine/core/ingestion/languages/javascript/merge-bindings.js +21 -0
  287. package/dist/core/code/engine/core/ingestion/languages/javascript/query.js +659 -0
  288. package/dist/core/code/engine/core/ingestion/languages/javascript/scope-resolver.js +78 -0
  289. package/dist/core/code/engine/core/ingestion/languages/javascript/simple-hooks.js +44 -0
  290. package/dist/core/code/engine/core/ingestion/languages/jvm/package-facts.js +46 -0
  291. package/dist/core/code/engine/core/ingestion/languages/jvm/package-siblings.js +200 -0
  292. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity-metadata.js +23 -0
  293. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity.js +18 -0
  294. package/dist/core/code/engine/core/ingestion/languages/kotlin/cache-stats.js +21 -0
  295. package/dist/core/code/engine/core/ingestion/languages/kotlin/capture-side-channel.js +160 -0
  296. package/dist/core/code/engine/core/ingestion/languages/kotlin/captures.js +1262 -0
  297. package/dist/core/code/engine/core/ingestion/languages/kotlin/companion-scopes.js +72 -0
  298. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-decomposer.js +40 -0
  299. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-target.js +135 -0
  300. package/dist/core/code/engine/core/ingestion/languages/kotlin/index.js +26 -0
  301. package/dist/core/code/engine/core/ingestion/languages/kotlin/interpret.js +75 -0
  302. package/dist/core/code/engine/core/ingestion/languages/kotlin/merge-bindings.js +28 -0
  303. package/dist/core/code/engine/core/ingestion/languages/kotlin/owners.js +134 -0
  304. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-facts.js +16 -0
  305. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-siblings.js +11 -0
  306. package/dist/core/code/engine/core/ingestion/languages/kotlin/query.js +243 -0
  307. package/dist/core/code/engine/core/ingestion/languages/kotlin/receiver-binding.js +103 -0
  308. package/dist/core/code/engine/core/ingestion/languages/kotlin/scope-resolver.js +207 -0
  309. package/dist/core/code/engine/core/ingestion/languages/kotlin/simple-hooks.js +42 -0
  310. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-aop.js +68 -0
  311. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-bean-metadata.js +11 -0
  312. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-conditionals.js +53 -0
  313. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-di.js +304 -0
  314. package/dist/core/code/engine/core/ingestion/languages/kotlin.js +189 -0
  315. package/dist/core/code/engine/core/ingestion/languages/php/arity-metadata.js +66 -0
  316. package/dist/core/code/engine/core/ingestion/languages/php/arity.js +43 -0
  317. package/dist/core/code/engine/core/ingestion/languages/php/cache-stats.js +32 -0
  318. package/dist/core/code/engine/core/ingestion/languages/php/captures.js +1166 -0
  319. package/dist/core/code/engine/core/ingestion/languages/php/import-decomposer.js +238 -0
  320. package/dist/core/code/engine/core/ingestion/languages/php/import-target.js +213 -0
  321. package/dist/core/code/engine/core/ingestion/languages/php/index.js +85 -0
  322. package/dist/core/code/engine/core/ingestion/languages/php/interpret.js +256 -0
  323. package/dist/core/code/engine/core/ingestion/languages/php/merge-bindings.js +50 -0
  324. package/dist/core/code/engine/core/ingestion/languages/php/namespace-siblings.js +353 -0
  325. package/dist/core/code/engine/core/ingestion/languages/php/query.js +391 -0
  326. package/dist/core/code/engine/core/ingestion/languages/php/receiver-binding.js +135 -0
  327. package/dist/core/code/engine/core/ingestion/languages/php/scope-resolver.js +361 -0
  328. package/dist/core/code/engine/core/ingestion/languages/php/simple-hooks.js +116 -0
  329. package/dist/core/code/engine/core/ingestion/languages/php.js +302 -0
  330. package/dist/core/code/engine/core/ingestion/languages/python/arity-metadata.js +49 -0
  331. package/dist/core/code/engine/core/ingestion/languages/python/arity.js +41 -0
  332. package/dist/core/code/engine/core/ingestion/languages/python/cache-stats.js +34 -0
  333. package/dist/core/code/engine/core/ingestion/languages/python/captures.js +299 -0
  334. package/dist/core/code/engine/core/ingestion/languages/python/depends-references.js +68 -0
  335. package/dist/core/code/engine/core/ingestion/languages/python/import-decomposer.js +115 -0
  336. package/dist/core/code/engine/core/ingestion/languages/python/import-target.js +440 -0
  337. package/dist/core/code/engine/core/ingestion/languages/python/index-stats.js +30 -0
  338. package/dist/core/code/engine/core/ingestion/languages/python/index.js +96 -0
  339. package/dist/core/code/engine/core/ingestion/languages/python/interpret.js +430 -0
  340. package/dist/core/code/engine/core/ingestion/languages/python/merge-bindings.js +47 -0
  341. package/dist/core/code/engine/core/ingestion/languages/python/query.js +323 -0
  342. package/dist/core/code/engine/core/ingestion/languages/python/receiver-binding.js +310 -0
  343. package/dist/core/code/engine/core/ingestion/languages/python/scope-resolver.js +80 -0
  344. package/dist/core/code/engine/core/ingestion/languages/python/simple-hooks.js +53 -0
  345. package/dist/core/code/engine/core/ingestion/languages/python.js +140 -0
  346. package/dist/core/code/engine/core/ingestion/languages/ruby/arity.js +41 -0
  347. package/dist/core/code/engine/core/ingestion/languages/ruby/cache-stats.js +21 -0
  348. package/dist/core/code/engine/core/ingestion/languages/ruby/captures.js +864 -0
  349. package/dist/core/code/engine/core/ingestion/languages/ruby/import-target.js +88 -0
  350. package/dist/core/code/engine/core/ingestion/languages/ruby/index.js +29 -0
  351. package/dist/core/code/engine/core/ingestion/languages/ruby/interpret.js +115 -0
  352. package/dist/core/code/engine/core/ingestion/languages/ruby/merge-bindings.js +21 -0
  353. package/dist/core/code/engine/core/ingestion/languages/ruby/query.js +349 -0
  354. package/dist/core/code/engine/core/ingestion/languages/ruby/receiver-binding.js +70 -0
  355. package/dist/core/code/engine/core/ingestion/languages/ruby/scope-resolver.js +263 -0
  356. package/dist/core/code/engine/core/ingestion/languages/ruby/simple-hooks.js +68 -0
  357. package/dist/core/code/engine/core/ingestion/languages/ruby.js +215 -0
  358. package/dist/core/code/engine/core/ingestion/languages/rust/arity.js +16 -0
  359. package/dist/core/code/engine/core/ingestion/languages/rust/cache-stats.js +21 -0
  360. package/dist/core/code/engine/core/ingestion/languages/rust/captures.js +304 -0
  361. package/dist/core/code/engine/core/ingestion/languages/rust/import-decomposer.js +167 -0
  362. package/dist/core/code/engine/core/ingestion/languages/rust/import-target.js +108 -0
  363. package/dist/core/code/engine/core/ingestion/languages/rust/index.js +29 -0
  364. package/dist/core/code/engine/core/ingestion/languages/rust/interpret.js +201 -0
  365. package/dist/core/code/engine/core/ingestion/languages/rust/merge-bindings.js +21 -0
  366. package/dist/core/code/engine/core/ingestion/languages/rust/method-owners.js +76 -0
  367. package/dist/core/code/engine/core/ingestion/languages/rust/module-path.js +222 -0
  368. package/dist/core/code/engine/core/ingestion/languages/rust/qualified-call.js +482 -0
  369. package/dist/core/code/engine/core/ingestion/languages/rust/query.js +280 -0
  370. package/dist/core/code/engine/core/ingestion/languages/rust/range-binding.js +687 -0
  371. package/dist/core/code/engine/core/ingestion/languages/rust/receiver-binding.js +148 -0
  372. package/dist/core/code/engine/core/ingestion/languages/rust/scope-resolver.js +151 -0
  373. package/dist/core/code/engine/core/ingestion/languages/rust/simple-hooks.js +32 -0
  374. package/dist/core/code/engine/core/ingestion/languages/rust.js +183 -0
  375. package/dist/core/code/engine/core/ingestion/languages/swift/arity-metadata.js +44 -0
  376. package/dist/core/code/engine/core/ingestion/languages/swift/arity.js +45 -0
  377. package/dist/core/code/engine/core/ingestion/languages/swift/base-type.js +30 -0
  378. package/dist/core/code/engine/core/ingestion/languages/swift/cache-stats.js +32 -0
  379. package/dist/core/code/engine/core/ingestion/languages/swift/captures.js +594 -0
  380. package/dist/core/code/engine/core/ingestion/languages/swift/conditional-directive-preprocess.js +256 -0
  381. package/dist/core/code/engine/core/ingestion/languages/swift/implicit-imports.js +60 -0
  382. package/dist/core/code/engine/core/ingestion/languages/swift/import-decomposer.js +87 -0
  383. package/dist/core/code/engine/core/ingestion/languages/swift/import-target.js +84 -0
  384. package/dist/core/code/engine/core/ingestion/languages/swift/index.js +56 -0
  385. package/dist/core/code/engine/core/ingestion/languages/swift/interpret.js +93 -0
  386. package/dist/core/code/engine/core/ingestion/languages/swift/merge-bindings.js +51 -0
  387. package/dist/core/code/engine/core/ingestion/languages/swift/query.js +226 -0
  388. package/dist/core/code/engine/core/ingestion/languages/swift/receiver-binding.js +169 -0
  389. package/dist/core/code/engine/core/ingestion/languages/swift/scope-resolver.js +192 -0
  390. package/dist/core/code/engine/core/ingestion/languages/swift/sibling-type-bindings.js +68 -0
  391. package/dist/core/code/engine/core/ingestion/languages/swift/signature-bindings.js +69 -0
  392. package/dist/core/code/engine/core/ingestion/languages/swift/simple-hooks.js +65 -0
  393. package/dist/core/code/engine/core/ingestion/languages/swift/target-grouping.js +97 -0
  394. package/dist/core/code/engine/core/ingestion/languages/swift/target-siblings.js +74 -0
  395. package/dist/core/code/engine/core/ingestion/languages/swift.js +246 -0
  396. package/dist/core/code/engine/core/ingestion/languages/typescript/arity-metadata.js +106 -0
  397. package/dist/core/code/engine/core/ingestion/languages/typescript/arity.js +57 -0
  398. package/dist/core/code/engine/core/ingestion/languages/typescript/array-callback.js +58 -0
  399. package/dist/core/code/engine/core/ingestion/languages/typescript/cache-stats.js +34 -0
  400. package/dist/core/code/engine/core/ingestion/languages/typescript/captures.js +956 -0
  401. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-export-assignment.js +535 -0
  402. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-module-exports.js +196 -0
  403. package/dist/core/code/engine/core/ingestion/languages/typescript/import-decomposer.js +374 -0
  404. package/dist/core/code/engine/core/ingestion/languages/typescript/import-target.js +65 -0
  405. package/dist/core/code/engine/core/ingestion/languages/typescript/index.js +108 -0
  406. package/dist/core/code/engine/core/ingestion/languages/typescript/interpret.js +344 -0
  407. package/dist/core/code/engine/core/ingestion/languages/typescript/merge-bindings.js +161 -0
  408. package/dist/core/code/engine/core/ingestion/languages/typescript/nuxt-auto-imports.js +325 -0
  409. package/dist/core/code/engine/core/ingestion/languages/typescript/query.js +1328 -0
  410. package/dist/core/code/engine/core/ingestion/languages/typescript/receiver-binding.js +201 -0
  411. package/dist/core/code/engine/core/ingestion/languages/typescript/scope-resolver.js +293 -0
  412. package/dist/core/code/engine/core/ingestion/languages/typescript/simple-hooks.js +139 -0
  413. package/dist/core/code/engine/core/ingestion/languages/typescript.js +455 -0
  414. package/dist/core/code/engine/core/ingestion/languages/vue/captures.js +70 -0
  415. package/dist/core/code/engine/core/ingestion/languages/vue/import-target.js +61 -0
  416. package/dist/core/code/engine/core/ingestion/languages/vue/index.js +55 -0
  417. package/dist/core/code/engine/core/ingestion/languages/vue/scope-resolver.js +295 -0
  418. package/dist/core/code/engine/core/ingestion/languages/vue.js +96 -0
  419. package/dist/core/code/engine/core/ingestion/local-symbol-pruner.js +68 -0
  420. package/dist/core/code/engine/core/ingestion/method-extractors/configs/c-cpp.js +387 -0
  421. package/dist/core/code/engine/core/ingestion/method-extractors/configs/csharp.js +290 -0
  422. package/dist/core/code/engine/core/ingestion/method-extractors/configs/dart.js +392 -0
  423. package/dist/core/code/engine/core/ingestion/method-extractors/configs/go.js +179 -0
  424. package/dist/core/code/engine/core/ingestion/method-extractors/configs/jvm.js +350 -0
  425. package/dist/core/code/engine/core/ingestion/method-extractors/configs/php.js +306 -0
  426. package/dist/core/code/engine/core/ingestion/method-extractors/configs/python.js +312 -0
  427. package/dist/core/code/engine/core/ingestion/method-extractors/configs/ruby.js +289 -0
  428. package/dist/core/code/engine/core/ingestion/method-extractors/configs/rust.js +198 -0
  429. package/dist/core/code/engine/core/ingestion/method-extractors/configs/swift.js +286 -0
  430. package/dist/core/code/engine/core/ingestion/method-extractors/configs/typescript-javascript.js +341 -0
  431. package/dist/core/code/engine/core/ingestion/method-extractors/generic.js +209 -0
  432. package/dist/core/code/engine/core/ingestion/method-types.js +3 -0
  433. package/dist/core/code/engine/core/ingestion/model/field-registry.js +41 -0
  434. package/dist/core/code/engine/core/ingestion/model/index.js +52 -0
  435. package/dist/core/code/engine/core/ingestion/model/method-registry.js +138 -0
  436. package/dist/core/code/engine/core/ingestion/model/owned-members-lookup.js +46 -0
  437. package/dist/core/code/engine/core/ingestion/model/registration-table.js +234 -0
  438. package/dist/core/code/engine/core/ingestion/model/resolve.js +183 -0
  439. package/dist/core/code/engine/core/ingestion/model/scope-resolution-indexes.js +43 -0
  440. package/dist/core/code/engine/core/ingestion/model/semantic-model.js +179 -0
  441. package/dist/core/code/engine/core/ingestion/model/symbol-table.js +216 -0
  442. package/dist/core/code/engine/core/ingestion/model/type-registry.js +84 -0
  443. package/dist/core/code/engine/core/ingestion/mro-processor.js +709 -0
  444. package/dist/core/code/engine/core/ingestion/parsing-processor.js +312 -0
  445. package/dist/core/code/engine/core/ingestion/pipeline-phases/communities.js +69 -0
  446. package/dist/core/code/engine/core/ingestion/pipeline-phases/cross-file.js +71 -0
  447. package/dist/core/code/engine/core/ingestion/pipeline-phases/di.js +338 -0
  448. package/dist/core/code/engine/core/ingestion/pipeline-phases/http-api-calls.js +312 -0
  449. package/dist/core/code/engine/core/ingestion/pipeline-phases/index.js +54 -0
  450. package/dist/core/code/engine/core/ingestion/pipeline-phases/mro.js +40 -0
  451. package/dist/core/code/engine/core/ingestion/pipeline-phases/orm.js +78 -0
  452. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse-impl.js +1286 -0
  453. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse.js +41 -0
  454. package/dist/core/code/engine/core/ingestion/pipeline-phases/processes.js +193 -0
  455. package/dist/core/code/engine/core/ingestion/pipeline-phases/prune-local-symbols.js +29 -0
  456. package/dist/core/code/engine/core/ingestion/pipeline-phases/registry.js +52 -0
  457. package/dist/core/code/engine/core/ingestion/pipeline-phases/routes.js +409 -0
  458. package/dist/core/code/engine/core/ingestion/pipeline-phases/rpc-edges.js +301 -0
  459. package/dist/core/code/engine/core/ingestion/pipeline-phases/runner.js +207 -0
  460. package/dist/core/code/engine/core/ingestion/pipeline-phases/scan.js +49 -0
  461. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-aop.js +442 -0
  462. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-auto-configuration.js +264 -0
  463. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-config.js +440 -0
  464. package/dist/core/code/engine/core/ingestion/pipeline-phases/structure.js +38 -0
  465. package/dist/core/code/engine/core/ingestion/pipeline-phases/tools.js +89 -0
  466. package/dist/core/code/engine/core/ingestion/pipeline-phases/types.js +40 -0
  467. package/dist/core/code/engine/core/ingestion/pipeline.js +152 -0
  468. package/dist/core/code/engine/core/ingestion/process-processor.js +325 -0
  469. package/dist/core/code/engine/core/ingestion/resolve-references.js +205 -0
  470. package/dist/core/code/engine/core/ingestion/route-extractors/constant-resolver.js +135 -0
  471. package/dist/core/code/engine/core/ingestion/route-extractors/django-root-discovery.js +221 -0
  472. package/dist/core/code/engine/core/ingestion/route-extractors/django.js +428 -0
  473. package/dist/core/code/engine/core/ingestion/route-extractors/expo.js +39 -0
  474. package/dist/core/code/engine/core/ingestion/route-extractors/fastapi-router-bindings.js +264 -0
  475. package/dist/core/code/engine/core/ingestion/route-extractors/laravel.js +501 -0
  476. package/dist/core/code/engine/core/ingestion/route-extractors/middleware.js +175 -0
  477. package/dist/core/code/engine/core/ingestion/route-extractors/nextjs.js +81 -0
  478. package/dist/core/code/engine/core/ingestion/route-extractors/php.js +25 -0
  479. package/dist/core/code/engine/core/ingestion/route-extractors/python-const-resolver.js +307 -0
  480. package/dist/core/code/engine/core/ingestion/route-extractors/response-shapes.js +299 -0
  481. package/dist/core/code/engine/core/ingestion/route-extractors/route-path.js +71 -0
  482. package/dist/core/code/engine/core/ingestion/route-extractors/spring-shared.js +310 -0
  483. package/dist/core/code/engine/core/ingestion/route-extractors/spring.js +441 -0
  484. package/dist/core/code/engine/core/ingestion/scope-extractor-bridge.js +60 -0
  485. package/dist/core/code/engine/core/ingestion/scope-extractor.js +1373 -0
  486. package/dist/core/code/engine/core/ingestion/scope-resolution/contract/scope-resolver.js +282 -0
  487. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +72 -0
  488. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/edges.js +194 -0
  489. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/ids.js +472 -0
  490. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +49 -0
  491. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +43 -0
  492. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +274 -0
  493. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +93 -0
  494. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/callable-value-flow.js +1240 -0
  495. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/compound-receiver.js +1174 -0
  496. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/free-call-fallback.js +873 -0
  497. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/imported-return-types.js +226 -0
  498. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/mro.js +107 -0
  499. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/overload-narrowing.js +441 -0
  500. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/property-dispatch.js +122 -0
  501. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +1720 -0
  502. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/phase.js +395 -0
  503. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +208 -0
  504. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/registry.js +49 -0
  505. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/run.js +632 -0
  506. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/validate-bindings-immutability.js +112 -0
  507. package/dist/core/code/engine/core/ingestion/scope-resolution/resolution-outcome.js +41 -0
  508. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/namespace-targets.js +81 -0
  509. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/walkers.js +1835 -0
  510. package/dist/core/code/engine/core/ingestion/scope-resolution/unresolved-receivers.js +242 -0
  511. package/dist/core/code/engine/core/ingestion/scope-resolution/utils/definition-id.js +22 -0
  512. package/dist/core/code/engine/core/ingestion/scope-resolution/workspace-index.js +151 -0
  513. package/dist/core/code/engine/core/ingestion/structure-processor.js +40 -0
  514. package/dist/core/code/engine/core/ingestion/tree-sitter-queries.js +2244 -0
  515. package/dist/core/code/engine/core/ingestion/ts-js-hoc-utils.js +115 -0
  516. package/dist/core/code/engine/core/ingestion/type-env.js +1136 -0
  517. package/dist/core/code/engine/core/ingestion/type-extractors/c-cpp.js +555 -0
  518. package/dist/core/code/engine/core/ingestion/type-extractors/csharp.js +570 -0
  519. package/dist/core/code/engine/core/ingestion/type-extractors/dart.js +372 -0
  520. package/dist/core/code/engine/core/ingestion/type-extractors/go.js +508 -0
  521. package/dist/core/code/engine/core/ingestion/type-extractors/jvm.js +875 -0
  522. package/dist/core/code/engine/core/ingestion/type-extractors/php.js +537 -0
  523. package/dist/core/code/engine/core/ingestion/type-extractors/python.js +477 -0
  524. package/dist/core/code/engine/core/ingestion/type-extractors/ruby.js +380 -0
  525. package/dist/core/code/engine/core/ingestion/type-extractors/rust.js +502 -0
  526. package/dist/core/code/engine/core/ingestion/type-extractors/shared.js +843 -0
  527. package/dist/core/code/engine/core/ingestion/type-extractors/swift.js +490 -0
  528. package/dist/core/code/engine/core/ingestion/type-extractors/types.js +2 -0
  529. package/dist/core/code/engine/core/ingestion/type-extractors/typescript.js +690 -0
  530. package/dist/core/code/engine/core/ingestion/utils/ast-helpers.js +1693 -0
  531. package/dist/core/code/engine/core/ingestion/utils/call-analysis.js +779 -0
  532. package/dist/core/code/engine/core/ingestion/utils/callable-flow-captures.js +932 -0
  533. package/dist/core/code/engine/core/ingestion/utils/callable-labels.js +49 -0
  534. package/dist/core/code/engine/core/ingestion/utils/deferred-resolution-profile.js +151 -0
  535. package/dist/core/code/engine/core/ingestion/utils/effective-ram.js +67 -0
  536. package/dist/core/code/engine/core/ingestion/utils/env.js +60 -0
  537. package/dist/core/code/engine/core/ingestion/utils/event-loop.js +9 -0
  538. package/dist/core/code/engine/core/ingestion/utils/graph-sort.js +103 -0
  539. package/dist/core/code/engine/core/ingestion/utils/heap-probe.js +45 -0
  540. package/dist/core/code/engine/core/ingestion/utils/heritage-marker.js +47 -0
  541. package/dist/core/code/engine/core/ingestion/utils/line-base.js +24 -0
  542. package/dist/core/code/engine/core/ingestion/utils/max-file-size.js +59 -0
  543. package/dist/core/code/engine/core/ingestion/utils/method-props.js +198 -0
  544. package/dist/core/code/engine/core/ingestion/utils/qualified-name.js +73 -0
  545. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-captures.js +60 -0
  546. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-codec.js +188 -0
  547. package/dist/core/code/engine/core/ingestion/utils/scope-tree-walk.js +36 -0
  548. package/dist/core/code/engine/core/ingestion/utils/symbol-labels.js +48 -0
  549. package/dist/core/code/engine/core/ingestion/utils/template-arguments.js +187 -0
  550. package/dist/core/code/engine/core/ingestion/utils/type-parameters.js +209 -0
  551. package/dist/core/code/engine/core/ingestion/utils/verbose.js +6 -0
  552. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/c-cpp.js +133 -0
  553. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/csharp.js +66 -0
  554. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/dart.js +111 -0
  555. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/go.js +153 -0
  556. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/jvm.js +145 -0
  557. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/php.js +61 -0
  558. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/python.js +104 -0
  559. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/ruby.js +55 -0
  560. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/rust.js +79 -0
  561. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/swift.js +91 -0
  562. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/typescript-javascript.js +86 -0
  563. package/dist/core/code/engine/core/ingestion/variable-extractors/generic.js +111 -0
  564. package/dist/core/code/engine/core/ingestion/variable-types.js +3 -0
  565. package/dist/core/code/engine/core/ingestion/vue-sfc-extractor.js +544 -0
  566. package/dist/core/code/engine/core/ingestion/workers/callable-id.js +122 -0
  567. package/dist/core/code/engine/core/ingestion/workers/clone-safety.js +470 -0
  568. package/dist/core/code/engine/core/ingestion/workers/parse-worker.js +2456 -0
  569. package/dist/core/code/engine/core/ingestion/workers/post-result.js +90 -0
  570. package/dist/core/code/engine/core/ingestion/workers/quarantine.js +41 -0
  571. package/dist/core/code/engine/core/ingestion/workers/result-merge.js +59 -0
  572. package/dist/core/code/engine/core/ingestion/workers/worker-pool.js +1725 -0
  573. package/dist/core/code/engine/core/ingestion/workspace-config.js +139 -0
  574. package/dist/core/code/engine/core/lbug/conn-lock.js +72 -0
  575. package/dist/core/code/engine/core/lbug/csv-generator.js +710 -0
  576. package/dist/core/code/engine/core/lbug/cypher-escape.js +24 -0
  577. package/dist/core/code/engine/core/lbug/extension-load-error.js +339 -0
  578. package/dist/core/code/engine/core/lbug/extension-loader.js +261 -0
  579. package/dist/core/code/engine/core/lbug/graph-emit-sink.js +584 -0
  580. package/dist/core/code/engine/core/lbug/lbug-adapter.js +2703 -0
  581. package/dist/core/code/engine/core/lbug/lbug-config.js +1029 -0
  582. package/dist/core/code/engine/core/lbug/native-check.js +435 -0
  583. package/dist/core/code/engine/core/lbug/pool-adapter.js +973 -0
  584. package/dist/core/code/engine/core/lbug/query-params.js +25 -0
  585. package/dist/core/code/engine/core/lbug/query-result-utils.js +31 -0
  586. package/dist/core/code/engine/core/lbug/rel-pair-routing.js +373 -0
  587. package/dist/core/code/engine/core/lbug/schema.js +771 -0
  588. package/dist/core/code/engine/core/lbug/shutdown-helpers.js +40 -0
  589. package/dist/core/code/engine/core/lbug/sidecar-recovery.js +716 -0
  590. package/dist/core/code/engine/core/lbug/stdio-capture.js +49 -0
  591. package/dist/core/code/engine/core/lbug/sync-csv-writer.js +115 -0
  592. package/dist/core/code/engine/core/lbug/wal-checkpoint-driver.js +215 -0
  593. package/dist/core/code/engine/core/lbug/wal-driver-state.js +28 -0
  594. package/dist/core/code/engine/core/logger.js +339 -0
  595. package/dist/core/code/engine/core/platform/capabilities.js +91 -0
  596. package/dist/core/code/engine/core/run-analyze.js +1098 -0
  597. package/dist/core/code/engine/core/tree-sitter/parser-loader.js +281 -0
  598. package/dist/core/code/engine/core/tree-sitter/safe-parse.js +258 -0
  599. package/dist/core/code/engine/core/tree-sitter/vendored-grammars.js +64 -0
  600. package/dist/core/code/engine/lib/utils.js +121 -0
  601. package/dist/core/code/engine/mcp/core/lbug-adapter.js +27 -0
  602. package/dist/core/code/engine/mcp/local/aop-metadata.js +230 -0
  603. package/dist/core/code/engine/mcp/local/bean-metadata.js +49 -0
  604. package/dist/core/code/engine/mcp/local/limits.js +15 -0
  605. package/dist/core/code/engine/mcp/local/line-display.js +6 -0
  606. package/dist/core/code/engine/mcp/local/local-backend.js +4142 -0
  607. package/dist/core/code/engine/storage/branch-index.js +72 -0
  608. package/dist/core/code/engine/storage/file-hash.js +95 -0
  609. package/dist/core/code/engine/storage/fs-atomic.js +34 -0
  610. package/dist/core/code/engine/storage/git.js +555 -0
  611. package/dist/core/code/engine/storage/index-lock.js +664 -0
  612. package/dist/core/code/engine/storage/parse-cache.js +650 -0
  613. package/dist/core/code/engine/storage/parsedfile-store.js +620 -0
  614. package/dist/core/code/engine/storage/repo-manager.js +1061 -0
  615. package/dist/core/code/engine/storage/scope-index-store.js +247 -0
  616. package/dist/core/code/engine/types/pipeline.js +2 -0
  617. package/dist/core/code/scripts/install-duckdb-extension.mjs +125 -0
  618. package/dist/core/code/scripts/resolve-analyze-cmd.cjs +346 -0
  619. package/dist/core/code/shared/graph/types.js +8 -0
  620. package/dist/core/code/shared/index.js +105 -0
  621. package/dist/core/code/shared/integrations/circuit-breaker.js +242 -0
  622. package/dist/core/code/shared/integrations/resilient-fetch.js +224 -0
  623. package/dist/core/code/shared/integrations/retry.js +70 -0
  624. package/dist/core/code/shared/integrations/understand-quickly.js +145 -0
  625. package/dist/core/code/shared/language-detection.js +162 -0
  626. package/dist/core/code/shared/languages.js +27 -0
  627. package/dist/core/code/shared/lbug/schema-constants.js +98 -0
  628. package/dist/core/code/shared/mro-strategy.js +2 -0
  629. package/dist/core/code/shared/pipeline.js +5 -0
  630. package/dist/core/code/shared/scope-resolution/callable-flow-site.js +11 -0
  631. package/dist/core/code/shared/scope-resolution/def-index.js +53 -0
  632. package/dist/core/code/shared/scope-resolution/evidence-weights.js +87 -0
  633. package/dist/core/code/shared/scope-resolution/finalize-algorithm.js +807 -0
  634. package/dist/core/code/shared/scope-resolution/language-classification.js +46 -0
  635. package/dist/core/code/shared/scope-resolution/method-dispatch-index.js +100 -0
  636. package/dist/core/code/shared/scope-resolution/module-scope-index.js +59 -0
  637. package/dist/core/code/shared/scope-resolution/origin-priority.js +23 -0
  638. package/dist/core/code/shared/scope-resolution/parsed-file.js +54 -0
  639. package/dist/core/code/shared/scope-resolution/position-index.js +136 -0
  640. package/dist/core/code/shared/scope-resolution/qualified-name-index.js +77 -0
  641. package/dist/core/code/shared/scope-resolution/reference-site.js +24 -0
  642. package/dist/core/code/shared/scope-resolution/registries/class-registry.js +32 -0
  643. package/dist/core/code/shared/scope-resolution/registries/context.js +52 -0
  644. package/dist/core/code/shared/scope-resolution/registries/evidence.js +152 -0
  645. package/dist/core/code/shared/scope-resolution/registries/field-registry.js +33 -0
  646. package/dist/core/code/shared/scope-resolution/registries/lookup-core.js +392 -0
  647. package/dist/core/code/shared/scope-resolution/registries/lookup-qualified.js +58 -0
  648. package/dist/core/code/shared/scope-resolution/registries/macro-registry.js +34 -0
  649. package/dist/core/code/shared/scope-resolution/registries/method-registry.js +34 -0
  650. package/dist/core/code/shared/scope-resolution/registries/tie-breaks.js +63 -0
  651. package/dist/core/code/shared/scope-resolution/resolve-type-ref.js +128 -0
  652. package/dist/core/code/shared/scope-resolution/scope-id.js +49 -0
  653. package/dist/core/code/shared/scope-resolution/scope-tree.js +225 -0
  654. package/dist/core/code/shared/scope-resolution/symbol-definition.js +12 -0
  655. package/dist/core/code/shared/scope-resolution/types.js +25 -0
  656. package/dist/core/code/shared/test-helpers.js +17 -0
  657. package/dist/core/code/vendor/leiden/index.cjs +355 -0
  658. package/dist/core/code/vendor/leiden/utils.cjs +419 -0
  659. package/dist/core/timeline/cli.d.ts.map +1 -1
  660. package/dist/core/timeline/cli.js +13 -6
  661. package/dist/core/timeline/cli.js.map +1 -1
  662. package/dist/core/timeline/debris.d.ts +20 -0
  663. package/dist/core/timeline/debris.d.ts.map +1 -0
  664. package/dist/core/timeline/debris.js +124 -0
  665. package/dist/core/timeline/debris.js.map +1 -0
  666. package/dist/core/timeline/hook-runner.d.ts.map +1 -1
  667. package/dist/core/timeline/hook-runner.js +3 -1
  668. package/dist/core/timeline/hook-runner.js.map +1 -1
  669. package/dist/core/timeline/hooks.d.ts.map +1 -1
  670. package/dist/core/timeline/hooks.js +13 -5
  671. package/dist/core/timeline/hooks.js.map +1 -1
  672. package/dist/core/timeline/installer.d.ts +2 -0
  673. package/dist/core/timeline/installer.d.ts.map +1 -1
  674. package/dist/core/timeline/installer.js +12 -0
  675. package/dist/core/timeline/installer.js.map +1 -1
  676. package/dist/core/timeline/project-root.d.ts +21 -0
  677. package/dist/core/timeline/project-root.d.ts.map +1 -0
  678. package/dist/core/timeline/project-root.js +83 -0
  679. package/dist/core/timeline/project-root.js.map +1 -0
  680. package/package.json +1 -1
@@ -0,0 +1,932 @@
1
+ "use strict";
2
+ /**
3
+ * Configurable AST-to-`@callable-flow.*` capture synthesis.
4
+ *
5
+ * The traversal is language-neutral: providers supply their grammar's node
6
+ * vocabulary and the small semantic callbacks (true-reference bindings,
7
+ * callable signatures, protocol invocation names). The central extractor
8
+ * never sees a parser node and shared ingestion code never branches on a
9
+ * language name.
10
+ *
11
+ * ## The cell/site model
12
+ *
13
+ * A *cell* is a named storage location that may hold a callable — a variable,
14
+ * parameter, field or pointer, canonicalized to a binding key by the scope
15
+ * tree. A *site* is one observed fact about cells, emitted here as a capture
16
+ * match and consumed by `passes/callable-value-flow.ts`, which runs them to a
17
+ * fixpoint. The site kinds (`CallableFlowSite`) are:
18
+ *
19
+ * - `seed` — a cell acquires a named callable: `f = target`. Carries
20
+ * `@callable-flow.target-name`, the name the pass resolves against.
21
+ * - `copy` / `alias` — a cell takes another cell's contents, so targets flow
22
+ * between them.
23
+ * - `address` / `store` / `load` — indirection through a pointer cell.
24
+ * - `formal` — a parameter cell of a known function, by index.
25
+ * - `argument` — a callable passed at a call site, binding to that `formal`.
26
+ * - `invoke` — a call THROUGH a cell (`f()`), the site that ultimately becomes
27
+ * a `CALLS` edge once the cell's target set is known.
28
+ *
29
+ * ## The anonymous-callable convention
30
+ *
31
+ * A closure literal has no name to resolve against, so a `seed` whose source
32
+ * is an anonymous callable takes its **destination's** name as
33
+ * `@callable-flow.target-name` — `val f = { }` seeds "the cell `f` holds the
34
+ * callable named `f`". That is deliberately self-referential and only resolves
35
+ * because the binding itself is a callable target: `buildGraphTargetIndex`
36
+ * admits it on the label of the graph node it resolves to, which #2687 makes a
37
+ * `Function` for exactly this construct. Languages whose closure binding does
38
+ * NOT emit a callable graph node get no resolution from the convention alone
39
+ * (#2693).
40
+ *
41
+ * ## Adding a language
42
+ *
43
+ * Supply `CallableFlowCaptureOptions` from `<lang>/captures.ts` and call
44
+ * `synthesizeCallableFlowCaptures`. Two recurring traps:
45
+ *
46
+ * - A **fieldless** assignment/binding node decomposes to nothing under the
47
+ * shared `left`/`name`/`value` fallback in `assignmentParts`. Supply
48
+ * `extractAssignment` (Kotlin's `assignment`, Dart's
49
+ * `initialized_identifier`). Returning `undefined` falls back to the shared
50
+ * path, so one callback can handle the odd node and leave the rest alone.
51
+ * - A binding needs a `SymbolDefinition` for the pass to attach to. Captures
52
+ * alone are not enough: without a `@declaration.*` for the bound name, the
53
+ * seed has no cell to key on.
54
+ *
55
+ * `c/captures.ts` is the fullest worked example (pointers, signatures,
56
+ * overload selection); `dart/captures.ts` the smallest interesting one.
57
+ */
58
+ Object.defineProperty(exports, "__esModule", { value: true });
59
+ exports.synthesizeCallableFlowCaptures = synthesizeCallableFlowCaptures;
60
+ exports.subscriptBase = subscriptBase;
61
+ const ast_helpers_js_1 = require("./ast-helpers.js");
62
+ /**
63
+ * Emit normalized flow captures in deterministic source order.
64
+ *
65
+ * One explicit DFS supplies all phases below. Query-backed emitters may still
66
+ * perform their existing query walk; this helper never reparses and remains
67
+ * linear in AST size (the scope-capture benchmark guards the scaling ratio).
68
+ */
69
+ function synthesizeCallableFlowCaptures(root, options) {
70
+ const nodes = collectNodes(root);
71
+ const functions = collectFunctions(nodes, options);
72
+ const knownCallableNames = new Set(functions.map((fn) => fn.name));
73
+ const assignments = collectAssignments(nodes, options);
74
+ const valueBindings = buildValueBindingIndex(nodes, assignments, functions, options);
75
+ const out = [];
76
+ for (const assignment of assignments) {
77
+ emitAssignmentFact(assignment, knownCallableNames, valueBindings, options, out);
78
+ }
79
+ for (const fn of functions)
80
+ emitFormalFacts(fn, options, out);
81
+ for (const node of nodes) {
82
+ if (options.callNodeTypes.has(node.type) &&
83
+ (options.isCallNode === undefined || options.isCallNode(node))) {
84
+ emitCallFacts(node, knownCallableNames, valueBindings, options, out);
85
+ }
86
+ }
87
+ out.sort((a, b) => compareCaptures(firstCapture(a), firstCapture(b)));
88
+ return out;
89
+ }
90
+ function collectNodes(root) {
91
+ const out = [];
92
+ const stack = [root];
93
+ while (stack.length > 0) {
94
+ const node = stack.pop();
95
+ out.push(node);
96
+ const children = node.namedChildren;
97
+ for (let i = children.length - 1; i >= 0; i--) {
98
+ const child = children[i];
99
+ if (child !== null)
100
+ stack.push(child);
101
+ }
102
+ }
103
+ return out;
104
+ }
105
+ function collectFunctions(nodes, options) {
106
+ const out = [];
107
+ for (const node of nodes) {
108
+ if (!options.functionNodeTypes.has(node.type))
109
+ continue;
110
+ const name = options.functionName?.(node) ?? defaultFunctionName(node, options);
111
+ if (name === undefined || name.length === 0)
112
+ continue;
113
+ out.push({ node, name, parameters: functionParameters(node, options) });
114
+ }
115
+ return out;
116
+ }
117
+ function defaultFunctionName(node, options) {
118
+ const direct = node.childForFieldName('name');
119
+ if (direct !== null) {
120
+ const id = terminalIdentifier(direct, options);
121
+ if (id !== undefined)
122
+ return id.text;
123
+ }
124
+ const declarator = node.childForFieldName('declarator');
125
+ if (declarator !== null) {
126
+ const id = bindingIdentifier(declarator, options);
127
+ if (id !== undefined)
128
+ return id.text;
129
+ }
130
+ const parent = node.parent;
131
+ if (parent !== null && options.bindingNodeTypes.has(parent.type)) {
132
+ const destination = assignmentParts(parent, options)[0]?.destination;
133
+ if (destination !== undefined)
134
+ return bindingIdentifier(destination, options)?.text;
135
+ }
136
+ return undefined;
137
+ }
138
+ function functionParameters(node, options) {
139
+ const providerParameters = options.extractFunctionParameters?.(node);
140
+ if (providerParameters !== undefined)
141
+ return providerParameters;
142
+ const explicit = node.childForFieldName('parameters') ??
143
+ node.childForFieldName('parameter') ??
144
+ findFirstDescendantOfTypes(node, options.parameterListNodeTypes);
145
+ if (explicit === null)
146
+ return [];
147
+ const direct = explicit.namedChildren.filter((child) => child !== null &&
148
+ (options.parameterNodeTypes.has(child.type) ||
149
+ (options.parameterListNodeTypes.has(explicit.type) &&
150
+ bindingIdentifier(child, options) !== undefined)));
151
+ return direct;
152
+ }
153
+ function collectAssignments(nodes, options) {
154
+ const out = [];
155
+ const seen = new Set();
156
+ for (const node of nodes) {
157
+ if (!options.bindingNodeTypes.has(node.type) && !options.assignmentNodeTypes.has(node.type)) {
158
+ continue;
159
+ }
160
+ if (seen.has(node.id))
161
+ continue;
162
+ const parts = assignmentParts(node, options);
163
+ if (parts.length === 0)
164
+ continue;
165
+ seen.add(node.id);
166
+ out.push(...parts);
167
+ }
168
+ return out;
169
+ }
170
+ function buildValueBindingIndex(nodes, assignments, functions, options) {
171
+ const assignmentRegionIdsByName = new Map();
172
+ const formalByOwner = new Map();
173
+ const signatureByNameAndRegion = new Map();
174
+ const add = (index, owner, name) => {
175
+ let names = index.get(owner);
176
+ if (names === undefined) {
177
+ names = new Set();
178
+ index.set(owner, names);
179
+ }
180
+ names.add(name);
181
+ };
182
+ for (const assignment of assignments) {
183
+ const destinationNames = new Set();
184
+ const destination = operandSyntax(assignment.destination, options, true);
185
+ if (destination !== undefined)
186
+ destinationNames.add(destination.name);
187
+ // Member-path destinations (`o->run = handler`) store into the MEMBER's
188
+ // name-cell — the seed fact is keyed on `run`, so the store must be
189
+ // visible under that name too or the member-call invoke gate never sees
190
+ // it (#2522 review, M3 ops-vtable pattern).
191
+ const terminal = terminalIdentifier(assignment.destination, options);
192
+ if (terminal !== undefined)
193
+ destinationNames.add(terminal.text);
194
+ for (const name of destinationNames) {
195
+ const region = nearestLexicalRegion(assignment.container, options);
196
+ let regionIds = assignmentRegionIdsByName.get(name);
197
+ if (regionIds === undefined) {
198
+ regionIds = new Set();
199
+ assignmentRegionIdsByName.set(name, regionIds);
200
+ }
201
+ regionIds.add(region.id);
202
+ if (options.functionScopedValueBindings === true) {
203
+ const functionOwner = nearestFunctionOwner(assignment.container, options);
204
+ if (functionOwner !== undefined)
205
+ regionIds.add(functionOwner.id);
206
+ }
207
+ }
208
+ }
209
+ for (const fn of functions) {
210
+ for (const parameter of fn.parameters) {
211
+ const binding = bindingIdentifier(parameter, options);
212
+ if (binding !== undefined)
213
+ add(formalByOwner, fn.node.id, binding.text);
214
+ }
215
+ }
216
+ for (const node of nodes) {
217
+ if (options.callableSignatureDeclarationNodeTypes?.has(node.type) !== true)
218
+ continue;
219
+ const binding = bindingIdentifier(node, options);
220
+ const signature = options.expectedSignature?.(node, node);
221
+ if (binding === undefined || signature === undefined)
222
+ continue;
223
+ // Only callable-typed VARIABLE declarations (`void (*fp)(int);`) create
224
+ // value cells — a plain function/method prototype (`void f(int);`)
225
+ // declares a callee, not a value. A variable declarator interposes a
226
+ // pointer/parenthesized declarator between the declaration and its
227
+ // identifier; a prototype's identifier hangs directly off the function
228
+ // declarator. Indexing prototypes here turned every call to a declared
229
+ // function into an indirect invoke — and, with
230
+ // `emitCanonicalInvokeReference`, minted a free-call reference that
231
+ // bypassed the precise passes' two-phase/ambiguity suppression
232
+ // (#2522 CI: eight cpp resolver tests gained a phantom edge).
233
+ if (!bindingInterposesValueDeclarator(node, binding))
234
+ continue;
235
+ const region = nearestLexicalRegion(node, options);
236
+ let byRegion = signatureByNameAndRegion.get(binding.text);
237
+ if (byRegion === undefined) {
238
+ byRegion = new Map();
239
+ signatureByNameAndRegion.set(binding.text, byRegion);
240
+ }
241
+ byRegion.set(region.id, signature);
242
+ if (options.functionScopedValueBindings === true) {
243
+ const functionOwner = nearestFunctionOwner(node, options);
244
+ if (functionOwner !== undefined)
245
+ byRegion.set(functionOwner.id, signature);
246
+ }
247
+ }
248
+ return { assignmentRegionIdsByName, formalByOwner, signatureByNameAndRegion };
249
+ }
250
+ /** True when a pointer/parenthesized declarator sits between the declaration
251
+ * and its binding identifier — the shape of a callable-typed variable, never
252
+ * of a plain prototype. Only C/C++ supply signature-declaration node types,
253
+ * so the type-name sniff stays scoped to those grammars. */
254
+ function bindingInterposesValueDeclarator(declaration, binding) {
255
+ let node = binding.parent;
256
+ while (node !== null && node.id !== declaration.id) {
257
+ if (node.type.includes('pointer') || node.type.includes('parenthesized'))
258
+ return true;
259
+ node = node.parent;
260
+ }
261
+ return false;
262
+ }
263
+ function nearestFunctionOwner(input, options) {
264
+ const providerOwner = options.lexicalFunctionOwner?.(input);
265
+ if (providerOwner !== undefined)
266
+ return providerOwner;
267
+ let node = input;
268
+ while (node !== null) {
269
+ if (options.functionNodeTypes.has(node.type))
270
+ return node;
271
+ node = node.parent;
272
+ }
273
+ return undefined;
274
+ }
275
+ function nearestLexicalRegion(input, options) {
276
+ const providerOwner = options.lexicalFunctionOwner?.(input);
277
+ let node = input.parent;
278
+ let outermost = input;
279
+ while (node !== null) {
280
+ outermost = node;
281
+ if (providerOwner !== undefined && node.id === providerOwner.id)
282
+ return node;
283
+ if (options.functionNodeTypes.has(node.type) || isLexicalRegionNode(node))
284
+ return node;
285
+ node = node.parent;
286
+ }
287
+ return providerOwner ?? outermost;
288
+ }
289
+ function isLexicalRegionNode(node) {
290
+ return /(?:^|_)(?:block|body|compound_statement|source_file|program|module|script)(?:$|_)/.test(node.type);
291
+ }
292
+ function isVisibleValueBinding(input, name, bindings, options) {
293
+ const assignmentRegionIds = bindings.assignmentRegionIdsByName.get(name);
294
+ const providerOwner = options.lexicalFunctionOwner?.(input);
295
+ if (providerOwner !== undefined &&
296
+ (assignmentRegionIds?.has(providerOwner.id) === true ||
297
+ bindings.formalByOwner.get(providerOwner.id)?.has(name) === true)) {
298
+ return true;
299
+ }
300
+ let node = input;
301
+ while (node !== null) {
302
+ if (assignmentRegionIds?.has(node.id) === true)
303
+ return true;
304
+ if (options.functionNodeTypes.has(node.type) &&
305
+ bindings.formalByOwner.get(node.id)?.has(name) === true) {
306
+ return true;
307
+ }
308
+ node = node.parent;
309
+ }
310
+ if (bindings.formalByOwner.get(undefined)?.has(name) === true)
311
+ return true;
312
+ // A declared callable-typed binding (file-scope `void (*fp)(int);`) is a
313
+ // value binding wherever its declaration is visible — its assignments may
314
+ // live in OTHER functions (the init/register callback pattern), so
315
+ // assignment regions alone under-approximate visibility and the cross-
316
+ // function call emitted no invoke fact at all (#2522 review, H1).
317
+ return visibleCallableSignature(input, name, bindings, options) !== undefined;
318
+ }
319
+ function visibleCallableSignature(input, name, bindings, options) {
320
+ const byRegion = bindings.signatureByNameAndRegion.get(name);
321
+ if (byRegion === undefined)
322
+ return undefined;
323
+ const providerOwner = options.lexicalFunctionOwner?.(input);
324
+ if (providerOwner !== undefined) {
325
+ const signature = byRegion.get(providerOwner.id);
326
+ if (signature !== undefined)
327
+ return signature;
328
+ }
329
+ let node = input;
330
+ while (node !== null) {
331
+ const signature = byRegion.get(node.id);
332
+ if (signature !== undefined)
333
+ return signature;
334
+ node = node.parent;
335
+ }
336
+ return undefined;
337
+ }
338
+ function assignmentParts(node, options) {
339
+ const providerParts = options.extractAssignment?.(node);
340
+ if (providerParts !== undefined) {
341
+ const pairs = Array.isArray(providerParts) ? providerParts : [providerParts];
342
+ return pairs.map((pair) => ({ container: node, ...pair }));
343
+ }
344
+ const destination = node.childForFieldName('left') ??
345
+ node.childForFieldName('name') ??
346
+ node.childForFieldName('pattern') ??
347
+ node.childForFieldName('declarator') ??
348
+ node.childForFieldName('target'); // Swift assignment
349
+ const source = node.childForFieldName('right') ??
350
+ node.childForFieldName('value') ??
351
+ node.childForFieldName('initializer') ??
352
+ node.childForFieldName('default_value') ??
353
+ node.childForFieldName('result'); // Swift assignment
354
+ // Declaration wrappers often contain the real initialized declarator one
355
+ // level below (for example a declarator list).
356
+ if (destination === null || source === null) {
357
+ for (const child of node.namedChildren) {
358
+ if (child === null || child.id === node.id)
359
+ continue;
360
+ if (!options.bindingNodeTypes.has(child.type))
361
+ continue;
362
+ const nested = assignmentParts(child, options);
363
+ if (nested.length > 0)
364
+ return nested;
365
+ }
366
+ }
367
+ if (destination === null || source === null)
368
+ return [];
369
+ return [{ container: node, destination, source }];
370
+ }
371
+ function emitAssignmentFact(assignment, knownCallableNames, valueBindings, options, out) {
372
+ const destination = operandSyntax(assignment.destination, options, options.bindingNodeTypes.has(assignment.container.type));
373
+ const source = operandSyntax(assignment.source, options);
374
+ if (destination === undefined || source === undefined)
375
+ return;
376
+ const signature = options.expectedSignature?.(assignment.container, assignment.destination) ??
377
+ visibleCallableSignature(assignment.container, destination.name, valueBindings, options);
378
+ const sourceIsValueBinding = isVisibleValueBinding(assignment.source, source.name, valueBindings, options);
379
+ if (options.bareNamesAreCalls === true &&
380
+ source.directDesignator &&
381
+ !source.callableReference &&
382
+ !source.anonymousCallable &&
383
+ !sourceIsValueBinding) {
384
+ // The RHS is the produced value of a call, not a reference to the callee.
385
+ return;
386
+ }
387
+ const sourceIsKnownCallable = source.callableReference ||
388
+ source.anonymousCallable ||
389
+ (source.directDesignator &&
390
+ !sourceIsValueBinding &&
391
+ (knownCallableNames.has(source.name) ||
392
+ source.qualifiedName !== undefined ||
393
+ signature !== undefined));
394
+ const flowSource = sourceIsKnownCallable ? asCallableDesignator(source) : source;
395
+ // A call/constructor/composite result is not the function designator that
396
+ // appears inside it. This guard must precede the store path: otherwise
397
+ // `*slot = factory()` stores `factory` itself into `slot`.
398
+ if (!source.directDesignator &&
399
+ !sourceIsKnownCallable &&
400
+ source.indirection === 0 &&
401
+ !source.addressOf) {
402
+ return;
403
+ }
404
+ if (destination.indirection > 0) {
405
+ out.push(binaryFact('store', assignment.container, 'pointer', destination, 'source', flowSource));
406
+ return;
407
+ }
408
+ if (source.addressOf && !sourceIsKnownCallable) {
409
+ // An address of a value binding creates an abstract-cell edge. Addresses
410
+ // of named callables are seeds instead (function designator semantics).
411
+ if (sourceIsValueBinding) {
412
+ out.push(binaryFact('address', assignment.container, 'destination', destination, 'source', source));
413
+ }
414
+ else if (source.directDesignator) {
415
+ // A declaration imported from another file is only visible after scope
416
+ // finalization. Preserve both interpretations here: the address relation
417
+ // supports pointer-to-pointer cells, while the copy lets the solver's
418
+ // exact lexical/import lookup recognize `auto fp = &importedTarget`.
419
+ out.push(binaryFact('address', assignment.container, 'destination', destination, 'source', source));
420
+ out.push(binaryFact('copy', assignment.container, 'destination', destination, 'source', source));
421
+ }
422
+ return;
423
+ }
424
+ if (source.indirection > 0 && !sourceIsKnownCallable) {
425
+ out.push(binaryFact('load', assignment.container, 'destination', destination, 'pointer', source));
426
+ return;
427
+ }
428
+ if (sourceIsKnownCallable) {
429
+ const match = {
430
+ '@callable-flow.seed': (0, ast_helpers_js_1.nodeToCapture)('@callable-flow.seed', assignment.container),
431
+ '@callable-flow.destination': operandCapture('@callable-flow.destination', destination),
432
+ '@callable-flow.target': operandCapture('@callable-flow.target', flowSource),
433
+ '@callable-flow.target-name': (0, ast_helpers_js_1.syntheticCapture)('@callable-flow.target-name', flowSource.node, flowSource.anonymousCallable ? destination.name : flowSource.name),
434
+ };
435
+ if (flowSource.qualifiedName !== undefined) {
436
+ match['@callable-flow.target-qualified-name'] = (0, ast_helpers_js_1.syntheticCapture)('@callable-flow.target-qualified-name', flowSource.node, options.normalizeQualifiedName?.(flowSource.qualifiedName) ?? flowSource.qualifiedName);
437
+ }
438
+ addSignatureCaptures(match, assignment.container, signature);
439
+ out.push(match);
440
+ return;
441
+ }
442
+ const kind = options.isTrueReferenceBinding?.(assignment.container, assignment.destination)
443
+ ? 'alias'
444
+ : 'copy';
445
+ out.push(binaryFact(kind, assignment.container, 'destination', destination, 'source', flowSource));
446
+ }
447
+ function emitFormalFacts(fn, options, out) {
448
+ for (let index = 0; index < fn.parameters.length; index++) {
449
+ const parameter = fn.parameters[index];
450
+ const binding = bindingIdentifier(parameter, options);
451
+ if (binding === undefined)
452
+ continue;
453
+ const mode = options.parameterPassingMode?.(parameter) ?? 'value';
454
+ const match = {
455
+ '@callable-flow.formal': (0, ast_helpers_js_1.nodeToCapture)('@callable-flow.formal', fn.node),
456
+ '@callable-flow.owner': (0, ast_helpers_js_1.syntheticCapture)('@callable-flow.owner', fn.node, fn.name),
457
+ '@callable-flow.binding': (0, ast_helpers_js_1.syntheticCapture)('@callable-flow.binding', binding, binding.text),
458
+ '@callable-flow.parameter-index': (0, ast_helpers_js_1.syntheticCapture)('@callable-flow.parameter-index', binding, String(index)),
459
+ '@callable-flow.passing-mode': (0, ast_helpers_js_1.syntheticCapture)('@callable-flow.passing-mode', parameter, mode),
460
+ };
461
+ addSignatureCaptures(match, parameter, options.expectedSignature?.(parameter, parameter));
462
+ out.push(match);
463
+ }
464
+ }
465
+ function emitCallFacts(call, knownCallableNames, valueBindings, options, out) {
466
+ const calleeNode = options.extractCallCallee?.(call) ??
467
+ call.childForFieldName('function') ??
468
+ call.childForFieldName('callee') ??
469
+ call.childForFieldName('name') ??
470
+ call.childForFieldName('method') ??
471
+ call.firstNamedChild;
472
+ if (calleeNode === null)
473
+ return;
474
+ const callSite = options.callSiteNode?.(call) ?? call;
475
+ const args = callArguments(call, options);
476
+ const member = directCallMemberParts(call, options) ?? memberParts(calleeNode, options);
477
+ const callee = operandSyntax(calleeNode, options);
478
+ const calleeIsValueBinding = callee !== undefined && isVisibleValueBinding(call, callee.name, valueBindings, options);
479
+ const directCalleeName = member === undefined &&
480
+ callee !== undefined &&
481
+ callee.indirection === 0 &&
482
+ !calleeIsValueBinding
483
+ ? callee.name
484
+ : undefined;
485
+ for (let index = 0; index < args.length; index++) {
486
+ const rawSource = operandSyntax(args[index], options);
487
+ if (rawSource === undefined)
488
+ continue;
489
+ // A call/constructor/composite result is a produced value, not a reference
490
+ // to the terminal identifier inside the expression.
491
+ if (!rawSource.directDesignator && rawSource.indirection === 0 && !rawSource.addressOf) {
492
+ continue;
493
+ }
494
+ const sourceIsValueBinding = isVisibleValueBinding(args[index], rawSource.name, valueBindings, options);
495
+ if (options.bareNamesAreCalls === true &&
496
+ rawSource.directDesignator &&
497
+ !rawSource.callableReference &&
498
+ !rawSource.anonymousCallable &&
499
+ !sourceIsValueBinding) {
500
+ // Bare argument name = a call's produced value in this language.
501
+ continue;
502
+ }
503
+ const sourceIsKnownCallable = rawSource.callableReference ||
504
+ rawSource.anonymousCallable ||
505
+ (rawSource.directDesignator &&
506
+ !sourceIsValueBinding &&
507
+ (knownCallableNames.has(rawSource.name) || rawSource.qualifiedName !== undefined));
508
+ // Keep unresolved direct identifiers (not arbitrary expressions): imports
509
+ // and cross-file callable bindings are only known after registry finalize.
510
+ // The solver requires an exact callable lexical binding before propagating,
511
+ // so ordinary value arguments remain inert.
512
+ if (!sourceIsValueBinding &&
513
+ !sourceIsKnownCallable &&
514
+ !rawSource.directDesignator &&
515
+ !rawSource.addressOf) {
516
+ continue;
517
+ }
518
+ const source = sourceIsKnownCallable ? asCallableDesignator(rawSource) : rawSource;
519
+ out.push({
520
+ '@callable-flow.argument': (0, ast_helpers_js_1.nodeToCapture)('@callable-flow.argument', callSite),
521
+ '@callable-flow.source': operandCapture('@callable-flow.source', source),
522
+ ...operandMetadataCaptures('source', source),
523
+ ...(source.indirection > 0
524
+ ? {
525
+ '@callable-flow.source-indirection': (0, ast_helpers_js_1.syntheticCapture)('@callable-flow.source-indirection', source.node, String(source.indirection)),
526
+ }
527
+ : {}),
528
+ ...(source.addressOf
529
+ ? {
530
+ '@callable-flow.source-address': (0, ast_helpers_js_1.syntheticCapture)('@callable-flow.source-address', source.node, 'true'),
531
+ }
532
+ : {}),
533
+ '@callable-flow.parameter-index': (0, ast_helpers_js_1.syntheticCapture)('@callable-flow.parameter-index', args[index], String(index)),
534
+ ...(directCalleeName !== undefined
535
+ ? {
536
+ '@callable-flow.direct-callee-name': (0, ast_helpers_js_1.syntheticCapture)('@callable-flow.direct-callee-name', callee.node, directCalleeName),
537
+ }
538
+ : {}),
539
+ });
540
+ }
541
+ if (member !== undefined) {
542
+ if (member.operator !== undefined &&
543
+ options.memberPointerOperators?.has(member.operator) === true) {
544
+ emitInvoke(callSite, member.member, 'member-pointer', args.length, out, options, member.receiver);
545
+ return;
546
+ }
547
+ if (options.callableProtocolMethods?.has(member.member.name) === true) {
548
+ emitInvoke(callSite, member.receiver, 'callable-object', args.length, out, options);
549
+ return;
550
+ }
551
+ // Field-stored callables (`o->run = handler; o->run(1)` — the C ops-vtable
552
+ // pattern): when a visible assignment wrote this member's name-cell, the
553
+ // member call is an indirect invoke through that cell (#2522 review, M3).
554
+ // Gated on the store so plain accessor calls (`map.get(x)`) stay inert;
555
+ // name-keyed field collapse matches the solver's store/load model.
556
+ // ponytail: same-region joins only — cross-function vtable installs need
557
+ // a field-sensitive cell model.
558
+ if (isVisibleValueBinding(call, member.member.name, valueBindings, options)) {
559
+ emitInvoke(callSite, member.member, 'indirect', args.length, out, options, member.receiver);
560
+ }
561
+ return;
562
+ }
563
+ if (callee === undefined)
564
+ return;
565
+ if (callee.indirection > 0 || calleeIsValueBinding) {
566
+ const invokeCallee = !calleeIsValueBinding && knownCallableNames.has(callee.name)
567
+ ? asCallableDesignator(callee)
568
+ : callee;
569
+ emitInvoke(callSite, invokeCallee, 'indirect', args.length, out, options);
570
+ }
571
+ }
572
+ function emitInvoke(call, callee, invocationKind, arity, out, options, receiver) {
573
+ out.push({
574
+ '@callable-flow.invoke': (0, ast_helpers_js_1.nodeToCapture)('@callable-flow.invoke', call),
575
+ '@callable-flow.callee': operandCapture('@callable-flow.callee', callee),
576
+ ...operandMetadataCaptures('callee', callee),
577
+ ...(callee.indirection > 0
578
+ ? {
579
+ '@callable-flow.callee-indirection': (0, ast_helpers_js_1.syntheticCapture)('@callable-flow.callee-indirection', callee.node, String(callee.indirection)),
580
+ }
581
+ : {}),
582
+ ...(receiver !== undefined
583
+ ? {
584
+ '@callable-flow.receiver': operandCapture('@callable-flow.receiver', receiver),
585
+ ...operandMetadataCaptures('receiver', receiver),
586
+ }
587
+ : {}),
588
+ '@callable-flow.invocation-kind': (0, ast_helpers_js_1.syntheticCapture)('@callable-flow.invocation-kind', call, invocationKind),
589
+ '@callable-flow.arity': (0, ast_helpers_js_1.syntheticCapture)('@callable-flow.arity', call, String(arity)),
590
+ });
591
+ if (invocationKind === 'member-pointer' && receiver !== undefined) {
592
+ // Parenthesized member-pointer callees are not matched by the ordinary
593
+ // member-call query shape.
594
+ // Supply the same canonical callsite contract so the shared resolver can
595
+ // exact-join this fact instead of trusting an unanchored/stale side fact.
596
+ out.push({
597
+ '@reference.call.member': (0, ast_helpers_js_1.nodeToCapture)('@reference.call.member', call),
598
+ '@reference.receiver': operandCapture('@reference.receiver', receiver),
599
+ '@reference.name': operandCapture('@reference.name', callee),
600
+ '@reference.arity': (0, ast_helpers_js_1.syntheticCapture)('@reference.arity', call, String(arity)),
601
+ });
602
+ }
603
+ else if (options.emitCanonicalInvokeReference === true) {
604
+ out.push({
605
+ '@reference.call.free': (0, ast_helpers_js_1.nodeToCapture)('@reference.call.free', call),
606
+ '@reference.name': operandCapture('@reference.name', callee),
607
+ '@reference.arity': (0, ast_helpers_js_1.syntheticCapture)('@reference.arity', call, String(arity)),
608
+ });
609
+ }
610
+ }
611
+ function callArguments(call, options) {
612
+ const list = call.childForFieldName('arguments') ??
613
+ call.childForFieldName('argument') ??
614
+ call.namedChildren.find((child) => child !== null && options.parameterListNodeTypes.has(child.type)) ??
615
+ findFirstDescendantOfTypes(call, options.parameterListNodeTypes) ??
616
+ null;
617
+ if (list === null)
618
+ return [];
619
+ if (options.parameterListNodeTypes.has(list.type)) {
620
+ return list.namedChildren.filter((child) => child !== null && child.type !== 'comment');
621
+ }
622
+ return [list];
623
+ }
624
+ function directCallMemberParts(call, options) {
625
+ const receiverNode = call.childForFieldName('object') ?? call.childForFieldName('receiver');
626
+ const memberNode = call.childForFieldName('method') ?? call.childForFieldName('name');
627
+ if (receiverNode === null || memberNode === null)
628
+ return undefined;
629
+ const receiver = operandSyntax(receiverNode, options);
630
+ const member = operandSyntax(memberNode, options);
631
+ return receiver === undefined || member === undefined ? undefined : { receiver, member };
632
+ }
633
+ function memberParts(input, options) {
634
+ const providerParts = options.memberPointerParts?.(input);
635
+ if (providerParts !== undefined) {
636
+ const receiver = operandSyntax(providerParts.receiver, options);
637
+ const member = operandSyntax(providerParts.member, options);
638
+ if (receiver !== undefined && member !== undefined) {
639
+ return { receiver, member, operator: providerParts.operator };
640
+ }
641
+ }
642
+ let node = input;
643
+ for (let guard = 0; guard < 8; guard++) {
644
+ const wrapped = wrappedExpression(node);
645
+ if (wrapped === null)
646
+ break;
647
+ node = wrapped;
648
+ }
649
+ const receiverNode = node.childForFieldName('object') ??
650
+ node.childForFieldName('argument') ??
651
+ node.childForFieldName('receiver');
652
+ const memberNode = node.childForFieldName('property') ??
653
+ node.childForFieldName('field') ??
654
+ node.childForFieldName('method');
655
+ if (receiverNode === null || memberNode === null)
656
+ return undefined;
657
+ const receiver = operandSyntax(receiverNode, options);
658
+ const member = operandSyntax(memberNode, options);
659
+ if (receiver === undefined || member === undefined)
660
+ return undefined;
661
+ const operator = node.children.find((child) => options.memberPointerOperators?.has(child.type) === true ||
662
+ options.memberPointerOperators?.has(child.text) === true);
663
+ return { receiver, member, ...(operator !== undefined ? { operator: operator.text } : {}) };
664
+ }
665
+ function operandSyntax(input, options, declarationBinding = false) {
666
+ if (declarationBinding) {
667
+ const binding = bindingIdentifier(input, options);
668
+ if (binding === undefined)
669
+ return undefined;
670
+ return {
671
+ name: binding.text,
672
+ node: binding,
673
+ indirection: 0,
674
+ addressOf: false,
675
+ directDesignator: false,
676
+ callableReference: false,
677
+ anonymousCallable: false,
678
+ expressionKind: 'binding',
679
+ };
680
+ }
681
+ const providerReference = options.extractCallableReference?.(input);
682
+ if (providerReference !== undefined) {
683
+ return {
684
+ name: providerReference.name,
685
+ node: providerReference.anchor,
686
+ indirection: 0,
687
+ addressOf: false,
688
+ ...(providerReference.qualifiedName !== undefined
689
+ ? { qualifiedName: providerReference.qualifiedName }
690
+ : {}),
691
+ directDesignator: true,
692
+ callableReference: true,
693
+ anonymousCallable: false,
694
+ expressionKind: providerReference.qualifiedName === undefined ? 'callable-designator' : 'bound-member',
695
+ };
696
+ }
697
+ let node = input;
698
+ let indirection = 0;
699
+ let addressOf = false;
700
+ for (let guard = 0; guard < 16; guard++) {
701
+ if (options.functionNodeTypes.has(node.type)) {
702
+ return {
703
+ name: '<anonymous>',
704
+ node,
705
+ indirection,
706
+ addressOf,
707
+ directDesignator: true,
708
+ callableReference: true,
709
+ anonymousCallable: true,
710
+ expressionKind: 'anonymous-callable',
711
+ };
712
+ }
713
+ const operator = unaryOperator(node);
714
+ if (operator === '&')
715
+ addressOf = true;
716
+ if (operator === '*')
717
+ indirection++;
718
+ const wrapped = wrappedExpression(node);
719
+ if (wrapped === null)
720
+ break;
721
+ node = wrapped;
722
+ }
723
+ const id = terminalIdentifier(node, options);
724
+ if (id === undefined)
725
+ return undefined;
726
+ const isQualified = id.id !== node.id && hasMultipleIdentifierLeaves(node, options);
727
+ const singleNameText = node.text.trim().replace(/^[\$@]+/, '');
728
+ const valueProducingExpression = /call|invocation|creation|new_expression|composite_literal/.test(node.type);
729
+ return {
730
+ name: id.text,
731
+ node: id,
732
+ indirection,
733
+ addressOf,
734
+ ...(isQualified ? { qualifiedName: node.text } : {}),
735
+ directDesignator: options.identifierNodeTypes.has(node.type) ||
736
+ (!isQualified && singleNameText === id.text) ||
737
+ (isQualified && !valueProducingExpression && !/[([{]/.test(node.text)),
738
+ callableReference: options.callableReferenceNodeTypes?.has(node.type) === true,
739
+ anonymousCallable: false,
740
+ expressionKind: isQualified
741
+ ? 'bound-member'
742
+ : options.callableReferenceNodeTypes?.has(node.type) === true
743
+ ? 'callable-designator'
744
+ : 'binding',
745
+ };
746
+ }
747
+ function asCallableDesignator(operand) {
748
+ if (operand.expressionKind !== 'binding')
749
+ return operand;
750
+ return { ...operand, expressionKind: 'callable-designator' };
751
+ }
752
+ function wrappedExpression(node) {
753
+ const field = node.childForFieldName('argument') ??
754
+ node.childForFieldName('expression') ??
755
+ node.childForFieldName('value');
756
+ if (field !== null && field.id !== node.id && node.namedChildCount === 1)
757
+ return field;
758
+ if (node.type.includes('parenthesized') ||
759
+ node.type.includes('reference_expression') ||
760
+ node.type.includes('pointer_expression') ||
761
+ node.type.includes('unary_expression') ||
762
+ node.type.includes('cast_expression')) {
763
+ return node.namedChild(node.namedChildCount - 1);
764
+ }
765
+ return null;
766
+ }
767
+ function unaryOperator(node) {
768
+ for (const child of node.children) {
769
+ if (child.text === '&' || child.text === '*')
770
+ return child.text;
771
+ }
772
+ const trimmed = node.text.trimStart();
773
+ if (trimmed.startsWith('&'))
774
+ return '&';
775
+ if (trimmed.startsWith('*'))
776
+ return '*';
777
+ return undefined;
778
+ }
779
+ /**
780
+ * For a subscript/index expression, the identifier of interest is always in
781
+ * the container operand, never the index: `tbl[i] = h` must bind the cell
782
+ * `tbl` (index-insensitive, Andersen-style), not the index variable `i` —
783
+ * seeding `i` both pollutes a same-named formal and misses the later
784
+ * `tbl[i]()` join (#2522 review). Field names cover the grammars that field
785
+ * their subscript nodes; others keep the generic traversal.
786
+ */
787
+ /** The container operand of a subscript node, per grammar. Exported because the
788
+ * receiver-chain walk needs the same per-grammar answer — two divergent field
789
+ * tables for one question is how a new grammar gets half-supported. */
790
+ function subscriptBase(node) {
791
+ if (node.childForFieldName('index') === null)
792
+ return null;
793
+ return (node.childForFieldName('argument') ?? // C/C++ subscript_expression
794
+ node.childForFieldName('object') ?? // JS/TS subscript_expression
795
+ node.childForFieldName('value') ?? // Python subscript
796
+ node.childForFieldName('operand') ?? // Go index_expression
797
+ node.childForFieldName('array') // Java array_access
798
+ );
799
+ }
800
+ function bindingIdentifier(node, options) {
801
+ if (options.identifierNodeTypes.has(node.type))
802
+ return node;
803
+ const base = subscriptBase(node);
804
+ if (base !== null)
805
+ return bindingIdentifier(base, options);
806
+ for (const fieldName of ['name', 'declarator', 'pattern', 'left']) {
807
+ const field = node.childForFieldName(fieldName);
808
+ if (field === null || field.id === node.id)
809
+ continue;
810
+ const found = bindingIdentifier(field, options);
811
+ if (found !== undefined)
812
+ return found;
813
+ }
814
+ for (const child of node.namedChildren) {
815
+ if (child === null)
816
+ continue;
817
+ const found = bindingIdentifier(child, options);
818
+ if (found !== undefined)
819
+ return found;
820
+ }
821
+ return undefined;
822
+ }
823
+ function terminalIdentifier(node, options) {
824
+ if (options.identifierNodeTypes.has(node.type))
825
+ return node;
826
+ const base = subscriptBase(node);
827
+ if (base !== null)
828
+ return terminalIdentifier(base, options);
829
+ for (const fieldName of ['name', 'property', 'field', 'method', 'declarator']) {
830
+ const field = node.childForFieldName(fieldName);
831
+ if (field === null || field.id === node.id)
832
+ continue;
833
+ const found = terminalIdentifier(field, options);
834
+ if (found !== undefined)
835
+ return found;
836
+ }
837
+ for (let i = node.namedChildCount - 1; i >= 0; i--) {
838
+ const child = node.namedChild(i);
839
+ if (child === null)
840
+ continue;
841
+ const found = terminalIdentifier(child, options);
842
+ if (found !== undefined)
843
+ return found;
844
+ }
845
+ return undefined;
846
+ }
847
+ function hasMultipleIdentifierLeaves(node, options) {
848
+ let count = 0;
849
+ const stack = [node];
850
+ while (stack.length > 0) {
851
+ const current = stack.pop();
852
+ if (options.identifierNodeTypes.has(current.type)) {
853
+ if (++count > 1)
854
+ return true;
855
+ continue;
856
+ }
857
+ for (const child of current.namedChildren)
858
+ if (child !== null)
859
+ stack.push(child);
860
+ }
861
+ return false;
862
+ }
863
+ function findFirstDescendantOfTypes(root, types) {
864
+ const stack = [...root.namedChildren].filter((child) => child !== null);
865
+ while (stack.length > 0) {
866
+ const node = stack.shift();
867
+ if (types.has(node.type))
868
+ return node;
869
+ for (const child of node.namedChildren)
870
+ if (child !== null)
871
+ stack.push(child);
872
+ }
873
+ return null;
874
+ }
875
+ function binaryFact(kind, anchor, leftRole, left, rightRole, right) {
876
+ return {
877
+ [`@callable-flow.${kind}`]: (0, ast_helpers_js_1.nodeToCapture)(`@callable-flow.${kind}`, anchor),
878
+ [`@callable-flow.${leftRole}`]: operandCapture(`@callable-flow.${leftRole}`, left),
879
+ ...operandMetadataCaptures(leftRole, left),
880
+ ...(left.indirection > 0
881
+ ? {
882
+ [`@callable-flow.${leftRole}-indirection`]: (0, ast_helpers_js_1.syntheticCapture)(`@callable-flow.${leftRole}-indirection`, left.node, String(left.indirection)),
883
+ }
884
+ : {}),
885
+ [`@callable-flow.${rightRole}`]: operandCapture(`@callable-flow.${rightRole}`, right),
886
+ ...operandMetadataCaptures(rightRole, right),
887
+ ...(right.indirection > 0
888
+ ? {
889
+ [`@callable-flow.${rightRole}-indirection`]: (0, ast_helpers_js_1.syntheticCapture)(`@callable-flow.${rightRole}-indirection`, right.node, String(right.indirection)),
890
+ }
891
+ : {}),
892
+ };
893
+ }
894
+ function operandCapture(name, operand) {
895
+ return (0, ast_helpers_js_1.syntheticCapture)(name, operand.node, operand.name);
896
+ }
897
+ function operandMetadataCaptures(role, operand) {
898
+ return {
899
+ [`@callable-flow.${role}-kind`]: (0, ast_helpers_js_1.syntheticCapture)(`@callable-flow.${role}-kind`, operand.node, operand.expressionKind),
900
+ ...(operand.qualifiedName !== undefined
901
+ ? {
902
+ [`@callable-flow.${role}-qualified-name`]: (0, ast_helpers_js_1.syntheticCapture)(`@callable-flow.${role}-qualified-name`, operand.node, operand.qualifiedName),
903
+ }
904
+ : {}),
905
+ };
906
+ }
907
+ function addSignatureCaptures(match, anchor, signature) {
908
+ if (signature?.parameterCount !== undefined) {
909
+ match['@callable-flow.expected-arity'] = (0, ast_helpers_js_1.syntheticCapture)('@callable-flow.expected-arity', anchor, String(signature.parameterCount));
910
+ }
911
+ if (signature?.parameterTypes !== undefined) {
912
+ match['@callable-flow.expected-types'] = (0, ast_helpers_js_1.syntheticCapture)('@callable-flow.expected-types', anchor, JSON.stringify(signature.parameterTypes));
913
+ }
914
+ if (signature?.parameterTypeClasses !== undefined) {
915
+ match['@callable-flow.expected-type-classes'] = (0, ast_helpers_js_1.syntheticCapture)('@callable-flow.expected-type-classes', anchor, JSON.stringify(signature.parameterTypeClasses));
916
+ }
917
+ if (signature?.isConst !== undefined) {
918
+ match['@callable-flow.expected-const'] = (0, ast_helpers_js_1.syntheticCapture)('@callable-flow.expected-const', anchor, String(signature.isConst));
919
+ }
920
+ }
921
+ function firstCapture(match) {
922
+ return Object.values(match)[0];
923
+ }
924
+ function compareCaptures(a, b) {
925
+ if (a === undefined)
926
+ return b === undefined ? 0 : 1;
927
+ if (b === undefined)
928
+ return -1;
929
+ return (a.range.startLine - b.range.startLine ||
930
+ a.range.startCol - b.range.startCol ||
931
+ a.name.localeCompare(b.name));
932
+ }