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,955 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectGoInterfaceImplementations = detectGoInterfaceImplementations;
4
+ const ids_js_1 = require("../../scope-resolution/graph-bridge/ids.js");
5
+ const walkers_js_1 = require("../../scope-resolution/scope/walkers.js");
6
+ const package_clause_js_1 = require("./package-clause.js");
7
+ const generic_type_parameters_js_1 = require("./generic-type-parameters.js");
8
+ function detectGoInterfaceImplementations(parsedFiles, _indexes, _model) {
9
+ return detectGoInterfaceImplementationsFromIndexes(buildDetectionIndexes(parsedFiles, _indexes));
10
+ }
11
+ function buildDetectionIndexes(parsedFiles, indexes) {
12
+ const interfaces = [];
13
+ const structsById = new Map();
14
+ const methodsByOwner = new Map();
15
+ const effectiveMethodsByStructId = new Map();
16
+ const interfaceById = new Map();
17
+ const interfaceOwnMethodsById = new Map();
18
+ const embeddedSitesByInterfaceId = new Map();
19
+ const parentStructIdsByStructId = new Map();
20
+ const valueMethodsByStructId = new Map();
21
+ const structIdsByMethodName = new Map();
22
+ const signatureContextByDefId = new Map();
23
+ const interfaceIdByScopeId = new Map();
24
+ const structIdByScopeId = new Map();
25
+ const typeParametersByInterfaceId = new Map();
26
+ const signatureContextByFilePath = new Map();
27
+ for (const parsed of parsedFiles) {
28
+ const signatureContext = signatureContextForFile(parsed, indexes);
29
+ signatureContextByFilePath.set(parsed.filePath, signatureContext);
30
+ for (const def of parsed.localDefs) {
31
+ signatureContextByDefId.set(def.nodeId, signatureContext);
32
+ if (def.type === 'Interface') {
33
+ interfaces.push(def);
34
+ interfaceById.set(def.nodeId, def);
35
+ const typeParameters = (0, generic_type_parameters_js_1.readGoTypeParameters)(def);
36
+ if (typeParameters !== undefined) {
37
+ typeParametersByInterfaceId.set(def.nodeId, typeParameters);
38
+ }
39
+ continue;
40
+ }
41
+ if (def.type === 'Struct') {
42
+ structsById.set(def.nodeId, def);
43
+ continue;
44
+ }
45
+ if (def.type !== 'Method' && def.type !== 'Function')
46
+ continue;
47
+ if (def.ownerId === undefined)
48
+ continue;
49
+ // POINTER-receiver methods count toward the method set (#2813).
50
+ //
51
+ // Go's rule is per-type, and there are two types here: the method set of
52
+ // `T` holds only its value-receiver methods, while the method set of `*T`
53
+ // holds BOTH. #1966 kept only the value-receiver half, which makes the
54
+ // `T` answer exactly right — and the `*T` answer permanently empty, so a
55
+ // struct whose methods all read `func (r *T)` satisfied nothing and got
56
+ // no IMPLEMENTS edge at all.
57
+ //
58
+ // That is the shape idiomatic Go actually writes: methods take pointer
59
+ // receivers so they can mutate, and `*T` is what gets stored in an
60
+ // interface-typed field. Excluding it did not make the graph
61
+ // conservative, it made it silent — every call through such a field
62
+ // resolved to the interface DECLARATION and `impact()` on the
63
+ // implementation reported zero callers, indistinguishable from a symbol
64
+ // that genuinely has none.
65
+ //
66
+ // GitNexus models one Struct node per type with no separate `*T` node, so
67
+ // the two method sets cannot both be represented. This picks the `*T`
68
+ // reading: the graph now answers "which types provide this interface's
69
+ // behaviour", and no longer proves `var x I = T{}` invalid. That trade is
70
+ // deliberate — blast radius is what every consumer of IMPLEMENTS asks for
71
+ // (verified: MRO/METHOD_IMPLEMENTS derivation, community clustering, the
72
+ // receiver-dispatch fan-out index, and the epistemic heritage probe; none
73
+ // performs value-assignability checking).
74
+ //
75
+ // `goReceiverKind` is still stamped in method-owners.ts and is the hook a
76
+ // future value/pointer-aware model would read; it is deliberately no
77
+ // longer a filter here.
78
+ const simpleName = (0, ids_js_1.simpleQualifiedName)(def);
79
+ if (simpleName === undefined || simpleName.length === 0)
80
+ continue;
81
+ addMethod(methodsByOwner, def.ownerId, methodSetKey(simpleName, def, signatureContextByDefId), def);
82
+ }
83
+ }
84
+ // Built from the nodeId-keyed map, so a def that appears in two ParsedFiles is
85
+ // one interface here just as it is one there — not a name collision with
86
+ // itself.
87
+ const interfacesByQualifiedName = new Map();
88
+ for (const iface of interfaceById.values()) {
89
+ const name = iface.qualifiedName;
90
+ if (name === undefined || name.length === 0)
91
+ continue;
92
+ interfacesByQualifiedName.set(name, interfacesByQualifiedName.has(name) ? null : iface);
93
+ }
94
+ for (const parsed of parsedFiles) {
95
+ for (const scope of parsed.scopes) {
96
+ const iface = scope.ownedDefs.find((def) => def.type === 'Interface');
97
+ if (iface !== undefined)
98
+ interfaceIdByScopeId.set(scope.id, iface.nodeId);
99
+ const struct = scope.ownedDefs.find((def) => def.type === 'Struct');
100
+ if (struct !== undefined)
101
+ structIdByScopeId.set(scope.id, struct.nodeId);
102
+ }
103
+ }
104
+ for (const parsed of parsedFiles) {
105
+ const childScopesByParent = new Map();
106
+ for (const scope of parsed.scopes) {
107
+ if (scope.parent === null)
108
+ continue;
109
+ const children = childScopesByParent.get(scope.parent) ?? [];
110
+ children.push(scope);
111
+ childScopesByParent.set(scope.parent, children);
112
+ }
113
+ for (const scope of parsed.scopes) {
114
+ const ifaceId = interfaceIdByScopeId.get(scope.id);
115
+ if (ifaceId === undefined)
116
+ continue;
117
+ const methods = new Map();
118
+ for (const childScope of childScopesByParent.get(scope.id) ?? []) {
119
+ for (const def of childScope.ownedDefs) {
120
+ if (def.type !== 'Method' && def.type !== 'Function')
121
+ continue;
122
+ const simpleName = (0, ids_js_1.simpleQualifiedName)(def);
123
+ if (simpleName === undefined || simpleName.length === 0)
124
+ continue;
125
+ // Same key function as the struct side — an interface requiring an
126
+ // unexported `seal()` must only be satisfied from its own package.
127
+ addMethodOverload(methods, methodSetKey(simpleName, def, signatureContextByDefId), def);
128
+ }
129
+ }
130
+ interfaceOwnMethodsById.set(ifaceId, methods);
131
+ }
132
+ for (const site of parsed.referenceSites) {
133
+ if (site.kind !== 'inherits')
134
+ continue;
135
+ const ifaceId = interfaceIdByScopeId.get(site.inScope);
136
+ if (ifaceId !== undefined) {
137
+ const sites = embeddedSitesByInterfaceId.get(ifaceId) ?? [];
138
+ sites.push(site);
139
+ embeddedSitesByInterfaceId.set(ifaceId, sites);
140
+ continue;
141
+ }
142
+ const structId = structIdByScopeId.get(site.inScope);
143
+ if (structId === undefined)
144
+ continue;
145
+ const parent = (0, walkers_js_1.resolveInheritanceBaseInScope)(site.inScope, site.name, indexes);
146
+ if (parent === undefined || parent.type !== 'Struct')
147
+ continue;
148
+ // `embeddedAsPointer` is the capture-layer record of `*T` vs `T`; the two
149
+ // promote different method sets (go.dev/ref/spec#Struct_types).
150
+ addParentStruct(parentStructIdsByStructId, structId, parent.nodeId, site.embeddedAsPointer === true);
151
+ }
152
+ }
153
+ const structMethodSetCache = new Map();
154
+ for (const structId of structsById.keys()) {
155
+ const dual = collectStructMethodSet(structId, {
156
+ parentStructIdsByStructId,
157
+ methodsByOwner,
158
+ }, new Set(), structMethodSetCache);
159
+ if (dual === undefined)
160
+ continue;
161
+ // `pointer` is MS(*T) and is the superset, so it drives candidate lookup:
162
+ // a type that implements only in pointer form is still an implementor.
163
+ effectiveMethodsByStructId.set(structId, dual.pointer);
164
+ valueMethodsByStructId.set(structId, dual.value);
165
+ for (const methodName of dual.pointer.keys()) {
166
+ addStructMethodCandidate(structIdsByMethodName, methodName, structId);
167
+ }
168
+ }
169
+ return {
170
+ interfaces,
171
+ structsById,
172
+ methodsByOwner,
173
+ effectiveMethodsByStructId,
174
+ interfacesByQualifiedName,
175
+ interfaceOwnMethodsById,
176
+ embeddedSitesByInterfaceId,
177
+ parentStructIdsByStructId,
178
+ structIdsByMethodName,
179
+ valueMethodsByStructId,
180
+ signatureContextByDefId,
181
+ typeParametersByInterfaceId,
182
+ // Gated on the repo declaring at least one generic interface. A Go codebase
183
+ // with none — the overwhelming majority — never runs the harvest at all,
184
+ // which matters because the spellings it would scan (`[]byte`,
185
+ // `map[string]X`) are among the commonest types in the language.
186
+ instantiationsByInterfaceId: typeParametersByInterfaceId.size === 0
187
+ ? new Map()
188
+ : collectGoInstantiations(parsedFiles, signatureContextByFilePath, typeParametersByInterfaceId, interfacesByQualifiedName, indexes),
189
+ scopeIndexes: indexes,
190
+ };
191
+ }
192
+ /**
193
+ * Every distinct instantiation of a generic interface written anywhere in the
194
+ * program, resolved and deduplicated in one pass.
195
+ *
196
+ * Go records no instantiation anywhere on the DECLARATION — `Repo[User]` exists
197
+ * only where it is written — so the sites are the field/parameter/variable type
198
+ * spellings the capture layer already preserved: `TypeRef.declaredSpelling`
199
+ * (which keeps the arguments `rawName` drops), and the def-side `declaredType` /
200
+ * `parameterTypes` / `returnType`.
201
+ *
202
+ * A spelling is scanned rather than parsed as a whole, so decorated and nested
203
+ * forms yield their inner instantiations too: `[]Repo[User]`, `*Repo[User]` and
204
+ * `map[string]Repo[User]` all yield `Repo[User]`, and `Outer[Repo[User]]` yields
205
+ * both — each of which really is an instantiation present in the program. False
206
+ * bases (`map[` scans as base `map`) resolve to no interface and drop out.
207
+ */
208
+ function collectGoInstantiations(parsedFiles, signatureContextByFilePath, typeParametersByInterfaceId, interfacesByQualifiedName, indexes) {
209
+ // One map where there were two on the same key: the inner map's KEY is the
210
+ // joined argument list, so holding it is the deduplication.
211
+ const argsByInterfaceId = new Map();
212
+ // A base name resolves once per scope. The bracket gate below cannot filter
213
+ // Go's commonest types — `map[string]string` scans as base `map` — so the
214
+ // FALSE bases dominate this pass, and each one otherwise re-walks the whole
215
+ // scope chain for a name that will never bind.
216
+ const basesInScope = new Map();
217
+ const resolveBase = (baseName, inScope) => {
218
+ // NUL-joined for the same reason `methodSetKey` is: it cannot occur in Go
219
+ // source, so no two (scope, name) pairs can collide on one key.
220
+ const key = `${inScope}\u0000${baseName}`;
221
+ const memo = basesInScope.get(key);
222
+ if (memo !== undefined)
223
+ return memo ?? undefined;
224
+ const iface = resolveGoInstantiationBase(baseName, inScope, interfacesByQualifiedName, indexes);
225
+ basesInScope.set(key, iface ?? null);
226
+ return iface;
227
+ };
228
+ const record = (spelling, inScope, context) => {
229
+ // Cheap gate first: most Go type spellings have no bracket at all, and the
230
+ // scan below is the only per-spelling cost this pass adds.
231
+ if (spelling === undefined || !spelling.includes('['))
232
+ return;
233
+ for (const { baseName, rawArgs } of parseGoInstantiationSpellings(spelling)) {
234
+ const iface = resolveBase(baseName, inScope);
235
+ if (iface === undefined)
236
+ continue;
237
+ const typeParameters = typeParametersByInterfaceId.get(iface.nodeId);
238
+ // A partial or over-long argument list is not a valid instantiation
239
+ // ("For a generic type, all type arguments must always be provided
240
+ // explicitly" — go.dev/ref/spec#Instantiations), so there is nothing to
241
+ // substitute and the site is dropped.
242
+ if (typeParameters === undefined || typeParameters.length !== rawArgs.length)
243
+ continue;
244
+ const normalizedArgs = normalizeGoTypeArguments(rawArgs, context);
245
+ if (normalizedArgs === undefined)
246
+ continue;
247
+ let byArgs = argsByInterfaceId.get(iface.nodeId);
248
+ if (byArgs === undefined) {
249
+ byArgs = new Map();
250
+ argsByInterfaceId.set(iface.nodeId, byArgs);
251
+ }
252
+ const key = normalizedArgs.join(',');
253
+ if (!byArgs.has(key))
254
+ byArgs.set(key, normalizedArgs);
255
+ }
256
+ };
257
+ for (const parsed of parsedFiles) {
258
+ const context = signatureContextByFilePath.get(parsed.filePath);
259
+ if (context === undefined)
260
+ continue;
261
+ for (const scope of parsed.scopes) {
262
+ for (const binding of scope.typeBindings.values()) {
263
+ record(binding.declaredSpelling ?? binding.rawName, scope.id, context);
264
+ }
265
+ for (const def of scope.ownedDefs) {
266
+ record(def.declaredType, scope.id, context);
267
+ record(def.returnType, scope.id, context);
268
+ for (const parameterType of def.parameterTypes ?? []) {
269
+ record(parameterType, scope.id, context);
270
+ }
271
+ }
272
+ }
273
+ }
274
+ return argsByInterfaceId;
275
+ }
276
+ /** Every `Ident[…]` / `pkg.Ident[…]` application in a type spelling, with its
277
+ * top-level (comma-separated, delimiter-balanced) arguments. */
278
+ function parseGoInstantiationSpellings(spelling) {
279
+ const out = [];
280
+ const namePattern = /[A-Za-z_][A-Za-z0-9_.]*(?=\[)/g;
281
+ let match;
282
+ while ((match = namePattern.exec(spelling)) !== null) {
283
+ const open = match.index + match[0].length;
284
+ const close = (0, generic_type_parameters_js_1.matchingGoDelimiter)(spelling, open);
285
+ if (close === -1)
286
+ continue;
287
+ const rawArgs = (0, generic_type_parameters_js_1.splitTopLevelGoList)(spelling.slice(open + 1, close));
288
+ if (rawArgs.length === 0)
289
+ continue;
290
+ out.push({ baseName: match[0], rawArgs });
291
+ }
292
+ return out;
293
+ }
294
+ /** Normalize each type argument in the context of the file that WROTE it, or
295
+ * `undefined` when any of them carries an unresolvable import qualifier — a
296
+ * half-normalized argument list would compare against nothing meaningful. */
297
+ function normalizeGoTypeArguments(rawArgs, context) {
298
+ const normalizedArgs = [];
299
+ for (const rawArg of rawArgs) {
300
+ const normalized = normalizeSignatureType(rawArg, context);
301
+ if (normalized === undefined)
302
+ return undefined;
303
+ normalizedArgs.push(normalized);
304
+ }
305
+ return normalizedArgs;
306
+ }
307
+ /**
308
+ * Bind an instantiation's base name to the generic interface it names.
309
+ *
310
+ * Goes through `resolveInheritanceBaseInScope` first — the same real scope
311
+ * resolution the embedded-interface path uses — and falls back to a globally
312
+ * UNIQUE name match.
313
+ */
314
+ function resolveGoInstantiationBase(baseName, inScope, interfacesByQualifiedName, indexes) {
315
+ const bound = (0, walkers_js_1.resolveInheritanceBaseInScope)(inScope, simpleTypeName(baseName), indexes);
316
+ if (bound !== undefined)
317
+ return bound.type === 'Interface' ? bound : undefined;
318
+ return uniqueInterfaceNamed(baseName, interfacesByQualifiedName);
319
+ }
320
+ /**
321
+ * The one interface a written name denotes by NAME ALONE — the fallback both
322
+ * name-match routes here share, once the real scope resolution above them has
323
+ * declined.
324
+ *
325
+ * Ambiguity drops the site rather than guessing: two same-named interfaces in
326
+ * different packages would otherwise cross-pollinate each other's
327
+ * instantiations, and a dropped site only costs fan-out that does not exist
328
+ * today anyway. A qualified spelling is tried under both its own name and its
329
+ * simple tail, and a hit under EACH is two matches, so it declines as well.
330
+ *
331
+ * One probe rather than a scan of every interface in the program, which is what
332
+ * made this quadratic: the bracket gate in `collectGoInstantiations` cannot
333
+ * filter `map[…]` or `[]T`, so a Go program pays this once per bracketed
334
+ * spelling it writes.
335
+ */
336
+ function uniqueInterfaceNamed(name, interfacesByQualifiedName) {
337
+ const exact = interfacesByQualifiedName.get(name);
338
+ if (exact === null)
339
+ return undefined;
340
+ const simpleName = simpleTypeName(name);
341
+ if (simpleName === name)
342
+ return exact;
343
+ const simple = interfacesByQualifiedName.get(simpleName);
344
+ if (simple === null)
345
+ return undefined;
346
+ if (exact !== undefined && simple !== undefined)
347
+ return undefined;
348
+ return exact ?? simple;
349
+ }
350
+ function detectGoInterfaceImplementationsFromIndexes(indexes) {
351
+ const implementations = new Map();
352
+ const methodSetCache = new Map();
353
+ for (const iface of indexes.interfaces) {
354
+ const required = collectInterfaceMethodSet(iface, indexes, new Set(), methodSetCache);
355
+ if (required === undefined || required.size === 0)
356
+ continue;
357
+ if (!methodSetHasVerifiableSignatures(required))
358
+ continue;
359
+ // Hoisted, not recomputed per set: `substituteMethodSet` rewrites
360
+ // SIGNATURES and returns the identical key set, and `candidateStructIdsFor`
361
+ // keys off nothing but those method names — so every set below has exactly
362
+ // these candidates. Materialized because it is iterated once per
363
+ // instantiation and one of the branches behind it yields a live iterator.
364
+ const candidateStructIds = [...candidateStructIdsFor(required, indexes)];
365
+ // The declaration's own method set, then one per observed instantiation.
366
+ // The declaration set runs FIRST and unconditionally, so this is strictly
367
+ // additive: every implementor found before #2855 is still found, in the
368
+ // same order, and instantiation only ever appends.
369
+ const formByStructId = new Map();
370
+ for (const candidateSet of [required, ...instantiatedMethodSetsFor(iface, required, indexes)]) {
371
+ for (const structId of candidateStructIds) {
372
+ if (formByStructId.get(structId) === 'value')
373
+ continue;
374
+ const pointerSet = indexes.effectiveMethodsByStructId.get(structId);
375
+ if (pointerSet === undefined)
376
+ continue;
377
+ // MS(*T) is the superset: if it does not satisfy, neither does MS(T).
378
+ if (!methodSetSatisfies(pointerSet, candidateSet, indexes.signatureContextByDefId))
379
+ continue;
380
+ // Then ask the narrower question separately — does the VALUE type satisfy?
381
+ // This is the distinction `var x I = T{}` turns on, and it is a fact about
382
+ // the program, not a heuristic.
383
+ const valueSet = indexes.valueMethodsByStructId.get(structId);
384
+ const satisfiesByValue = valueSet !== undefined &&
385
+ methodSetSatisfies(valueSet, candidateSet, indexes.signatureContextByDefId);
386
+ formByStructId.set(structId, satisfiesByValue ? 'value' : 'pointer');
387
+ }
388
+ }
389
+ const implementors = [...formByStructId].map(([structDefId, receiverForm]) => ({ structDefId, receiverForm }));
390
+ if (implementors.length > 0)
391
+ implementations.set(iface.nodeId, implementors);
392
+ }
393
+ return implementations;
394
+ }
395
+ /**
396
+ * The method set of each observed INSTANTIATION of a generic interface.
397
+ *
398
+ * Go spec, Instantiations: "A generic function or type is instantiated by
399
+ * substituting type arguments for the type parameters. … Each type argument is
400
+ * substituted for its corresponding type parameter in the generic declaration. …
401
+ * Instantiating a type results in a new non-generic named type." Combined with
402
+ * Type definitions ("Generic types must be instantiated when they are used") the
403
+ * consequence is that `Repo` is not a type at all and `Repo[User]` is — with
404
+ * method set `{ Save(x User) }` after substitution. Implementing an interface
405
+ * then asks whether a type "is an element of the type set of I", and Basic
406
+ * interfaces defines that type set as "the set of types which implement all of
407
+ * those methods". `UserRepo`, whose method set contains `Save(x User)`, is an
408
+ * element of `Repo[User]`'s type set — so it implements `Repo[User]`, and a call
409
+ * through a `Repo[User]`-typed field really can land on `UserRepo.Save`. Before
410
+ * this, it could not: the required parameter type stayed the type PARAMETER `T`,
411
+ * matched no implementor's `User`, and the interface got no IMPLEMENTS edge at
412
+ * all. That is the same false-silence shape as #2813/#2829, one abstraction up.
413
+ *
414
+ * SUBSTITUTION, NOT ERASURE. `Repo[Order]` instantiates to `Save(x Order)` and
415
+ * is NOT satisfied by a `Save(x User)` implementor. Treating `T` as a wildcard
416
+ * would satisfy both and mint an edge Go does not have; the whole point of
417
+ * #2829 was that an exact model beats an approximate one.
418
+ *
419
+ * WHAT THIS DELIBERATELY DOES NOT MODEL. GitNexus holds one node per generic
420
+ * DECLARATION, not one per instantiation, so an interface instantiated at two
421
+ * different arguments in the same program unions their implementors onto the one
422
+ * `Repo` node — `Repo[User]` and `Repo[Order]` in the same repo both fan out to
423
+ * every type satisfying either. That is the same one-node-per-declaration
424
+ * over-approximation every nominal language in the graph already carries (a
425
+ * Kotlin `class UserRepo : Repo<User>` yields `UserRepo IMPLEMENTS Repo`, argument
426
+ * discarded), and it is bounded by the arguments the program actually writes —
427
+ * strictly narrower than erasure, which admits arguments that appear nowhere.
428
+ *
429
+ * Constraints are out of reach by construction and that is correct: a generic
430
+ * interface used as a CONSTRAINT (`func F[T Repo[X]](…)`) is written in a type
431
+ * parameter list, which produces no type binding and no declared type, so no
432
+ * such site is ever harvested. Non-basic interfaces — the union/type-set kind
433
+ * that "may only be used as type constraints" (General interfaces) — declare no
434
+ * methods and are already dropped by the empty-method-set guard above.
435
+ */
436
+ function instantiatedMethodSetsFor(iface, required, indexes) {
437
+ const typeParameters = indexes.typeParametersByInterfaceId.get(iface.nodeId);
438
+ if (typeParameters === undefined)
439
+ return [];
440
+ const instantiations = indexes.instantiationsByInterfaceId.get(iface.nodeId);
441
+ if (instantiations === undefined || instantiations.size === 0)
442
+ return [];
443
+ const indexByName = new Map(typeParameters.map((name, index) => [name, index]));
444
+ const sets = [];
445
+ for (const normalizedArgs of instantiations.values()) {
446
+ const substituted = substituteMethodSet(required, indexByName, normalizedArgs, indexes.signatureContextByDefId);
447
+ if (substituted !== undefined)
448
+ sets.push(substituted);
449
+ }
450
+ return sets;
451
+ }
452
+ /**
453
+ * Rewrite a required method set under one instantiation, or `undefined` when any
454
+ * signature in it cannot be normalized (an unresolved import qualifier) — a
455
+ * partially substituted set would compare a mix of instantiated and
456
+ * uninstantiated types, so the instantiation is dropped whole.
457
+ *
458
+ * The substituted defs carry a synthetic node id that is deliberately absent
459
+ * from `signatureContextByDefId`. Their parameter/return types come out of here
460
+ * ALREADY normalized — the type arguments in the context that WROTE them, the
461
+ * rest in the interface's own — and `normalizeSignatureType` with no context is
462
+ * the identity beyond whitespace, so the comparison in `signaturesCompatible`
463
+ * cannot re-qualify a spelling that is already fully qualified.
464
+ */
465
+ function substituteMethodSet(required, indexByName, normalizedArgs, signatureContextByDefId) {
466
+ const out = new Map();
467
+ for (const [name, overloads] of required) {
468
+ const substitutedOverloads = [];
469
+ for (const def of overloads) {
470
+ const context = signatureContextByDefId.get(def.nodeId);
471
+ const parameterTypes = [];
472
+ for (const parameterType of def.parameterTypes ?? []) {
473
+ const substituted = substituteSignatureType(parameterType, indexByName, normalizedArgs, context);
474
+ if (substituted === undefined)
475
+ return undefined;
476
+ parameterTypes.push(substituted);
477
+ }
478
+ let returnType;
479
+ if (def.returnType !== undefined) {
480
+ returnType = substituteSignatureType(def.returnType, indexByName, normalizedArgs, context);
481
+ if (returnType === undefined)
482
+ return undefined;
483
+ }
484
+ substitutedOverloads.push({
485
+ ...def,
486
+ nodeId: `${def.nodeId}\u0000instantiated`,
487
+ ...(def.parameterTypes !== undefined ? { parameterTypes } : {}),
488
+ ...(returnType !== undefined ? { returnType } : {}),
489
+ });
490
+ }
491
+ out.set(name, substitutedOverloads);
492
+ }
493
+ return out;
494
+ }
495
+ /**
496
+ * Placeholder for the type argument at position `i` while its enclosing type is
497
+ * normalized. NUL-delimited — the same separator `methodSetKey` already uses,
498
+ * and for the same reason: it cannot occur in Go source.
499
+ *
500
+ * Both halves of that choice are load-bearing. `qualifyGoSignatureTypes` rewrites
501
+ * only tokens matching `[A-Za-z_][A-Za-z0-9_]*`, which can start with neither NUL
502
+ * nor a digit, so the placeholder survives normalization untouched; and
503
+ * `normalizeSignatureType` strips `\s+` FIRST, so a whitespace-delimited
504
+ * placeholder would lose its delimiters and become indistinguishable from an
505
+ * array length (`[5]int`).
506
+ */
507
+ const TYPE_PARAMETER_PLACEHOLDER = /\u0000(\d+)\u0000/g;
508
+ /**
509
+ * Substitute type arguments into one signature type, preserving Go's type
510
+ * identity rules for everything around them.
511
+ *
512
+ * Substitution happens BEFORE normalization and reinstatement AFTER, so the
513
+ * argument's own spelling is never re-qualified by the interface's package while
514
+ * the rest of the type still is: `[]T` in package `repo` with argument
515
+ * `internal/model.User` yields `[]internal/model.User`, not
516
+ * `[]repo.internal/model.User`. Pointer, slice, map and variadic shape survive
517
+ * because only the identifier token is replaced (`*T` -> `*model.User`), which is
518
+ * what makes `Save(x T)` and `Save(x *T)` stay different methods.
519
+ */
520
+ function substituteSignatureType(typeName, indexByName, normalizedArgs, context) {
521
+ const placeheld = typeName.replace(/[A-Za-z_][A-Za-z0-9_]*/g, (token, offset, source) => {
522
+ // `pkg.T` names `T` in package `pkg`, never the type parameter `T`.
523
+ if (hasPackageQualifierDot(source, offset))
524
+ return token;
525
+ const index = indexByName.get(token);
526
+ return index === undefined ? token : `\u0000${index}\u0000`;
527
+ });
528
+ const normalized = normalizeSignatureType(placeheld, context);
529
+ if (normalized === undefined)
530
+ return undefined;
531
+ return normalized.replace(TYPE_PARAMETER_PLACEHOLDER, (_match, digits) => {
532
+ return normalizedArgs[Number(digits)] ?? _match;
533
+ });
534
+ }
535
+ /**
536
+ * The key a method occupies in a method set.
537
+ *
538
+ * Go spec, Uniqueness of identifiers: "Two identifiers are different if they are
539
+ * spelled differently, **or if they appear in different packages and are not
540
+ * exported**." So an UNEXPORTED method name is scoped to its declaring package —
541
+ * `seal` in package `sealed` is a different identifier from `seal` in package
542
+ * `foreign`, and a type outside `sealed` can never satisfy `interface { seal() }`.
543
+ * That is the whole basis of the sealed-interface idiom.
544
+ *
545
+ * Matching on the bare name made those types satisfy each other, which is a
546
+ * FALSE implementation rather than an over-approximation. Qualifying the key
547
+ * with the declaring package for unexported names makes the comparison exact.
548
+ *
549
+ * Exported names are deliberately left unqualified: the spec makes them the same
550
+ * identifier across packages, which is what allows cross-package interface
551
+ * satisfaction to work at all.
552
+ */
553
+ function methodSetKey(simpleName, def, signatureContextByDefId) {
554
+ if (isExportedGoIdentifier(simpleName))
555
+ return simpleName;
556
+ const pkg = signatureContextByDefId.get(def.nodeId)?.packageQualifier;
557
+ return pkg === undefined ? simpleName : `${pkg}\u0000${simpleName}`;
558
+ }
559
+ /**
560
+ * Go spec, Exported identifiers: exported iff the first character is a Unicode
561
+ * uppercase letter (category Lu). Method names always satisfy the second clause
562
+ * (they are method names), so the first character is the whole test.
563
+ */
564
+ function isExportedGoIdentifier(name) {
565
+ const first = name.codePointAt(0);
566
+ if (first === undefined)
567
+ return false;
568
+ const ch = String.fromCodePoint(first);
569
+ return ch !== ch.toLowerCase() && ch === ch.toUpperCase();
570
+ }
571
+ function addMethod(methodsByOwner, ownerId, methodName, def) {
572
+ let methods = methodsByOwner.get(ownerId);
573
+ if (methods === undefined) {
574
+ methods = new Map();
575
+ methodsByOwner.set(ownerId, methods);
576
+ }
577
+ addMethodOverload(methods, methodName, def);
578
+ }
579
+ function addMethodOverload(methods, methodName, def) {
580
+ const overloads = methods.get(methodName) ?? [];
581
+ overloads.push(def);
582
+ methods.set(methodName, overloads);
583
+ }
584
+ function addStructMethodCandidate(structIdsByMethodName, methodName, structId) {
585
+ const structIds = structIdsByMethodName.get(methodName) ?? new Set();
586
+ structIds.add(structId);
587
+ structIdsByMethodName.set(methodName, structIds);
588
+ }
589
+ function addParentStruct(parentStructIdsByStructId, structId, parentStructId, asPointer) {
590
+ const parents = parentStructIdsByStructId.get(structId) ?? [];
591
+ parents.push({ structId: parentStructId, asPointer });
592
+ parentStructIdsByStructId.set(structId, parents);
593
+ }
594
+ function collectStructMethodSet(structId, indexes, visiting, cache) {
595
+ const entries = collectStructMethodEntries(structId, indexes, visiting, cache);
596
+ if (entries === undefined)
597
+ return undefined;
598
+ return {
599
+ value: methodEntriesToMethodSet(entries.value),
600
+ pointer: methodEntriesToMethodSet(entries.pointer),
601
+ };
602
+ }
603
+ /**
604
+ * Build MS(T) and MS(*T) together, applying the spec's promotion table exactly
605
+ * (go.dev/ref/spec#Method_sets, #Struct_types):
606
+ *
607
+ * declared receiver T -> in MS(T) and MS(*T)
608
+ * declared receiver *T -> in MS(*T) only
609
+ * S embeds T (value) -> MS(S) gets P's MS(T); MS(*S) gets P's MS(*T)
610
+ * S embeds *T (pointer) -> MS(S) AND MS(*S) both get P's MS(*T)
611
+ *
612
+ * The last row is the one that makes the embed FORM load-bearing: with
613
+ * `func (b *Base) Ping()`, `struct{ Base }` does not implement a `Ping`
614
+ * interface by value while `struct{ *Base }` does. Collapsing the forms gives
615
+ * both the same answer and one of them is then wrong.
616
+ */
617
+ function collectStructMethodEntries(structId, indexes, visiting, cache) {
618
+ const cached = cache.get(structId);
619
+ if (cached !== undefined) {
620
+ return { value: cloneMethodEntries(cached.value), pointer: cloneMethodEntries(cached.pointer) };
621
+ }
622
+ if (visiting.has(structId))
623
+ return undefined;
624
+ visiting.add(structId);
625
+ const own = indexes.methodsByOwner.get(structId);
626
+ // MS(*T) holds every declared method; MS(T) drops the pointer-receiver ones.
627
+ const pointer = directMethodEntries(own);
628
+ const value = directMethodEntries(filterValueReceiverMethods(own));
629
+ for (const parent of indexes.parentStructIdsByStructId.get(structId) ?? []) {
630
+ const parentEntries = collectStructMethodEntries(parent.structId, indexes, visiting, cache);
631
+ if (parentEntries === undefined) {
632
+ visiting.delete(structId);
633
+ return undefined;
634
+ }
635
+ // Embedding by POINTER lifts the parent's pointer-receiver methods into the
636
+ // embedder's VALUE method set; embedding by value does not.
637
+ const promotedIntoValue = parent.asPointer ? parentEntries.pointer : parentEntries.value;
638
+ promoteEntries(value, promotedIntoValue);
639
+ promoteEntries(pointer, parentEntries.pointer);
640
+ }
641
+ visiting.delete(structId);
642
+ cache.set(structId, { value: cloneMethodEntries(value), pointer: cloneMethodEntries(pointer) });
643
+ return { value, pointer };
644
+ }
645
+ /** Merge one depth-level of promoted entries, preserving the shallowest-depth
646
+ * and ambiguity rules the selector spec defines. */
647
+ function promoteEntries(target, source) {
648
+ for (const [methodName, entry] of source) {
649
+ if (entry.ambiguous)
650
+ continue;
651
+ mergePromotedMethodEntry(target, methodName, {
652
+ overloads: entry.overloads,
653
+ depth: entry.depth + 1,
654
+ ambiguous: false,
655
+ });
656
+ }
657
+ }
658
+ /** MS(T) excludes methods declared with a `*T` receiver. */
659
+ function filterValueReceiverMethods(methods) {
660
+ if (methods === undefined)
661
+ return undefined;
662
+ const out = new Map();
663
+ for (const [name, overloads] of methods) {
664
+ const valueOnly = overloads.filter((def) => def.goReceiverKind !== 'pointer');
665
+ if (valueOnly.length > 0)
666
+ out.set(name, valueOnly);
667
+ }
668
+ return out;
669
+ }
670
+ function collectInterfaceMethodSet(iface, indexes, visiting, cache) {
671
+ const cached = cache.get(iface.nodeId);
672
+ // NOTE: Returns a direct reference to the cached map. Callers (the detection
673
+ // loop in detectGoInterfaceImplementationsFromIndexes) only READ the result
674
+ // (keys/values passed to candidateStructIdsFor and methodSetSatisfies). If a
675
+ // future caller needs to mutate the returned map, it must clone first — the
676
+ // cache entry is shared and must remain immutable after this function returns.
677
+ if (cached !== undefined)
678
+ return cached;
679
+ if (visiting.has(iface.nodeId))
680
+ return undefined;
681
+ visiting.add(iface.nodeId);
682
+ const ownMethods = indexes.methodsByOwner.get(iface.nodeId) ?? indexes.interfaceOwnMethodsById.get(iface.nodeId);
683
+ const merged = cloneMethodSet(ownMethods);
684
+ const embeddedInterfaces = embeddedInterfacesFor(iface, indexes);
685
+ if (embeddedInterfaces === undefined) {
686
+ visiting.delete(iface.nodeId);
687
+ return undefined;
688
+ }
689
+ for (const embeddedIface of embeddedInterfaces) {
690
+ const embeddedMethods = collectInterfaceMethodSet(embeddedIface, indexes, visiting, cache);
691
+ if (embeddedMethods === undefined) {
692
+ visiting.delete(iface.nodeId);
693
+ return undefined;
694
+ }
695
+ mergeMethodSet(merged, embeddedMethods);
696
+ }
697
+ visiting.delete(iface.nodeId);
698
+ // Store a clone in the cache so the returned `merged` reference is independent.
699
+ // This protects the cache from mutation if a caller modifies the return value.
700
+ cache.set(iface.nodeId, cloneMethodSet(merged));
701
+ return merged;
702
+ }
703
+ function embeddedInterfacesFor(iface, indexes) {
704
+ const embedded = [];
705
+ for (const site of indexes.embeddedSitesByInterfaceId.get(iface.nodeId) ?? []) {
706
+ const resolved = resolveEmbeddedInterface(site, indexes);
707
+ if (resolved === undefined)
708
+ return undefined;
709
+ embedded.push(resolved);
710
+ }
711
+ return embedded;
712
+ }
713
+ function candidateStructIdsFor(required, indexes) {
714
+ let result;
715
+ for (const name of required.keys()) {
716
+ const candidates = indexes.structIdsByMethodName.get(name);
717
+ if (candidates === undefined)
718
+ return [];
719
+ if (result === undefined) {
720
+ // First method name: start with its full candidate set (copy to avoid
721
+ // corrupting the shared index).
722
+ result = new Set(candidates);
723
+ }
724
+ else {
725
+ // Intersect: keep only struct IDs present in this method's candidate set.
726
+ // Iterate a snapshot to avoid mutating while iterating.
727
+ const toDelete = [];
728
+ for (const id of result) {
729
+ if (!candidates.has(id))
730
+ toDelete.push(id);
731
+ }
732
+ for (const id of toDelete)
733
+ result.delete(id);
734
+ }
735
+ if (result.size === 0)
736
+ return []; // Early exit: no struct has all required methods
737
+ }
738
+ return result === undefined ? indexes.structsById.keys() : result;
739
+ }
740
+ function resolveEmbeddedInterface(site, indexes) {
741
+ const bound = (0, walkers_js_1.resolveInheritanceBaseInScope)(site.inScope, site.name, indexes.scopeIndexes);
742
+ if (bound !== undefined)
743
+ return bound.type === 'Interface' ? bound : undefined;
744
+ return uniqueInterfaceNamed(site.name, indexes.interfacesByQualifiedName);
745
+ }
746
+ function simpleTypeName(name) {
747
+ const dot = name.lastIndexOf('.');
748
+ return dot === -1 ? name : name.slice(dot + 1);
749
+ }
750
+ function cloneMethodSet(methods) {
751
+ const clone = new Map();
752
+ if (methods === undefined)
753
+ return clone;
754
+ for (const [name, overloads] of methods) {
755
+ clone.set(name, [...overloads]);
756
+ }
757
+ return clone;
758
+ }
759
+ function directMethodEntries(methods) {
760
+ const entries = new Map();
761
+ if (methods === undefined)
762
+ return entries;
763
+ for (const [name, overloads] of methods) {
764
+ entries.set(name, { overloads: [...overloads], depth: 0, ambiguous: false });
765
+ }
766
+ return entries;
767
+ }
768
+ function cloneMethodEntries(entries) {
769
+ const clone = new Map();
770
+ for (const [name, entry] of entries) {
771
+ clone.set(name, { ...entry, overloads: [...entry.overloads] });
772
+ }
773
+ return clone;
774
+ }
775
+ function methodEntriesToMethodSet(entries) {
776
+ const methods = new Map();
777
+ for (const [name, entry] of entries) {
778
+ if (entry.ambiguous)
779
+ continue;
780
+ methods.set(name, [...entry.overloads]);
781
+ }
782
+ return methods;
783
+ }
784
+ function mergePromotedMethodEntry(target, methodName, candidate) {
785
+ const existing = target.get(methodName);
786
+ if (existing === undefined || candidate.depth < existing.depth) {
787
+ target.set(methodName, candidate);
788
+ return;
789
+ }
790
+ if (candidate.depth > existing.depth)
791
+ return;
792
+ target.set(methodName, { overloads: [], depth: candidate.depth, ambiguous: true });
793
+ }
794
+ function mergeMethodSet(target, source) {
795
+ for (const [name, overloads] of source) {
796
+ const existing = target.get(name) ?? [];
797
+ existing.push(...overloads);
798
+ target.set(name, existing);
799
+ }
800
+ }
801
+ function methodSetSatisfies(actual, required, signatureContextByDefId) {
802
+ for (const [name, requiredOverloads] of required) {
803
+ const actualOverloads = actual.get(name);
804
+ if (actualOverloads === undefined)
805
+ return false;
806
+ for (const requiredMethod of requiredOverloads) {
807
+ // Fast arity pre-filter: if the required method has a known parameter
808
+ // count, reject immediately when no actual overload matches it. This
809
+ // avoids the expensive signature normalization loop for obvious mismatches.
810
+ if (requiredMethod.parameterCount !== undefined) {
811
+ if (!actualOverloads.some((a) => a.parameterCount === requiredMethod.parameterCount)) {
812
+ return false;
813
+ }
814
+ }
815
+ if (!hasCompatibleMethod(actualOverloads, requiredMethod, signatureContextByDefId)) {
816
+ return false;
817
+ }
818
+ }
819
+ }
820
+ return true;
821
+ }
822
+ function hasCompatibleMethod(actualOverloads, requiredMethod, signatureContextByDefId) {
823
+ if (!hasVerifiableSignature(requiredMethod))
824
+ return false;
825
+ return actualOverloads.some((actualMethod) => signaturesCompatible(actualMethod, requiredMethod, signatureContextByDefId));
826
+ }
827
+ function methodSetHasVerifiableSignatures(methods) {
828
+ for (const overloads of methods.values()) {
829
+ if (!overloads.some(hasVerifiableSignature))
830
+ return false;
831
+ }
832
+ return true;
833
+ }
834
+ function hasVerifiableSignature(def) {
835
+ return (def.parameterCount !== undefined ||
836
+ def.requiredParameterCount !== undefined ||
837
+ (def.parameterTypes !== undefined && def.parameterTypes.length > 0) ||
838
+ def.returnType !== undefined);
839
+ }
840
+ function signaturesCompatible(actual, required, signatureContextByDefId) {
841
+ const actualContext = signatureContextByDefId.get(actual.nodeId);
842
+ const requiredContext = signatureContextByDefId.get(required.nodeId);
843
+ return (countsCompatible(actual.parameterCount, required.parameterCount) &&
844
+ countsCompatible(actual.requiredParameterCount, required.requiredParameterCount) &&
845
+ parameterTypesCompatible(actual.parameterTypes, required.parameterTypes, actualContext, requiredContext) &&
846
+ returnTypesCompatible(actual.returnType, required.returnType, actualContext, requiredContext));
847
+ }
848
+ function countsCompatible(actual, required) {
849
+ return actual === undefined || required === undefined || actual === required;
850
+ }
851
+ function parameterTypesCompatible(actual, required, actualContext, requiredContext) {
852
+ if (actual === undefined || required === undefined)
853
+ return true;
854
+ if (actual.length !== required.length)
855
+ return false;
856
+ return actual.every((type, index) => {
857
+ const actualType = normalizeSignatureType(type, actualContext);
858
+ const requiredType = normalizeSignatureType(required[index], requiredContext);
859
+ return actualType !== undefined && requiredType !== undefined && actualType === requiredType;
860
+ });
861
+ }
862
+ function returnTypesCompatible(actual, required, actualContext, requiredContext) {
863
+ if (required === undefined)
864
+ return actual === undefined;
865
+ if (actual === undefined)
866
+ return false;
867
+ const actualType = normalizeSignatureType(actual, actualContext);
868
+ const requiredType = normalizeSignatureType(required, requiredContext);
869
+ return actualType !== undefined && requiredType !== undefined && actualType === requiredType;
870
+ }
871
+ function normalizeSignatureType(typeName, context) {
872
+ // Go type identity includes pointer/slice/map/variadic shape and package
873
+ // qualifiers. Only erase whitespace and qualify bare local type names; stripping
874
+ // `*`, `[]`, `...`, or `pkg.` would make non-identical signatures compare equal.
875
+ const compact = typeName.replace(/\s+/g, '');
876
+ if (context === undefined)
877
+ return compact;
878
+ return qualifyGoSignatureTypes(compact, context);
879
+ }
880
+ function qualifyGoSignatureTypes(typeName, context) {
881
+ let unresolvedQualifier = false;
882
+ const qualified = typeName.replace(/[A-Za-z_][A-Za-z0-9_]*/g, (token, offset, source) => {
883
+ if (GO_BUILTIN_TYPES.has(token))
884
+ return token;
885
+ if (hasPackageQualifierDot(source, offset))
886
+ return token;
887
+ if (source[offset + token.length] === '.') {
888
+ const qualifier = context.importQualifiers.get(token);
889
+ if (qualifier !== undefined)
890
+ return qualifier;
891
+ unresolvedQualifier = true;
892
+ return token;
893
+ }
894
+ if (context.packageQualifier === undefined)
895
+ return token;
896
+ return `${context.packageQualifier}.${token}`;
897
+ });
898
+ return unresolvedQualifier ? undefined : qualified;
899
+ }
900
+ function hasPackageQualifierDot(source, offset) {
901
+ return source[offset - 1] === '.' && source[offset - 2] !== '.';
902
+ }
903
+ function signatureContextForFile(parsed, indexes) {
904
+ const importQualifiers = new Map();
905
+ const importEdges = indexes.imports?.get(parsed.moduleScope) ?? [];
906
+ for (const edge of importEdges) {
907
+ if (edge.kind !== 'namespace' || edge.targetFile === null)
908
+ continue;
909
+ const qualifier = packageQualifierForFile(edge.targetFile);
910
+ if (qualifier !== undefined)
911
+ importQualifiers.set(edge.localName, qualifier);
912
+ }
913
+ return {
914
+ packageQualifier: packageQualifierForFile(parsed.filePath),
915
+ importQualifiers,
916
+ };
917
+ }
918
+ /** The package directory, or `undefined` for a repo-root file.
919
+ *
920
+ * Shares `goPackageDir` with the package-clause resolver rather than repeating
921
+ * its normalize-and-slice (#2837): the two disagree only on how they spell "no
922
+ * directory", so the difference stays here, at the one call site that cares. */
923
+ function packageQualifierForFile(filePath) {
924
+ const packageDir = (0, package_clause_js_1.goPackageDir)(filePath);
925
+ return packageDir.length === 0 ? undefined : packageDir;
926
+ }
927
+ const GO_BUILTIN_TYPES = new Set([
928
+ 'any',
929
+ 'bool',
930
+ 'byte',
931
+ 'comparable',
932
+ 'complex64',
933
+ 'complex128',
934
+ 'error',
935
+ 'float32',
936
+ 'float64',
937
+ 'func',
938
+ 'int',
939
+ 'int8',
940
+ 'int16',
941
+ 'int32',
942
+ 'int64',
943
+ 'interface',
944
+ 'map',
945
+ 'rune',
946
+ 'string',
947
+ 'struct',
948
+ 'uint',
949
+ 'uint8',
950
+ 'uint16',
951
+ 'uint32',
952
+ 'uint64',
953
+ 'uintptr',
954
+ 'chan',
955
+ ]);