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,779 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractCallArgTypes = exports.extractReceiverNode = exports.extractReceiverName = exports.inferCallForm = exports.countCallArguments = exports.MAX_CHAIN_DEPTH = exports.CALL_EXPRESSION_TYPES = void 0;
4
+ exports.extractCallChain = extractCallChain;
5
+ exports.extractMixedChain = extractMixedChain;
6
+ const ast_helpers_js_1 = require("./ast-helpers.js");
7
+ const callable_flow_captures_js_1 = require("./callable-flow-captures.js");
8
+ /** Node types representing call expressions across supported languages. */
9
+ exports.CALL_EXPRESSION_TYPES = new Set([
10
+ 'call_expression', // TS/JS/C/C++/Go/Rust
11
+ 'method_invocation', // Java
12
+ 'member_call_expression', // PHP
13
+ 'nullsafe_member_call_expression', // PHP ?.
14
+ 'call', // Python/Ruby
15
+ 'invocation_expression', // C#
16
+ ]);
17
+ /**
18
+ * Hard limit on chain depth to prevent runaway recursion.
19
+ * For `a.b().c().d()`, the chain has depth 2 (b and c before d).
20
+ *
21
+ * A chain deeper than this is DISCARDED WHOLE, not truncated:
22
+ * `extractMixedChain` returns an undefined base and the encoder refuses to mint
23
+ * a partial chain, because a base-side prefix decodes cleanly as a shorter,
24
+ * complete-looking chain and would type the receiver against the wrong member.
25
+ * Correct, but it means a builder chain one hop too long contributes nothing at
26
+ * all rather than degrading.
27
+ *
28
+ * DELIBERATELY NOT RAISED. Measured (see bench/receiver-resolution/BASELINE.md,
29
+ * `fourHopChain`): a 4-step chain mints NOTHING at this cap — confirmed by
30
+ * probing the emitter directly — and the site still RESOLVES, because the text
31
+ * cascade that owns the fallback path runs to `COMPOUND_RECEIVER_MAX_DEPTH` (8)
32
+ * and answers where the structural fold declined.
33
+ *
34
+ * So the cap bounds which chains are typed STRUCTURALLY, not which calls
35
+ * resolve. Raising it moves work from the cascade to the fold without changing
36
+ * any edge, and the fixture that proves it is committed so the next person to
37
+ * reach for this number has the measurement rather than the intuition.
38
+ */
39
+ exports.MAX_CHAIN_DEPTH = 3;
40
+ /**
41
+ * Count direct arguments for a call expression across common tree-sitter grammars.
42
+ * Returns undefined when the argument container cannot be located cheaply.
43
+ */
44
+ const countCallArguments = (callNode) => {
45
+ if (!callNode)
46
+ return undefined;
47
+ // Direct field or direct child (most languages)
48
+ let argsNode = callNode.childForFieldName('arguments') ??
49
+ callNode.children.find((child) => ast_helpers_js_1.CALL_ARGUMENT_LIST_TYPES.has(child.type));
50
+ // Kotlin/Swift: call_expression → call_suffix → value_arguments
51
+ // Search one level deeper for languages that wrap arguments in a suffix node
52
+ if (!argsNode) {
53
+ for (const child of callNode.children) {
54
+ if (!child.isNamed)
55
+ continue;
56
+ const nested = child.children.find((gc) => ast_helpers_js_1.CALL_ARGUMENT_LIST_TYPES.has(gc.type));
57
+ if (nested) {
58
+ argsNode = nested;
59
+ break;
60
+ }
61
+ }
62
+ }
63
+ if (!argsNode)
64
+ return undefined;
65
+ let count = 0;
66
+ for (const child of argsNode.children) {
67
+ if (!child.isNamed)
68
+ continue;
69
+ if (child.type === 'comment')
70
+ continue;
71
+ count++;
72
+ }
73
+ return count;
74
+ };
75
+ exports.countCallArguments = countCallArguments;
76
+ // ── Call-form discrimination (Phase 1, Step D) ─────────────────────────
77
+ /**
78
+ * AST node types that indicate a member-access wrapper around the callee name.
79
+ * When nameNode.parent.type is one of these, the call is a member call.
80
+ */
81
+ const MEMBER_ACCESS_NODE_TYPES = new Set([
82
+ 'member_expression', // TS/JS: obj.method()
83
+ 'attribute', // Python: obj.method()
84
+ 'member_access_expression', // C#: obj.Method()
85
+ 'field_expression', // Rust/C++: obj.method() / ptr->method()
86
+ 'selector_expression', // Go: obj.Method()
87
+ 'navigation_suffix', // Kotlin/Swift: obj.method() — nameNode sits inside navigation_suffix
88
+ 'member_binding_expression', // C#: user?.Method() — null-conditional access
89
+ 'unconditional_assignable_selector', // Dart: obj.method() — nameNode inside selector > unconditional_assignable_selector
90
+ ]);
91
+ /**
92
+ * Call node types that are inherently constructor invocations.
93
+ * Only includes patterns that the tree-sitter queries already capture as @call.
94
+ */
95
+ const CONSTRUCTOR_CALL_NODE_TYPES = new Set([
96
+ 'constructor_invocation', // Kotlin: Foo()
97
+ 'new_expression', // TS/JS/C++: new Foo()
98
+ 'object_creation_expression', // Java/C#/PHP: new Foo()
99
+ 'implicit_object_creation_expression', // C# 9: User u = new(...)
100
+ 'composite_literal', // Go: User{...}
101
+ 'struct_expression', // Rust: User { ... }
102
+ ]);
103
+ /**
104
+ * AST node types for scoped/qualified calls (e.g., Foo::new() in Rust, Foo::bar() in C++).
105
+ */
106
+ const SCOPED_CALL_NODE_TYPES = new Set([
107
+ 'scoped_identifier', // Rust: Foo::new()
108
+ 'qualified_identifier', // C++: ns::func()
109
+ ]);
110
+ /**
111
+ * Infer whether a captured call site is a free call, member call, or constructor.
112
+ * Returns undefined if the form cannot be determined.
113
+ *
114
+ * Works by inspecting the AST structure between callNode (@call) and nameNode (@call.name).
115
+ * No tree-sitter query changes needed — the distinction is in the node types.
116
+ */
117
+ const inferCallForm = (callNode, nameNode) => {
118
+ // 1. Constructor: callNode itself is a constructor invocation (Kotlin)
119
+ if (CONSTRUCTOR_CALL_NODE_TYPES.has(callNode.type)) {
120
+ return 'constructor';
121
+ }
122
+ // 2. Member call: nameNode's parent is a member-access wrapper
123
+ const nameParent = nameNode.parent;
124
+ if (nameParent && MEMBER_ACCESS_NODE_TYPES.has(nameParent.type)) {
125
+ return 'member';
126
+ }
127
+ // 3. PHP: the callNode itself distinguishes member vs free calls
128
+ if (callNode.type === 'member_call_expression' ||
129
+ callNode.type === 'nullsafe_member_call_expression') {
130
+ return 'member';
131
+ }
132
+ if (callNode.type === 'scoped_call_expression') {
133
+ return 'member'; // static call Foo::bar()
134
+ }
135
+ // 4. Java method_invocation: member if it has an 'object' field
136
+ if (callNode.type === 'method_invocation' && callNode.childForFieldName('object')) {
137
+ return 'member';
138
+ }
139
+ // 4b. Ruby call with receiver: obj.method
140
+ if (callNode.type === 'call' && callNode.childForFieldName('receiver')) {
141
+ return 'member';
142
+ }
143
+ // 5. Scoped calls (Rust Foo::new(), C++ ns::func()): treat as free
144
+ // The receiver is a type, not an instance — handled differently in Phase 3
145
+ if (nameParent && SCOPED_CALL_NODE_TYPES.has(nameParent.type)) {
146
+ return 'free';
147
+ }
148
+ // 6. Default: if nameNode is a direct child of callNode, it's a free call
149
+ if (nameNode.parent === callNode || nameParent?.parent === callNode) {
150
+ return 'free';
151
+ }
152
+ return undefined;
153
+ };
154
+ exports.inferCallForm = inferCallForm;
155
+ /**
156
+ * Extract the receiver identifier for member calls.
157
+ * Only captures simple identifiers — returns undefined for complex expressions
158
+ * like getUser().save() or arr[0].method().
159
+ */
160
+ const SIMPLE_RECEIVER_TYPES = new Set([
161
+ 'identifier',
162
+ 'simple_identifier',
163
+ 'variable_name', // PHP $variable (tree-sitter-php)
164
+ 'name', // PHP name node
165
+ 'this', // TS/JS/Java/C# this.method()
166
+ 'self', // Rust/Python self.method()
167
+ 'super', // TS/JS/Java/Kotlin/Ruby super.method()
168
+ 'super_expression', // Kotlin wraps super in super_expression
169
+ 'base', // C# base.Method()
170
+ 'parent', // PHP parent::method()
171
+ 'constant', // Ruby CONSTANT.method() (uppercase identifiers)
172
+ ]);
173
+ const extractReceiverName = (nameNode) => {
174
+ const parent = nameNode.parent;
175
+ if (!parent)
176
+ return undefined;
177
+ // PHP: member_call_expression / nullsafe_member_call_expression — receiver is on the callNode
178
+ // Java: method_invocation — receiver is the 'object' field on callNode
179
+ // For these, parent of nameNode is the call itself, so check the call's object field
180
+ const callNode = parent.parent ?? parent;
181
+ let receiver = null;
182
+ // Try standard field names used across grammars
183
+ receiver =
184
+ parent.childForFieldName('object') ?? // TS/JS member_expression, Python attribute, PHP, Java
185
+ parent.childForFieldName('value') ?? // Rust field_expression
186
+ parent.childForFieldName('operand') ?? // Go selector_expression
187
+ parent.childForFieldName('expression') ?? // C# member_access_expression
188
+ parent.childForFieldName('argument'); // C++ field_expression
189
+ // Java method_invocation: 'object' field is on the callNode, not on nameNode's parent
190
+ if (!receiver && callNode.type === 'method_invocation') {
191
+ receiver = callNode.childForFieldName('object');
192
+ }
193
+ // PHP: member_call_expression has 'object' on the call node
194
+ if (!receiver &&
195
+ (callNode.type === 'member_call_expression' ||
196
+ callNode.type === 'nullsafe_member_call_expression')) {
197
+ receiver = callNode.childForFieldName('object');
198
+ }
199
+ // Ruby: call node has 'receiver' field
200
+ if (!receiver && parent.type === 'call') {
201
+ receiver = parent.childForFieldName('receiver');
202
+ }
203
+ // PHP scoped_call_expression (parent::method(), self::method()):
204
+ // nameNode's direct parent IS the scoped_call_expression (name is a direct child)
205
+ if (!receiver &&
206
+ (parent.type === 'scoped_call_expression' || callNode.type === 'scoped_call_expression')) {
207
+ const scopedCall = parent.type === 'scoped_call_expression' ? parent : callNode;
208
+ receiver = scopedCall.childForFieldName('scope');
209
+ // relative_scope wraps 'parent'/'self'/'static' — unwrap to get the keyword
210
+ if (receiver?.type === 'relative_scope') {
211
+ receiver = receiver.firstChild;
212
+ }
213
+ }
214
+ // Dart: unconditional_assignable_selector is inside a `selector`, which is a sibling
215
+ // of the receiver in the expression_statement. For `user.save()`, the previous named
216
+ // sibling of the `selector` is `identifier [user]`.
217
+ if (!receiver && parent.type === 'unconditional_assignable_selector') {
218
+ const selectorNode = parent.parent; // selector [.save]
219
+ if (selectorNode) {
220
+ receiver = selectorNode.previousNamedSibling;
221
+ }
222
+ }
223
+ // C# null-conditional: user?.Save() → conditional_access_expression wraps member_binding_expression
224
+ if (!receiver && parent.type === 'member_binding_expression') {
225
+ const condAccess = parent.parent;
226
+ if (condAccess?.type === 'conditional_access_expression') {
227
+ receiver = condAccess.firstNamedChild;
228
+ }
229
+ }
230
+ // Kotlin/Swift: navigation_expression target is the first child
231
+ if (!receiver && parent.type === 'navigation_suffix') {
232
+ const navExpr = parent.parent;
233
+ if (navExpr?.type === 'navigation_expression') {
234
+ // First named child is the target (receiver)
235
+ for (const child of navExpr.children) {
236
+ if (child.isNamed && child !== parent) {
237
+ receiver = child;
238
+ break;
239
+ }
240
+ }
241
+ }
242
+ }
243
+ if (!receiver)
244
+ return undefined;
245
+ // Only capture simple identifiers — refuse complex expressions
246
+ if (SIMPLE_RECEIVER_TYPES.has(receiver.type)) {
247
+ return receiver.text;
248
+ }
249
+ // Python super().method(): receiver is a call node `super()` — extract the function name
250
+ if (receiver.type === 'call') {
251
+ const func = receiver.childForFieldName('function');
252
+ if (func?.text === 'super')
253
+ return 'super';
254
+ }
255
+ return undefined;
256
+ };
257
+ exports.extractReceiverName = extractReceiverName;
258
+ /**
259
+ * Extract the raw receiver AST node for a member call.
260
+ * Unlike extractReceiverName, this returns the receiver node regardless of its type —
261
+ * including call_expression / method_invocation nodes that appear in chained calls
262
+ * like `svc.getUser().save()`.
263
+ *
264
+ * Returns undefined when the call is not a member call or when no receiver node
265
+ * can be found (e.g. top-level free calls).
266
+ */
267
+ const extractReceiverNode = (nameNode) => {
268
+ const parent = nameNode.parent;
269
+ if (!parent)
270
+ return undefined;
271
+ const callNode = parent.parent ?? parent;
272
+ let receiver = null;
273
+ receiver =
274
+ parent.childForFieldName('object') ??
275
+ parent.childForFieldName('value') ??
276
+ parent.childForFieldName('operand') ??
277
+ parent.childForFieldName('expression') ??
278
+ parent.childForFieldName('argument');
279
+ if (!receiver && callNode.type === 'method_invocation') {
280
+ receiver = callNode.childForFieldName('object');
281
+ }
282
+ if (!receiver &&
283
+ (callNode.type === 'member_call_expression' ||
284
+ callNode.type === 'nullsafe_member_call_expression')) {
285
+ receiver = callNode.childForFieldName('object');
286
+ }
287
+ if (!receiver && parent.type === 'call') {
288
+ receiver = parent.childForFieldName('receiver');
289
+ }
290
+ if (!receiver &&
291
+ (parent.type === 'scoped_call_expression' || callNode.type === 'scoped_call_expression')) {
292
+ const scopedCall = parent.type === 'scoped_call_expression' ? parent : callNode;
293
+ receiver = scopedCall.childForFieldName('scope');
294
+ if (receiver?.type === 'relative_scope') {
295
+ receiver = receiver.firstChild;
296
+ }
297
+ }
298
+ // Dart: unconditional_assignable_selector — receiver is previous sibling of the selector
299
+ if (!receiver && parent.type === 'unconditional_assignable_selector') {
300
+ const selectorNode = parent.parent;
301
+ if (selectorNode) {
302
+ receiver = selectorNode.previousNamedSibling;
303
+ }
304
+ }
305
+ if (!receiver && parent.type === 'member_binding_expression') {
306
+ const condAccess = parent.parent;
307
+ if (condAccess?.type === 'conditional_access_expression') {
308
+ receiver = condAccess.firstNamedChild;
309
+ }
310
+ }
311
+ if (!receiver && parent.type === 'navigation_suffix') {
312
+ const navExpr = parent.parent;
313
+ if (navExpr?.type === 'navigation_expression') {
314
+ for (const child of navExpr.children) {
315
+ if (child.isNamed && child !== parent) {
316
+ receiver = child;
317
+ break;
318
+ }
319
+ }
320
+ }
321
+ }
322
+ return receiver ?? undefined;
323
+ };
324
+ exports.extractReceiverNode = extractReceiverNode;
325
+ // ── Chained-call extraction ───────────────────────────────────────────────
326
+ /** Node types representing member/field access across languages. */
327
+ /**
328
+ * Await expressions, per grammar. The walk previously stopped here — an await
329
+ * node is neither a call nor a field access — so `(await svc.getUserAsync()).save()`
330
+ * minted NO chain at all and the receiver fell to the text cascade.
331
+ */
332
+ const AWAIT_EXPRESSION_NODE_TYPES = new Set([
333
+ 'await_expression', // TS/JS/C#/Rust
334
+ 'await', // Python
335
+ ]);
336
+ /**
337
+ * Subscript / index expressions, per grammar. Same story as await: the walk
338
+ * stopped, so `repos[0].save()` minted no chain — which is why `indexElement`
339
+ * is an INVISIBLE-GAP (no edge AND no recorded drop) in all 14 languages, the
340
+ * most uniform cell in the matrix.
341
+ */
342
+ const SUBSCRIPT_NODE_TYPES = new Set([
343
+ 'subscript_expression', // TS/JS/PHP/C/C++
344
+ 'subscript', // Python
345
+ 'index_expression', // Go/Rust
346
+ 'element_access_expression', // C#
347
+ 'array_access', // Java
348
+ 'indexing_expression', // Kotlin
349
+ ]);
350
+ /**
351
+ * Can the chain walk descend into this node, or is it the base?
352
+ *
353
+ * ONE predicate for all four branches. The call and field branches previously
354
+ * tested only the call/field sets, so a receiver like `x[0].f().g()` stopped at
355
+ * the subscript and returned the literal text `x[0]` as the base — which
356
+ * `isEncodableSegment` accepts, minting a chain whose base binds to nothing. And
357
+ * `(await f()).g.h()` returned `await f()`, rejected on whitespace, minting no
358
+ * chain at all. Adding a fifth step kind must not require remembering four
359
+ * separate call sites.
360
+ */
361
+ function isChainableReceiverNode(node) {
362
+ return (exports.CALL_EXPRESSION_TYPES.has(node.type) ||
363
+ FIELD_ACCESS_NODE_TYPES.has(node.type) ||
364
+ AWAIT_EXPRESSION_NODE_TYPES.has(node.type) ||
365
+ SUBSCRIPT_NODE_TYPES.has(node.type));
366
+ }
367
+ const FIELD_ACCESS_NODE_TYPES = new Set([
368
+ 'member_expression', // TS/JS
369
+ 'member_access_expression', // C#
370
+ 'selector_expression', // Go
371
+ 'field_expression', // Rust/C++
372
+ 'field_access', // Java
373
+ 'attribute', // Python
374
+ 'navigation_expression', // Kotlin/Swift
375
+ 'member_binding_expression', // C# null-conditional (user?.Address)
376
+ ]);
377
+ /**
378
+ * Walk a receiver AST node that is itself a call expression, accumulating the
379
+ * chain of intermediate method names up to MAX_CHAIN_DEPTH.
380
+ *
381
+ * For `svc.getUser().save()`, called with the receiver of `save` (getUser() call):
382
+ * returns { chain: ['getUser'], baseReceiverName: 'svc' }
383
+ *
384
+ * For `a.b().c().d()`, called with the receiver of `d` (c() call):
385
+ * returns { chain: ['b', 'c'], baseReceiverName: 'a' }
386
+ */
387
+ function extractCallChain(receiverCallNode) {
388
+ const chain = [];
389
+ let current = receiverCallNode;
390
+ while (exports.CALL_EXPRESSION_TYPES.has(current.type) && chain.length < exports.MAX_CHAIN_DEPTH) {
391
+ // Extract the method name from this call node.
392
+ const funcNode = current.childForFieldName?.('function') ??
393
+ current.childForFieldName?.('name') ??
394
+ current.childForFieldName?.('method'); // Ruby `call` node
395
+ let methodName;
396
+ let innerReceiver = null;
397
+ if (funcNode) {
398
+ // member_expression / attribute: last named child is the method identifier
399
+ methodName = funcNode.lastNamedChild?.text ?? funcNode.text;
400
+ }
401
+ // Kotlin/Swift: call_expression exposes callee as firstNamedChild, not a field.
402
+ // navigation_expression: method name is in navigation_suffix → simple_identifier.
403
+ if (!funcNode && current.type === 'call_expression') {
404
+ const callee = current.firstNamedChild;
405
+ if (callee?.type === 'navigation_expression') {
406
+ const suffix = callee.lastNamedChild;
407
+ if (suffix?.type === 'navigation_suffix') {
408
+ methodName = suffix.lastNamedChild?.text;
409
+ // The receiver is the part of navigation_expression before the suffix
410
+ for (let i = 0; i < callee.namedChildCount; i++) {
411
+ const child = callee.namedChild(i);
412
+ if (child && child.type !== 'navigation_suffix') {
413
+ innerReceiver = child;
414
+ break;
415
+ }
416
+ }
417
+ }
418
+ }
419
+ }
420
+ if (!methodName)
421
+ break;
422
+ chain.unshift(methodName); // build chain outermost-last
423
+ // Walk into the receiver of this call to continue the chain
424
+ if (!innerReceiver && funcNode) {
425
+ innerReceiver =
426
+ funcNode.childForFieldName?.('object') ??
427
+ funcNode.childForFieldName?.('value') ??
428
+ funcNode.childForFieldName?.('operand') ??
429
+ funcNode.childForFieldName?.('expression');
430
+ }
431
+ // Java method_invocation: object field is on the call node
432
+ if (!innerReceiver && current.type === 'method_invocation') {
433
+ innerReceiver = current.childForFieldName?.('object');
434
+ }
435
+ // PHP member_call_expression
436
+ if (!innerReceiver &&
437
+ (current.type === 'member_call_expression' ||
438
+ current.type === 'nullsafe_member_call_expression')) {
439
+ innerReceiver = current.childForFieldName?.('object');
440
+ }
441
+ // Ruby `call` node: receiver field is on the call node itself
442
+ if (!innerReceiver && current.type === 'call') {
443
+ innerReceiver = current.childForFieldName?.('receiver');
444
+ }
445
+ if (!innerReceiver)
446
+ break;
447
+ if (exports.CALL_EXPRESSION_TYPES.has(innerReceiver.type)) {
448
+ current = innerReceiver; // continue walking
449
+ }
450
+ else {
451
+ // Reached a simple identifier — the base receiver
452
+ return {
453
+ chain,
454
+ baseReceiverName: unwrapTransparentReceiver(innerReceiver).text || undefined,
455
+ };
456
+ }
457
+ }
458
+ return chain.length > 0 ? { chain, baseReceiverName: undefined } : undefined;
459
+ }
460
+ /**
461
+ * Walk a receiver AST node that may interleave field accesses and method calls,
462
+ * building a unified chain of steps up to MAX_CHAIN_DEPTH.
463
+ *
464
+ * For `svc.getUser().address.save()`, called with the receiver of `save`
465
+ * (`svc.getUser().address`, a field access node):
466
+ * returns { chain: [{ kind:'call', name:'getUser' }, { kind:'field', name:'address' }],
467
+ * baseReceiverName: 'svc' }
468
+ *
469
+ * For `user.getAddress().city.getName()`, called with receiver of `getName`
470
+ * (`user.getAddress().city`):
471
+ * returns { chain: [{ kind:'call', name:'getAddress' }, { kind:'field', name:'city' }],
472
+ * baseReceiverName: 'user' }
473
+ *
474
+ * Pure field chains and pure call chains are special cases (all steps same kind).
475
+ */
476
+ /**
477
+ * Node types that wrap an expression without changing what it denotes, so a
478
+ * receiver chain's BASE can be read through them.
479
+ *
480
+ * `svc!` (TS non-null assertion) and `(svc)` denote exactly `svc`; taking the
481
+ * wrapper's own text instead yields `svc!` / `(svc)`, which matches no binding
482
+ * and silently costs the chain its base.
483
+ *
484
+ * Deliberately EXCLUDES a cast (`x as T`, `(T)x`): a cast changes the type an
485
+ * expression denotes, so reading through one would type the receiver as the
486
+ * operand rather than as the cast target.
487
+ *
488
+ * Keyed by node type; the value is the operator text that has to TERMINATE the
489
+ * node for the peel to apply, or `null` for a node type that is transparent
490
+ * unconditionally.
491
+ *
492
+ * The gated entry exists because Swift force-unwrap (`self.a!`) is the exact
493
+ * semantic of TypeScript's `non_null_expression` — it yields the wrapped type —
494
+ * but Swift parses it as the general `postfix_expression`, which ALSO carries
495
+ * user-defined postfix operators. Those can return anything, so peeling that
496
+ * node type unconditionally would type the receiver as the operand and could
497
+ * produce a confidently wrong owner. Reading the operator keeps the peel to the
498
+ * case that is provably type-preserving.
499
+ */
500
+ const TRANSPARENT_RECEIVER_WRAPPERS = new Map([
501
+ ['non_null_expression', null], // TypeScript `svc!`
502
+ ['parenthesized_expression', null], // `(svc)`
503
+ // NOT Swift-only: Kotlin's `!!` non-null assertion parses as the same node type
504
+ // and is equally type-preserving, so it is peeled too. Measured — the
505
+ // receiver-resolution bench moved `kotlin.nonNullAssert` VISIBLE-GAP ->
506
+ // RESOLVES when this landed, which is how the Kotlin effect was discovered
507
+ // rather than assumed. Any other grammar emitting `postfix_expression` is
508
+ // affected as well; the `!` gate, not the language, is what bounds this.
509
+ ['postfix_expression', '!'], // Swift `self.a!`, Kotlin `a!!`
510
+ ]);
511
+ /** Is `node` a wrapper that denotes exactly what its operand denotes? */
512
+ function isTransparentReceiverWrapper(node) {
513
+ // `node.type` is a native getter, and this predicate runs on every receiver
514
+ // node. Crossing it twice for two separate table lookups measured 376 ns/check
515
+ // against 188 ns for the single read below.
516
+ const operator = TRANSPARENT_RECEIVER_WRAPPERS.get(node.type);
517
+ // `undefined` is "not in the table"; `null` is "in the table, ungated". The
518
+ // two are distinguishable, so one `get` answers both questions — no separate
519
+ // `has` probe, and one crossing of the native `node.type` getter.
520
+ if (operator === undefined)
521
+ return false;
522
+ if (operator === null)
523
+ return true;
524
+ // The operator is an anonymous token, so it is not in `namedChildren`; the
525
+ // node's own text is the reliable place to read it. Deliberately NOT
526
+ // `node.lastChild` — measured 3x SLOWER (the child wrapper allocation
527
+ // dominates), and the token surfaces with type `bang`, not `!`.
528
+ return node.text.trimEnd().endsWith(operator);
529
+ }
530
+ /**
531
+ * Iteration bound for the wrapper peel. Its OWN constant, not `MAX_CHAIN_DEPTH`.
532
+ *
533
+ * The two answer unrelated questions — "how many chain hops do we type?" versus
534
+ * "how many redundant parens might someone write?" — and sharing one number
535
+ * meant raising the chain cap silently widened this loop as a side effect. That
536
+ * coupling is easy to miss precisely because the shared name reads as
537
+ * intentional. `((x))` nests twice; nothing real nests deeply.
538
+ */
539
+ const MAX_TRANSPARENT_WRAPPER_DEPTH = 3;
540
+ /** Peel transparent wrappers off a base receiver node. */
541
+ function unwrapTransparentReceiver(node) {
542
+ let current = node;
543
+ for (let i = 0; i < MAX_TRANSPARENT_WRAPPER_DEPTH && isTransparentReceiverWrapper(current); i++) {
544
+ const inner = current.namedChildren?.find((c) => c !== null);
545
+ if (inner === undefined || inner === null)
546
+ break;
547
+ current = inner;
548
+ }
549
+ return current;
550
+ }
551
+ function extractMixedChain(receiverNode) {
552
+ const chain = [];
553
+ let current = receiverNode;
554
+ while (chain.length < exports.MAX_CHAIN_DEPTH) {
555
+ // Peel transparent wrappers at LOOP ENTRY, not only where a base is
556
+ // returned. `(await svc.getUserAsync()).save()` hands this walk a
557
+ // `parenthesized_expression`, which matches no branch below, so the walk
558
+ // fell straight through to the base case with an empty chain and minted
559
+ // nothing — the await step could never be reached.
560
+ current = unwrapTransparentReceiver(current);
561
+ if (exports.CALL_EXPRESSION_TYPES.has(current.type)) {
562
+ // ── Call expression: extract method name + inner receiver ────────────
563
+ const funcNode = current.childForFieldName?.('function') ??
564
+ current.childForFieldName?.('name') ??
565
+ current.childForFieldName?.('method');
566
+ let methodName;
567
+ let innerReceiver = null;
568
+ if (funcNode) {
569
+ methodName = funcNode.lastNamedChild?.text ?? funcNode.text;
570
+ }
571
+ // Kotlin/Swift: call_expression → navigation_expression
572
+ if (!funcNode && current.type === 'call_expression') {
573
+ const callee = current.firstNamedChild;
574
+ if (callee?.type === 'navigation_expression') {
575
+ const suffix = callee.lastNamedChild;
576
+ if (suffix?.type === 'navigation_suffix') {
577
+ methodName = suffix.lastNamedChild?.text;
578
+ for (let i = 0; i < callee.namedChildCount; i++) {
579
+ const child = callee.namedChild(i);
580
+ if (child && child.type !== 'navigation_suffix') {
581
+ innerReceiver = child;
582
+ break;
583
+ }
584
+ }
585
+ }
586
+ }
587
+ }
588
+ if (!methodName)
589
+ break;
590
+ chain.unshift({ kind: 'call', name: methodName });
591
+ if (!innerReceiver && funcNode) {
592
+ innerReceiver =
593
+ funcNode.childForFieldName?.('object') ??
594
+ funcNode.childForFieldName?.('value') ??
595
+ funcNode.childForFieldName?.('operand') ??
596
+ funcNode.childForFieldName?.('argument') ?? // C/C++ field_expression
597
+ funcNode.childForFieldName?.('expression') ??
598
+ null;
599
+ }
600
+ if (!innerReceiver && current.type === 'method_invocation') {
601
+ innerReceiver = current.childForFieldName?.('object') ?? null;
602
+ }
603
+ if (!innerReceiver &&
604
+ (current.type === 'member_call_expression' ||
605
+ current.type === 'nullsafe_member_call_expression')) {
606
+ innerReceiver = current.childForFieldName?.('object') ?? null;
607
+ }
608
+ if (!innerReceiver && current.type === 'call') {
609
+ innerReceiver = current.childForFieldName?.('receiver') ?? null;
610
+ }
611
+ if (!innerReceiver)
612
+ break;
613
+ if (isChainableReceiverNode(innerReceiver)) {
614
+ current = innerReceiver;
615
+ }
616
+ else {
617
+ return {
618
+ chain,
619
+ baseReceiverName: unwrapTransparentReceiver(innerReceiver).text || undefined,
620
+ };
621
+ }
622
+ }
623
+ else if (FIELD_ACCESS_NODE_TYPES.has(current.type)) {
624
+ // ── Field/member access: extract property name + inner object ─────────
625
+ let propertyName;
626
+ let innerObject = null;
627
+ if (current.type === 'navigation_expression') {
628
+ for (const child of current.children ?? []) {
629
+ if (child.type === 'navigation_suffix') {
630
+ for (const sc of child.children ?? []) {
631
+ if (sc.isNamed && sc.type !== '.') {
632
+ propertyName = sc.text;
633
+ break;
634
+ }
635
+ }
636
+ }
637
+ else if (child.isNamed && !innerObject) {
638
+ innerObject = child;
639
+ }
640
+ }
641
+ }
642
+ else if (current.type === 'attribute') {
643
+ innerObject = current.childForFieldName?.('object') ?? null;
644
+ propertyName = current.childForFieldName?.('attribute')?.text;
645
+ }
646
+ else {
647
+ innerObject =
648
+ current.childForFieldName?.('object') ??
649
+ current.childForFieldName?.('value') ??
650
+ current.childForFieldName?.('operand') ??
651
+ current.childForFieldName?.('argument') ?? // C/C++ field_expression
652
+ current.childForFieldName?.('expression') ??
653
+ null;
654
+ propertyName = (current.childForFieldName?.('property') ??
655
+ current.childForFieldName?.('field') ??
656
+ current.childForFieldName?.('name'))?.text;
657
+ }
658
+ if (!propertyName)
659
+ break;
660
+ chain.unshift({ kind: 'field', name: propertyName });
661
+ if (!innerObject)
662
+ break;
663
+ if (isChainableReceiverNode(innerObject)) {
664
+ current = innerObject;
665
+ }
666
+ else {
667
+ return {
668
+ chain,
669
+ baseReceiverName: unwrapTransparentReceiver(innerObject).text || undefined,
670
+ };
671
+ }
672
+ }
673
+ else if (AWAIT_EXPRESSION_NODE_TYPES.has(current.type)) {
674
+ // Name-free: the awaited call's method name already lives on its own
675
+ // `call` step, so this records only that an await happened.
676
+ chain.unshift({ kind: 'await' });
677
+ const inner = current.childForFieldName?.('argument') ??
678
+ current.childForFieldName?.('expression') ??
679
+ current.namedChildren?.find((c) => c !== null) ??
680
+ null;
681
+ if (!inner)
682
+ break;
683
+ if (isChainableReceiverNode(inner)) {
684
+ current = inner;
685
+ }
686
+ else {
687
+ return {
688
+ chain,
689
+ baseReceiverName: unwrapTransparentReceiver(inner).text || undefined,
690
+ };
691
+ }
692
+ }
693
+ else if (SUBSCRIPT_NODE_TYPES.has(current.type)) {
694
+ // Name-free: a subscript key is a VALUE, not an identifier the resolver
695
+ // could look up, so there is no member name to record.
696
+ chain.unshift({ kind: 'index' });
697
+ // Shared per-grammar table — it knows Python's `value` and Java's `array`,
698
+ // which a locally-written ladder omitted (they worked only because the
699
+ // container happened to be the first named child, an ordering coincidence
700
+ // rather than a contract). Falls back for grammars whose subscript node
701
+ // carries no `index` field.
702
+ const obj = (0, callable_flow_captures_js_1.subscriptBase)(current) ??
703
+ current.childForFieldName?.('object') ??
704
+ current.childForFieldName?.('argument') ??
705
+ current.childForFieldName?.('operand') ??
706
+ current.childForFieldName?.('expression') ??
707
+ current.namedChildren?.find((c) => c !== null) ??
708
+ null;
709
+ if (!obj)
710
+ break;
711
+ if (isChainableReceiverNode(obj)) {
712
+ current = obj;
713
+ }
714
+ else {
715
+ return {
716
+ chain,
717
+ baseReceiverName: unwrapTransparentReceiver(obj).text || undefined,
718
+ };
719
+ }
720
+ }
721
+ else if (current.type === 'selector') {
722
+ // ── Dart: flat selector siblings (user.address.save() uses selector nodes) ──
723
+ // Extract field name from unconditional_assignable_selector child
724
+ const uas = current.namedChildren?.find((c) => c.type === 'unconditional_assignable_selector');
725
+ const propertyName = uas?.namedChildren?.find((c) => c.type === 'identifier')?.text;
726
+ if (!propertyName)
727
+ break;
728
+ chain.unshift({ kind: 'field', name: propertyName });
729
+ // Walk to previous sibling for the next step in the chain
730
+ const prev = current.previousNamedSibling;
731
+ if (!prev)
732
+ break;
733
+ if (prev.type === 'selector') {
734
+ current = prev;
735
+ }
736
+ else {
737
+ // Base receiver (identifier or other terminal)
738
+ return { chain, baseReceiverName: prev.text || undefined };
739
+ }
740
+ }
741
+ else {
742
+ // Simple identifier — this is the base receiver
743
+ return chain.length > 0 ? { chain, baseReceiverName: current.text || undefined } : undefined;
744
+ }
745
+ }
746
+ return chain.length > 0 ? { chain, baseReceiverName: undefined } : undefined;
747
+ }
748
+ /** Arg types per call position (literals + optional TypeEnv for ids); undefined if unusable */
749
+ const extractCallArgTypes = (callNode, inferLiteralType, typeEnvLookup) => {
750
+ let argList = callNode.childForFieldName?.('arguments') ??
751
+ callNode.children.find((c) => c.type === 'arguments' || c.type === 'argument_list' || c.type === 'value_arguments');
752
+ if (!argList) {
753
+ const callSuffix = callNode.children.find((c) => c.type === 'call_suffix');
754
+ if (callSuffix) {
755
+ argList = callSuffix.children.find((c) => c.type === 'value_arguments');
756
+ }
757
+ }
758
+ if (!argList)
759
+ return undefined;
760
+ const argTypes = [];
761
+ for (const arg of argList.namedChildren) {
762
+ if (arg.type === 'comment')
763
+ continue;
764
+ const valueNode = arg.childForFieldName?.('value') ??
765
+ arg.childForFieldName?.('expression') ??
766
+ (arg.type === 'argument' || arg.type === 'value_argument'
767
+ ? (arg.firstNamedChild ?? arg)
768
+ : arg);
769
+ let inferred = inferLiteralType(valueNode);
770
+ if (!inferred && typeEnvLookup && valueNode.type === 'identifier') {
771
+ inferred = typeEnvLookup(valueNode.text, callNode);
772
+ }
773
+ argTypes.push(inferred);
774
+ }
775
+ if (argTypes.every((t) => t === undefined))
776
+ return undefined;
777
+ return argTypes;
778
+ };
779
+ exports.extractCallArgTypes = extractCallArgTypes;