cgraphx 2.0.1 → 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 (701) hide show
  1. package/dist/.claude-template/FLOW-MAP.md +7 -5
  2. package/dist/.claude-template/commands/end.md +1 -1
  3. package/dist/.claude-template/skills/cgraphx-guide/SKILL.md +2 -1
  4. package/dist/.claude-template/skills/cgraphx-guide/how-to-use.html +4 -2
  5. package/dist/.claude-template/skills/cgraphx-guide/how-to-use.md +5 -2
  6. package/dist/.claude-template/skills/iboc-check/SKILL.md +116 -0
  7. package/dist/.claude-template/skills/iboc-check/filler-prompt.md +75 -0
  8. package/dist/.claude-template/skills/implementation/SKILL.md +7 -0
  9. package/dist/.claude-template/skills/init-project-guides/SKILL.md +1 -1
  10. package/dist/.claude-template/skills/run-api-test/references/db-verification.md +2 -2
  11. package/dist/.claude-template/skills/subagent-implement/SKILL.md +3 -2
  12. package/dist/.claude-template/skills/write-api/assets/template-request.bru +3 -3
  13. package/dist/.claude-template/skills/write-api/references/bru-format.md +6 -6
  14. package/dist/.claude-template/skills/write-delivery-guide/SKILL.md +97 -0
  15. package/dist/.claude-template/skills/write-delivery-guide/template-change-type.md +120 -0
  16. package/dist/.claude-template/skills/write-delivery-guide/template-multi-role-flow.md +148 -0
  17. package/dist/.claude-template/skills/write-unit-test-code/SKILL.md +23 -6
  18. package/dist/core/code/engine/cli/analyze-config.js +320 -0
  19. package/dist/core/code/engine/cli/analyze.js +1086 -0
  20. package/dist/core/code/engine/cli/cli-message.js +83 -0
  21. package/dist/core/code/engine/cli/detect-changes-format.js +58 -0
  22. package/dist/core/code/engine/cli/embedding-dims.js +43 -0
  23. package/dist/core/code/engine/cli/format-elapsed.js +12 -0
  24. package/dist/core/code/engine/cli/help-i18n.js +144 -0
  25. package/dist/core/code/engine/cli/i18n/en.js +110 -0
  26. package/dist/core/code/engine/cli/i18n/index.js +47 -0
  27. package/dist/core/code/engine/cli/i18n/resources.js +9 -0
  28. package/dist/core/code/engine/cli/i18n/zh-CN.js +110 -0
  29. package/dist/core/code/engine/cli/lazy-action.js +67 -0
  30. package/dist/core/code/engine/cli/optional-grammars.js +136 -0
  31. package/dist/core/code/engine/cli/resolve-invocation.js +76 -0
  32. package/dist/core/code/engine/cli/status.js +156 -0
  33. package/dist/core/code/engine/cli/tool.js +384 -0
  34. package/dist/core/code/engine/config/ignore-service.js +511 -0
  35. package/dist/core/code/engine/config/supported-languages.js +17 -0
  36. package/dist/core/code/engine/core/analysis-features.js +64 -0
  37. package/dist/core/code/engine/core/analyzer-identity.js +2171 -0
  38. package/dist/core/code/engine/core/git-staleness.js +180 -0
  39. package/dist/core/code/engine/core/graph/graph.js +180 -0
  40. package/dist/core/code/engine/core/graph/import-cycles.js +106 -0
  41. package/dist/core/code/engine/core/graph/types.js +2 -0
  42. package/dist/core/code/engine/core/index-freshness.js +12 -0
  43. package/dist/core/code/engine/core/ingestion/binding-accumulator.js +341 -0
  44. package/dist/core/code/engine/core/ingestion/call-extractors/configs/c-cpp.js +168 -0
  45. package/dist/core/code/engine/core/ingestion/call-extractors/configs/csharp.js +9 -0
  46. package/dist/core/code/engine/core/ingestion/call-extractors/configs/dart.js +8 -0
  47. package/dist/core/code/engine/core/ingestion/call-extractors/configs/go.js +8 -0
  48. package/dist/core/code/engine/core/ingestion/call-extractors/configs/jvm.js +54 -0
  49. package/dist/core/code/engine/core/ingestion/call-extractors/configs/php.js +8 -0
  50. package/dist/core/code/engine/core/ingestion/call-extractors/configs/python.js +8 -0
  51. package/dist/core/code/engine/core/ingestion/call-extractors/configs/ruby.js +8 -0
  52. package/dist/core/code/engine/core/ingestion/call-extractors/configs/rust.js +8 -0
  53. package/dist/core/code/engine/core/ingestion/call-extractors/configs/swift.js +8 -0
  54. package/dist/core/code/engine/core/ingestion/call-extractors/configs/typescript-javascript.js +11 -0
  55. package/dist/core/code/engine/core/ingestion/call-extractors/generic.js +62 -0
  56. package/dist/core/code/engine/core/ingestion/call-processor.js +503 -0
  57. package/dist/core/code/engine/core/ingestion/call-routing.js +98 -0
  58. package/dist/core/code/engine/core/ingestion/call-types.js +3 -0
  59. package/dist/core/code/engine/core/ingestion/cfg/callee-cell-format.js +45 -0
  60. package/dist/core/code/engine/core/ingestion/cfg/cfg-builder.js +202 -0
  61. package/dist/core/code/engine/core/ingestion/cfg/collect.js +81 -0
  62. package/dist/core/code/engine/core/ingestion/cfg/control-dependence.js +185 -0
  63. package/dist/core/code/engine/core/ingestion/cfg/control-flow-context.js +130 -0
  64. package/dist/core/code/engine/core/ingestion/cfg/emit.js +646 -0
  65. package/dist/core/code/engine/core/ingestion/cfg/post-dominators.js +182 -0
  66. package/dist/core/code/engine/core/ingestion/cfg/reaching-def-reason-codec.js +139 -0
  67. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs-graph.js +322 -0
  68. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs.js +792 -0
  69. package/dist/core/code/engine/core/ingestion/cfg/synthetic-escape.js +305 -0
  70. package/dist/core/code/engine/core/ingestion/cfg/traversal-result.js +6 -0
  71. package/dist/core/code/engine/core/ingestion/cfg/types.js +14 -0
  72. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp-harvest.js +545 -0
  73. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp.js +590 -0
  74. package/dist/core/code/engine/core/ingestion/cfg/visitors/call-site-harvest.js +356 -0
  75. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp-harvest.js +593 -0
  76. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp.js +871 -0
  77. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart-harvest.js +874 -0
  78. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart.js +840 -0
  79. package/dist/core/code/engine/core/ingestion/cfg/visitors/go-harvest.js +625 -0
  80. package/dist/core/code/engine/core/ingestion/cfg/visitors/go.js +642 -0
  81. package/dist/core/code/engine/core/ingestion/cfg/visitors/java-harvest.js +517 -0
  82. package/dist/core/code/engine/core/ingestion/cfg/visitors/java.js +816 -0
  83. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin-harvest.js +723 -0
  84. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin.js +813 -0
  85. package/dist/core/code/engine/core/ingestion/cfg/visitors/php-harvest.js +630 -0
  86. package/dist/core/code/engine/core/ingestion/cfg/visitors/php.js +725 -0
  87. package/dist/core/code/engine/core/ingestion/cfg/visitors/python-harvest.js +776 -0
  88. package/dist/core/code/engine/core/ingestion/cfg/visitors/python.js +562 -0
  89. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby-harvest.js +591 -0
  90. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby.js +760 -0
  91. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust-harvest.js +877 -0
  92. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust.js +562 -0
  93. package/dist/core/code/engine/core/ingestion/cfg/visitors/scope-tree-harvest.js +120 -0
  94. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift-harvest.js +683 -0
  95. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift.js +791 -0
  96. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript-harvest.js +1060 -0
  97. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript.js +587 -0
  98. package/dist/core/code/engine/core/ingestion/class-extractors/configs/c-cpp.js +77 -0
  99. package/dist/core/code/engine/core/ingestion/class-extractors/configs/csharp.js +24 -0
  100. package/dist/core/code/engine/core/ingestion/class-extractors/configs/dart.js +10 -0
  101. package/dist/core/code/engine/core/ingestion/class-extractors/configs/go.js +28 -0
  102. package/dist/core/code/engine/core/ingestion/class-extractors/configs/jvm.js +67 -0
  103. package/dist/core/code/engine/core/ingestion/class-extractors/configs/php.js +10 -0
  104. package/dist/core/code/engine/core/ingestion/class-extractors/configs/python.js +10 -0
  105. package/dist/core/code/engine/core/ingestion/class-extractors/configs/ruby.js +13 -0
  106. package/dist/core/code/engine/core/ingestion/class-extractors/configs/rust.js +10 -0
  107. package/dist/core/code/engine/core/ingestion/class-extractors/configs/swift.js +21 -0
  108. package/dist/core/code/engine/core/ingestion/class-extractors/configs/typescript-javascript.js +31 -0
  109. package/dist/core/code/engine/core/ingestion/class-extractors/generic.js +144 -0
  110. package/dist/core/code/engine/core/ingestion/class-types.js +2 -0
  111. package/dist/core/code/engine/core/ingestion/cluster-enricher.js +174 -0
  112. package/dist/core/code/engine/core/ingestion/community-processor.js +604 -0
  113. package/dist/core/code/engine/core/ingestion/constants.js +26 -0
  114. package/dist/core/code/engine/core/ingestion/cpp-ue-preprocessor.js +263 -0
  115. package/dist/core/code/engine/core/ingestion/csharp-namespace-gate.js +133 -0
  116. package/dist/core/code/engine/core/ingestion/di-extractors/index.js +38 -0
  117. package/dist/core/code/engine/core/ingestion/di-extractors/spring.js +310 -0
  118. package/dist/core/code/engine/core/ingestion/emit-references.js +244 -0
  119. package/dist/core/code/engine/core/ingestion/entry-point-scoring.js +201 -0
  120. package/dist/core/code/engine/core/ingestion/export-detection.js +244 -0
  121. package/dist/core/code/engine/core/ingestion/field-extractor.js +29 -0
  122. package/dist/core/code/engine/core/ingestion/field-extractors/configs/c-cpp.js +107 -0
  123. package/dist/core/code/engine/core/ingestion/field-extractors/configs/csharp.js +124 -0
  124. package/dist/core/code/engine/core/ingestion/field-extractors/configs/dart.js +99 -0
  125. package/dist/core/code/engine/core/ingestion/field-extractors/configs/go.js +102 -0
  126. package/dist/core/code/engine/core/ingestion/field-extractors/configs/helpers.js +198 -0
  127. package/dist/core/code/engine/core/ingestion/field-extractors/configs/jvm.js +172 -0
  128. package/dist/core/code/engine/core/ingestion/field-extractors/configs/php.js +67 -0
  129. package/dist/core/code/engine/core/ingestion/field-extractors/configs/python.js +94 -0
  130. package/dist/core/code/engine/core/ingestion/field-extractors/configs/ruby.js +79 -0
  131. package/dist/core/code/engine/core/ingestion/field-extractors/configs/rust.js +55 -0
  132. package/dist/core/code/engine/core/ingestion/field-extractors/configs/swift.js +93 -0
  133. package/dist/core/code/engine/core/ingestion/field-extractors/configs/typescript-javascript.js +59 -0
  134. package/dist/core/code/engine/core/ingestion/field-extractors/generic.js +147 -0
  135. package/dist/core/code/engine/core/ingestion/field-extractors/typescript.js +266 -0
  136. package/dist/core/code/engine/core/ingestion/field-types.js +3 -0
  137. package/dist/core/code/engine/core/ingestion/filesystem-walker.js +136 -0
  138. package/dist/core/code/engine/core/ingestion/finalize-orchestrator.js +159 -0
  139. package/dist/core/code/engine/core/ingestion/framework-detection.js +432 -0
  140. package/dist/core/code/engine/core/ingestion/frameworks/spring/analysis-features.js +38 -0
  141. package/dist/core/code/engine/core/ingestion/frameworks/spring/annotation-arguments.js +234 -0
  142. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop-candidates.js +88 -0
  143. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop.js +487 -0
  144. package/dist/core/code/engine/core/ingestion/frameworks/spring/auto-configuration.js +21 -0
  145. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-candidates.js +189 -0
  146. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-catalog.js +32 -0
  147. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-factories.js +73 -0
  148. package/dist/core/code/engine/core/ingestion/frameworks/spring/conditionals.js +323 -0
  149. package/dist/core/code/engine/core/ingestion/frameworks/spring/config-bindings.js +119 -0
  150. package/dist/core/code/engine/core/ingestion/frameworks/spring/di-metadata.js +385 -0
  151. package/dist/core/code/engine/core/ingestion/frameworks/spring/resource-injection.js +96 -0
  152. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/c-cpp.js +17 -0
  153. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/csharp.js +46 -0
  154. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/dart.js +59 -0
  155. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/go.js +30 -0
  156. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/jvm.js +73 -0
  157. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/php.js +19 -0
  158. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/python.js +45 -0
  159. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/ruby.js +20 -0
  160. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/rust.js +58 -0
  161. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/swift.js +94 -0
  162. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/typescript-javascript.js +26 -0
  163. package/dist/core/code/engine/core/ingestion/import-resolvers/csharp.js +128 -0
  164. package/dist/core/code/engine/core/ingestion/import-resolvers/go.js +50 -0
  165. package/dist/core/code/engine/core/ingestion/import-resolvers/jvm.js +112 -0
  166. package/dist/core/code/engine/core/ingestion/import-resolvers/php.js +80 -0
  167. package/dist/core/code/engine/core/ingestion/import-resolvers/python.js +75 -0
  168. package/dist/core/code/engine/core/ingestion/import-resolvers/resolver-factory.js +36 -0
  169. package/dist/core/code/engine/core/ingestion/import-resolvers/ruby.js +20 -0
  170. package/dist/core/code/engine/core/ingestion/import-resolvers/rust.js +79 -0
  171. package/dist/core/code/engine/core/ingestion/import-resolvers/standard.js +180 -0
  172. package/dist/core/code/engine/core/ingestion/import-resolvers/types.js +7 -0
  173. package/dist/core/code/engine/core/ingestion/import-resolvers/utils.js +153 -0
  174. package/dist/core/code/engine/core/ingestion/import-target-adapter.js +99 -0
  175. package/dist/core/code/engine/core/ingestion/language-config.js +391 -0
  176. package/dist/core/code/engine/core/ingestion/language-provider.js +25 -0
  177. package/dist/core/code/engine/core/ingestion/languages/c/arity-metadata.js +98 -0
  178. package/dist/core/code/engine/core/ingestion/languages/c/arity.js +21 -0
  179. package/dist/core/code/engine/core/ingestion/languages/c/capture-side-channel.js +69 -0
  180. package/dist/core/code/engine/core/ingestion/languages/c/captures.js +189 -0
  181. package/dist/core/code/engine/core/ingestion/languages/c/header-scan.js +58 -0
  182. package/dist/core/code/engine/core/ingestion/languages/c/import-decomposer.js +68 -0
  183. package/dist/core/code/engine/core/ingestion/languages/c/import-target.js +103 -0
  184. package/dist/core/code/engine/core/ingestion/languages/c/index.js +33 -0
  185. package/dist/core/code/engine/core/ingestion/languages/c/interpret.js +53 -0
  186. package/dist/core/code/engine/core/ingestion/languages/c/merge-bindings.js +26 -0
  187. package/dist/core/code/engine/core/ingestion/languages/c/query.js +210 -0
  188. package/dist/core/code/engine/core/ingestion/languages/c/scope-resolver.js +112 -0
  189. package/dist/core/code/engine/core/ingestion/languages/c/simple-hooks.js +24 -0
  190. package/dist/core/code/engine/core/ingestion/languages/c/static-linkage.js +109 -0
  191. package/dist/core/code/engine/core/ingestion/languages/c-cpp.js +506 -0
  192. package/dist/core/code/engine/core/ingestion/languages/cpp/adl.js +804 -0
  193. package/dist/core/code/engine/core/ingestion/languages/cpp/arity-metadata.js +258 -0
  194. package/dist/core/code/engine/core/ingestion/languages/cpp/arity.js +37 -0
  195. package/dist/core/code/engine/core/ingestion/languages/cpp/capture-side-channel.js +89 -0
  196. package/dist/core/code/engine/core/ingestion/languages/cpp/captures.js +1975 -0
  197. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-extractor.js +311 -0
  198. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-filter.js +210 -0
  199. package/dist/core/code/engine/core/ingestion/languages/cpp/conversion-rank.js +163 -0
  200. package/dist/core/code/engine/core/ingestion/languages/cpp/file-local-linkage.js +327 -0
  201. package/dist/core/code/engine/core/ingestion/languages/cpp/header-scan.js +53 -0
  202. package/dist/core/code/engine/core/ingestion/languages/cpp/import-decomposer.js +134 -0
  203. package/dist/core/code/engine/core/ingestion/languages/cpp/import-target.js +16 -0
  204. package/dist/core/code/engine/core/ingestion/languages/cpp/index.js +33 -0
  205. package/dist/core/code/engine/core/ingestion/languages/cpp/inline-namespaces.js +379 -0
  206. package/dist/core/code/engine/core/ingestion/languages/cpp/interpret.js +239 -0
  207. package/dist/core/code/engine/core/ingestion/languages/cpp/member-lookup.js +470 -0
  208. package/dist/core/code/engine/core/ingestion/languages/cpp/merge-bindings.js +32 -0
  209. package/dist/core/code/engine/core/ingestion/languages/cpp/query.js +763 -0
  210. package/dist/core/code/engine/core/ingestion/languages/cpp/range-bindings.js +230 -0
  211. package/dist/core/code/engine/core/ingestion/languages/cpp/scope-resolver.js +354 -0
  212. package/dist/core/code/engine/core/ingestion/languages/cpp/simple-hooks.js +67 -0
  213. package/dist/core/code/engine/core/ingestion/languages/cpp/two-phase-lookup.js +348 -0
  214. package/dist/core/code/engine/core/ingestion/languages/cpp/type-classifier.js +56 -0
  215. package/dist/core/code/engine/core/ingestion/languages/cpp/user-defined-conversions.js +128 -0
  216. package/dist/core/code/engine/core/ingestion/languages/csharp/accessor-unwrap.js +67 -0
  217. package/dist/core/code/engine/core/ingestion/languages/csharp/arity-metadata.js +49 -0
  218. package/dist/core/code/engine/core/ingestion/languages/csharp/arity.js +40 -0
  219. package/dist/core/code/engine/core/ingestion/languages/csharp/cache-stats.js +32 -0
  220. package/dist/core/code/engine/core/ingestion/languages/csharp/captures.js +557 -0
  221. package/dist/core/code/engine/core/ingestion/languages/csharp/import-decomposer.js +96 -0
  222. package/dist/core/code/engine/core/ingestion/languages/csharp/import-target.js +176 -0
  223. package/dist/core/code/engine/core/ingestion/languages/csharp/index.js +95 -0
  224. package/dist/core/code/engine/core/ingestion/languages/csharp/interpret.js +150 -0
  225. package/dist/core/code/engine/core/ingestion/languages/csharp/merge-bindings.js +58 -0
  226. package/dist/core/code/engine/core/ingestion/languages/csharp/namespace-siblings.js +708 -0
  227. package/dist/core/code/engine/core/ingestion/languages/csharp/qualified-type-names.js +62 -0
  228. package/dist/core/code/engine/core/ingestion/languages/csharp/query.js +578 -0
  229. package/dist/core/code/engine/core/ingestion/languages/csharp/receiver-binding.js +142 -0
  230. package/dist/core/code/engine/core/ingestion/languages/csharp/resolution-config.js +18 -0
  231. package/dist/core/code/engine/core/ingestion/languages/csharp/scope-resolver.js +84 -0
  232. package/dist/core/code/engine/core/ingestion/languages/csharp/simple-hooks.js +81 -0
  233. package/dist/core/code/engine/core/ingestion/languages/csharp.js +204 -0
  234. package/dist/core/code/engine/core/ingestion/languages/dart/arity-metadata.js +38 -0
  235. package/dist/core/code/engine/core/ingestion/languages/dart/arity.js +34 -0
  236. package/dist/core/code/engine/core/ingestion/languages/dart/built-ins.js +37 -0
  237. package/dist/core/code/engine/core/ingestion/languages/dart/cache-stats.js +30 -0
  238. package/dist/core/code/engine/core/ingestion/languages/dart/captures.js +1096 -0
  239. package/dist/core/code/engine/core/ingestion/languages/dart/expand-wildcards.js +34 -0
  240. package/dist/core/code/engine/core/ingestion/languages/dart/extension-type-preprocess.js +33 -0
  241. package/dist/core/code/engine/core/ingestion/languages/dart/import-target.js +68 -0
  242. package/dist/core/code/engine/core/ingestion/languages/dart/index.js +45 -0
  243. package/dist/core/code/engine/core/ingestion/languages/dart/interpret.js +101 -0
  244. package/dist/core/code/engine/core/ingestion/languages/dart/merge-bindings.js +42 -0
  245. package/dist/core/code/engine/core/ingestion/languages/dart/query.js +246 -0
  246. package/dist/core/code/engine/core/ingestion/languages/dart/receiver-binding.js +90 -0
  247. package/dist/core/code/engine/core/ingestion/languages/dart/scope-resolver.js +197 -0
  248. package/dist/core/code/engine/core/ingestion/languages/dart/signature-bindings.js +54 -0
  249. package/dist/core/code/engine/core/ingestion/languages/dart/simple-hooks.js +61 -0
  250. package/dist/core/code/engine/core/ingestion/languages/dart.js +138 -0
  251. package/dist/core/code/engine/core/ingestion/languages/go/arity-metadata.js +71 -0
  252. package/dist/core/code/engine/core/ingestion/languages/go/arity.js +17 -0
  253. package/dist/core/code/engine/core/ingestion/languages/go/cache-stats.js +21 -0
  254. package/dist/core/code/engine/core/ingestion/languages/go/captures.js +492 -0
  255. package/dist/core/code/engine/core/ingestion/languages/go/expand-wildcards.js +97 -0
  256. package/dist/core/code/engine/core/ingestion/languages/go/generic-type-parameters.js +146 -0
  257. package/dist/core/code/engine/core/ingestion/languages/go/import-decomposer.js +47 -0
  258. package/dist/core/code/engine/core/ingestion/languages/go/import-target.js +70 -0
  259. package/dist/core/code/engine/core/ingestion/languages/go/index.js +39 -0
  260. package/dist/core/code/engine/core/ingestion/languages/go/interface-impls.js +955 -0
  261. package/dist/core/code/engine/core/ingestion/languages/go/interpret.js +177 -0
  262. package/dist/core/code/engine/core/ingestion/languages/go/merge-bindings.js +21 -0
  263. package/dist/core/code/engine/core/ingestion/languages/go/method-owners.js +131 -0
  264. package/dist/core/code/engine/core/ingestion/languages/go/namespace-mirror.js +56 -0
  265. package/dist/core/code/engine/core/ingestion/languages/go/package-clause.js +79 -0
  266. package/dist/core/code/engine/core/ingestion/languages/go/package-siblings.js +83 -0
  267. package/dist/core/code/engine/core/ingestion/languages/go/query.js +298 -0
  268. package/dist/core/code/engine/core/ingestion/languages/go/range-binding.js +127 -0
  269. package/dist/core/code/engine/core/ingestion/languages/go/receiver-binding.js +24 -0
  270. package/dist/core/code/engine/core/ingestion/languages/go/scope-resolver.js +75 -0
  271. package/dist/core/code/engine/core/ingestion/languages/go/simple-hooks.js +31 -0
  272. package/dist/core/code/engine/core/ingestion/languages/go/type-binding.js +279 -0
  273. package/dist/core/code/engine/core/ingestion/languages/go.js +160 -0
  274. package/dist/core/code/engine/core/ingestion/languages/index.js +66 -0
  275. package/dist/core/code/engine/core/ingestion/languages/java/analysis-features.js +16 -0
  276. package/dist/core/code/engine/core/ingestion/languages/java/arity-metadata.js +43 -0
  277. package/dist/core/code/engine/core/ingestion/languages/java/arity.js +27 -0
  278. package/dist/core/code/engine/core/ingestion/languages/java/cache-stats.js +32 -0
  279. package/dist/core/code/engine/core/ingestion/languages/java/capture-side-channel.js +123 -0
  280. package/dist/core/code/engine/core/ingestion/languages/java/captures.js +791 -0
  281. package/dist/core/code/engine/core/ingestion/languages/java/import-decomposer.js +88 -0
  282. package/dist/core/code/engine/core/ingestion/languages/java/import-target.js +103 -0
  283. package/dist/core/code/engine/core/ingestion/languages/java/index.js +43 -0
  284. package/dist/core/code/engine/core/ingestion/languages/java/interpret.js +146 -0
  285. package/dist/core/code/engine/core/ingestion/languages/java/merge-bindings.js +43 -0
  286. package/dist/core/code/engine/core/ingestion/languages/java/package-facts.js +16 -0
  287. package/dist/core/code/engine/core/ingestion/languages/java/package-siblings.js +11 -0
  288. package/dist/core/code/engine/core/ingestion/languages/java/query.js +319 -0
  289. package/dist/core/code/engine/core/ingestion/languages/java/receiver-binding.js +98 -0
  290. package/dist/core/code/engine/core/ingestion/languages/java/scope-resolver.js +213 -0
  291. package/dist/core/code/engine/core/ingestion/languages/java/simple-hooks.js +39 -0
  292. package/dist/core/code/engine/core/ingestion/languages/java/spring-aop.js +53 -0
  293. package/dist/core/code/engine/core/ingestion/languages/java/spring-bean-metadata.js +11 -0
  294. package/dist/core/code/engine/core/ingestion/languages/java/spring-conditionals.js +52 -0
  295. package/dist/core/code/engine/core/ingestion/languages/java/spring-config-bindings.js +222 -0
  296. package/dist/core/code/engine/core/ingestion/languages/java/spring-di.js +165 -0
  297. package/dist/core/code/engine/core/ingestion/languages/java.js +192 -0
  298. package/dist/core/code/engine/core/ingestion/languages/javascript/arity.js +15 -0
  299. package/dist/core/code/engine/core/ingestion/languages/javascript/captures.js +1122 -0
  300. package/dist/core/code/engine/core/ingestion/languages/javascript/import-target.js +56 -0
  301. package/dist/core/code/engine/core/ingestion/languages/javascript/index.js +109 -0
  302. package/dist/core/code/engine/core/ingestion/languages/javascript/interpret.js +45 -0
  303. package/dist/core/code/engine/core/ingestion/languages/javascript/merge-bindings.js +21 -0
  304. package/dist/core/code/engine/core/ingestion/languages/javascript/query.js +659 -0
  305. package/dist/core/code/engine/core/ingestion/languages/javascript/scope-resolver.js +78 -0
  306. package/dist/core/code/engine/core/ingestion/languages/javascript/simple-hooks.js +44 -0
  307. package/dist/core/code/engine/core/ingestion/languages/jvm/package-facts.js +46 -0
  308. package/dist/core/code/engine/core/ingestion/languages/jvm/package-siblings.js +200 -0
  309. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity-metadata.js +23 -0
  310. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity.js +18 -0
  311. package/dist/core/code/engine/core/ingestion/languages/kotlin/cache-stats.js +21 -0
  312. package/dist/core/code/engine/core/ingestion/languages/kotlin/capture-side-channel.js +160 -0
  313. package/dist/core/code/engine/core/ingestion/languages/kotlin/captures.js +1262 -0
  314. package/dist/core/code/engine/core/ingestion/languages/kotlin/companion-scopes.js +72 -0
  315. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-decomposer.js +40 -0
  316. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-target.js +135 -0
  317. package/dist/core/code/engine/core/ingestion/languages/kotlin/index.js +26 -0
  318. package/dist/core/code/engine/core/ingestion/languages/kotlin/interpret.js +75 -0
  319. package/dist/core/code/engine/core/ingestion/languages/kotlin/merge-bindings.js +28 -0
  320. package/dist/core/code/engine/core/ingestion/languages/kotlin/owners.js +134 -0
  321. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-facts.js +16 -0
  322. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-siblings.js +11 -0
  323. package/dist/core/code/engine/core/ingestion/languages/kotlin/query.js +243 -0
  324. package/dist/core/code/engine/core/ingestion/languages/kotlin/receiver-binding.js +103 -0
  325. package/dist/core/code/engine/core/ingestion/languages/kotlin/scope-resolver.js +207 -0
  326. package/dist/core/code/engine/core/ingestion/languages/kotlin/simple-hooks.js +42 -0
  327. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-aop.js +68 -0
  328. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-bean-metadata.js +11 -0
  329. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-conditionals.js +53 -0
  330. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-di.js +304 -0
  331. package/dist/core/code/engine/core/ingestion/languages/kotlin.js +189 -0
  332. package/dist/core/code/engine/core/ingestion/languages/php/arity-metadata.js +66 -0
  333. package/dist/core/code/engine/core/ingestion/languages/php/arity.js +43 -0
  334. package/dist/core/code/engine/core/ingestion/languages/php/cache-stats.js +32 -0
  335. package/dist/core/code/engine/core/ingestion/languages/php/captures.js +1166 -0
  336. package/dist/core/code/engine/core/ingestion/languages/php/import-decomposer.js +238 -0
  337. package/dist/core/code/engine/core/ingestion/languages/php/import-target.js +213 -0
  338. package/dist/core/code/engine/core/ingestion/languages/php/index.js +85 -0
  339. package/dist/core/code/engine/core/ingestion/languages/php/interpret.js +256 -0
  340. package/dist/core/code/engine/core/ingestion/languages/php/merge-bindings.js +50 -0
  341. package/dist/core/code/engine/core/ingestion/languages/php/namespace-siblings.js +353 -0
  342. package/dist/core/code/engine/core/ingestion/languages/php/query.js +391 -0
  343. package/dist/core/code/engine/core/ingestion/languages/php/receiver-binding.js +135 -0
  344. package/dist/core/code/engine/core/ingestion/languages/php/scope-resolver.js +361 -0
  345. package/dist/core/code/engine/core/ingestion/languages/php/simple-hooks.js +116 -0
  346. package/dist/core/code/engine/core/ingestion/languages/php.js +302 -0
  347. package/dist/core/code/engine/core/ingestion/languages/python/arity-metadata.js +49 -0
  348. package/dist/core/code/engine/core/ingestion/languages/python/arity.js +41 -0
  349. package/dist/core/code/engine/core/ingestion/languages/python/cache-stats.js +34 -0
  350. package/dist/core/code/engine/core/ingestion/languages/python/captures.js +299 -0
  351. package/dist/core/code/engine/core/ingestion/languages/python/depends-references.js +68 -0
  352. package/dist/core/code/engine/core/ingestion/languages/python/import-decomposer.js +115 -0
  353. package/dist/core/code/engine/core/ingestion/languages/python/import-target.js +440 -0
  354. package/dist/core/code/engine/core/ingestion/languages/python/index-stats.js +30 -0
  355. package/dist/core/code/engine/core/ingestion/languages/python/index.js +96 -0
  356. package/dist/core/code/engine/core/ingestion/languages/python/interpret.js +430 -0
  357. package/dist/core/code/engine/core/ingestion/languages/python/merge-bindings.js +47 -0
  358. package/dist/core/code/engine/core/ingestion/languages/python/query.js +323 -0
  359. package/dist/core/code/engine/core/ingestion/languages/python/receiver-binding.js +310 -0
  360. package/dist/core/code/engine/core/ingestion/languages/python/scope-resolver.js +80 -0
  361. package/dist/core/code/engine/core/ingestion/languages/python/simple-hooks.js +53 -0
  362. package/dist/core/code/engine/core/ingestion/languages/python.js +140 -0
  363. package/dist/core/code/engine/core/ingestion/languages/ruby/arity.js +41 -0
  364. package/dist/core/code/engine/core/ingestion/languages/ruby/cache-stats.js +21 -0
  365. package/dist/core/code/engine/core/ingestion/languages/ruby/captures.js +864 -0
  366. package/dist/core/code/engine/core/ingestion/languages/ruby/import-target.js +88 -0
  367. package/dist/core/code/engine/core/ingestion/languages/ruby/index.js +29 -0
  368. package/dist/core/code/engine/core/ingestion/languages/ruby/interpret.js +115 -0
  369. package/dist/core/code/engine/core/ingestion/languages/ruby/merge-bindings.js +21 -0
  370. package/dist/core/code/engine/core/ingestion/languages/ruby/query.js +349 -0
  371. package/dist/core/code/engine/core/ingestion/languages/ruby/receiver-binding.js +70 -0
  372. package/dist/core/code/engine/core/ingestion/languages/ruby/scope-resolver.js +263 -0
  373. package/dist/core/code/engine/core/ingestion/languages/ruby/simple-hooks.js +68 -0
  374. package/dist/core/code/engine/core/ingestion/languages/ruby.js +215 -0
  375. package/dist/core/code/engine/core/ingestion/languages/rust/arity.js +16 -0
  376. package/dist/core/code/engine/core/ingestion/languages/rust/cache-stats.js +21 -0
  377. package/dist/core/code/engine/core/ingestion/languages/rust/captures.js +304 -0
  378. package/dist/core/code/engine/core/ingestion/languages/rust/import-decomposer.js +167 -0
  379. package/dist/core/code/engine/core/ingestion/languages/rust/import-target.js +108 -0
  380. package/dist/core/code/engine/core/ingestion/languages/rust/index.js +29 -0
  381. package/dist/core/code/engine/core/ingestion/languages/rust/interpret.js +201 -0
  382. package/dist/core/code/engine/core/ingestion/languages/rust/merge-bindings.js +21 -0
  383. package/dist/core/code/engine/core/ingestion/languages/rust/method-owners.js +76 -0
  384. package/dist/core/code/engine/core/ingestion/languages/rust/module-path.js +222 -0
  385. package/dist/core/code/engine/core/ingestion/languages/rust/qualified-call.js +482 -0
  386. package/dist/core/code/engine/core/ingestion/languages/rust/query.js +280 -0
  387. package/dist/core/code/engine/core/ingestion/languages/rust/range-binding.js +687 -0
  388. package/dist/core/code/engine/core/ingestion/languages/rust/receiver-binding.js +148 -0
  389. package/dist/core/code/engine/core/ingestion/languages/rust/scope-resolver.js +151 -0
  390. package/dist/core/code/engine/core/ingestion/languages/rust/simple-hooks.js +32 -0
  391. package/dist/core/code/engine/core/ingestion/languages/rust.js +183 -0
  392. package/dist/core/code/engine/core/ingestion/languages/swift/arity-metadata.js +44 -0
  393. package/dist/core/code/engine/core/ingestion/languages/swift/arity.js +45 -0
  394. package/dist/core/code/engine/core/ingestion/languages/swift/base-type.js +30 -0
  395. package/dist/core/code/engine/core/ingestion/languages/swift/cache-stats.js +32 -0
  396. package/dist/core/code/engine/core/ingestion/languages/swift/captures.js +594 -0
  397. package/dist/core/code/engine/core/ingestion/languages/swift/conditional-directive-preprocess.js +256 -0
  398. package/dist/core/code/engine/core/ingestion/languages/swift/implicit-imports.js +60 -0
  399. package/dist/core/code/engine/core/ingestion/languages/swift/import-decomposer.js +87 -0
  400. package/dist/core/code/engine/core/ingestion/languages/swift/import-target.js +84 -0
  401. package/dist/core/code/engine/core/ingestion/languages/swift/index.js +56 -0
  402. package/dist/core/code/engine/core/ingestion/languages/swift/interpret.js +93 -0
  403. package/dist/core/code/engine/core/ingestion/languages/swift/merge-bindings.js +51 -0
  404. package/dist/core/code/engine/core/ingestion/languages/swift/query.js +226 -0
  405. package/dist/core/code/engine/core/ingestion/languages/swift/receiver-binding.js +169 -0
  406. package/dist/core/code/engine/core/ingestion/languages/swift/scope-resolver.js +192 -0
  407. package/dist/core/code/engine/core/ingestion/languages/swift/sibling-type-bindings.js +68 -0
  408. package/dist/core/code/engine/core/ingestion/languages/swift/signature-bindings.js +69 -0
  409. package/dist/core/code/engine/core/ingestion/languages/swift/simple-hooks.js +65 -0
  410. package/dist/core/code/engine/core/ingestion/languages/swift/target-grouping.js +97 -0
  411. package/dist/core/code/engine/core/ingestion/languages/swift/target-siblings.js +74 -0
  412. package/dist/core/code/engine/core/ingestion/languages/swift.js +246 -0
  413. package/dist/core/code/engine/core/ingestion/languages/typescript/arity-metadata.js +106 -0
  414. package/dist/core/code/engine/core/ingestion/languages/typescript/arity.js +57 -0
  415. package/dist/core/code/engine/core/ingestion/languages/typescript/array-callback.js +58 -0
  416. package/dist/core/code/engine/core/ingestion/languages/typescript/cache-stats.js +34 -0
  417. package/dist/core/code/engine/core/ingestion/languages/typescript/captures.js +956 -0
  418. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-export-assignment.js +535 -0
  419. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-module-exports.js +196 -0
  420. package/dist/core/code/engine/core/ingestion/languages/typescript/import-decomposer.js +374 -0
  421. package/dist/core/code/engine/core/ingestion/languages/typescript/import-target.js +65 -0
  422. package/dist/core/code/engine/core/ingestion/languages/typescript/index.js +108 -0
  423. package/dist/core/code/engine/core/ingestion/languages/typescript/interpret.js +344 -0
  424. package/dist/core/code/engine/core/ingestion/languages/typescript/merge-bindings.js +161 -0
  425. package/dist/core/code/engine/core/ingestion/languages/typescript/nuxt-auto-imports.js +325 -0
  426. package/dist/core/code/engine/core/ingestion/languages/typescript/query.js +1328 -0
  427. package/dist/core/code/engine/core/ingestion/languages/typescript/receiver-binding.js +201 -0
  428. package/dist/core/code/engine/core/ingestion/languages/typescript/scope-resolver.js +293 -0
  429. package/dist/core/code/engine/core/ingestion/languages/typescript/simple-hooks.js +139 -0
  430. package/dist/core/code/engine/core/ingestion/languages/typescript.js +455 -0
  431. package/dist/core/code/engine/core/ingestion/languages/vue/captures.js +70 -0
  432. package/dist/core/code/engine/core/ingestion/languages/vue/import-target.js +61 -0
  433. package/dist/core/code/engine/core/ingestion/languages/vue/index.js +55 -0
  434. package/dist/core/code/engine/core/ingestion/languages/vue/scope-resolver.js +295 -0
  435. package/dist/core/code/engine/core/ingestion/languages/vue.js +96 -0
  436. package/dist/core/code/engine/core/ingestion/local-symbol-pruner.js +68 -0
  437. package/dist/core/code/engine/core/ingestion/method-extractors/configs/c-cpp.js +387 -0
  438. package/dist/core/code/engine/core/ingestion/method-extractors/configs/csharp.js +290 -0
  439. package/dist/core/code/engine/core/ingestion/method-extractors/configs/dart.js +392 -0
  440. package/dist/core/code/engine/core/ingestion/method-extractors/configs/go.js +179 -0
  441. package/dist/core/code/engine/core/ingestion/method-extractors/configs/jvm.js +350 -0
  442. package/dist/core/code/engine/core/ingestion/method-extractors/configs/php.js +306 -0
  443. package/dist/core/code/engine/core/ingestion/method-extractors/configs/python.js +312 -0
  444. package/dist/core/code/engine/core/ingestion/method-extractors/configs/ruby.js +289 -0
  445. package/dist/core/code/engine/core/ingestion/method-extractors/configs/rust.js +198 -0
  446. package/dist/core/code/engine/core/ingestion/method-extractors/configs/swift.js +286 -0
  447. package/dist/core/code/engine/core/ingestion/method-extractors/configs/typescript-javascript.js +341 -0
  448. package/dist/core/code/engine/core/ingestion/method-extractors/generic.js +209 -0
  449. package/dist/core/code/engine/core/ingestion/method-types.js +3 -0
  450. package/dist/core/code/engine/core/ingestion/model/field-registry.js +41 -0
  451. package/dist/core/code/engine/core/ingestion/model/index.js +52 -0
  452. package/dist/core/code/engine/core/ingestion/model/method-registry.js +138 -0
  453. package/dist/core/code/engine/core/ingestion/model/owned-members-lookup.js +46 -0
  454. package/dist/core/code/engine/core/ingestion/model/registration-table.js +234 -0
  455. package/dist/core/code/engine/core/ingestion/model/resolve.js +183 -0
  456. package/dist/core/code/engine/core/ingestion/model/scope-resolution-indexes.js +43 -0
  457. package/dist/core/code/engine/core/ingestion/model/semantic-model.js +179 -0
  458. package/dist/core/code/engine/core/ingestion/model/symbol-table.js +216 -0
  459. package/dist/core/code/engine/core/ingestion/model/type-registry.js +84 -0
  460. package/dist/core/code/engine/core/ingestion/mro-processor.js +709 -0
  461. package/dist/core/code/engine/core/ingestion/parsing-processor.js +312 -0
  462. package/dist/core/code/engine/core/ingestion/pipeline-phases/communities.js +69 -0
  463. package/dist/core/code/engine/core/ingestion/pipeline-phases/cross-file.js +71 -0
  464. package/dist/core/code/engine/core/ingestion/pipeline-phases/di.js +338 -0
  465. package/dist/core/code/engine/core/ingestion/pipeline-phases/http-api-calls.js +312 -0
  466. package/dist/core/code/engine/core/ingestion/pipeline-phases/index.js +54 -0
  467. package/dist/core/code/engine/core/ingestion/pipeline-phases/mro.js +40 -0
  468. package/dist/core/code/engine/core/ingestion/pipeline-phases/orm.js +78 -0
  469. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse-impl.js +1286 -0
  470. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse.js +41 -0
  471. package/dist/core/code/engine/core/ingestion/pipeline-phases/processes.js +193 -0
  472. package/dist/core/code/engine/core/ingestion/pipeline-phases/prune-local-symbols.js +29 -0
  473. package/dist/core/code/engine/core/ingestion/pipeline-phases/registry.js +52 -0
  474. package/dist/core/code/engine/core/ingestion/pipeline-phases/routes.js +409 -0
  475. package/dist/core/code/engine/core/ingestion/pipeline-phases/rpc-edges.js +301 -0
  476. package/dist/core/code/engine/core/ingestion/pipeline-phases/runner.js +207 -0
  477. package/dist/core/code/engine/core/ingestion/pipeline-phases/scan.js +49 -0
  478. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-aop.js +442 -0
  479. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-auto-configuration.js +264 -0
  480. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-config.js +440 -0
  481. package/dist/core/code/engine/core/ingestion/pipeline-phases/structure.js +38 -0
  482. package/dist/core/code/engine/core/ingestion/pipeline-phases/tools.js +89 -0
  483. package/dist/core/code/engine/core/ingestion/pipeline-phases/types.js +40 -0
  484. package/dist/core/code/engine/core/ingestion/pipeline.js +152 -0
  485. package/dist/core/code/engine/core/ingestion/process-processor.js +325 -0
  486. package/dist/core/code/engine/core/ingestion/resolve-references.js +205 -0
  487. package/dist/core/code/engine/core/ingestion/route-extractors/constant-resolver.js +135 -0
  488. package/dist/core/code/engine/core/ingestion/route-extractors/django-root-discovery.js +221 -0
  489. package/dist/core/code/engine/core/ingestion/route-extractors/django.js +428 -0
  490. package/dist/core/code/engine/core/ingestion/route-extractors/expo.js +39 -0
  491. package/dist/core/code/engine/core/ingestion/route-extractors/fastapi-router-bindings.js +264 -0
  492. package/dist/core/code/engine/core/ingestion/route-extractors/laravel.js +501 -0
  493. package/dist/core/code/engine/core/ingestion/route-extractors/middleware.js +175 -0
  494. package/dist/core/code/engine/core/ingestion/route-extractors/nextjs.js +81 -0
  495. package/dist/core/code/engine/core/ingestion/route-extractors/php.js +25 -0
  496. package/dist/core/code/engine/core/ingestion/route-extractors/python-const-resolver.js +307 -0
  497. package/dist/core/code/engine/core/ingestion/route-extractors/response-shapes.js +299 -0
  498. package/dist/core/code/engine/core/ingestion/route-extractors/route-path.js +71 -0
  499. package/dist/core/code/engine/core/ingestion/route-extractors/spring-shared.js +310 -0
  500. package/dist/core/code/engine/core/ingestion/route-extractors/spring.js +441 -0
  501. package/dist/core/code/engine/core/ingestion/scope-extractor-bridge.js +60 -0
  502. package/dist/core/code/engine/core/ingestion/scope-extractor.js +1373 -0
  503. package/dist/core/code/engine/core/ingestion/scope-resolution/contract/scope-resolver.js +282 -0
  504. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +72 -0
  505. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/edges.js +194 -0
  506. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/ids.js +472 -0
  507. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +49 -0
  508. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +43 -0
  509. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +274 -0
  510. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +93 -0
  511. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/callable-value-flow.js +1240 -0
  512. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/compound-receiver.js +1174 -0
  513. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/free-call-fallback.js +873 -0
  514. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/imported-return-types.js +226 -0
  515. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/mro.js +107 -0
  516. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/overload-narrowing.js +441 -0
  517. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/property-dispatch.js +122 -0
  518. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +1720 -0
  519. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/phase.js +395 -0
  520. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +208 -0
  521. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/registry.js +49 -0
  522. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/run.js +632 -0
  523. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/validate-bindings-immutability.js +112 -0
  524. package/dist/core/code/engine/core/ingestion/scope-resolution/resolution-outcome.js +41 -0
  525. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/namespace-targets.js +81 -0
  526. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/walkers.js +1835 -0
  527. package/dist/core/code/engine/core/ingestion/scope-resolution/unresolved-receivers.js +242 -0
  528. package/dist/core/code/engine/core/ingestion/scope-resolution/utils/definition-id.js +22 -0
  529. package/dist/core/code/engine/core/ingestion/scope-resolution/workspace-index.js +151 -0
  530. package/dist/core/code/engine/core/ingestion/structure-processor.js +40 -0
  531. package/dist/core/code/engine/core/ingestion/tree-sitter-queries.js +2244 -0
  532. package/dist/core/code/engine/core/ingestion/ts-js-hoc-utils.js +115 -0
  533. package/dist/core/code/engine/core/ingestion/type-env.js +1136 -0
  534. package/dist/core/code/engine/core/ingestion/type-extractors/c-cpp.js +555 -0
  535. package/dist/core/code/engine/core/ingestion/type-extractors/csharp.js +570 -0
  536. package/dist/core/code/engine/core/ingestion/type-extractors/dart.js +372 -0
  537. package/dist/core/code/engine/core/ingestion/type-extractors/go.js +508 -0
  538. package/dist/core/code/engine/core/ingestion/type-extractors/jvm.js +875 -0
  539. package/dist/core/code/engine/core/ingestion/type-extractors/php.js +537 -0
  540. package/dist/core/code/engine/core/ingestion/type-extractors/python.js +477 -0
  541. package/dist/core/code/engine/core/ingestion/type-extractors/ruby.js +380 -0
  542. package/dist/core/code/engine/core/ingestion/type-extractors/rust.js +502 -0
  543. package/dist/core/code/engine/core/ingestion/type-extractors/shared.js +843 -0
  544. package/dist/core/code/engine/core/ingestion/type-extractors/swift.js +490 -0
  545. package/dist/core/code/engine/core/ingestion/type-extractors/types.js +2 -0
  546. package/dist/core/code/engine/core/ingestion/type-extractors/typescript.js +690 -0
  547. package/dist/core/code/engine/core/ingestion/utils/ast-helpers.js +1693 -0
  548. package/dist/core/code/engine/core/ingestion/utils/call-analysis.js +779 -0
  549. package/dist/core/code/engine/core/ingestion/utils/callable-flow-captures.js +932 -0
  550. package/dist/core/code/engine/core/ingestion/utils/callable-labels.js +49 -0
  551. package/dist/core/code/engine/core/ingestion/utils/deferred-resolution-profile.js +151 -0
  552. package/dist/core/code/engine/core/ingestion/utils/effective-ram.js +67 -0
  553. package/dist/core/code/engine/core/ingestion/utils/env.js +60 -0
  554. package/dist/core/code/engine/core/ingestion/utils/event-loop.js +9 -0
  555. package/dist/core/code/engine/core/ingestion/utils/graph-sort.js +103 -0
  556. package/dist/core/code/engine/core/ingestion/utils/heap-probe.js +45 -0
  557. package/dist/core/code/engine/core/ingestion/utils/heritage-marker.js +47 -0
  558. package/dist/core/code/engine/core/ingestion/utils/line-base.js +24 -0
  559. package/dist/core/code/engine/core/ingestion/utils/max-file-size.js +59 -0
  560. package/dist/core/code/engine/core/ingestion/utils/method-props.js +198 -0
  561. package/dist/core/code/engine/core/ingestion/utils/qualified-name.js +73 -0
  562. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-captures.js +60 -0
  563. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-codec.js +188 -0
  564. package/dist/core/code/engine/core/ingestion/utils/scope-tree-walk.js +36 -0
  565. package/dist/core/code/engine/core/ingestion/utils/symbol-labels.js +48 -0
  566. package/dist/core/code/engine/core/ingestion/utils/template-arguments.js +187 -0
  567. package/dist/core/code/engine/core/ingestion/utils/type-parameters.js +209 -0
  568. package/dist/core/code/engine/core/ingestion/utils/verbose.js +6 -0
  569. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/c-cpp.js +133 -0
  570. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/csharp.js +66 -0
  571. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/dart.js +111 -0
  572. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/go.js +153 -0
  573. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/jvm.js +145 -0
  574. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/php.js +61 -0
  575. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/python.js +104 -0
  576. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/ruby.js +55 -0
  577. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/rust.js +79 -0
  578. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/swift.js +91 -0
  579. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/typescript-javascript.js +86 -0
  580. package/dist/core/code/engine/core/ingestion/variable-extractors/generic.js +111 -0
  581. package/dist/core/code/engine/core/ingestion/variable-types.js +3 -0
  582. package/dist/core/code/engine/core/ingestion/vue-sfc-extractor.js +544 -0
  583. package/dist/core/code/engine/core/ingestion/workers/callable-id.js +122 -0
  584. package/dist/core/code/engine/core/ingestion/workers/clone-safety.js +470 -0
  585. package/dist/core/code/engine/core/ingestion/workers/parse-worker.js +2456 -0
  586. package/dist/core/code/engine/core/ingestion/workers/post-result.js +90 -0
  587. package/dist/core/code/engine/core/ingestion/workers/quarantine.js +41 -0
  588. package/dist/core/code/engine/core/ingestion/workers/result-merge.js +59 -0
  589. package/dist/core/code/engine/core/ingestion/workers/worker-pool.js +1725 -0
  590. package/dist/core/code/engine/core/ingestion/workspace-config.js +139 -0
  591. package/dist/core/code/engine/core/lbug/conn-lock.js +72 -0
  592. package/dist/core/code/engine/core/lbug/csv-generator.js +710 -0
  593. package/dist/core/code/engine/core/lbug/cypher-escape.js +24 -0
  594. package/dist/core/code/engine/core/lbug/extension-load-error.js +339 -0
  595. package/dist/core/code/engine/core/lbug/extension-loader.js +261 -0
  596. package/dist/core/code/engine/core/lbug/graph-emit-sink.js +584 -0
  597. package/dist/core/code/engine/core/lbug/lbug-adapter.js +2703 -0
  598. package/dist/core/code/engine/core/lbug/lbug-config.js +1029 -0
  599. package/dist/core/code/engine/core/lbug/native-check.js +435 -0
  600. package/dist/core/code/engine/core/lbug/pool-adapter.js +973 -0
  601. package/dist/core/code/engine/core/lbug/query-params.js +25 -0
  602. package/dist/core/code/engine/core/lbug/query-result-utils.js +31 -0
  603. package/dist/core/code/engine/core/lbug/rel-pair-routing.js +373 -0
  604. package/dist/core/code/engine/core/lbug/schema.js +771 -0
  605. package/dist/core/code/engine/core/lbug/shutdown-helpers.js +40 -0
  606. package/dist/core/code/engine/core/lbug/sidecar-recovery.js +716 -0
  607. package/dist/core/code/engine/core/lbug/stdio-capture.js +49 -0
  608. package/dist/core/code/engine/core/lbug/sync-csv-writer.js +115 -0
  609. package/dist/core/code/engine/core/lbug/wal-checkpoint-driver.js +215 -0
  610. package/dist/core/code/engine/core/lbug/wal-driver-state.js +28 -0
  611. package/dist/core/code/engine/core/logger.js +339 -0
  612. package/dist/core/code/engine/core/platform/capabilities.js +91 -0
  613. package/dist/core/code/engine/core/run-analyze.js +1098 -0
  614. package/dist/core/code/engine/core/tree-sitter/parser-loader.js +281 -0
  615. package/dist/core/code/engine/core/tree-sitter/safe-parse.js +258 -0
  616. package/dist/core/code/engine/core/tree-sitter/vendored-grammars.js +64 -0
  617. package/dist/core/code/engine/lib/utils.js +121 -0
  618. package/dist/core/code/engine/mcp/core/lbug-adapter.js +27 -0
  619. package/dist/core/code/engine/mcp/local/aop-metadata.js +230 -0
  620. package/dist/core/code/engine/mcp/local/bean-metadata.js +49 -0
  621. package/dist/core/code/engine/mcp/local/limits.js +15 -0
  622. package/dist/core/code/engine/mcp/local/line-display.js +6 -0
  623. package/dist/core/code/engine/mcp/local/local-backend.js +4142 -0
  624. package/dist/core/code/engine/storage/branch-index.js +72 -0
  625. package/dist/core/code/engine/storage/file-hash.js +95 -0
  626. package/dist/core/code/engine/storage/fs-atomic.js +34 -0
  627. package/dist/core/code/engine/storage/git.js +555 -0
  628. package/dist/core/code/engine/storage/index-lock.js +664 -0
  629. package/dist/core/code/engine/storage/parse-cache.js +650 -0
  630. package/dist/core/code/engine/storage/parsedfile-store.js +620 -0
  631. package/dist/core/code/engine/storage/repo-manager.js +1061 -0
  632. package/dist/core/code/engine/storage/scope-index-store.js +247 -0
  633. package/dist/core/code/engine/types/pipeline.js +2 -0
  634. package/dist/core/code/scripts/install-duckdb-extension.mjs +125 -0
  635. package/dist/core/code/scripts/resolve-analyze-cmd.cjs +346 -0
  636. package/dist/core/code/shared/graph/types.js +8 -0
  637. package/dist/core/code/shared/index.js +105 -0
  638. package/dist/core/code/shared/integrations/circuit-breaker.js +242 -0
  639. package/dist/core/code/shared/integrations/resilient-fetch.js +224 -0
  640. package/dist/core/code/shared/integrations/retry.js +70 -0
  641. package/dist/core/code/shared/integrations/understand-quickly.js +145 -0
  642. package/dist/core/code/shared/language-detection.js +162 -0
  643. package/dist/core/code/shared/languages.js +27 -0
  644. package/dist/core/code/shared/lbug/schema-constants.js +98 -0
  645. package/dist/core/code/shared/mro-strategy.js +2 -0
  646. package/dist/core/code/shared/pipeline.js +5 -0
  647. package/dist/core/code/shared/scope-resolution/callable-flow-site.js +11 -0
  648. package/dist/core/code/shared/scope-resolution/def-index.js +53 -0
  649. package/dist/core/code/shared/scope-resolution/evidence-weights.js +87 -0
  650. package/dist/core/code/shared/scope-resolution/finalize-algorithm.js +807 -0
  651. package/dist/core/code/shared/scope-resolution/language-classification.js +46 -0
  652. package/dist/core/code/shared/scope-resolution/method-dispatch-index.js +100 -0
  653. package/dist/core/code/shared/scope-resolution/module-scope-index.js +59 -0
  654. package/dist/core/code/shared/scope-resolution/origin-priority.js +23 -0
  655. package/dist/core/code/shared/scope-resolution/parsed-file.js +54 -0
  656. package/dist/core/code/shared/scope-resolution/position-index.js +136 -0
  657. package/dist/core/code/shared/scope-resolution/qualified-name-index.js +77 -0
  658. package/dist/core/code/shared/scope-resolution/reference-site.js +24 -0
  659. package/dist/core/code/shared/scope-resolution/registries/class-registry.js +32 -0
  660. package/dist/core/code/shared/scope-resolution/registries/context.js +52 -0
  661. package/dist/core/code/shared/scope-resolution/registries/evidence.js +152 -0
  662. package/dist/core/code/shared/scope-resolution/registries/field-registry.js +33 -0
  663. package/dist/core/code/shared/scope-resolution/registries/lookup-core.js +392 -0
  664. package/dist/core/code/shared/scope-resolution/registries/lookup-qualified.js +58 -0
  665. package/dist/core/code/shared/scope-resolution/registries/macro-registry.js +34 -0
  666. package/dist/core/code/shared/scope-resolution/registries/method-registry.js +34 -0
  667. package/dist/core/code/shared/scope-resolution/registries/tie-breaks.js +63 -0
  668. package/dist/core/code/shared/scope-resolution/resolve-type-ref.js +128 -0
  669. package/dist/core/code/shared/scope-resolution/scope-id.js +49 -0
  670. package/dist/core/code/shared/scope-resolution/scope-tree.js +225 -0
  671. package/dist/core/code/shared/scope-resolution/symbol-definition.js +12 -0
  672. package/dist/core/code/shared/scope-resolution/types.js +25 -0
  673. package/dist/core/code/shared/test-helpers.js +17 -0
  674. package/dist/core/code/vendor/leiden/index.cjs +355 -0
  675. package/dist/core/code/vendor/leiden/utils.cjs +419 -0
  676. package/dist/core/features/scanner.d.ts +2 -0
  677. package/dist/core/features/scanner.d.ts.map +1 -1
  678. package/dist/core/features/scanner.js +27 -6
  679. package/dist/core/features/scanner.js.map +1 -1
  680. package/dist/core/timeline/cli.d.ts.map +1 -1
  681. package/dist/core/timeline/cli.js +13 -6
  682. package/dist/core/timeline/cli.js.map +1 -1
  683. package/dist/core/timeline/debris.d.ts +20 -0
  684. package/dist/core/timeline/debris.d.ts.map +1 -0
  685. package/dist/core/timeline/debris.js +124 -0
  686. package/dist/core/timeline/debris.js.map +1 -0
  687. package/dist/core/timeline/hook-runner.d.ts.map +1 -1
  688. package/dist/core/timeline/hook-runner.js +3 -1
  689. package/dist/core/timeline/hook-runner.js.map +1 -1
  690. package/dist/core/timeline/hooks.d.ts.map +1 -1
  691. package/dist/core/timeline/hooks.js +13 -5
  692. package/dist/core/timeline/hooks.js.map +1 -1
  693. package/dist/core/timeline/installer.d.ts +2 -0
  694. package/dist/core/timeline/installer.d.ts.map +1 -1
  695. package/dist/core/timeline/installer.js +12 -0
  696. package/dist/core/timeline/installer.js.map +1 -1
  697. package/dist/core/timeline/project-root.d.ts +21 -0
  698. package/dist/core/timeline/project-root.d.ts.map +1 -0
  699. package/dist/core/timeline/project-root.js +83 -0
  700. package/dist/core/timeline/project-root.js.map +1 -0
  701. package/package.json +1 -1
@@ -0,0 +1,873 @@
1
+ "use strict";
2
+ /**
3
+ * Emit CALLS edges for free-call reference sites whose target is
4
+ * imported (or otherwise visible only via post-finalize scope.bindings).
5
+ *
6
+ * The shared `MethodRegistry.lookup` only consults `scope.bindings`
7
+ * (pre-finalize / local-only) for free calls. Cross-file imports land
8
+ * in `indexes.bindings` (post-finalize). Without this fallback, every
9
+ * `from x import f; f()` resolves to "unresolved".
10
+ *
11
+ * **Free-call dedup contract (Contract Invariant I2):** free calls
12
+ * collapse to one CALLS edge per (caller, target) pair regardless of
13
+ * how many call sites the caller contains. Mirrors the legacy DAG's
14
+ * dedup semantics (what the `default-params` / `variadic` / `overload`
15
+ * fixtures expect). Member calls keep position-based dedup elsewhere.
16
+ *
17
+ * Generic; promoted from `languages/python/scope-resolver.ts` per the scope-resolution
18
+ * generalization plan.
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.emitFreeCallFallback = emitFreeCallFallback;
22
+ exports.buildGlobalCallableIndex = buildGlobalCallableIndex;
23
+ exports.buildGlobalClassIndex = buildGlobalClassIndex;
24
+ exports.pickUniqueGlobalCallable = pickUniqueGlobalCallable;
25
+ exports.pickUniqueGlobalClass = pickUniqueGlobalClass;
26
+ exports.pickImplicitThisOverload = pickImplicitThisOverload;
27
+ const ids_js_1 = require("../graph-bridge/ids.js");
28
+ const walkers_js_1 = require("../scope/walkers.js");
29
+ const overload_narrowing_js_1 = require("./overload-narrowing.js");
30
+ function emitFreeCallFallback(graph, scopes, parsedFiles, nodeLookup, _referenceIndex, handledSites, model, workspaceIndex, options = {}) {
31
+ let emitted = 0;
32
+ const seen = new Set();
33
+ // Build an O(1) simple-name -> callable defs index over scopes.defs once
34
+ // per pass so pickUniqueGlobalCallable doesn't re-scan defs.byId.values()
35
+ // per call site. Same name + callable-kind filter that the previous scan
36
+ // applied (see pickUniqueGlobalCallable JSDoc). Cost: O(|defs|) once.
37
+ const globalCallablesBySimpleName = buildGlobalCallableIndex(scopes);
38
+ // Sibling index for constructor-form class fallback. Built once here so
39
+ // pickUniqueGlobalClass is O(1)-per-site rather than re-scanning
40
+ // defs.byId.values() at every constructor call. Same simple-name keying
41
+ // and class-like kind filter the previous per-site scan applied.
42
+ const globalClassesBySimpleName = buildGlobalClassIndex(scopes);
43
+ // Workspace file-path set for `resolveQualifiedFreeCall` (a module path maps
44
+ // to a file by language convention). Built lazily and once: languages without
45
+ // the hook never pay for it.
46
+ let allFilePathsMemo;
47
+ const allFilePaths = () => (allFilePathsMemo ??= new Set(parsedFiles.map((p) => p.filePath)));
48
+ // Per-pass memo of pickUniqueGlobalCallable's post-filter candidate list,
49
+ // keyed (simpleName, callerFilePath). Only created when no per-caller
50
+ // visibility filter applies (the list is then a pure function of name+file —
51
+ // see pickUniqueGlobalCallable). Lets repeated free calls of the same name
52
+ // from one file reuse the same-name-bucket scan instead of re-walking it.
53
+ const scopeDefsCache = options.isCallableVisibleFromCaller === undefined
54
+ ? new Map()
55
+ : undefined;
56
+ const enclosingInstanceOwnerByScope = options.freeCallsRequireInstanceOwnership === true
57
+ ? new Map()
58
+ : undefined;
59
+ const reachableInstanceOwnersByOwner = options.freeCallsRequireInstanceOwnership === true
60
+ ? new Map()
61
+ : undefined;
62
+ const instanceOwnerKey = (ownerId) => {
63
+ const owner = scopes.defs.get(ownerId);
64
+ const qualifiedName = owner?.qualifiedName;
65
+ if (qualifiedName === undefined || qualifiedName === '')
66
+ return ownerId;
67
+ const namespacePrefix = owner.namespacePrefix ?? '';
68
+ return `${namespacePrefix.length}:${namespacePrefix}:${qualifiedName}`;
69
+ };
70
+ const isReachableInstanceOwner = (scopeId, ownerId) => {
71
+ let enclosing = enclosingInstanceOwnerByScope?.get(scopeId);
72
+ if (enclosing === undefined) {
73
+ enclosing = (0, walkers_js_1.findEnclosingClassDef)(scopeId, scopes) ?? null;
74
+ enclosingInstanceOwnerByScope?.set(scopeId, enclosing);
75
+ }
76
+ if (enclosing === null)
77
+ return false;
78
+ let owners = reachableInstanceOwnersByOwner?.get(enclosing.nodeId);
79
+ if (owners === undefined) {
80
+ const mutableOwners = new Set([instanceOwnerKey(enclosing.nodeId)]);
81
+ for (const inheritedOwnerId of scopes.methodDispatch.mroFor(enclosing.nodeId)) {
82
+ mutableOwners.add(instanceOwnerKey(inheritedOwnerId));
83
+ }
84
+ owners = mutableOwners;
85
+ reachableInstanceOwnersByOwner?.set(enclosing.nodeId, owners);
86
+ }
87
+ return owners.has(instanceOwnerKey(ownerId));
88
+ };
89
+ for (const parsed of parsedFiles) {
90
+ const bindingCandidatesByScope = options.freeCallsRequireInstanceOwnership === true
91
+ ? new Map()
92
+ : undefined;
93
+ for (const site of parsed.referenceSites) {
94
+ if (site.kind !== 'call')
95
+ continue;
96
+ if (site.explicitReceiver !== undefined)
97
+ continue;
98
+ if (options.skipSites?.has(siteKey(parsed.filePath, site)) === true)
99
+ continue;
100
+ // Constructor form (`new User(...)`): resolve the class, then
101
+ // emit CALLS to its explicit Constructor def (when present) or
102
+ // to the Class node itself (implicit constructor). Legacy emits
103
+ // the same two targets; see test expectations.
104
+ let fnDef;
105
+ if (site.callForm === 'constructor') {
106
+ const classDef = (0, walkers_js_1.resolveInheritanceBaseInScope)(site.inScope, site.name, scopes, site.rawQualifiedName);
107
+ if (classDef !== undefined && classDef.type !== 'Interface') {
108
+ // Most languages link `Type(...)` to the explicit Constructor def
109
+ // when one exists (else the Class). Languages that model the call
110
+ // as a reference to the type itself opt into
111
+ // `constructorCallTargetsClass` and always link to the Class.
112
+ fnDef =
113
+ options.constructorCallTargetsClass === true
114
+ ? classDef
115
+ : pickConstructorOrClass(classDef, workspaceIndex, scopes, site.arity);
116
+ }
117
+ else if (options.allowGlobalFallback === true) {
118
+ // The constructed type may live in a sibling/imported file that is
119
+ // not in the call-site's lexical scope-chain bindings. Fall back to
120
+ // a unique workspace-wide Class def by simple name (gated on the
121
+ // same global-fallback opt-in as free calls). Then target the
122
+ // Class or its Constructor per the language's preference.
123
+ const globalClass = pickUniqueGlobalClass(site.name, globalClassesBySimpleName);
124
+ if (globalClass !== undefined) {
125
+ fnDef =
126
+ globalClass.type === 'Interface'
127
+ ? undefined
128
+ : options.constructorCallTargetsClass === true
129
+ ? globalClass
130
+ : pickConstructorOrClass(globalClass, workspaceIndex, scopes, site.arity);
131
+ }
132
+ }
133
+ }
134
+ // Module-qualified free call (`mod::fn()`): the source named the module
135
+ // explicitly, so that path outranks every lexical tier below — otherwise
136
+ // the scope-chain walk binds the bare tail to a same-named definition in
137
+ // the caller's own file and emits a self-loop instead of the real
138
+ // cross-module edge (#2730). Only fires when the language populated
139
+ // `rawQualifiedName` AND provides the hook; `undefined` falls through to
140
+ // the unchanged chain, so this tier is strictly additive.
141
+ if (fnDef === undefined &&
142
+ options.resolveQualifiedFreeCall !== undefined &&
143
+ site.rawQualifiedName !== undefined) {
144
+ fnDef = options.resolveQualifiedFreeCall(site, parsed, scopes, workspaceIndex, allFilePaths());
145
+ }
146
+ // Implicit-this overload narrowing: an unqualified call inside
147
+ // a method body might be calling a sibling overload on the
148
+ // enclosing class. When the workspace has multiple methods of
149
+ // the same name in a single class, choose the best match by
150
+ // arity + argument types.
151
+ let fnDefFromImplicitThis = false;
152
+ if (fnDef === undefined) {
153
+ fnDef = pickImplicitThisOverload(site, scopes, workspaceIndex, model, {
154
+ conversionRankFn: options.conversionRankFn,
155
+ conversionOnlyArgTypePrefixes: options.conversionOnlyArgTypePrefixes,
156
+ constraintCompatibility: options.constraintCompatibility,
157
+ });
158
+ fnDefFromImplicitThis = fnDef !== undefined;
159
+ }
160
+ // Scope-chain callable lookup. First-match preserves scope-chain
161
+ // precedence (local shadows import). When a conversion-rank function
162
+ // is available AND the binding scope contains multiple overloads,
163
+ // refine with `narrowOverloadCandidates` to pick the best overload
164
+ // by argument types (#1578). The first-match result is kept as a
165
+ // fallback when narrowing is indeterminate.
166
+ if (fnDef === undefined) {
167
+ if (options.resolveAdlCandidates === undefined) {
168
+ // Non-ADL path: first-match preserves scope-chain precedence
169
+ // (local shadows import). When a conversion-rank function is
170
+ // available AND the binding scope contains multiple overloads,
171
+ // refine with narrowOverloadCandidates (#1578).
172
+ let bindingCandidates;
173
+ if (bindingCandidatesByScope !== undefined) {
174
+ let byName = bindingCandidatesByScope.get(site.inScope);
175
+ if (byName === undefined) {
176
+ byName = new Map();
177
+ bindingCandidatesByScope.set(site.inScope, byName);
178
+ }
179
+ bindingCandidates = byName.get(site.name);
180
+ if (bindingCandidates === undefined) {
181
+ bindingCandidates = (0, walkers_js_1.findAllCallableBindingCandidatesInScope)(site.inScope, site.name, scopes);
182
+ byName.set(site.name, bindingCandidates);
183
+ }
184
+ }
185
+ let eligibleBindingCandidates;
186
+ if (bindingCandidates === undefined) {
187
+ fnDef = (0, walkers_js_1.findCallableBindingInScope)(site.inScope, site.name, scopes);
188
+ }
189
+ else {
190
+ eligibleBindingCandidates = bindingCandidates.filter((candidate) => {
191
+ const def = candidate.def;
192
+ if (def.type !== 'Method' ||
193
+ def.ownerId === undefined ||
194
+ def.filePath !== parsed.filePath) {
195
+ return true;
196
+ }
197
+ const ownerReachable = isReachableInstanceOwner(site.inScope, def.ownerId);
198
+ const staticallyImported = candidate.bindings.some((binding) => binding.visibility === 'static-member-import');
199
+ return ownerReachable || staticallyImported;
200
+ });
201
+ fnDef = eligibleBindingCandidates[0]?.def;
202
+ if (fnDef === undefined && bindingCandidates.length > 0) {
203
+ recordSuppressedOutcome(options.recordResolutionOutcome, {
204
+ phase: 'free-call-fallback',
205
+ filePath: parsed.filePath,
206
+ name: site.name,
207
+ range: site.atRange,
208
+ reason: 'free-call-instance-ownership',
209
+ candidates: bindingCandidates.map((candidate) => candidate.def),
210
+ });
211
+ }
212
+ }
213
+ if (fnDef !== undefined &&
214
+ options.isBuiltInName?.(site.name) === true &&
215
+ fnDef.filePath === parsed.filePath &&
216
+ eligibleBindingCandidates?.some((candidate) => candidate.bindings.some((binding) => binding.visibility === 'static-member-import')) !== true &&
217
+ !hasGenuineLexicalBinding(site.inScope, site.name, scopes)) {
218
+ // A platform/language built-in (e.g. `fetch`, `setTimeout`)
219
+ // with no binding reachable via the TRUE lexical scope chain
220
+ // (Scope.bindings only) -- the match came solely from
221
+ // finalize's per-file "local + imports + wildcards" bucket,
222
+ // which flattens every declaration in the file onto the
223
+ // module scope regardless of true nesting depth
224
+ // (cgraph-shared's `materializeBindings`). That flattening
225
+ // is correct for its purpose (cross-file import targets) but
226
+ // over-matches same-file built-in-shadowing declarations that
227
+ // were never really module-scope-visible -- e.g. a Cloudflare
228
+ // Worker's `export default { fetch(req) {} }` handler (#2545).
229
+ // Leave the call unresolved rather than emit a false edge.
230
+ //
231
+ // `fnDef.filePath === parsed.filePath` is the load-bearing
232
+ // guard against a real regression: `materializeBindings`'s
233
+ // flat bucket is per-file, so the leak this guard targets is
234
+ // ALWAYS same-file. A cross-file match at this point can only
235
+ // come from a genuine import/namespace/workspace-FQN channel
236
+ // (the separate, gated `pickUniqueGlobalCallable` global
237
+ // fallback runs later and isn't what populated `fnDef` here)
238
+ // -- e.g. `import { fetch } from './fetch-polyfill'` must
239
+ // keep resolving. Without this check, that import silently
240
+ // stopped resolving (verified via a scratch probe fixture).
241
+ fnDef = undefined;
242
+ }
243
+ if (fnDef !== undefined &&
244
+ (options.conversionRankFn !== undefined || bindingCandidates !== undefined)) {
245
+ const allCallables = eligibleBindingCandidates === undefined
246
+ ? (0, walkers_js_1.findAllCallableBindingsInScope)(site.inScope, site.name, scopes)
247
+ : eligibleBindingCandidates.map((candidate) => candidate.def);
248
+ if (allCallables.length > 1) {
249
+ const narrowed = (0, overload_narrowing_js_1.narrowOverloadCandidates)(allCallables, site.arity, site.argumentTypes, {
250
+ argumentTypeClasses: site.argumentTypeClasses,
251
+ conversionRankFn: options.conversionRankFn,
252
+ conversionOnlyArgTypePrefixes: options.conversionOnlyArgTypePrefixes,
253
+ constraintCompatibility: options.constraintCompatibility,
254
+ });
255
+ if (narrowed.length === 1) {
256
+ fnDef = narrowed[0];
257
+ }
258
+ else if (narrowed.length > 1) {
259
+ // Multiple survivors after conversion-rank scoring.
260
+ // Suppress when all candidates share the same file (true
261
+ // overloads) — mirrors ADL merged-candidate path behavior.
262
+ // Cross-file candidates are shadowing; keep first-match.
263
+ const sameFile = narrowed.every((d) => d.filePath === narrowed[0].filePath);
264
+ if (sameFile) {
265
+ recordSuppressedOutcome(options.recordResolutionOutcome, {
266
+ phase: 'free-call-fallback',
267
+ filePath: parsed.filePath,
268
+ name: site.name,
269
+ range: site.atRange,
270
+ reason: suppressionReasonForOverload(narrowed, site.arity, {
271
+ conversionRankFn: options.conversionRankFn,
272
+ argumentTypes: site.argumentTypes,
273
+ }),
274
+ candidates: narrowed,
275
+ });
276
+ handledSites.add(siteKey(parsed.filePath, site));
277
+ continue;
278
+ }
279
+ }
280
+ // narrowed.length === 0: keep the first-match fnDef —
281
+ // preserves local-shadows-import.
282
+ }
283
+ }
284
+ }
285
+ else {
286
+ // ADL path: ISO C++ `[basic.lookup.unqual]` §7 — ADL is suppressed
287
+ // when ordinary lookup finds a non-function name or a block-scope
288
+ // function declaration.
289
+ const { callables: ordinary, nonCallableFound, blockScopeDeclFound, } = (0, walkers_js_1.findCallableBindingsAndAdlBlocker)(site.inScope, site.name, scopes);
290
+ const adlSuppressed = nonCallableFound || blockScopeDeclFound;
291
+ const adl = adlSuppressed
292
+ ? undefined
293
+ : options.resolveAdlCandidates({
294
+ name: site.name,
295
+ arity: site.arity,
296
+ argumentTypes: site.argumentTypes,
297
+ atRange: { startLine: site.atRange.startLine, startCol: site.atRange.startCol },
298
+ }, parsed, scopes, parsedFiles);
299
+ const key = siteKey(parsed.filePath, site);
300
+ if (adlSuppressed && ordinary.length === 0) {
301
+ recordSuppressedOutcome(options.recordResolutionOutcome, {
302
+ phase: 'free-call-fallback',
303
+ filePath: parsed.filePath,
304
+ name: site.name,
305
+ range: site.atRange,
306
+ reason: 'adl-ordinary-lookup-blocked',
307
+ candidates: ordinary,
308
+ });
309
+ handledSites.add(key);
310
+ continue;
311
+ }
312
+ if (adl === undefined || adl.length === 0) {
313
+ // No ADL contribution. Default behavior: `ordinary[0]` —
314
+ // scope-chain walk preserves local-shadows-import precedence.
315
+ //
316
+ // Narrowing kicks in when either disambiguation signal is
317
+ // present: any candidate carries `templateConstraints`
318
+ // (SFINAE / `requires`-clause guarded templates, #1579), OR
319
+ // a conversion-rank function is provided (#1606 / #1578).
320
+ // Both hooks are threaded into `narrowOverloadCandidates`
321
+ // via the unified `OverloadNarrowingHookCtx`.
322
+ const hasConstraints = ordinary.some((d) => d.templateConstraints !== undefined);
323
+ const canNarrow = hasConstraints || options.conversionRankFn !== undefined;
324
+ if (ordinary.length <= 1 || !canNarrow) {
325
+ fnDef = ordinary[0];
326
+ }
327
+ else {
328
+ const narrowed = (0, overload_narrowing_js_1.narrowOverloadCandidates)(ordinary, site.arity, site.argumentTypes, {
329
+ argumentTypeClasses: site.argumentTypeClasses,
330
+ conversionRankFn: options.conversionRankFn,
331
+ conversionOnlyArgTypePrefixes: options.conversionOnlyArgTypePrefixes,
332
+ constraintCompatibility: options.constraintCompatibility,
333
+ });
334
+ if (narrowed.length === 1) {
335
+ fnDef = narrowed[0];
336
+ }
337
+ else if (narrowed.length === 0) {
338
+ handledSites.add(key);
339
+ continue;
340
+ }
341
+ else {
342
+ // >1 survivors: same-file → suppress (true overloads,
343
+ // "degrade not lie" — no edge beats a wrong one, and
344
+ // SFINAE-ambiguous calls land here). Cross-file →
345
+ // first-match (shadowing semantics).
346
+ const sameFile = narrowed.every((d) => d.filePath === narrowed[0].filePath);
347
+ if (sameFile) {
348
+ recordSuppressedOutcome(options.recordResolutionOutcome, {
349
+ phase: 'free-call-fallback',
350
+ filePath: parsed.filePath,
351
+ name: site.name,
352
+ range: site.atRange,
353
+ reason: suppressionReasonForOverload(narrowed, site.arity, {
354
+ conversionRankFn: options.conversionRankFn,
355
+ argumentTypes: site.argumentTypes,
356
+ }),
357
+ candidates: narrowed,
358
+ });
359
+ handledSites.add(key);
360
+ continue;
361
+ }
362
+ fnDef = ordinary[0];
363
+ }
364
+ }
365
+ }
366
+ else {
367
+ const merged = [];
368
+ const seenMerge = new Set();
369
+ const push = (defs) => {
370
+ for (const d of defs) {
371
+ if (seenMerge.has(d.nodeId))
372
+ continue;
373
+ seenMerge.add(d.nodeId);
374
+ merged.push(d);
375
+ }
376
+ };
377
+ push(ordinary);
378
+ push(adl);
379
+ const narrowed = (0, overload_narrowing_js_1.narrowOverloadCandidates)(merged, site.arity, site.argumentTypes, {
380
+ argumentTypeClasses: site.argumentTypeClasses,
381
+ conversionRankFn: options.conversionRankFn,
382
+ conversionOnlyArgTypePrefixes: options.conversionOnlyArgTypePrefixes,
383
+ constraintCompatibility: options.constraintCompatibility,
384
+ });
385
+ if (narrowed.length === 1) {
386
+ fnDef = narrowed[0];
387
+ }
388
+ else if (narrowed.length === 0) {
389
+ handledSites.add(key);
390
+ continue;
391
+ }
392
+ else if (narrowed.length > 1) {
393
+ recordSuppressedOutcome(options.recordResolutionOutcome, {
394
+ phase: 'free-call-fallback',
395
+ filePath: parsed.filePath,
396
+ name: site.name,
397
+ range: site.atRange,
398
+ reason: suppressionReasonForOverload(narrowed, site.arity, {
399
+ conversionRankFn: options.conversionRankFn,
400
+ argumentTypes: site.argumentTypes,
401
+ }),
402
+ candidates: narrowed,
403
+ });
404
+ if ((0, overload_narrowing_js_1.isOverloadAmbiguousAfterNormalization)(narrowed, site.arity)) {
405
+ handledSites.add(key);
406
+ continue;
407
+ }
408
+ // Multiple survivors remain after conversion-rank scoring;
409
+ // suppress instead of picking arbitrarily.
410
+ handledSites.add(key);
411
+ continue;
412
+ }
413
+ }
414
+ }
415
+ }
416
+ // V1: pickUniqueGlobalCallable ignores import context — resolves to any
417
+ // globally-unique callable. False cross-package edges are possible when
418
+ // the caller does not import the target package. Same-package calls are
419
+ // usually caught by nearest-scope lookup before reaching here.
420
+ if (fnDef === undefined && options.allowGlobalFallback === true) {
421
+ fnDef = pickUniqueGlobalCallable(site.name, model, globalCallablesBySimpleName, parsed.filePath, options.isFileLocalDef, site.arity, options.isCallableVisibleFromCaller !== undefined
422
+ ? (candidate) => options.isCallableVisibleFromCaller({
423
+ callerParsed: parsed,
424
+ candidate,
425
+ callerScope: site.inScope,
426
+ scopes,
427
+ })
428
+ : undefined, site.argumentTypes, site.argumentTypeClasses, options.conversionRankFn, scopeDefsCache, options.conversionOnlyArgTypePrefixes);
429
+ }
430
+ if (fnDef === undefined)
431
+ continue;
432
+ if (fnDef.isDeleted === true) {
433
+ recordSuppressedOutcome(options.recordResolutionOutcome, {
434
+ phase: 'free-call-fallback',
435
+ filePath: parsed.filePath,
436
+ name: site.name,
437
+ range: site.atRange,
438
+ reason: 'selected-callable-deleted',
439
+ candidates: [fnDef],
440
+ });
441
+ handledSites.add(siteKey(parsed.filePath, site));
442
+ continue;
443
+ }
444
+ if ((fnDefFromImplicitThis || fnDef.type === 'Method' || fnDef.type === 'Constructor') &&
445
+ options.isCallableVisibleFromCaller !== undefined &&
446
+ !options.isCallableVisibleFromCaller({
447
+ callerParsed: parsed,
448
+ candidate: fnDef,
449
+ callerScope: site.inScope,
450
+ scopes,
451
+ })) {
452
+ handledSites.add(siteKey(parsed.filePath, site));
453
+ continue;
454
+ }
455
+ const callerGraphId = (0, ids_js_1.resolveCallerGraphId)(site.inScope, scopes, nodeLookup, site.atRange);
456
+ if (callerGraphId === undefined)
457
+ continue;
458
+ const tgtGraphId = (0, ids_js_1.resolveDefGraphId)(fnDef.filePath, fnDef, nodeLookup);
459
+ if (tgtGraphId === undefined)
460
+ continue;
461
+ // Always mark the site as handled — even when the dedup-collapse
462
+ // means we don't add a new edge — so `emit-references` skips its
463
+ // potentially-wrong fallback for the same site.
464
+ handledSites.add(siteKey(parsed.filePath, site));
465
+ // Resolved-callee-id capture (#2227 U2/KTD6/R8): record this CALLS site's
466
+ // resolved target BEFORE the collapsed `seen` dedup. The free-call dedup
467
+ // key drops the line (one edge per caller→target), so capturing after
468
+ // `seen.has` would lose every same-target call past the first — capture
469
+ // here, per site, keyed on `site.atRange` (byte-equal to U1's
470
+ // SiteRecord.at: 1-based line / 0-based col).
471
+ options.calleeIdSink?.add(parsed.filePath, site.atRange.startLine, site.atRange.startCol, tgtGraphId);
472
+ const relId = `rel:CALLS:${callerGraphId}->${tgtGraphId}`;
473
+ if (seen.has(relId))
474
+ continue;
475
+ seen.add(relId);
476
+ graph.addRelationship({
477
+ id: relId,
478
+ sourceId: callerGraphId,
479
+ targetId: tgtGraphId,
480
+ type: 'CALLS',
481
+ confidence: 0.85,
482
+ // Match legacy DAG's reason convention so consumers that
483
+ // assert `reason === 'import-resolved'` keep working.
484
+ reason: fnDef.filePath !== parsed.filePath ? 'import-resolved' : 'local-call',
485
+ });
486
+ emitted++;
487
+ }
488
+ }
489
+ return emitted;
490
+ }
491
+ function siteKey(filePath, site) {
492
+ return `${filePath}:${site.atRange.startLine}:${site.atRange.startCol}`;
493
+ }
494
+ function suppressionReasonForOverload(candidates, arity, ctx) {
495
+ if ((0, overload_narrowing_js_1.isOverloadAmbiguousAfterNormalization)(candidates, arity)) {
496
+ return 'overload-ambiguous-normalization';
497
+ }
498
+ if (ctx.conversionRankFn !== undefined &&
499
+ ctx.argumentTypes !== undefined &&
500
+ ctx.argumentTypes.length > 0) {
501
+ return 'conversion-rank-tied';
502
+ }
503
+ return 'overload-ambiguous';
504
+ }
505
+ function recordSuppressedOutcome(record, input) {
506
+ record?.({
507
+ kind: 'suppressed',
508
+ phase: input.phase,
509
+ filePath: input.filePath,
510
+ name: input.name,
511
+ range: input.range,
512
+ reason: input.reason,
513
+ candidateIds: input.candidates.map((d) => d.nodeId),
514
+ });
515
+ }
516
+ /**
517
+ * Build a `simpleName -> callable defs` index from `scopes.defs` once per
518
+ * pass. Mirrors the filter the old per-site scan applied: Function /
519
+ * Method / Constructor, keyed by the last `.`-segment of `qualifiedName`
520
+ * (falling back to the qualifiedName itself when undotted). Used by
521
+ * `pickUniqueGlobalCallable` so every free-call fallback site is O(1)
522
+ * instead of O(|defs|).
523
+ *
524
+ * Exported for unit testing — language-agnostic logic, exercised via synthetic
525
+ * stubs in `pick-unique-global-callable.test.ts`.
526
+ */
527
+ function buildGlobalCallableIndex(scopes) {
528
+ const out = new Map();
529
+ for (const def of scopes.defs.byId.values()) {
530
+ if (def.type !== 'Function' && def.type !== 'Method' && def.type !== 'Constructor')
531
+ continue;
532
+ const qualified = def.qualifiedName;
533
+ if (qualified === undefined || qualified.length === 0)
534
+ continue;
535
+ const dot = qualified.lastIndexOf('.');
536
+ const simple = dot === -1 ? qualified : qualified.slice(dot + 1);
537
+ const bucket = out.get(simple);
538
+ if (bucket)
539
+ bucket.push(def);
540
+ else
541
+ out.set(simple, [def]);
542
+ }
543
+ return out;
544
+ }
545
+ /**
546
+ * Build a `simpleName -> class-like defs` index from `scopes.defs` once per
547
+ * pass — the structural sibling of `buildGlobalCallableIndex`, consumed by
548
+ * `pickUniqueGlobalClass` so constructor-form fallback is O(1)-per-site
549
+ * instead of O(|defs|).
550
+ *
551
+ * **Kind filter (KTD5 — KEEP `'Interface'`):** the set is
552
+ * `Class | Struct | Interface`, matching the idiomatic class-like set used
553
+ * elsewhere in the scope-resolution bridge (`graph-bridge/ids.ts`,
554
+ * `node-lookup.ts`). This is a behavior-PRESERVING perf refactor for all 8
555
+ * `allowGlobalFreeCallFallback` languages — the previous per-site scan used
556
+ * exactly this filter. Excluding Swift `protocol` (`Interface`) defs because
557
+ * protocols aren't instantiable is a *separate* Swift-semantics question with
558
+ * its own test; dropping `Interface` here would be a deliberate
559
+ * behavior-changing edit, not part of U5.
560
+ *
561
+ * Bucket insertion order follows `defs.byId.values()` iteration order, so the
562
+ * downstream "keep first" / ambiguity ordering in `pickUniqueGlobalClass` is
563
+ * byte-identical to the old linear scan (equivalence verified).
564
+ *
565
+ * Exported for unit testing — language-agnostic logic, exercised via synthetic
566
+ * stubs in `pick-unique-global-class.test.ts`.
567
+ */
568
+ function buildGlobalClassIndex(scopes) {
569
+ const out = new Map();
570
+ for (const def of scopes.defs.byId.values()) {
571
+ if (def.type !== 'Class' && def.type !== 'Struct' && def.type !== 'Interface')
572
+ continue;
573
+ const qualified = def.qualifiedName;
574
+ if (qualified === undefined || qualified.length === 0)
575
+ continue;
576
+ const dot = qualified.lastIndexOf('.');
577
+ const simple = dot === -1 ? qualified : qualified.slice(dot + 1);
578
+ const bucket = out.get(simple);
579
+ if (bucket)
580
+ bucket.push(def);
581
+ else
582
+ out.set(simple, [def]);
583
+ }
584
+ return out;
585
+ }
586
+ /**
587
+ * Resolve a free (unqualified, receiver-less) call to a globally-unique
588
+ * callable def by simple name. See the in-body comments for the narrowing
589
+ * order. Exported for unit testing — the `scopeDefsCache` equivalence is
590
+ * exercised via synthetic stubs in `pick-unique-global-callable.test.ts`.
591
+ */
592
+ function pickUniqueGlobalCallable(name, model, globalCallablesBySimpleName, callerFilePath, isFileLocalDef, callArity, isCallerVisible, callArgTypes, callArgTypeClasses, conversionRankFn, scopeDefsCache, conversionOnlyArgTypePrefixes) {
593
+ // The scope-index candidate list is a pure function of (name, callerFilePath):
594
+ // the same-name bucket is fixed for the pass, the file-local filter depends
595
+ // only on the candidate + callerFilePath, and the logical-key dedup is
596
+ // deterministic. When no per-caller visibility filter applies, memoize it so
597
+ // repeated free calls of the same name from one file — the kernel's hot
598
+ // pattern (e.g. `kmalloc` across hundreds of `drivers/` sites, where the
599
+ // same-name bucket has thousands of defs) — reuse the bucket scan instead of
600
+ // re-walking it per site. The cached array is only ever READ by the arity /
601
+ // overload narrowers below (both `.filter()`-based — they never mutate it),
602
+ // so one shared instance across call sites is safe. The cache is bypassed
603
+ // when a visibility filter is present (`isCallerVisible !== undefined`),
604
+ // because the list would then depend on the caller's scope, not just its file.
605
+ const cacheKey = scopeDefsCache !== undefined && isCallerVisible === undefined
606
+ ? `${name}${callerFilePath}`
607
+ : undefined;
608
+ let scopeDefs = cacheKey !== undefined ? scopeDefsCache.get(cacheKey) : undefined;
609
+ if (scopeDefs === undefined) {
610
+ const built = [];
611
+ const scopeSeen = new Set();
612
+ for (const def of globalCallablesBySimpleName.get(name) ?? []) {
613
+ // Skip file-local defs (e.g. C `static` functions) that live in a
614
+ // different file from the caller — they are logically invisible.
615
+ if (isFileLocalDef !== undefined && def.filePath !== callerFilePath && isFileLocalDef(def)) {
616
+ continue;
617
+ }
618
+ // Caller-side visibility filter (e.g., PHP namespace + use-function
619
+ // import gating). When defined, blocks candidates the caller cannot
620
+ // legally reach. Languages without namespace-scoped function resolution
621
+ // leave this undefined → no filtering.
622
+ if (isCallerVisible !== undefined && !isCallerVisible(def)) {
623
+ continue;
624
+ }
625
+ const key = logicalCallableKey(def);
626
+ if (scopeSeen.has(key))
627
+ continue;
628
+ scopeSeen.add(key);
629
+ built.push(def);
630
+ }
631
+ scopeDefs = built;
632
+ if (cacheKey !== undefined)
633
+ scopeDefsCache.set(cacheKey, built);
634
+ }
635
+ if (scopeDefs.length === 1)
636
+ return scopeDefs[0];
637
+ // When multiple scope-index candidates exist, attempt arity narrowing
638
+ // before falling back to the semantic-model lookup. This handles
639
+ // registry-primary languages where the model is not populated for the
640
+ // migrated language's files (call-processor skips them).
641
+ if (scopeDefs.length > 1 && callArity !== undefined) {
642
+ const arityMatch = narrowByArity(scopeDefs, callArity);
643
+ if (arityMatch !== undefined)
644
+ return arityMatch;
645
+ }
646
+ // When arity narrowing left >1 candidate, try overload narrowing with
647
+ // argument types + conversion ranking (#1578). This picks the unique
648
+ // best-rank candidate when exact-type or conversion-rank scoring can
649
+ // disambiguate (e.g., `f(int)` vs `f(double)` called with `f(2.5)`).
650
+ if (scopeDefs.length > 1) {
651
+ const narrowed = (0, overload_narrowing_js_1.narrowOverloadCandidates)(scopeDefs, callArity, callArgTypes, {
652
+ argumentTypeClasses: callArgTypeClasses,
653
+ conversionRankFn,
654
+ conversionOnlyArgTypePrefixes,
655
+ });
656
+ if (narrowed.length === 1)
657
+ return narrowed[0];
658
+ }
659
+ const defs = [];
660
+ const seen = new Set();
661
+ const push = (pool) => {
662
+ for (const def of pool) {
663
+ // Apply the same file-local linkage filter as Phase 1 —
664
+ // cross-file static defs must never leak through the
665
+ // SemanticModel fallback path.
666
+ if (isFileLocalDef !== undefined && def.filePath !== callerFilePath && isFileLocalDef(def)) {
667
+ continue;
668
+ }
669
+ // Same caller-visibility filter applied to the model-side pool.
670
+ if (isCallerVisible !== undefined && !isCallerVisible(def)) {
671
+ continue;
672
+ }
673
+ const key = logicalCallableKey(def);
674
+ if (seen.has(key))
675
+ continue;
676
+ seen.add(key);
677
+ defs.push(def);
678
+ }
679
+ };
680
+ push(model.symbols.lookupCallableByName(name));
681
+ push(model.methods.lookupMethodByName(name));
682
+ if (defs.length === 1)
683
+ return defs[0];
684
+ // When multiple candidates exist and the call site has a known arity,
685
+ // narrow by parameter count.
686
+ if (defs.length > 1 && callArity !== undefined) {
687
+ const arityMatch = narrowByArity(defs, callArity);
688
+ if (arityMatch !== undefined)
689
+ return arityMatch;
690
+ }
691
+ // Same argument-type + conversion-rank narrowing for the model pool.
692
+ if (defs.length > 1) {
693
+ const narrowed = (0, overload_narrowing_js_1.narrowOverloadCandidates)(defs, callArity, callArgTypes, {
694
+ argumentTypeClasses: callArgTypeClasses,
695
+ conversionRankFn,
696
+ conversionOnlyArgTypePrefixes,
697
+ });
698
+ if (narrowed.length === 1)
699
+ return narrowed[0];
700
+ }
701
+ return undefined;
702
+ }
703
+ /**
704
+ * Narrow a list of callable candidates by call-site arity.
705
+ * A def is compatible when `requiredParameterCount <= arity <= parameterCount`.
706
+ * Defs with `parameterCount === undefined` (variadic/unknown) are always kept.
707
+ * Returns the single compatible def, or `undefined` when zero or multiple match.
708
+ */
709
+ function narrowByArity(defs, callArity) {
710
+ const compatible = defs.filter((d) => {
711
+ const total = d.parameterCount;
712
+ if (total === undefined)
713
+ return true; // unknown arity — keep
714
+ const required = d.requiredParameterCount ?? total;
715
+ return required <= callArity && callArity <= total;
716
+ });
717
+ return compatible.length === 1 ? compatible[0] : undefined;
718
+ }
719
+ function logicalCallableKey(def) {
720
+ return [
721
+ def.filePath,
722
+ def.qualifiedName ?? '',
723
+ def.type,
724
+ def.parameterCount ?? '',
725
+ def.parameterTypes?.join(',') ?? '',
726
+ ].join('\0');
727
+ }
728
+ /** For a constructor call `new X(...)`, return the X class's explicit
729
+ * Constructor def (by walking the class scope's ownedDefs) or the
730
+ * Class def itself when no explicit Constructor exists. Matches
731
+ * legacy behavior — tests assert targetLabel === 'Class' for implicit
732
+ * ctors and targetLabel === 'Constructor' for explicit ones. */
733
+ function pickConstructorOrClass(classDef, workspaceIndex, scopes, callArity) {
734
+ const classScope = workspaceIndex.classScopeByDefId.get(classDef.nodeId);
735
+ if (classScope === undefined)
736
+ return classDef;
737
+ const ctors = [];
738
+ for (const def of classScope.ownedDefs) {
739
+ if (def.type === 'Constructor')
740
+ ctors.push(def);
741
+ }
742
+ if (scopes !== undefined) {
743
+ for (const childId of scopes.scopeTree.getChildren(classScope.id)) {
744
+ const childScope = scopes.scopeTree.getScope(childId);
745
+ if (childScope === undefined || childScope.kind === 'Class')
746
+ continue;
747
+ for (const def of childScope.ownedDefs) {
748
+ if (def.type === 'Constructor')
749
+ ctors.push(def);
750
+ }
751
+ }
752
+ }
753
+ if (ctors.length === 0)
754
+ return classDef;
755
+ if (callArity !== undefined) {
756
+ const narrowed = narrowByArity(ctors, callArity);
757
+ if (narrowed !== undefined)
758
+ return narrowed;
759
+ }
760
+ return ctors[0];
761
+ }
762
+ /** Find a unique workspace-wide class-like def by simple name, for a
763
+ * constructor-form call `Type(...)` whose type lives outside the call
764
+ * site's lexical bindings (a sibling/imported file). Returns the def
765
+ * only when all matches share ONE qualified name — i.e. they are
766
+ * fragments of a single logical type (partial classes / extensions
767
+ * that re-key onto the same type), which resolve to the same graph
768
+ * node. Genuinely distinct types with the same simple name are
769
+ * ambiguous and leave the call unresolved rather than guessing. Gated
770
+ * by the caller on `allowGlobalFallback`, mirroring
771
+ * `pickUniqueGlobalCallable`.
772
+ *
773
+ * Consumes the once-built `buildGlobalClassIndex` (`simpleName ->
774
+ * class-like defs`) so each call site is O(1) rather than O(|defs|).
775
+ * The index's `Class | Struct | Interface` kind filter is intentionally
776
+ * KEPT (KTD5) — see `buildGlobalClassIndex` for why dropping `Interface`
777
+ * would be a separate, behavior-changing Swift-semantics edit.
778
+ *
779
+ * Exported for unit testing — language-agnostic logic, exercised via
780
+ * synthetic stubs in `pick-unique-global-class.test.ts`. The production
781
+ * call site is the constructor-form fallback in `emitFreeCallFallback`. */
782
+ function pickUniqueGlobalClass(name, index) {
783
+ let found;
784
+ for (const def of index.get(name) ?? []) {
785
+ // Same qualified name = same logical type (extension / partial-class
786
+ // fragment); keep the first and don't treat it as ambiguous.
787
+ if (found !== undefined && found.qualifiedName !== def.qualifiedName)
788
+ return undefined;
789
+ if (found === undefined)
790
+ found = def;
791
+ }
792
+ return found;
793
+ }
794
+ /** Walk up from the call-site scope to the enclosing class scope,
795
+ * pick a method member by name with overload narrowing on arity +
796
+ * argument types. Returns undefined if there's no enclosing class,
797
+ * no matching method, OR narrowing leaves multiple compatible
798
+ * candidates — in the multi-candidate case, picking
799
+ * `candidates[0]` would emit a high-confidence CALLS edge whose
800
+ * target depends on registration order rather than a defensible
801
+ * resolution. Mirrors `pickUniqueGlobalCallable`'s uniqueness check
802
+ * in the same file (Codex PR #1497 review, finding 2).
803
+ *
804
+ * Exported for unit testing — language-agnostic logic, exercised
805
+ * via synthetic stubs in `pick-implicit-this-overload.test.ts`. The
806
+ * production call site is `applyFreeCallFallback` immediately above. */
807
+ function pickImplicitThisOverload(site, scopes, workspaceIndex, model, hookCtx) {
808
+ // Find the enclosing Class scope by walking parents.
809
+ let curId = site.inScope;
810
+ let classScopeId;
811
+ while (curId !== null) {
812
+ const sc = scopes.scopeTree.getScope(curId);
813
+ if (sc === undefined)
814
+ break;
815
+ if (sc.kind === 'Class') {
816
+ classScopeId = sc.id;
817
+ break;
818
+ }
819
+ curId = sc.parent;
820
+ }
821
+ if (classScopeId === undefined)
822
+ return undefined;
823
+ // O(1) reverse-lookup via inverse map on WorkspaceResolutionIndex.
824
+ const classDefId = workspaceIndex.classScopeIdToDefId.get(classScopeId);
825
+ if (classDefId === undefined)
826
+ return undefined;
827
+ const overloads = model.methods.lookupAllByOwner(classDefId, site.name);
828
+ if (overloads.length === 0)
829
+ return undefined;
830
+ if (overloads.length === 1)
831
+ return overloads[0];
832
+ // Narrow on arity + argument types. Require a UNIQUE survivor —
833
+ // ambiguous narrowing (multiple compatible candidates with no
834
+ // disambiguating signal) leaves the call unresolved rather than
835
+ // routing to an arbitrary first overload by registration order.
836
+ const candidates = (0, overload_narrowing_js_1.narrowOverloadCandidates)(overloads, site.arity, site.argumentTypes, {
837
+ argumentTypeClasses: site.argumentTypeClasses,
838
+ conversionRankFn: hookCtx?.conversionRankFn,
839
+ conversionOnlyArgTypePrefixes: hookCtx?.conversionOnlyArgTypePrefixes,
840
+ constraintCompatibility: hookCtx?.constraintCompatibility,
841
+ });
842
+ if (candidates.length !== 1)
843
+ return undefined;
844
+ return candidates[0];
845
+ }
846
+ /**
847
+ * True when `name` is bound somewhere along the TRUE lexical scope
848
+ * chain from `startScope` -- i.e. via `Scope.bindings` (the raw,
849
+ * nesting-aware per-scope map built during extraction), NOT via
850
+ * finalize's `indexes.bindings` module-scope bucket (which flattens
851
+ * every declaration in the file onto the module scope regardless of
852
+ * true nesting -- see `hasGenuineLexicalBinding`'s caller for why that
853
+ * distinction matters, #2545).
854
+ */
855
+ function hasGenuineLexicalBinding(startScope, name, scopes) {
856
+ let currentId = startScope;
857
+ const visited = new Set();
858
+ while (currentId !== null) {
859
+ if (visited.has(currentId))
860
+ return false;
861
+ visited.add(currentId);
862
+ const scope = scopes.scopeTree.getScope(currentId);
863
+ if (scope === undefined)
864
+ return false;
865
+ // `Object` scopes (object/record literal bodies) are a hoist
866
+ // boundary only -- never a genuine lexical binding, not even to
867
+ // their own nested children (#2551, mirrors scope/walkers.ts).
868
+ if (scope.kind !== 'Object' && scope.bindings.get(name) !== undefined)
869
+ return true;
870
+ currentId = scope.parent;
871
+ }
872
+ return false;
873
+ }