@lzehrung/codegraph 2.4.0 → 3.0.1

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 (452) hide show
  1. package/README.md +5 -4
  2. package/codegraph-skill/codegraph/SKILL.md +3 -3
  3. package/dist/agent/call-hierarchy.js +2 -4
  4. package/dist/agent/call-hierarchy.js.map +1 -1
  5. package/dist/agent/explore.d.ts +1 -1
  6. package/dist/agent/explore.d.ts.map +1 -1
  7. package/dist/agent/explore.js +3 -2
  8. package/dist/agent/explore.js.map +1 -1
  9. package/dist/agent/refactor-plan.js +2 -4
  10. package/dist/agent/refactor-plan.js.map +1 -1
  11. package/dist/agent/rename-preview.d.ts.map +1 -1
  12. package/dist/agent/rename-preview.js +58 -8
  13. package/dist/agent/rename-preview.js.map +1 -1
  14. package/dist/agent/search.js +2 -3
  15. package/dist/agent/search.js.map +1 -1
  16. package/dist/agent/semantic-symbols.d.ts.map +1 -1
  17. package/dist/agent/semantic-symbols.js +2 -3
  18. package/dist/agent/semantic-symbols.js.map +1 -1
  19. package/dist/agent/type-hierarchy.js +2 -4
  20. package/dist/agent/type-hierarchy.js.map +1 -1
  21. package/dist/agent/workspace-symbols.d.ts.map +1 -1
  22. package/dist/agent/workspace-symbols.js +2 -3
  23. package/dist/agent/workspace-symbols.js.map +1 -1
  24. package/dist/agent-tools.d.ts +0 -4
  25. package/dist/agent-tools.d.ts.map +1 -1
  26. package/dist/agent-tools.js +3 -6
  27. package/dist/agent-tools.js.map +1 -1
  28. package/dist/analysis-summary.d.ts +8 -4
  29. package/dist/analysis-summary.d.ts.map +1 -1
  30. package/dist/analysis-summary.js +15 -66
  31. package/dist/analysis-summary.js.map +1 -1
  32. package/dist/bin/cli.js +14417 -16886
  33. package/dist/bin/query-index-worker.js +229 -99
  34. package/dist/cli/command-table.d.ts.map +1 -1
  35. package/dist/cli/command-table.js +9 -17
  36. package/dist/cli/command-table.js.map +1 -1
  37. package/dist/cli/context.js +10 -10
  38. package/dist/cli/context.js.map +1 -1
  39. package/dist/cli/drift.d.ts +0 -2
  40. package/dist/cli/drift.d.ts.map +1 -1
  41. package/dist/cli/drift.js +0 -1
  42. package/dist/cli/drift.js.map +1 -1
  43. package/dist/cli/graph-delta.d.ts +0 -2
  44. package/dist/cli/graph-delta.d.ts.map +1 -1
  45. package/dist/cli/graph-delta.js +0 -4
  46. package/dist/cli/graph-delta.js.map +1 -1
  47. package/dist/cli/graph.d.ts +0 -3
  48. package/dist/cli/graph.d.ts.map +1 -1
  49. package/dist/cli/graph.js +4 -14
  50. package/dist/cli/graph.js.map +1 -1
  51. package/dist/cli/help.d.ts +34 -34
  52. package/dist/cli/help.d.ts.map +1 -1
  53. package/dist/cli/help.js +6 -13
  54. package/dist/cli/help.js.map +1 -1
  55. package/dist/cli/impact.d.ts +0 -2
  56. package/dist/cli/impact.d.ts.map +1 -1
  57. package/dist/cli/impact.js +0 -1
  58. package/dist/cli/impact.js.map +1 -1
  59. package/dist/cli/index.d.ts +0 -2
  60. package/dist/cli/index.d.ts.map +1 -1
  61. package/dist/cli/index.js +5 -6
  62. package/dist/cli/index.js.map +1 -1
  63. package/dist/cli/inspect.d.ts +0 -2
  64. package/dist/cli/inspect.d.ts.map +1 -1
  65. package/dist/cli/inspect.js +5 -8
  66. package/dist/cli/inspect.js.map +1 -1
  67. package/dist/cli/invocation-context.d.ts +0 -3
  68. package/dist/cli/invocation-context.d.ts.map +1 -1
  69. package/dist/cli/invocation-context.js +4 -16
  70. package/dist/cli/invocation-context.js.map +1 -1
  71. package/dist/cli/navigation.d.ts +0 -2
  72. package/dist/cli/navigation.d.ts.map +1 -1
  73. package/dist/cli/navigation.js +0 -1
  74. package/dist/cli/navigation.js.map +1 -1
  75. package/dist/cli/options.d.ts.map +1 -1
  76. package/dist/cli/options.js +2 -12
  77. package/dist/cli/options.js.map +1 -1
  78. package/dist/cli/review.d.ts +0 -2
  79. package/dist/cli/review.d.ts.map +1 -1
  80. package/dist/cli/review.js +0 -5
  81. package/dist/cli/review.js.map +1 -1
  82. package/dist/cli/root-policy.d.ts +0 -2
  83. package/dist/cli/root-policy.d.ts.map +1 -1
  84. package/dist/cli/root-policy.js +0 -8
  85. package/dist/cli/root-policy.js.map +1 -1
  86. package/dist/cli/server.d.ts.map +1 -1
  87. package/dist/cli/server.js +0 -2
  88. package/dist/cli/server.js.map +1 -1
  89. package/dist/drift/git.d.ts.map +1 -1
  90. package/dist/drift/git.js +0 -1
  91. package/dist/drift/git.js.map +1 -1
  92. package/dist/drift/snapshot.d.ts.map +1 -1
  93. package/dist/drift/snapshot.js +0 -1
  94. package/dist/drift/snapshot.js.map +1 -1
  95. package/dist/drift/types.d.ts +0 -2
  96. package/dist/drift/types.d.ts.map +1 -1
  97. package/dist/drift/types.js.map +1 -1
  98. package/dist/duplicates/unit-cache.d.ts +0 -1
  99. package/dist/duplicates/unit-cache.d.ts.map +1 -1
  100. package/dist/duplicates/unit-cache.js +3 -11
  101. package/dist/duplicates/unit-cache.js.map +1 -1
  102. package/dist/duplicates/units.d.ts +5 -5
  103. package/dist/duplicates/units.d.ts.map +1 -1
  104. package/dist/duplicates/units.js +25 -88
  105. package/dist/duplicates/units.js.map +1 -1
  106. package/dist/graph-builder.d.ts +0 -6
  107. package/dist/graph-builder.d.ts.map +1 -1
  108. package/dist/graph-builder.js +2 -5
  109. package/dist/graph-builder.js.map +1 -1
  110. package/dist/graph-edge-collector.d.ts +1 -6
  111. package/dist/graph-edge-collector.d.ts.map +1 -1
  112. package/dist/graph-edge-collector.js +23 -21
  113. package/dist/graph-edge-collector.js.map +1 -1
  114. package/dist/graphs/edge-resolution.d.ts +1 -1
  115. package/dist/graphs/edge-resolution.d.ts.map +1 -1
  116. package/dist/graphs/edge-resolution.js +22 -98
  117. package/dist/graphs/edge-resolution.js.map +1 -1
  118. package/dist/graphs/specifiers.d.ts +4 -13
  119. package/dist/graphs/specifiers.d.ts.map +1 -1
  120. package/dist/graphs/specifiers.js +76 -173
  121. package/dist/graphs/specifiers.js.map +1 -1
  122. package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts +12 -3
  123. package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts.map +1 -1
  124. package/dist/graphs/symbol-graph-detailed/edge-passes.js +315 -177
  125. package/dist/graphs/symbol-graph-detailed/edge-passes.js.map +1 -1
  126. package/dist/graphs/symbol-graph-detailed/import-aliases.d.ts.map +1 -1
  127. package/dist/graphs/symbol-graph-detailed/import-aliases.js +11 -0
  128. package/dist/graphs/symbol-graph-detailed/import-aliases.js.map +1 -1
  129. package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts +25 -22
  130. package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts.map +1 -1
  131. package/dist/graphs/symbol-graph-detailed/receiver-calls.js +216 -147
  132. package/dist/graphs/symbol-graph-detailed/receiver-calls.js.map +1 -1
  133. package/dist/graphs/symbol-graph-detailed.d.ts.map +1 -1
  134. package/dist/graphs/symbol-graph-detailed.js +80 -71
  135. package/dist/graphs/symbol-graph-detailed.js.map +1 -1
  136. package/dist/graphs/symbol-graph.d.ts +1 -1
  137. package/dist/graphs/symbol-graph.d.ts.map +1 -1
  138. package/dist/graphs/symbol-graph.js +12 -4
  139. package/dist/graphs/symbol-graph.js.map +1 -1
  140. package/dist/graphs/types.d.ts +0 -4
  141. package/dist/graphs/types.d.ts.map +1 -1
  142. package/dist/graphs.d.ts +1 -1
  143. package/dist/graphs.d.ts.map +1 -1
  144. package/dist/impact/analyzer.d.ts.map +1 -1
  145. package/dist/impact/analyzer.js +94 -1
  146. package/dist/impact/analyzer.js.map +1 -1
  147. package/dist/impact/call-compatibility.d.ts.map +1 -1
  148. package/dist/impact/call-compatibility.js +39 -43
  149. package/dist/impact/call-compatibility.js.map +1 -1
  150. package/dist/impact/transitive.d.ts +6 -2
  151. package/dist/impact/transitive.d.ts.map +1 -1
  152. package/dist/impact/transitive.js +23 -11
  153. package/dist/impact/transitive.js.map +1 -1
  154. package/dist/index.d.ts +2 -2
  155. package/dist/index.d.ts.map +1 -1
  156. package/dist/index.js.map +1 -1
  157. package/dist/indexer/build-cache/module-cache.d.ts +1 -1
  158. package/dist/indexer/build-cache/module-cache.d.ts.map +1 -1
  159. package/dist/indexer/build-cache/module-cache.js +67 -12
  160. package/dist/indexer/build-cache/module-cache.js.map +1 -1
  161. package/dist/indexer/build-cache/options.d.ts +17 -2
  162. package/dist/indexer/build-cache/options.d.ts.map +1 -1
  163. package/dist/indexer/build-cache/options.js +19 -29
  164. package/dist/indexer/build-cache/options.js.map +1 -1
  165. package/dist/indexer/build-cache/project-snapshot.d.ts +3 -4
  166. package/dist/indexer/build-cache/project-snapshot.d.ts.map +1 -1
  167. package/dist/indexer/build-cache/project-snapshot.js +53 -62
  168. package/dist/indexer/build-cache/project-snapshot.js.map +1 -1
  169. package/dist/indexer/build-cache/reports.d.ts +0 -2
  170. package/dist/indexer/build-cache/reports.d.ts.map +1 -1
  171. package/dist/indexer/build-cache/reports.js +0 -97
  172. package/dist/indexer/build-cache/reports.js.map +1 -1
  173. package/dist/indexer/build-cache.d.ts +1 -1
  174. package/dist/indexer/build-cache.d.ts.map +1 -1
  175. package/dist/indexer/build-cache.js +1 -1
  176. package/dist/indexer/build-cache.js.map +1 -1
  177. package/dist/indexer/build-index.d.ts.map +1 -1
  178. package/dist/indexer/build-index.js +72 -58
  179. package/dist/indexer/build-index.js.map +1 -1
  180. package/dist/indexer/build-workers.d.ts.map +1 -1
  181. package/dist/indexer/build-workers.js +9 -9
  182. package/dist/indexer/build-workers.js.map +1 -1
  183. package/dist/indexer/callable-identity.d.ts +24 -0
  184. package/dist/indexer/callable-identity.d.ts.map +1 -0
  185. package/dist/indexer/callable-identity.js +111 -0
  186. package/dist/indexer/callable-identity.js.map +1 -0
  187. package/dist/indexer/compilation-units.d.ts +2 -0
  188. package/dist/indexer/compilation-units.d.ts.map +1 -1
  189. package/dist/indexer/compilation-units.js +20 -18
  190. package/dist/indexer/compilation-units.js.map +1 -1
  191. package/dist/indexer/cpp-callables.d.ts +12 -7
  192. package/dist/indexer/cpp-callables.d.ts.map +1 -1
  193. package/dist/indexer/cpp-callables.js +42 -34
  194. package/dist/indexer/cpp-callables.js.map +1 -1
  195. package/dist/indexer/declaration-visibility.d.ts +7 -0
  196. package/dist/indexer/declaration-visibility.d.ts.map +1 -1
  197. package/dist/indexer/declaration-visibility.js +22 -0
  198. package/dist/indexer/declaration-visibility.js.map +1 -1
  199. package/dist/indexer/declarations.d.ts.map +1 -1
  200. package/dist/indexer/declarations.js +32 -7
  201. package/dist/indexer/declarations.js.map +1 -1
  202. package/dist/indexer/expand-star-imports.d.ts +6 -1
  203. package/dist/indexer/expand-star-imports.d.ts.map +1 -1
  204. package/dist/indexer/expand-star-imports.js +120 -48
  205. package/dist/indexer/expand-star-imports.js.map +1 -1
  206. package/dist/indexer/finalize.d.ts.map +1 -1
  207. package/dist/indexer/finalize.js +0 -1
  208. package/dist/indexer/finalize.js.map +1 -1
  209. package/dist/indexer/import-resolution-tables.d.ts +72 -0
  210. package/dist/indexer/import-resolution-tables.d.ts.map +1 -0
  211. package/dist/indexer/import-resolution-tables.js +147 -0
  212. package/dist/indexer/import-resolution-tables.js.map +1 -0
  213. package/dist/indexer/import-types.d.ts +18 -1
  214. package/dist/indexer/import-types.d.ts.map +1 -1
  215. package/dist/indexer/import-types.js.map +1 -1
  216. package/dist/indexer/imports/context.d.ts +6 -1
  217. package/dist/indexer/imports/context.d.ts.map +1 -1
  218. package/dist/indexer/imports/import-binding-tables.d.ts +3 -2
  219. package/dist/indexer/imports/import-binding-tables.d.ts.map +1 -1
  220. package/dist/indexer/imports/import-binding-tables.js +19 -22
  221. package/dist/indexer/imports/import-binding-tables.js.map +1 -1
  222. package/dist/indexer/imports/native-captures.d.ts.map +1 -1
  223. package/dist/indexer/imports/native-captures.js +10 -4
  224. package/dist/indexer/imports/native-captures.js.map +1 -1
  225. package/dist/indexer/imports/python.d.ts.map +1 -1
  226. package/dist/indexer/imports/python.js +46 -81
  227. package/dist/indexer/imports/python.js.map +1 -1
  228. package/dist/indexer/imports/text-import-extractors.d.ts.map +1 -1
  229. package/dist/indexer/imports/text-import-extractors.js +17 -7
  230. package/dist/indexer/imports/text-import-extractors.js.map +1 -1
  231. package/dist/indexer/imports.d.ts +3 -4
  232. package/dist/indexer/imports.d.ts.map +1 -1
  233. package/dist/indexer/imports.js +106 -81
  234. package/dist/indexer/imports.js.map +1 -1
  235. package/dist/indexer/incremental-plan.d.ts.map +1 -1
  236. package/dist/indexer/incremental-plan.js +27 -11
  237. package/dist/indexer/incremental-plan.js.map +1 -1
  238. package/dist/indexer/locals-and-exports.d.ts +1 -2
  239. package/dist/indexer/locals-and-exports.d.ts.map +1 -1
  240. package/dist/indexer/locals-and-exports.js +121 -43
  241. package/dist/indexer/locals-and-exports.js.map +1 -1
  242. package/dist/indexer/member-selection.d.ts +46 -0
  243. package/dist/indexer/member-selection.d.ts.map +1 -0
  244. package/dist/indexer/member-selection.js +169 -0
  245. package/dist/indexer/member-selection.js.map +1 -0
  246. package/dist/indexer/name-lookup-policies/c-family.d.ts +1 -1
  247. package/dist/indexer/name-lookup-policies/c-family.d.ts.map +1 -1
  248. package/dist/indexer/name-lookup-policies/c-family.js +30 -10
  249. package/dist/indexer/name-lookup-policies/c-family.js.map +1 -1
  250. package/dist/indexer/name-lookup-policies/implicit-self.d.ts.map +1 -1
  251. package/dist/indexer/name-lookup-policies/implicit-self.js +14 -8
  252. package/dist/indexer/name-lookup-policies/implicit-self.js.map +1 -1
  253. package/dist/indexer/name-lookup-policies/index.d.ts.map +1 -1
  254. package/dist/indexer/name-lookup-policies/index.js +29 -3
  255. package/dist/indexer/name-lookup-policies/index.js.map +1 -1
  256. package/dist/indexer/name-lookup-policies/php.d.ts.map +1 -1
  257. package/dist/indexer/name-lookup-policies/php.js +9 -2
  258. package/dist/indexer/name-lookup-policies/php.js.map +1 -1
  259. package/dist/indexer/name-resolution-types.d.ts +2 -0
  260. package/dist/indexer/name-resolution-types.d.ts.map +1 -1
  261. package/dist/indexer/name-resolution.d.ts +5 -0
  262. package/dist/indexer/name-resolution.d.ts.map +1 -1
  263. package/dist/indexer/name-resolution.js +17 -2
  264. package/dist/indexer/name-resolution.js.map +1 -1
  265. package/dist/indexer/navigation-cpp.d.ts +8 -0
  266. package/dist/indexer/navigation-cpp.d.ts.map +1 -1
  267. package/dist/indexer/navigation-cpp.js +283 -2
  268. package/dist/indexer/navigation-cpp.js.map +1 -1
  269. package/dist/indexer/navigation-goto.d.ts +11 -2
  270. package/dist/indexer/navigation-goto.d.ts.map +1 -1
  271. package/dist/indexer/navigation-goto.js +675 -333
  272. package/dist/indexer/navigation-goto.js.map +1 -1
  273. package/dist/indexer/navigation-local.d.ts +4 -1
  274. package/dist/indexer/navigation-local.d.ts.map +1 -1
  275. package/dist/indexer/navigation-local.js +43 -23
  276. package/dist/indexer/navigation-local.js.map +1 -1
  277. package/dist/indexer/navigation-provenance.d.ts +1 -1
  278. package/dist/indexer/navigation-provenance.d.ts.map +1 -1
  279. package/dist/indexer/navigation-provenance.js +4 -13
  280. package/dist/indexer/navigation-provenance.js.map +1 -1
  281. package/dist/indexer/navigation-references.d.ts +1 -1
  282. package/dist/indexer/navigation-references.d.ts.map +1 -1
  283. package/dist/indexer/navigation-references.js +44 -16
  284. package/dist/indexer/navigation-references.js.map +1 -1
  285. package/dist/indexer/navigation-resolve.d.ts +13 -0
  286. package/dist/indexer/navigation-resolve.d.ts.map +1 -1
  287. package/dist/indexer/navigation-resolve.js +158 -5
  288. package/dist/indexer/navigation-resolve.js.map +1 -1
  289. package/dist/indexer/navigation.d.ts +2 -1
  290. package/dist/indexer/navigation.d.ts.map +1 -1
  291. package/dist/indexer/navigation.js +82 -57
  292. package/dist/indexer/navigation.js.map +1 -1
  293. package/dist/indexer/parse-context.d.ts +2 -3
  294. package/dist/indexer/parse-context.d.ts.map +1 -1
  295. package/dist/indexer/parse-context.js +8 -21
  296. package/dist/indexer/parse-context.js.map +1 -1
  297. package/dist/indexer/reference-candidates.d.ts.map +1 -1
  298. package/dist/indexer/reference-candidates.js +13 -7
  299. package/dist/indexer/reference-candidates.js.map +1 -1
  300. package/dist/indexer/reference-context.d.ts.map +1 -1
  301. package/dist/indexer/reference-context.js +4 -1
  302. package/dist/indexer/reference-context.js.map +1 -1
  303. package/dist/indexer/scope-nodes.d.ts.map +1 -1
  304. package/dist/indexer/scope-nodes.js +5 -0
  305. package/dist/indexer/scope-nodes.js.map +1 -1
  306. package/dist/indexer/scope-types.d.ts +4 -0
  307. package/dist/indexer/scope-types.d.ts.map +1 -1
  308. package/dist/indexer/scope.d.ts +2 -3
  309. package/dist/indexer/scope.d.ts.map +1 -1
  310. package/dist/indexer/scope.js +85 -13
  311. package/dist/indexer/scope.js.map +1 -1
  312. package/dist/indexer/shared-owner-identity.js +1 -1
  313. package/dist/indexer/shared-owner-identity.js.map +1 -1
  314. package/dist/indexer/star-import-precedence.d.ts +6 -7
  315. package/dist/indexer/star-import-precedence.d.ts.map +1 -1
  316. package/dist/indexer/star-import-precedence.js +18 -12
  317. package/dist/indexer/star-import-precedence.js.map +1 -1
  318. package/dist/indexer/ts-callables.d.ts +15 -24
  319. package/dist/indexer/ts-callables.d.ts.map +1 -1
  320. package/dist/indexer/ts-callables.js +44 -75
  321. package/dist/indexer/ts-callables.js.map +1 -1
  322. package/dist/indexer/types.d.ts +23 -26
  323. package/dist/indexer/types.d.ts.map +1 -1
  324. package/dist/indexer/types.js +4 -0
  325. package/dist/indexer/types.js.map +1 -1
  326. package/dist/indexer.d.ts +2 -7
  327. package/dist/indexer.d.ts.map +1 -1
  328. package/dist/indexer.js.map +1 -1
  329. package/dist/languages/all.d.ts +1 -0
  330. package/dist/languages/all.d.ts.map +1 -1
  331. package/dist/languages/all.js +1 -0
  332. package/dist/languages/all.js.map +1 -1
  333. package/dist/languages/callable-arity.d.ts +21 -0
  334. package/dist/languages/callable-arity.d.ts.map +1 -1
  335. package/dist/languages/callable-arity.js +17 -0
  336. package/dist/languages/callable-arity.js.map +1 -1
  337. package/dist/languages/definitions/terraform.d.ts +9 -0
  338. package/dist/languages/definitions/terraform.d.ts.map +1 -0
  339. package/dist/languages/definitions/terraform.js +84 -0
  340. package/dist/languages/definitions/terraform.js.map +1 -0
  341. package/dist/languages/definitions/zig.d.ts.map +1 -1
  342. package/dist/languages/definitions/zig.js +6 -0
  343. package/dist/languages/definitions/zig.js.map +1 -1
  344. package/dist/languages.d.ts +1 -0
  345. package/dist/languages.d.ts.map +1 -1
  346. package/dist/languages.js +1 -0
  347. package/dist/languages.js.map +1 -1
  348. package/dist/lifecycle/manifest.d.ts.map +1 -1
  349. package/dist/lifecycle/manifest.js +0 -1
  350. package/dist/lifecycle/manifest.js.map +1 -1
  351. package/dist/native/byte-index.d.ts +6 -0
  352. package/dist/native/byte-index.d.ts.map +1 -1
  353. package/dist/native/byte-index.js +11 -6
  354. package/dist/native/byte-index.js.map +1 -1
  355. package/dist/native/contracts.d.ts +2 -3
  356. package/dist/native/contracts.d.ts.map +1 -1
  357. package/dist/native/execution.d.ts +9 -9
  358. package/dist/native/execution.d.ts.map +1 -1
  359. package/dist/native/execution.js +37 -77
  360. package/dist/native/execution.js.map +1 -1
  361. package/dist/native/js-bridge.d.ts +2 -15
  362. package/dist/native/js-bridge.d.ts.map +1 -1
  363. package/dist/native/js-bridge.js +2 -15
  364. package/dist/native/js-bridge.js.map +1 -1
  365. package/dist/native/query-results.js +2 -2
  366. package/dist/native/query-results.js.map +1 -1
  367. package/dist/native/runtime.d.ts +12 -12
  368. package/dist/native/runtime.d.ts.map +1 -1
  369. package/dist/native/runtime.js +24 -69
  370. package/dist/native/runtime.js.map +1 -1
  371. package/dist/native/tree-sitter-native.d.ts +3 -3
  372. package/dist/native/tree-sitter-native.d.ts.map +1 -1
  373. package/dist/native/tree-sitter-native.js +2 -2
  374. package/dist/native/tree-sitter-native.js.map +1 -1
  375. package/dist/presets.d.ts.map +1 -1
  376. package/dist/presets.js +0 -4
  377. package/dist/presets.js.map +1 -1
  378. package/dist/review.d.ts.map +1 -1
  379. package/dist/review.js +2 -20
  380. package/dist/review.js.map +1 -1
  381. package/dist/session.d.ts.map +1 -1
  382. package/dist/session.js +0 -5
  383. package/dist/session.js.map +1 -1
  384. package/dist/sql/navigation.js +1 -1
  385. package/dist/sql/navigation.js.map +1 -1
  386. package/dist/terraform/navigation.d.ts +20 -0
  387. package/dist/terraform/navigation.d.ts.map +1 -0
  388. package/dist/terraform/navigation.js +142 -0
  389. package/dist/terraform/navigation.js.map +1 -0
  390. package/dist/terraform/resolution.d.ts +82 -0
  391. package/dist/terraform/resolution.d.ts.map +1 -0
  392. package/dist/terraform/resolution.js +324 -0
  393. package/dist/terraform/resolution.js.map +1 -0
  394. package/dist/terraform/syntax.d.ts +109 -0
  395. package/dist/terraform/syntax.d.ts.map +1 -0
  396. package/dist/terraform/syntax.js +441 -0
  397. package/dist/terraform/syntax.js.map +1 -0
  398. package/dist/util/bloom-filter.d.ts +1 -0
  399. package/dist/util/bloom-filter.d.ts.map +1 -1
  400. package/dist/util/bloom-filter.js +3 -0
  401. package/dist/util/bloom-filter.js.map +1 -1
  402. package/dist/util/glob.d.ts +32 -0
  403. package/dist/util/glob.d.ts.map +1 -0
  404. package/dist/util/glob.js +137 -0
  405. package/dist/util/glob.js.map +1 -0
  406. package/dist/util/member-access-tables.d.ts.map +1 -1
  407. package/dist/util/member-access-tables.js +5 -0
  408. package/dist/util/member-access-tables.js.map +1 -1
  409. package/dist/util/member-access.d.ts.map +1 -1
  410. package/dist/util/member-access.js +5 -2
  411. package/dist/util/member-access.js.map +1 -1
  412. package/dist/util/project-files.d.ts +2 -10
  413. package/dist/util/project-files.d.ts.map +1 -1
  414. package/dist/util/project-files.js +32 -52
  415. package/dist/util/project-files.js.map +1 -1
  416. package/dist/util/python-type-checking.d.ts +18 -0
  417. package/dist/util/python-type-checking.d.ts.map +1 -0
  418. package/dist/util/python-type-checking.js +160 -0
  419. package/dist/util/python-type-checking.js.map +1 -0
  420. package/dist/util/resolution/jvm.d.ts +7 -3
  421. package/dist/util/resolution/jvm.d.ts.map +1 -1
  422. package/dist/util/resolution/jvm.js +56 -38
  423. package/dist/util/resolution/jvm.js.map +1 -1
  424. package/dist/util/resolution/rust.d.ts +0 -1
  425. package/dist/util/resolution/rust.d.ts.map +1 -1
  426. package/dist/util/resolution/rust.js +0 -9
  427. package/dist/util/resolution/rust.js.map +1 -1
  428. package/dist/util/resolution/specifier-targets.d.ts +44 -0
  429. package/dist/util/resolution/specifier-targets.d.ts.map +1 -0
  430. package/dist/util/resolution/specifier-targets.js +157 -0
  431. package/dist/util/resolution/specifier-targets.js.map +1 -0
  432. package/dist/util/resolution/terraform.d.ts +18 -0
  433. package/dist/util/resolution/terraform.d.ts.map +1 -0
  434. package/dist/util/resolution/terraform.js +64 -0
  435. package/dist/util/resolution/terraform.js.map +1 -0
  436. package/dist/util/resolution.d.ts.map +1 -1
  437. package/dist/util/resolution.js +5 -10
  438. package/dist/util/resolution.js.map +1 -1
  439. package/dist/util/specifiers.d.ts +9 -1
  440. package/dist/util/specifiers.d.ts.map +1 -1
  441. package/dist/util/specifiers.js +27 -8
  442. package/dist/util/specifiers.js.map +1 -1
  443. package/dist/util/trivia-tables.d.ts.map +1 -1
  444. package/dist/util/trivia-tables.js +9 -0
  445. package/dist/util/trivia-tables.js.map +1 -1
  446. package/dist/util/trivia.d.ts.map +1 -1
  447. package/dist/util/trivia.js +49 -30
  448. package/dist/util/trivia.js.map +1 -1
  449. package/dist/util/workspace.d.ts.map +1 -1
  450. package/dist/util/workspace.js +32 -4
  451. package/dist/util/workspace.js.map +1 -1
  452. package/package.json +6 -8
@@ -1,25 +1,24 @@
1
1
  import { SymbolKind } from "../../indexer/types.js";
2
- import { cppCallableShapeForNode } from "../../indexer/cpp-callables.js";
3
2
  import { getCompilationUnitPeers } from "../../indexer/compilation-units.js";
4
3
  import { isExportedDeclaration, isGoExportedMemberName, isSwiftCrossFileHiddenSharedOwnerMember, isSwiftFileHiddenSharedOwnerMember, } from "../../indexer/declaration-visibility.js";
5
4
  import { resolveCppQualifiedMemberContainer } from "../../indexer/navigation-cpp.js";
6
- import { cppQualifiedOwnerHasImplicitThis, findTypeScriptNamespaceMemberCandidates, innermostNamespaceImport, isDirectKeywordMemberDeclaration, memberAcceptsCallAt, resolvePhpObjectCreationTarget, resolveRubyVisibleConstant, resolveSharedOwnerContainers, } from "../../indexer/navigation-goto.js";
5
+ import { cppQualifiedOwnerHasImplicitThis, findTypeScriptNamespaceMemberCandidates, innermostNamespaceImport, isDirectKeywordMemberDeclaration, memberAcceptsCallAt, resolvePhpObjectCreationTarget, resolveRubyVisibleConstant, resolveSharedOwnerContainers, supportsDeclaredFieldChains, } from "../../indexer/navigation-goto.js";
7
6
  import { findClosestScopeBinding } from "../../indexer/navigation-local.js";
8
7
  import { findPhpImportAlias, inferPhpQualifiedReferenceImportType } from "../../indexer/navigation-php.js";
9
8
  import { cjsRequireValueBinding, resolveImportTypeMember, resolvePhpExportByImportType, } from "../../indexer/navigation-resolve.js";
9
+ import { selectMember } from "../../indexer/member-selection.js";
10
10
  import { effectiveExplicitBinding } from "../../indexer/star-import-precedence.js";
11
- import { typescriptSelectOverloadCandidate } from "../../indexer/ts-callables.js";
12
11
  import { isSwiftConstrainedExtension, isSwiftExtensionContainer, selectCsharpPartialRepresentative, } from "../../indexer/shared-owner-identity.js";
13
12
  import { isJsTsLanguage } from "../../languages/js-family.js";
14
- import { getCallableArity, getCallArgumentCount, memberLookupBinding } from "../../languages/callable-arity.js";
13
+ import { getCallArgumentCount, memberLookupBinding } from "../../languages/callable-arity.js";
15
14
  import { sliceText, toRange } from "../../util/ast.js";
16
15
  import { getMemberAccessParts, isMemberAccessNode, rustTokenTreeHoldsExpressions, rustTokenTreeNameFollowsSeparator, } from "../../util/member-access.js";
17
16
  import { foldPhpIdentifierCase } from "../../util/identifiers.js";
18
- import { MEMBER_ACCESS_ROWS, keywordReceiverKind, } from "../../util/member-access-tables.js";
17
+ import { MEMBER_ACCESS_ROWS, } from "../../util/member-access-tables.js";
19
18
  import { fileIdentityKey } from "../../util/paths.js";
20
19
  import { defNodeId, nodeForDef } from "../symbol-graph.js";
21
20
  import { collectNodesByType, declarationMemberArity, findFirstNodeByType, isIdentifierType } from "./ast.js";
22
- import { CALL_ARGUMENT_NODE_TYPES, classifyReceiver, constructionTypeName, declarationIsStaticEquivalent, declarationNodeIsStatic, cppOutOfLineOwnerPath, cppOutOfLineMemberDeclarationNode, cppQualifiedNameSegments, csharpDottedNameRoot, declaresMembers, isUnprovenHeritageExpression, kotlinExtensionReceiverTypeNode, memberContainerDef, nearestMemberContainer, nodeInStaticMemberContext, phpObjectCreationKeyword, receiverCallAccess, rustImplSelfTypeNode, supportsImplicitSelfMemberCalls, supportsReceiverMemberOverloads, receiverConstructorExpression, importTypeQuerySpecifier, } from "./receiver-calls.js";
21
+ import { CALL_ARGUMENT_NODE_TYPES, classifyReceiver, constructionTypeName, declarationIsStaticEquivalent, declarationNodeIsStatic, cppOutOfLineOwnerPath, cppOutOfLineMemberDeclarationNode, cppQualifiedNameSegments, declaresMembers, isUnprovenHeritageExpression, kotlinExtensionReceiverTypeNode, memberContainerDef, nearestMemberContainer, nodeInStaticMemberContext, phpObjectCreationKeyword, receiverCallAccess, rustImplSelfTypeNode, supportsImplicitSelfMemberCalls, supportsReceiverMemberOverloads, importTypeQuerySpecifier, } from "./receiver-calls.js";
23
22
  function ensureNode(context, def) {
24
23
  const id = defNodeId(def);
25
24
  if (!context.nodes.has(id))
@@ -44,40 +43,31 @@ function markMemberArity(context, id, declarationNode) {
44
43
  if (node)
45
44
  node.memberArity = arity;
46
45
  }
47
- function cppShapeNode(node) {
48
- return node.type === "function_declarator" ? node : (findFirstNodeByType(node, "function_declarator") ?? node);
49
- }
50
- function mergeCppCallableShapes(...shapes) {
51
- const present = shapes.filter((shape) => !!shape);
52
- if (!present.length)
53
- return undefined;
54
- let min = present[0].minArity;
55
- let max = present[0].maxArity;
56
- for (const shape of present.slice(1)) {
57
- min = Math.min(min, shape.minArity);
58
- if (max === null || shape.maxArity === null)
59
- max = null;
46
+ function mergeCppCallableShapes(...defs) {
47
+ let merged;
48
+ for (const def of defs) {
49
+ const arity = def?.callable?.arity;
50
+ if (!arity)
51
+ continue;
52
+ if (!merged) {
53
+ merged = { min: arity.minArgs, max: arity.maxArgs };
54
+ continue;
55
+ }
56
+ merged.min = Math.min(merged.min, arity.minArgs);
57
+ if (merged.max === null || arity.maxArgs === null)
58
+ merged.max = null;
60
59
  else
61
- max = Math.max(max, shape.maxArity);
60
+ merged.max = Math.max(merged.max, arity.maxArgs);
62
61
  }
63
- return { min, max };
62
+ return merged;
64
63
  }
65
- /**
66
- * Accepted explicit-argument range of a member declaration from the shared callable
67
- * facts (default parameters, varargs, explicit receivers), or undefined when the
68
- * declaration shape is unknown or the language does not select members by call arity.
69
- * The binding follows the call form member lookup resolves (see `memberLookupBinding`).
70
- */
71
- function acceptedMemberArityRange(context, declarationNode, source) {
64
+ /** The member call form determines whether a declared receiver takes an argument. */
65
+ function acceptedMemberArityRange(context, def) {
72
66
  if (!supportsReceiverMemberOverloads(context.sup.id))
73
67
  return undefined;
74
- const arity = getCallableArity({
75
- languageId: context.sup.id,
76
- source,
77
- declaration: declarationNode,
78
- binding: memberLookupBinding(context.sup.id),
79
- });
80
- return arity ? { min: arity.minArgs, max: arity.maxArgs } : undefined;
68
+ const callable = def.callable;
69
+ const range = memberLookupBinding(context.sup.id) === "unbound" ? (callable?.unboundArity ?? callable?.arity) : callable?.arity;
70
+ return range ? { min: range.minArgs, max: range.maxArgs } : undefined;
81
71
  }
82
72
  function recordMemberLookupIdentity(context, definitionId, memberId, memberScope, arityRange) {
83
73
  context.receiverMemberScopes.set(definitionId, memberScope);
@@ -115,6 +105,7 @@ function tryResolveNode(context, node, fromId, label) {
115
105
  if (isIdentifierType(context.sup, node.type) ||
116
106
  node.type === "type_identifier" ||
117
107
  (context.sup.id === "csharp" && (node.type === "qualified_name" || node.type === "alias_qualified_name")) ||
108
+ (context.sup.id === "php" && (node.type === "qualified_name" || node.type === "relative_name")) ||
118
109
  (context.sup.id === "cpp" && (node.type === "operator_name" || node.type === "destructor_name"))) {
119
110
  const name = sliceText(node, context.source);
120
111
  const target = context.resolveIdentifier(name, node);
@@ -141,7 +132,7 @@ function tryResolveNode(context, node, fromId, label) {
141
132
  * navigation's refusals inside token trees.
142
133
  */
143
134
  function recordRustMacroArgumentCalls(context, tokenTree, fromId) {
144
- if (context.sup.id !== "rust" || !rustTokenTreeHoldsExpressions(tokenTree))
135
+ if (!rustTokenTreeHoldsExpressions(tokenTree))
145
136
  return;
146
137
  const children = tokenTree.namedChildren;
147
138
  for (let index = 0; index + 1 < children.length; index += 1) {
@@ -189,8 +180,6 @@ function getNewTarget(node) {
189
180
  return namedType ?? node.child(0);
190
181
  }
191
182
  export function emitPythonDecoratorEdges(context, rootNode) {
192
- if (context.sup.id !== "python")
193
- return;
194
183
  const addDecoratorUses = (node) => {
195
184
  if (node.type === "decorated_definition") {
196
185
  const fn = node.namedChildren.find((child) => child.type === "function_definition");
@@ -293,9 +282,10 @@ export async function emitMemberOwnershipEdges(context, functionNodes, classNode
293
282
  if (memberId !== definitionId)
294
283
  markMemberArity(context, memberId, arityNode);
295
284
  const memberScope = memberScopeForDefinition(context, fn, owner.cppOutOfLine, outOfLineDeclaration);
285
+ const outOfLineMember = outOfLineDeclaration ? memberDef : undefined;
296
286
  const arityRange = context.sup.id === "cpp"
297
- ? mergeCppCallableShapes(cppCallableShapeForNode(cppShapeNode(fn.node)), outOfLineDeclaration ? cppCallableShapeForNode(cppShapeNode(outOfLineDeclaration.node)) : undefined)
298
- : acceptedMemberArityRange(context, arityNode, outOfLineDeclaration?.source ?? context.source);
287
+ ? mergeCppCallableShapes(fn.def, outOfLineMember)
288
+ : acceptedMemberArityRange(context, memberDef);
299
289
  recordMemberLookupIdentity(context, definitionId, memberId, memberScope, arityRange);
300
290
  recordDefEdge(context, definitionId, owner.def, "member_of");
301
291
  await emitSharedOwnerMembershipEdges(context, owner, definitionId, fn.node);
@@ -493,7 +483,10 @@ function unwrapGoNamedType(node) {
493
483
  }
494
484
  /** Type-like defs only, so a PHP `use function` alias cannot steal `Example::m()`. */
495
485
  function resolveNamedType(context, name, node, rubyConstructed = false) {
496
- if (context.sup.id === "go" && context.optionalMemberTypes.has(node.type)) {
486
+ // A Go composite literal or Zig struct initializer can name a qualified cross-file type
487
+ // (`pkg.Type{}` / `ns.Type{}`); the receiver's typeName is then dotted text, not one
488
+ // identifier, so resolve the chain directly instead of treating it as a plain name.
489
+ if ((context.sup.id === "go" || context.sup.id === "zig") && context.optionalMemberTypes.has(node.type)) {
497
490
  const qualified = context.resolveMemberChainTarget(node);
498
491
  return qualified && declaresMembers(qualified) ? qualified : null;
499
492
  }
@@ -508,13 +501,109 @@ function resolveNamedType(context, name, node, rubyConstructed = false) {
508
501
  const imported = context.aliasToTargetDef.get(name);
509
502
  if (imported && declaresMembers(imported))
510
503
  return imported;
511
- // Only a constructed `Klass.new` type uses Ruby's bare-constant visibility, and
512
- // only when this file does not already have several classes of that name.
513
- // Inheritance names stay on resolveIdentifier so an unproven superclass is not invented.
514
- if (!rubyConstructed || typed.length > 1)
504
+ // A constructed `Klass.new` type, or (Ruby only) a bare capitalized constant receiver
505
+ // (`Calc.add(1, 2)`), uses Ruby's bare-constant visibility, and only when this file does not
506
+ // already have several classes of that name. Inheritance names stay on resolveIdentifier so
507
+ // an unproven superclass is not invented.
508
+ const triesRubyVisibleConstant = rubyConstructed || context.sup.id === "ruby";
509
+ if (!triesRubyVisibleConstant || typed.length > 1)
515
510
  return null;
516
511
  return resolveRubyVisibleConstant(context.index, context.moduleEntry, context.sup, name);
517
512
  }
513
+ /**
514
+ * Zig's static-receiver call form (`module.Type.member()`): the receiver is itself a qualified
515
+ * member-access node naming a type through another file's export (`counter.Counter` in
516
+ * `counter.Counter.zero()`). `classifyReceiver` only proves an identifier or keyword receiver,
517
+ * so this resolves the receiver's own chain directly and defers the member lookup through the
518
+ * same cross-file receiver-call pipeline every other member call uses.
519
+ */
520
+ function recordZigQualifiedTypeReceiverCall(context, node, access, fromId) {
521
+ const typeDef = context.resolveMemberChainTarget(access.receiver);
522
+ if (!typeDef || !declaresMembers(typeDef))
523
+ return false;
524
+ const memberName = sliceText(access.property, context.source);
525
+ if (!memberName)
526
+ return false;
527
+ const argumentCount = supportsReceiverMemberOverloads(context.sup.id)
528
+ ? getCallArgumentCount({ languageId: context.sup.id, source: context.source, call: node })
529
+ : null;
530
+ context.receiverCalls.push({
531
+ callerId: fromId,
532
+ ownerId: ensureNode(context, typeDef),
533
+ viaSupertypes: false,
534
+ memberName,
535
+ argumentCount,
536
+ site: { file: context.moduleEntry.file, range: toRange(access.property) },
537
+ memberScope: "any",
538
+ });
539
+ return true;
540
+ }
541
+ /**
542
+ * Go's `d.Base.Run()`: `d.Base` explicitly names an embedded field to reach a promoted method
543
+ * that a derived type's own same-named method would otherwise shadow, Go's equivalent of
544
+ * `super`/`base`. `classifyReceiver` only proves an identifier or keyword receiver, so a
545
+ * dotted `d.Base` receiver is never classified. This resolves `d`'s own type, confirms `Base`
546
+ * is really a nameless embedded field declared on it (not an unrelated named field that merely
547
+ * shares the name), then defers the member lookup through the same cross-file receiver-call
548
+ * pipeline every other member call uses. Limited to a same-file owner declaration: the AST
549
+ * needed to read the field list is only synchronously available there.
550
+ */
551
+ function recordGoEmbeddedFieldReceiverCall(context, access, fromId, hasLexicalBinding) {
552
+ const parts = getMemberAccessParts(context.sup, access.receiver);
553
+ const objectNode = parts.object;
554
+ const fieldNode = parts.property;
555
+ if (!objectNode || !fieldNode || !isIdentifierType(context.sup, fieldNode.type))
556
+ return false;
557
+ const ownerBinding = classifyReceiver(context.sup, objectNode, context.source, null, 0, access.receiver, hasLexicalBinding);
558
+ if (ownerBinding?.kind !== "named-type")
559
+ return false;
560
+ const ownerDef = resolveNamedType(context, ownerBinding.typeName, ownerBinding.typeNode, ownerBinding.constructed);
561
+ if (!ownerDef || fileIdentityKey(ownerDef.file) !== fileIdentityKey(context.moduleEntry.file))
562
+ return false;
563
+ const embeds = MEMBER_ACCESS_ROWS.go?.receiverAncestry?.embeds;
564
+ if (!embeds)
565
+ return false;
566
+ const start = ownerDef.range.start.index ?? 0;
567
+ const nameNode = context.tree.rootNode.descendantForIndex(start, ownerDef.range.end.index ?? start);
568
+ const declaration = nameNode.parent;
569
+ const declaredType = declaration?.childForFieldName("type");
570
+ if (!declaration || !declaredType)
571
+ return false;
572
+ const fieldName = sliceText(fieldNode, context.source);
573
+ for (const rule of embeds) {
574
+ if (declaredType.type !== rule.body)
575
+ continue;
576
+ const list = rule.memberList ? findFirstNodeByType(declaredType, rule.memberList) : declaredType;
577
+ if (!list)
578
+ continue;
579
+ for (const member of list.namedChildren ?? []) {
580
+ if (member.type !== rule.member)
581
+ continue;
582
+ if (rule.nameless && member.childForFieldName("name"))
583
+ continue;
584
+ const specifier = rule.typeField ? member.childForFieldName(rule.typeField) : member;
585
+ if (!specifier || sliceText(specifier, context.source) !== fieldName)
586
+ continue;
587
+ const embeddedDef = context.resolveIdentifier(fieldName, specifier);
588
+ if (!embeddedDef || !declaresMembers(embeddedDef))
589
+ return false;
590
+ const memberName = sliceText(access.property, context.source);
591
+ if (!memberName)
592
+ return false;
593
+ context.receiverCalls.push({
594
+ callerId: fromId,
595
+ ownerId: ensureNode(context, embeddedDef),
596
+ viaSupertypes: false,
597
+ memberName,
598
+ argumentCount: null,
599
+ site: { file: context.moduleEntry.file, range: toRange(access.property) },
600
+ memberScope: "any",
601
+ });
602
+ return true;
603
+ }
604
+ }
605
+ return false;
606
+ }
518
607
  /**
519
608
  * Collection can attach an arrow to any same-name local when the binding site is
520
609
  * not that local (`obj.helper = () => 1` beside `const helper = 1`). Prove that
@@ -572,18 +661,22 @@ function resolveTypeScriptNamespaceMember(context, call, receiverNode, property)
572
661
  const candidates = findTypeScriptNamespaceMemberCandidates(context.moduleEntry.locals, member, receiver, context);
573
662
  if (!candidates.length)
574
663
  return undefined;
575
- return typescriptSelectOverloadCandidate({
576
- group: candidates,
577
- tree: context.tree,
578
- definitionOf: (candidate) => candidate,
579
- declarationOf: (candidate) => {
580
- const start = candidate.range.start.index ?? 0;
581
- return context.tree.rootNode.descendantForIndex(start, candidate.range.end.index ?? start).parent;
582
- },
583
- source: context.source,
584
- languageId: context.sup.id,
664
+ const selected = selectMember([receiver], {
665
+ ownerKey: (def) => def.callable?.owner ?? fileIdentityKey(def.file),
666
+ members: () => candidates,
667
+ supertypes: () => [],
668
+ name: (def) => def.localName,
669
+ key: (def) => def.callable?.key ?? `${fileIdentityKey(def.file)}:${def.range.start.index}`,
670
+ callable: (def) => def.callable,
671
+ scope: () => "any",
672
+ visible: () => true,
673
+ }, {
674
+ name: member,
585
675
  argumentCount: getCallArgumentCount({ languageId: context.sup.id, source: context.source, call }),
676
+ scope: "any",
677
+ useFile: context.moduleEntry.file,
586
678
  });
679
+ return selected.status === "unique" ? selected.member : null;
587
680
  }
588
681
  function recordTypeScriptNamespaceCall(context, call, access, fromId) {
589
682
  const selected = resolveTypeScriptNamespaceMember(context, call, access.receiver, access.property);
@@ -608,10 +701,10 @@ function recordTypeScriptNamespaceConstruction(context, node, target, fromId) {
608
701
  return true;
609
702
  }
610
703
  /** A member call on a `typeof import("spec")` binding names that module's export. */
611
- function recordImportTypeCall(context, access, fromId) {
704
+ function recordImportTypeCall(context, access, fromId, proof) {
612
705
  if (!isJsTsLanguage(context.sup.id))
613
706
  return false;
614
- const importType = receiverConstructorExpression(access.receiver, context.source, context.sup);
707
+ const importType = proof.kind === "named-type" ? proof.typeNode : null;
615
708
  const specifier = importType?.type === "type_query" ? importTypeQuerySpecifier(importType) : null;
616
709
  if (!specifier)
617
710
  return false;
@@ -623,8 +716,6 @@ function recordImportTypeCall(context, access, fromId) {
623
716
  }
624
717
  /** Swift `Foo()` / `Worker(name:)` is construction. Record `instantiates` and skip the call path. */
625
718
  function recordSwiftCapitalizedConstruction(context, node, fromId) {
626
- if (context.sup.id !== "swift")
627
- return false;
628
719
  const constructed = constructionTypeName(node, context.source, context.sup);
629
720
  if (!constructed)
630
721
  return false;
@@ -638,7 +729,96 @@ function recordSwiftCapitalizedConstruction(context, node, fromId) {
638
729
  recordDefEdge(context, fromId, target, "instantiates", constructed);
639
730
  return true;
640
731
  }
732
+ function recordGoBuiltinConstruction(context, node, fromId) {
733
+ const callTarget = getCallTarget(node);
734
+ const calleeName = callTarget && isIdentifierType(context.sup, callTarget.type) ? sliceText(callTarget, context.source) : null;
735
+ if (calleeName !== "new" && calleeName !== "make")
736
+ return undefined;
737
+ const argList = node.childForFieldName("arguments") ?? node.childForFieldName("argument_list");
738
+ const typeNode = argList?.namedChildren?.find((child) => child.type === "type_identifier") ?? null;
739
+ if (typeNode)
740
+ tryResolveNode(context, typeNode, fromId, "instantiates");
741
+ return false;
742
+ }
743
+ function recordRubySuper(context, fn, superNode, fromId) {
744
+ const container = nearestMemberContainer(fn.node);
745
+ if (!container || container.type !== "class")
746
+ return;
747
+ const owner = memberContainerDef(context.moduleEntry, container);
748
+ if (!owner)
749
+ return;
750
+ context.receiverCalls.push({
751
+ callerId: fromId,
752
+ ownerId: ensureNode(context, owner),
753
+ viaSupertypes: true,
754
+ memberName: fn.def.localName,
755
+ argumentCount: null,
756
+ site: { file: context.moduleEntry.file, range: toRange(superNode) },
757
+ memberScope: "any",
758
+ });
759
+ }
760
+ function recordRubyCall(context, node, fromId, resolveCallTarget) {
761
+ if (node.type !== "call")
762
+ return undefined;
763
+ const methodNode = node.childForFieldName("method");
764
+ const receiverNode = node.childForFieldName("receiver");
765
+ const methodName = methodNode ? sliceText(methodNode, context.source) : null;
766
+ if (methodName === "new" && receiverNode) {
767
+ const recorded = tryResolveNode(context, receiverNode, fromId, "instantiates");
768
+ if (!recorded) {
769
+ const rubyType = resolveRubyVisibleConstant(context.index, context.moduleEntry, context.sup, sliceText(receiverNode, context.source));
770
+ if (rubyType)
771
+ recordDefEdge(context, fromId, rubyType, "instantiates", receiverNode);
772
+ }
773
+ return false;
774
+ }
775
+ if (methodNode?.type === "super")
776
+ return true;
777
+ if (methodNode) {
778
+ resolveCallTarget(node, methodNode);
779
+ return false;
780
+ }
781
+ const callee = getCallTarget(node);
782
+ if (callee?.type === "super")
783
+ return true;
784
+ resolveCallTarget(node, callee);
785
+ return false;
786
+ }
787
+ /** Specialized syntax stays with its language; the common walker only dispatches these hooks. */
788
+ export const SPECIALIZED_EDGE_PASSES = {
789
+ python: { beforeModule: emitPythonDecoratorEdges },
790
+ rust: {
791
+ afterModule: emitRustImplEdges,
792
+ onNode(context, _fn, node, fromId) {
793
+ if (node.type === "token_tree")
794
+ recordRustMacroArgumentCalls(context, node, fromId);
795
+ return undefined;
796
+ },
797
+ },
798
+ go: {
799
+ onReceiverCall(context, access, fromId, hasLexicalBinding) {
800
+ return (context.optionalMemberTypes.has(access.receiver.type) &&
801
+ recordGoEmbeddedFieldReceiverCall(context, access, fromId, hasLexicalBinding));
802
+ },
803
+ onCall: recordGoBuiltinConstruction,
804
+ },
805
+ ruby: {
806
+ onNode(context, fn, node, fromId) {
807
+ if (node.type !== "super")
808
+ return undefined;
809
+ recordRubySuper(context, fn, node, fromId);
810
+ return true;
811
+ },
812
+ onCall: recordRubyCall,
813
+ },
814
+ swift: {
815
+ onCall(context, node, fromId) {
816
+ return recordSwiftCapitalizedConstruction(context, node, fromId) ? true : undefined;
817
+ },
818
+ },
819
+ };
641
820
  export async function emitFunctionBodyEdges(context, functionNodes) {
821
+ const specialized = SPECIALIZED_EDGE_PASSES[context.sup.id];
642
822
  const qualifiedConstructionTargets = [];
643
823
  // C# calls through a dotted receiver (`P.Mix.M()`, `Imported.Outer.Inner.M()`): navigation's
644
824
  // member-access resolution decides the target after the walk, so both consumers agree.
@@ -654,12 +834,14 @@ export async function emitFunctionBodyEdges(context, functionNodes) {
654
834
  "nullsafe_member_call_expression",
655
835
  "scoped_call_expression",
656
836
  ]);
657
- const newNodeTypes = new Set([
658
- "new_expression",
659
- "object_creation_expression",
660
- "struct_expression",
661
- "composite_literal",
662
- ]);
837
+ const newNodeTypes = {
838
+ new_expression: true,
839
+ object_creation_expression: true,
840
+ struct_expression: true,
841
+ composite_literal: true,
842
+ // tree-sitter-zig's own struct-literal node, e.g. `Widget{}` or a qualified `ns.Widget{}`.
843
+ struct_initializer: true,
844
+ };
663
845
  // Receiver typing and lexical member lookup are initialized only for receiver calls.
664
846
  const receiverProofs = new Map();
665
847
  const hasLexicalBinding = (callee) => {
@@ -729,13 +911,8 @@ export async function emitFunctionBodyEdges(context, functionNodes) {
729
911
  return;
730
912
  let target = context.aliasToTargetDef.get(name) ?? null;
731
913
  if (!target) {
732
- // A local variable can shadow a Go package alias (`u := LocalU{}` alongside
733
- // `import u "pkg"`); aliasToTargetModule is a blind per-file text map, so refuse it
734
- // here too whenever a closer, non-namespace scope binding owns the name.
735
- const modFile = context.sup.id === "go" && context.hasNonModuleBinding(name, node)
736
- ? undefined
737
- : context.aliasToTargetModule.get(name);
738
- if (modFile) {
914
+ const modFile = context.aliasToTargetModule.get(name);
915
+ if (modFile && context.moduleAliasIsUnshadowed(name, node)) {
739
916
  let exportedName = null;
740
917
  const parent = node.parent;
741
918
  if (parent &&
@@ -767,28 +944,35 @@ export async function emitFunctionBodyEdges(context, functionNodes) {
767
944
  recordDefEdge(context, fromId, targetDef, "uses");
768
945
  }
769
946
  };
947
+ const classifyImport = (name, node) => {
948
+ if (isJsTsLanguage(context.sup.id) && isIdentifierType(context.sup, node.type)) {
949
+ const imported = effectiveExplicitBinding(context.moduleEntry.imports, context.sup.id, (candidate) => candidate.kind === "namespace" && candidate.localNS === name, node.startIndex) ?? innermostNamespaceImport(context.moduleEntry.imports, name, node);
950
+ if (imported?.mechanism === "cjs" && typeof imported.resolved === "string") {
951
+ const value = cjsRequireValueBinding(context.index, imported.resolved);
952
+ const lexical = value ? context.resolveIdentifier(name, node) : null;
953
+ if (value && declaresMembers(value) && lexical && defNodeId(value) === defNodeId(lexical)) {
954
+ return "static-type";
955
+ }
956
+ return "module-import";
957
+ }
958
+ }
959
+ if (context.aliasToTargetModule.has(name) && context.moduleAliasIsUnshadowed(name, node)) {
960
+ return "module-import";
961
+ }
962
+ return null;
963
+ };
770
964
  /**
771
965
  * Resolves a receiver method call against the receiver's type. Members declared
772
966
  * alongside the caller resolve here; anything needing another module's members
773
967
  * becomes a deferred candidate.
774
968
  */
775
- const recordReceiverCall = (node, access, forcedMemberScope) => {
969
+ const recordReceiverCall = (node, access, forcedMemberScope, proof) => {
776
970
  const memberName = sliceText(access.property, context.source);
777
971
  if (!memberName)
778
972
  return;
779
- let binding = classifyReceiver(context.sup, access.receiver, context.source, receiverProofs, fn.node.startIndex, access.accessNode, hasLexicalBinding);
780
- if (isJsTsLanguage(context.sup.id) && isIdentifierType(context.sup, access.receiver.type)) {
781
- const receiverName = sliceText(access.receiver, context.source);
782
- const imported = effectiveExplicitBinding(context.moduleEntry.imports, context.sup.id, (candidate) => candidate.kind === "namespace" && candidate.localNS === receiverName, access.receiver.startIndex) ?? innermostNamespaceImport(context.moduleEntry.imports, receiverName, access.receiver);
783
- if (imported?.mechanism === "cjs" && typeof imported.resolved === "string") {
784
- const value = cjsRequireValueBinding(context.index, imported.resolved);
785
- const lexical = value ? context.resolveIdentifier(receiverName, access.receiver) : null;
786
- if (!value || !declaresMembers(value) || !lexical || defNodeId(value) !== defNodeId(lexical))
787
- return;
788
- binding = { kind: "named-type", typeName: receiverName, typeNode: access.receiver, memberScope: "static" };
789
- }
790
- }
791
- if (!binding)
973
+ const binding = proof ??
974
+ classifyReceiver(context.sup, access.receiver, context.source, receiverProofs, fn.node.startIndex, access.accessNode, hasLexicalBinding, classifyImport);
975
+ if (binding.kind === "module-import" || binding.kind === "unknown")
792
976
  return;
793
977
  const site = { file: context.moduleEntry.file, range: toRange(access.property) };
794
978
  // Shared call-count facts treat unproven spread expansions as unknown (null),
@@ -903,9 +1087,6 @@ export async function emitFunctionBodyEdges(context, functionNodes) {
903
1087
  if (access) {
904
1088
  if (recordTypeScriptNamespaceCall(context, node, access, fromId))
905
1089
  return;
906
- if (recordImportTypeCall(context, access, fromId))
907
- return;
908
- const receiverName = sliceText(access.receiver, context.source);
909
1090
  const typeScopedCppCall = context.sup.id === "cpp" &&
910
1091
  context.source.slice(access.receiver.endIndex, access.property.startIndex).includes("::");
911
1092
  if (typeScopedCppCall) {
@@ -921,19 +1102,49 @@ export async function emitFunctionBodyEdges(context, functionNodes) {
921
1102
  });
922
1103
  return;
923
1104
  }
924
- if (keywordReceiverKind(context.sup.id, receiverName)) {
925
- recordReceiverCall(node, access);
1105
+ const receiverProof = classifyReceiver(context.sup, access.receiver, context.source, receiverProofs, fn.node.startIndex, access.accessNode, hasLexicalBinding, classifyImport);
1106
+ if (recordImportTypeCall(context, access, fromId, receiverProof))
1107
+ return;
1108
+ if (supportsDeclaredFieldChains(context.sup.id) && isMemberAccessNode(context.sup, access.receiver)) {
1109
+ dottedReceiverCalls.push({ fromId, access });
1110
+ return;
1111
+ }
1112
+ if (receiverProof.kind === "own-type" || receiverProof.kind === "supertype") {
1113
+ recordReceiverCall(node, access, undefined, receiverProof);
1114
+ return;
1115
+ }
1116
+ if (context.sup.id === "swift" &&
1117
+ isIdentifierType(context.sup, access.receiver.type) &&
1118
+ context.resolveIdentifier(sliceText(access.receiver, context.source), access.receiver)?.kind ===
1119
+ SymbolKind.TypeAlias) {
1120
+ dottedReceiverCalls.push({ fromId, access });
926
1121
  return;
927
1122
  }
928
1123
  if (tryResolveChain(context, access.accessNode, fromId, "calls"))
929
1124
  return;
930
- if (context.sup.id === "csharp" &&
931
- access.receiver.type === "member_access_expression" &&
932
- csharpDottedNameRoot(access.receiver)) {
1125
+ if (context.sup.id === "zig" &&
1126
+ context.optionalMemberTypes.has(access.receiver.type) &&
1127
+ recordZigQualifiedTypeReceiverCall(context, node, access, fromId)) {
1128
+ return;
1129
+ }
1130
+ if (specialized?.onReceiverCall?.(context, access, fromId, hasLexicalBinding))
1131
+ return;
1132
+ const javaConstructionType = context.sup.id === "java" && access.receiver.type === "object_creation_expression"
1133
+ ? constructionTypeName(access.receiver, context.source, context.sup)
1134
+ : null;
1135
+ if (context.sup.id === "java" &&
1136
+ javaConstructionType &&
1137
+ isMemberAccessNode(context.sup, javaConstructionType)) {
1138
+ dottedReceiverCalls.push({ fromId, access });
1139
+ return;
1140
+ }
1141
+ if (context.sup.id === "kotlin" &&
1142
+ (isIdentifierType(context.sup, access.receiver.type) || access.receiver.type === "navigation_expression") &&
1143
+ !context.resolveIdentifier(sliceText(access.receiver, context.source), access.receiver)) {
933
1144
  dottedReceiverCalls.push({ fromId, access });
934
1145
  return;
935
1146
  }
936
- recordReceiverCall(node, access);
1147
+ recordReceiverCall(node, access, undefined, receiverProof);
937
1148
  return;
938
1149
  }
939
1150
  if (!callee)
@@ -948,90 +1159,20 @@ export async function emitFunctionBodyEdges(context, functionNodes) {
948
1159
  return;
949
1160
  }
950
1161
  }
951
- const implicitOwnerLanguage = context.sup.id === "swift" || context.sup.id === "csharp";
952
- if (implicitOwnerLanguage && isIdentifierType(context.sup, callee.type) && nearestMemberContainer(fn.node)) {
953
- const name = sliceText(callee, context.source);
954
- const lexical = context.resolveIdentifier(name, callee);
955
- const importedCsharpMember = context.sup.id === "csharp" &&
956
- !!lexical?.isMember &&
957
- fileIdentityKey(lexical.file) !== fileIdentityKey(context.moduleEntry.file);
958
- if (!importedCsharpMember && (!lexical || lexical.isMember || !context.hasNonModuleBinding(name, callee))) {
959
- // A method's local binding wins. Type members require receiver ownership
960
- // and static-scope proof; only a free function can be a fallback.
961
- recordImplicitSelfMemberCall(node, callee, lexical?.isMember ? null : lexical);
962
- return;
963
- }
964
- }
965
1162
  if (!tryResolveNode(context, callee, fromId, "calls"))
966
1163
  recordImplicitSelfMemberCall(node, callee);
967
1164
  };
968
- const recordRubySuper = (superNode) => {
969
- const container = nearestMemberContainer(fn.node);
970
- if (!container || container.type !== "class")
971
- return;
972
- const owner = memberContainerDef(context.moduleEntry, container);
973
- if (!owner)
974
- return;
975
- context.receiverCalls.push({
976
- callerId: fromId,
977
- ownerId: ensureNode(context, owner),
978
- viaSupertypes: true,
979
- memberName: fn.def.localName,
980
- argumentCount: null,
981
- site: { file: context.moduleEntry.file, range: toRange(superNode) },
982
- memberScope: "any",
983
- });
984
- };
985
1165
  const recordCallOrInstantiation = (node) => {
986
- if (context.sup.id === "ruby" && node.type === "super") {
987
- recordRubySuper(node);
988
- return true;
989
- }
990
- if (node.type === "token_tree")
991
- recordRustMacroArgumentCalls(context, node, fromId);
1166
+ const nodeResult = specialized?.onNode?.(context, fn, node, fromId);
1167
+ if (nodeResult !== undefined)
1168
+ return nodeResult;
992
1169
  if (callNodeTypes.has(node.type)) {
993
- if (context.sup.id === "go") {
994
- const callTarget = getCallTarget(node);
995
- const calleeName = callTarget && isIdentifierType(context.sup, callTarget.type) ? sliceText(callTarget, context.source) : null;
996
- if (calleeName === "new" || calleeName === "make") {
997
- const argList = node.childForFieldName("arguments") ?? node.childForFieldName("argument_list");
998
- const typeNode = argList?.namedChildren?.find((child) => child.type === "type_identifier") ?? null;
999
- if (typeNode) {
1000
- tryResolveNode(context, typeNode, fromId, "instantiates");
1001
- }
1002
- return false;
1003
- }
1004
- }
1005
- if (context.sup.id === "ruby" && node.type === "call") {
1006
- const methodNode = node.childForFieldName("method");
1007
- const receiverNode = node.childForFieldName("receiver");
1008
- const methodName = methodNode ? sliceText(methodNode, context.source) : null;
1009
- if (methodName === "new" && receiverNode) {
1010
- const recorded = tryResolveNode(context, receiverNode, fromId, "instantiates");
1011
- if (!recorded) {
1012
- const rubyType = resolveRubyVisibleConstant(context.index, context.moduleEntry, context.sup, sliceText(receiverNode, context.source));
1013
- if (rubyType)
1014
- recordDefEdge(context, fromId, rubyType, "instantiates", receiverNode);
1015
- }
1016
- return false;
1017
- }
1018
- if (methodNode?.type === "super")
1019
- return true;
1020
- if (methodNode) {
1021
- resolveCallTarget(node, methodNode);
1022
- return false;
1023
- }
1024
- const callee = getCallTarget(node);
1025
- if (callee?.type === "super")
1026
- return true;
1027
- resolveCallTarget(node, callee);
1028
- return false;
1029
- }
1030
- if (recordSwiftCapitalizedConstruction(context, node, fromId))
1031
- return true;
1170
+ const callResult = specialized?.onCall?.(context, node, fromId, resolveCallTarget);
1171
+ if (callResult !== undefined)
1172
+ return callResult;
1032
1173
  resolveCallTarget(node, getCallTarget(node));
1033
1174
  }
1034
- if (newNodeTypes.has(node.type)) {
1175
+ if (newNodeTypes[node.type]) {
1035
1176
  const keyword = phpObjectCreationKeyword(node, context.source, context.sup);
1036
1177
  if (keyword) {
1037
1178
  const created = resolvePhpObjectCreationTarget(context.index, context.moduleEntry, keyword, context.source, context.sup);
@@ -1090,15 +1231,14 @@ export async function emitFunctionBodyEdges(context, functionNodes) {
1090
1231
  }
1091
1232
  else {
1092
1233
  // Without an implicit `this` of the owner, `Owner::member()` can only name a static member.
1093
- recordReceiverCall(call.node, call.access, implicitThis ? undefined : "static");
1234
+ recordReceiverCall(call.node, call.access, implicitThis ? "any" : "static");
1094
1235
  }
1095
1236
  }
1096
1237
  }
1097
1238
  for (const { fromId, access } of dottedReceiverCalls) {
1098
1239
  const member = await context.resolveMemberAccessTarget(access.property);
1099
1240
  // The graph records no edge for a call its target cannot accept, as for other member calls.
1100
- if (member &&
1101
- (await memberAcceptsCallAt(context.index, member, access.accessNode, context.source, context.sup.id))) {
1241
+ if (member && memberAcceptsCallAt(context.index, member, access.accessNode, context.source, context.sup.id)) {
1102
1242
  recordDefEdge(context, fromId, member, "calls", access.property);
1103
1243
  }
1104
1244
  }
@@ -1362,8 +1502,6 @@ export async function emitClassInheritanceEdges(context, classNodes) {
1362
1502
  }
1363
1503
  }
1364
1504
  export function emitRustImplEdges(context, rootNode) {
1365
- if (context.sup.id !== "rust")
1366
- return;
1367
1505
  const walkImpls = (node) => {
1368
1506
  if (node.type === "impl_item") {
1369
1507
  const typeIdentifiers = node.namedChildren?.filter((child) => child.type === "type_identifier") ?? [];