@lzehrung/codegraph 2.3.29 → 2.3.31

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 (324) hide show
  1. package/dist/bin/cli.js +6602 -4453
  2. package/dist/bin/query-index-worker.js +1302 -753
  3. package/dist/document-links/asciidoc.d.ts.map +1 -1
  4. package/dist/document-links/asciidoc.js +3 -4
  5. package/dist/document-links/asciidoc.js.map +1 -1
  6. package/dist/document-links/html-forms.d.ts +39 -0
  7. package/dist/document-links/html-forms.d.ts.map +1 -0
  8. package/dist/document-links/html-forms.js +94 -0
  9. package/dist/document-links/html-forms.js.map +1 -0
  10. package/dist/document-links/html.d.ts +8 -0
  11. package/dist/document-links/html.d.ts.map +1 -1
  12. package/dist/document-links/html.js +30 -15
  13. package/dist/document-links/html.js.map +1 -1
  14. package/dist/document-links/markdown.d.ts.map +1 -1
  15. package/dist/document-links/markdown.js +6 -7
  16. package/dist/document-links/markdown.js.map +1 -1
  17. package/dist/document-links/rst.d.ts.map +1 -1
  18. package/dist/document-links/rst.js +6 -0
  19. package/dist/document-links/rst.js.map +1 -1
  20. package/dist/document-links/sfc.d.ts.map +1 -1
  21. package/dist/document-links/sfc.js +4 -4
  22. package/dist/document-links/sfc.js.map +1 -1
  23. package/dist/graphs/angularjs.d.ts.map +1 -1
  24. package/dist/graphs/angularjs.js +9 -1
  25. package/dist/graphs/angularjs.js.map +1 -1
  26. package/dist/graphs/edge-resolution.d.ts.map +1 -1
  27. package/dist/graphs/edge-resolution.js +8 -3
  28. package/dist/graphs/edge-resolution.js.map +1 -1
  29. package/dist/graphs/specifiers.d.ts.map +1 -1
  30. package/dist/graphs/specifiers.js +62 -104
  31. package/dist/graphs/specifiers.js.map +1 -1
  32. package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts.map +1 -1
  33. package/dist/graphs/symbol-graph-detailed/edge-passes.js +118 -86
  34. package/dist/graphs/symbol-graph-detailed/edge-passes.js.map +1 -1
  35. package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts +27 -0
  36. package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts.map +1 -1
  37. package/dist/graphs/symbol-graph-detailed/receiver-calls.js +509 -42
  38. package/dist/graphs/symbol-graph-detailed/receiver-calls.js.map +1 -1
  39. package/dist/impact/call-compatibility/providers/index.d.ts +15 -1
  40. package/dist/impact/call-compatibility/providers/index.d.ts.map +1 -1
  41. package/dist/impact/call-compatibility/providers/index.js +21 -20
  42. package/dist/impact/call-compatibility/providers/index.js.map +1 -1
  43. package/dist/impact/call-compatibility/providers/profiles.d.ts +80 -0
  44. package/dist/impact/call-compatibility/providers/profiles.d.ts.map +1 -0
  45. package/dist/impact/call-compatibility/providers/profiles.js +164 -0
  46. package/dist/impact/call-compatibility/providers/profiles.js.map +1 -0
  47. package/dist/impact/call-compatibility.d.ts.map +1 -1
  48. package/dist/impact/call-compatibility.js +73 -108
  49. package/dist/impact/call-compatibility.js.map +1 -1
  50. package/dist/impact/member-resolution-coverage.d.ts.map +1 -1
  51. package/dist/impact/member-resolution-coverage.js +2 -2
  52. package/dist/impact/member-resolution-coverage.js.map +1 -1
  53. package/dist/indexer/build-cache/manifest.d.ts +7 -0
  54. package/dist/indexer/build-cache/manifest.d.ts.map +1 -1
  55. package/dist/indexer/build-cache/manifest.js +32 -1
  56. package/dist/indexer/build-cache/manifest.js.map +1 -1
  57. package/dist/indexer/build-cache/options.d.ts +16 -2
  58. package/dist/indexer/build-cache/options.d.ts.map +1 -1
  59. package/dist/indexer/build-cache/options.js +17 -3
  60. package/dist/indexer/build-cache/options.js.map +1 -1
  61. package/dist/indexer/build-cache/project-snapshot.d.ts.map +1 -1
  62. package/dist/indexer/build-cache/project-snapshot.js +1 -0
  63. package/dist/indexer/build-cache/project-snapshot.js.map +1 -1
  64. package/dist/indexer/build-index.d.ts.map +1 -1
  65. package/dist/indexer/build-index.js +80 -2
  66. package/dist/indexer/build-index.js.map +1 -1
  67. package/dist/indexer/build-manifest.d.ts +1 -0
  68. package/dist/indexer/build-manifest.d.ts.map +1 -1
  69. package/dist/indexer/build-manifest.js +18 -0
  70. package/dist/indexer/build-manifest.js.map +1 -1
  71. package/dist/indexer/build-workers.js +1 -1
  72. package/dist/indexer/build-workers.js.map +1 -1
  73. package/dist/indexer/declaration-visibility.d.ts +43 -0
  74. package/dist/indexer/declaration-visibility.d.ts.map +1 -0
  75. package/dist/indexer/declaration-visibility.js +202 -0
  76. package/dist/indexer/declaration-visibility.js.map +1 -0
  77. package/dist/indexer/imports/binding-ranges.d.ts +2 -2
  78. package/dist/indexer/imports/binding-ranges.d.ts.map +1 -1
  79. package/dist/indexer/imports/binding-ranges.js +2 -123
  80. package/dist/indexer/imports/binding-ranges.js.map +1 -1
  81. package/dist/indexer/imports/import-binding-tables.d.ts +64 -0
  82. package/dist/indexer/imports/import-binding-tables.d.ts.map +1 -0
  83. package/dist/indexer/imports/import-binding-tables.js +419 -0
  84. package/dist/indexer/imports/import-binding-tables.js.map +1 -0
  85. package/dist/indexer/imports/js-text-imports.d.ts.map +1 -1
  86. package/dist/indexer/imports/js-text-imports.js +5 -2
  87. package/dist/indexer/imports/js-text-imports.js.map +1 -1
  88. package/dist/indexer/imports/language-specific.d.ts +3 -22
  89. package/dist/indexer/imports/language-specific.d.ts.map +1 -1
  90. package/dist/indexer/imports/language-specific.js +54 -573
  91. package/dist/indexer/imports/language-specific.js.map +1 -1
  92. package/dist/indexer/imports/native-captures.d.ts.map +1 -1
  93. package/dist/indexer/imports/native-captures.js +23 -32
  94. package/dist/indexer/imports/native-captures.js.map +1 -1
  95. package/dist/indexer/imports/text-import-extractors.d.ts +37 -0
  96. package/dist/indexer/imports/text-import-extractors.d.ts.map +1 -0
  97. package/dist/indexer/imports/text-import-extractors.js +358 -0
  98. package/dist/indexer/imports/text-import-extractors.js.map +1 -0
  99. package/dist/indexer/imports.d.ts.map +1 -1
  100. package/dist/indexer/imports.js +2 -1
  101. package/dist/indexer/imports.js.map +1 -1
  102. package/dist/indexer/locals-and-exports.d.ts.map +1 -1
  103. package/dist/indexer/locals-and-exports.js +23 -27
  104. package/dist/indexer/locals-and-exports.js.map +1 -1
  105. package/dist/indexer/navigation-goto.d.ts +1 -7
  106. package/dist/indexer/navigation-goto.d.ts.map +1 -1
  107. package/dist/indexer/navigation-goto.js +181 -381
  108. package/dist/indexer/navigation-goto.js.map +1 -1
  109. package/dist/indexer/navigation-resolve.d.ts.map +1 -1
  110. package/dist/indexer/navigation-resolve.js +20 -1
  111. package/dist/indexer/navigation-resolve.js.map +1 -1
  112. package/dist/indexer/navigation.d.ts.map +1 -1
  113. package/dist/indexer/navigation.js +39 -7
  114. package/dist/indexer/navigation.js.map +1 -1
  115. package/dist/indexer/parse-context.js +2 -2
  116. package/dist/indexer/parse-context.js.map +1 -1
  117. package/dist/indexer/scope-nodes.d.ts +108 -0
  118. package/dist/indexer/scope-nodes.d.ts.map +1 -0
  119. package/dist/indexer/scope-nodes.js +238 -0
  120. package/dist/indexer/scope-nodes.js.map +1 -0
  121. package/dist/indexer/scope.d.ts.map +1 -1
  122. package/dist/indexer/scope.js +70 -130
  123. package/dist/indexer/scope.js.map +1 -1
  124. package/dist/indexer/types.d.ts +7 -0
  125. package/dist/indexer/types.d.ts.map +1 -1
  126. package/dist/languages/definitions/c-family.d.ts +18 -4
  127. package/dist/languages/definitions/c-family.d.ts.map +1 -1
  128. package/dist/languages/definitions/c-family.js +51 -13
  129. package/dist/languages/definitions/c-family.js.map +1 -1
  130. package/dist/languages/definitions/c.d.ts.map +1 -1
  131. package/dist/languages/definitions/c.js +7 -43
  132. package/dist/languages/definitions/c.js.map +1 -1
  133. package/dist/languages/definitions/cpp.d.ts.map +1 -1
  134. package/dist/languages/definitions/cpp.js +15 -61
  135. package/dist/languages/definitions/cpp.js.map +1 -1
  136. package/dist/languages/definitions/csharp.d.ts.map +1 -1
  137. package/dist/languages/definitions/csharp.js +46 -52
  138. package/dist/languages/definitions/csharp.js.map +1 -1
  139. package/dist/languages/definitions/css-like.d.ts.map +1 -1
  140. package/dist/languages/definitions/css-like.js +13 -10
  141. package/dist/languages/definitions/css-like.js.map +1 -1
  142. package/dist/languages/definitions/go.d.ts.map +1 -1
  143. package/dist/languages/definitions/go.js +29 -42
  144. package/dist/languages/definitions/go.js.map +1 -1
  145. package/dist/languages/definitions/html.d.ts.map +1 -1
  146. package/dist/languages/definitions/html.js +15 -14
  147. package/dist/languages/definitions/html.js.map +1 -1
  148. package/dist/languages/definitions/java.d.ts.map +1 -1
  149. package/dist/languages/definitions/java.js +42 -48
  150. package/dist/languages/definitions/java.js.map +1 -1
  151. package/dist/languages/definitions/javascript.d.ts.map +1 -1
  152. package/dist/languages/definitions/javascript.js +26 -54
  153. package/dist/languages/definitions/javascript.js.map +1 -1
  154. package/dist/languages/definitions/js-family.d.ts +15 -1
  155. package/dist/languages/definitions/js-family.d.ts.map +1 -1
  156. package/dist/languages/definitions/js-family.js +51 -0
  157. package/dist/languages/definitions/js-family.js.map +1 -1
  158. package/dist/languages/definitions/kotlin.d.ts.map +1 -1
  159. package/dist/languages/definitions/kotlin.js +26 -43
  160. package/dist/languages/definitions/kotlin.js.map +1 -1
  161. package/dist/languages/definitions/php.d.ts.map +1 -1
  162. package/dist/languages/definitions/php.js +50 -60
  163. package/dist/languages/definitions/php.js.map +1 -1
  164. package/dist/languages/definitions/python.d.ts.map +1 -1
  165. package/dist/languages/definitions/python.js +23 -14
  166. package/dist/languages/definitions/python.js.map +1 -1
  167. package/dist/languages/definitions/ruby.d.ts.map +1 -1
  168. package/dist/languages/definitions/ruby.js +14 -17
  169. package/dist/languages/definitions/ruby.js.map +1 -1
  170. package/dist/languages/definitions/rust.d.ts.map +1 -1
  171. package/dist/languages/definitions/rust.js +30 -52
  172. package/dist/languages/definitions/rust.js.map +1 -1
  173. package/dist/languages/definitions/scss.d.ts.map +1 -1
  174. package/dist/languages/definitions/scss.js +33 -49
  175. package/dist/languages/definitions/scss.js.map +1 -1
  176. package/dist/languages/definitions/sfc-graph.d.ts +4 -0
  177. package/dist/languages/definitions/sfc-graph.d.ts.map +1 -0
  178. package/dist/languages/definitions/sfc-graph.js +16 -0
  179. package/dist/languages/definitions/sfc-graph.js.map +1 -0
  180. package/dist/languages/definitions/shared.d.ts +33 -0
  181. package/dist/languages/definitions/shared.d.ts.map +1 -0
  182. package/dist/languages/definitions/shared.js +63 -0
  183. package/dist/languages/definitions/shared.js.map +1 -0
  184. package/dist/languages/definitions/sql.d.ts.map +1 -1
  185. package/dist/languages/definitions/sql.js +1 -0
  186. package/dist/languages/definitions/sql.js.map +1 -1
  187. package/dist/languages/definitions/svelte.d.ts.map +1 -1
  188. package/dist/languages/definitions/svelte.js +2 -10
  189. package/dist/languages/definitions/svelte.js.map +1 -1
  190. package/dist/languages/definitions/swift.d.ts.map +1 -1
  191. package/dist/languages/definitions/swift.js +37 -31
  192. package/dist/languages/definitions/swift.js.map +1 -1
  193. package/dist/languages/definitions/typescript.d.ts.map +1 -1
  194. package/dist/languages/definitions/typescript.js +56 -90
  195. package/dist/languages/definitions/typescript.js.map +1 -1
  196. package/dist/languages/definitions/vue.d.ts.map +1 -1
  197. package/dist/languages/definitions/vue.js +2 -10
  198. package/dist/languages/definitions/vue.js.map +1 -1
  199. package/dist/languages/definitions/zig.d.ts.map +1 -1
  200. package/dist/languages/definitions/zig.js +9 -15
  201. package/dist/languages/definitions/zig.js.map +1 -1
  202. package/dist/languages/graph-captures.d.ts +40 -0
  203. package/dist/languages/graph-captures.d.ts.map +1 -0
  204. package/dist/languages/graph-captures.js +46 -0
  205. package/dist/languages/graph-captures.js.map +1 -0
  206. package/dist/languages/import-statement-parsers.d.ts +17 -0
  207. package/dist/languages/import-statement-parsers.d.ts.map +1 -1
  208. package/dist/languages/import-statement-parsers.js +108 -0
  209. package/dist/languages/import-statement-parsers.js.map +1 -1
  210. package/dist/languages/js-family.d.ts +2 -0
  211. package/dist/languages/js-family.d.ts.map +1 -1
  212. package/dist/languages/js-family.js +15 -6
  213. package/dist/languages/js-family.js.map +1 -1
  214. package/dist/languages/types.d.ts +4 -0
  215. package/dist/languages/types.d.ts.map +1 -1
  216. package/dist/languages/types.js +1 -1
  217. package/dist/languages/types.js.map +1 -1
  218. package/dist/languages.js +1 -1
  219. package/dist/languages.js.map +1 -1
  220. package/dist/native/contracts.d.ts +1 -1
  221. package/dist/native/contracts.d.ts.map +1 -1
  222. package/dist/native/js-bridge.d.ts +10 -0
  223. package/dist/native/js-bridge.d.ts.map +1 -1
  224. package/dist/native/js-bridge.js +10 -0
  225. package/dist/native/js-bridge.js.map +1 -1
  226. package/dist/native/native-backend-report.d.ts.map +1 -1
  227. package/dist/native/native-backend-report.js +2 -0
  228. package/dist/native/native-backend-report.js.map +1 -1
  229. package/dist/util/comments.d.ts +7 -7
  230. package/dist/util/comments.d.ts.map +1 -1
  231. package/dist/util/comments.js +15 -214
  232. package/dist/util/comments.js.map +1 -1
  233. package/dist/util/dynamic-import-tables.d.ts +88 -0
  234. package/dist/util/dynamic-import-tables.d.ts.map +1 -0
  235. package/dist/util/dynamic-import-tables.js +100 -0
  236. package/dist/util/dynamic-import-tables.js.map +1 -0
  237. package/dist/util/lines.d.ts.map +1 -1
  238. package/dist/util/lines.js +4 -1
  239. package/dist/util/lines.js.map +1 -1
  240. package/dist/util/member-access-tables.d.ts +72 -0
  241. package/dist/util/member-access-tables.d.ts.map +1 -0
  242. package/dist/util/member-access-tables.js +167 -0
  243. package/dist/util/member-access-tables.js.map +1 -0
  244. package/dist/util/member-access.d.ts +2 -0
  245. package/dist/util/member-access.d.ts.map +1 -1
  246. package/dist/util/member-access.js +61 -95
  247. package/dist/util/member-access.js.map +1 -1
  248. package/dist/util/paths.d.ts +4 -0
  249. package/dist/util/paths.d.ts.map +1 -1
  250. package/dist/util/paths.js +26 -0
  251. package/dist/util/paths.js.map +1 -1
  252. package/dist/util/project-files.js +1 -1
  253. package/dist/util/project-files.js.map +1 -1
  254. package/dist/util/resolution/cargo-targets.d.ts.map +1 -1
  255. package/dist/util/resolution/cargo-targets.js +17 -14
  256. package/dist/util/resolution/cargo-targets.js.map +1 -1
  257. package/dist/util/resolution/cpp.d.ts +6 -0
  258. package/dist/util/resolution/cpp.d.ts.map +1 -0
  259. package/dist/util/resolution/cpp.js +69 -0
  260. package/dist/util/resolution/cpp.js.map +1 -0
  261. package/dist/util/resolution/csharp.d.ts +4 -3
  262. package/dist/util/resolution/csharp.d.ts.map +1 -1
  263. package/dist/util/resolution/csharp.js +27 -113
  264. package/dist/util/resolution/csharp.js.map +1 -1
  265. package/dist/util/resolution/files.d.ts +6 -0
  266. package/dist/util/resolution/files.d.ts.map +1 -1
  267. package/dist/util/resolution/files.js +108 -4
  268. package/dist/util/resolution/files.js.map +1 -1
  269. package/dist/util/resolution/go.d.ts +1 -0
  270. package/dist/util/resolution/go.d.ts.map +1 -1
  271. package/dist/util/resolution/go.js +4 -3
  272. package/dist/util/resolution/go.js.map +1 -1
  273. package/dist/util/resolution/jvm.d.ts +3 -3
  274. package/dist/util/resolution/jvm.d.ts.map +1 -1
  275. package/dist/util/resolution/jvm.js +90 -54
  276. package/dist/util/resolution/jvm.js.map +1 -1
  277. package/dist/util/resolution/node.js +2 -2
  278. package/dist/util/resolution/node.js.map +1 -1
  279. package/dist/util/resolution/php-composer.d.ts.map +1 -1
  280. package/dist/util/resolution/php-composer.js +8 -7
  281. package/dist/util/resolution/php-composer.js.map +1 -1
  282. package/dist/util/resolution/php.d.ts.map +1 -1
  283. package/dist/util/resolution/php.js +30 -43
  284. package/dist/util/resolution/php.js.map +1 -1
  285. package/dist/util/resolution/project-symbols.d.ts +5 -7
  286. package/dist/util/resolution/project-symbols.d.ts.map +1 -1
  287. package/dist/util/resolution/project-symbols.js +23 -9
  288. package/dist/util/resolution/project-symbols.js.map +1 -1
  289. package/dist/util/resolution/python.d.ts.map +1 -1
  290. package/dist/util/resolution/python.js +107 -62
  291. package/dist/util/resolution/python.js.map +1 -1
  292. package/dist/util/resolution/rust.d.ts.map +1 -1
  293. package/dist/util/resolution/rust.js +45 -34
  294. package/dist/util/resolution/rust.js.map +1 -1
  295. package/dist/util/resolution/tsconfig.d.ts.map +1 -1
  296. package/dist/util/resolution/tsconfig.js +3 -9
  297. package/dist/util/resolution/tsconfig.js.map +1 -1
  298. package/dist/util/resolution-candidates.d.ts +5 -1
  299. package/dist/util/resolution-candidates.d.ts.map +1 -1
  300. package/dist/util/resolution-candidates.js +18 -0
  301. package/dist/util/resolution-candidates.js.map +1 -1
  302. package/dist/util/resolution.d.ts.map +1 -1
  303. package/dist/util/resolution.js +93 -49
  304. package/dist/util/resolution.js.map +1 -1
  305. package/dist/util/specifiers.d.ts +4 -10
  306. package/dist/util/specifiers.d.ts.map +1 -1
  307. package/dist/util/specifiers.js +131 -165
  308. package/dist/util/specifiers.js.map +1 -1
  309. package/dist/util/trivia-tables.d.ts +69 -0
  310. package/dist/util/trivia-tables.d.ts.map +1 -0
  311. package/dist/util/trivia-tables.js +186 -0
  312. package/dist/util/trivia-tables.js.map +1 -0
  313. package/dist/util/trivia.d.ts +24 -0
  314. package/dist/util/trivia.d.ts.map +1 -0
  315. package/dist/util/trivia.js +621 -0
  316. package/dist/util/trivia.js.map +1 -0
  317. package/dist/util.d.ts +1 -1
  318. package/dist/util.d.ts.map +1 -1
  319. package/dist/util.js +1 -1
  320. package/dist/util.js.map +1 -1
  321. package/dist/worker/native-extract-worker.d.ts.map +1 -1
  322. package/dist/worker/native-extract-worker.js +4 -4
  323. package/dist/worker/native-extract-worker.js.map +1 -1
  324. package/package.json +3 -3
@@ -2,29 +2,33 @@ import { isJsTsLanguage } from "../languages/js-family.js";
2
2
  import { isPythonReceiverAttributeAssignmentName } from "../languages/definitions/python.js";
3
3
  import { sliceText } from "../util/ast.js";
4
4
  import { fileIdentityKey } from "../util/paths.js";
5
- import { getMemberAccessParts, getNavigationExpressionProperty, isMemberAccessNode, memberAccessTraversalTypes, } from "../util/member-access.js";
6
- import { CSHARP_IDENTIFIER_SOURCE, JAVA_IDENTIFIER_SOURCE, XID_IDENTIFIER_SOURCE } from "../util/identifiers.js";
5
+ import { getMemberAccessParts, getNavigationExpressionProperty, isMemberAccessNode, isReceiverNameNode, memberAccessTraversalTypes, } from "../util/member-access.js";
6
+ import { isKeywordReceiver, supportsReceiverMemberNavigation } from "../util/member-access-tables.js";
7
+ import { declaresMembers, hasStaticMemberDistinction, nearestMemberContainer, receiverConstructorExpression, unwrapNamedType, } from "../graphs/symbol-graph-detailed/receiver-calls.js";
7
8
  import { ensureParsedContext } from "./parse-context.js";
8
9
  import { okGoToResult } from "./navigation-provenance.js";
9
10
  import { resolveExport, resolveImported } from "./navigation-resolve.js";
10
11
  import { SymbolKind, } from "./types.js";
11
- const RUBY_CONSTANT_SOURCE = String.raw `(?=\p{Lu})${XID_IDENTIFIER_SOURCE}`;
12
- const CSHARP_CONSTANT_SOURCE = String.raw `(?=@?\p{Lu})${CSHARP_IDENTIFIER_SOURCE}`;
13
- const JAVA_CONSTANT_SOURCE = String.raw `(?=\p{Lu})${JAVA_IDENTIFIER_SOURCE}`;
14
- const RUST_CONSTANT_SOURCE = String.raw `(?=\p{Lu})${XID_IDENTIFIER_SOURCE}`;
15
- const IDENTIFIER_BOUNDARY_SOURCE = String.raw `[$_\p{ID_Continue}\u200c\u200d]`;
16
12
  export async function resolveMemberAccessDefinition(params) {
17
13
  const { index, mod, node, source, sup, resolveLexicalBinding } = params;
18
14
  const parent = node.parent;
19
- if (!parent || !sup.supportsCrossModuleSymbols || !isMemberAccessNode(sup, parent)) {
15
+ if (!parent || !sup.supportsCrossModuleSymbols) {
20
16
  return null;
21
17
  }
22
- const memberNode = parent;
18
+ let memberNode = null;
19
+ if (isMemberAccessNode(sup, parent)) {
20
+ memberNode = parent;
21
+ }
22
+ else if (parent.parent && isMemberAccessNode(sup, parent.parent)) {
23
+ memberNode = parent.parent;
24
+ }
25
+ if (!memberNode)
26
+ return null;
23
27
  const { object: obj, property: prop } = getMemberAccessParts(sup, memberNode);
24
28
  const optionalMemberTypes = memberAccessTraversalTypes(sup);
25
29
  const resolveExpression = async (expr) => {
26
- const exprIsId = sup.nodeTypes.identifier.includes(expr.type) && !isMemberAccessNode(sup, expr);
27
- if (exprIsId || expr.type === "identifier" || expr.type === "type_identifier" || expr.type === "constant") {
30
+ const exprIsId = isReceiverNameNode(sup, expr.type) && !isMemberAccessNode(sup, expr);
31
+ if (exprIsId) {
28
32
  const lexicalBinding = resolveLexicalBinding?.(expr);
29
33
  if (lexicalBinding)
30
34
  return { kind: "resolved", def: lexicalBinding };
@@ -130,10 +134,8 @@ export async function resolveMemberAccessDefinition(params) {
130
134
  }
131
135
  }
132
136
  const receiverName = obj ? sliceText(obj, source) : "";
133
- const implicitClassReceiver = (isJsTsLanguage(sup.id) && receiverName === "this") ||
134
- (sup.id === "php" && /^(?:\$this|self|static)$/.test(receiverName)) ||
135
- (sup.id === "rust" && /^(?:self|Self)$/.test(receiverName));
136
- if (obj && prop && node.id === prop.id && (supportsReceiverMemberResolution(sup.id) || implicitClassReceiver)) {
137
+ const implicitClassReceiver = isKeywordReceiver(sup.id, receiverName);
138
+ if (obj && prop && node.id === prop.id && (supportsReceiverMemberNavigation(sup.id) || implicitClassReceiver)) {
137
139
  const member = sliceText(prop, source);
138
140
  if (sup.id === "python") {
139
141
  const memberDef = await resolvePythonReceiverMember(index, mod, node, obj, member, source, sup, resolveExpression);
@@ -158,7 +160,7 @@ export async function resolveMemberAccessDefinition(params) {
158
160
  });
159
161
  }
160
162
  }
161
- const receiver = await resolveReceiverDefinition(obj, source, sup, resolveExpression);
163
+ const receiver = await resolveReceiverDefinition(obj, source, sup, resolveExpression, mod);
162
164
  if (receiver) {
163
165
  const objDef = receiver.def;
164
166
  const targetContext = await ensureParsedContext(objDef.file, undefined, index.languageExtensions);
@@ -180,12 +182,12 @@ export async function resolveMemberAccessDefinition(params) {
180
182
  const targetModule = index.byFile.get(fileIdentityKey(objDef.file));
181
183
  if (targetModule) {
182
184
  const normalizeIdentifier = targetContext.sup.normalizeIdentifier;
185
+ const memberPredicate = receiver.memberScope === "any"
186
+ ? undefined
187
+ : (local) => matchesReceiverMemberScope(local, receiver.memberScope, targetContext, container);
183
188
  let memberDef;
184
- if (receiver.runtimeTypeOnly) {
185
- memberDef = findDirectLocalWithinNode(targetModule.locals, member, container, targetContext, normalizeIdentifier);
186
- }
187
- else if (targetContext.sup.id === "java") {
188
- memberDef = findDirectLocalWithinNode(targetModule.locals, member, container, targetContext, normalizeIdentifier);
189
+ if (receiver.runtimeTypeOnly || targetContext.sup.id === "java") {
190
+ memberDef = findDirectLocalWithinNode(targetModule.locals, member, container, targetContext, normalizeIdentifier, memberPredicate);
189
191
  }
190
192
  else {
191
193
  memberDef = findReceiverMemberDefinition(targetModule.locals, member, objDef, container, targetContext, normalizeIdentifier, receiver.memberScope);
@@ -204,49 +206,47 @@ export async function resolveMemberAccessDefinition(params) {
204
206
  return null;
205
207
  }
206
208
  function findEnclosingClassContainer(node) {
207
- let current = node.parent;
208
- while (current) {
209
- if (current.type === "class_declaration" ||
210
- current.type === "abstract_class_declaration" ||
211
- current.type === "class_definition" ||
212
- current.type === "impl_item") {
213
- return current;
214
- }
215
- current = current.parent;
216
- }
217
- return null;
209
+ return nearestMemberContainer(node);
218
210
  }
219
- export function supportsReceiverMemberResolution(languageId) {
220
- return (languageId === "csharp" ||
221
- languageId === "python" ||
222
- languageId === "js" ||
223
- languageId === "java" ||
224
- languageId === "javascript" ||
225
- languageId === "jsx" ||
226
- languageId === "rust" ||
227
- languageId === "ts" ||
228
- languageId === "typescript" ||
229
- languageId === "tsx");
211
+ export { supportsReceiverCallEdges, supportsReceiverMemberNavigation } from "../util/member-access-tables.js";
212
+ function memberDeclaringLocals(mod, typeName, normalize) {
213
+ const normalized = normalize(typeName);
214
+ return mod.locals.filter((local) => normalize(local.localName) === normalized && declaresMembers(local));
230
215
  }
231
- async function resolveReceiverDefinition(obj, source, sup, resolveExpression) {
216
+ async function resolveReceiverDefinition(obj, source, sup, resolveExpression, mod) {
232
217
  const constructor = receiverConstructorExpression(obj, source, sup);
233
218
  if (constructor) {
219
+ const typeName = sliceText(constructor, source);
220
+ const typedLocals = memberDeclaringLocals(mod, typeName, sup.normalizeIdentifier);
221
+ if (typedLocals.length === 1) {
222
+ return {
223
+ def: typedLocals[0],
224
+ memberScope: hasStaticMemberDistinction(sup.id) ? "instance" : "any",
225
+ };
226
+ }
234
227
  const result = await resolveExpression(constructor);
235
- if (result?.kind === "resolved") {
228
+ if (result?.kind === "resolved" && declaresMembers(result.def)) {
236
229
  return {
237
230
  def: result.def,
238
- memberScope: isJsTsLanguage(sup.id) ? "instance" : "any",
231
+ memberScope: hasStaticMemberDistinction(sup.id) ? "instance" : "any",
232
+ };
233
+ }
234
+ if (typedLocals[0]) {
235
+ return {
236
+ def: typedLocals[0],
237
+ memberScope: hasStaticMemberDistinction(sup.id) ? "instance" : "any",
239
238
  };
240
239
  }
241
240
  }
242
241
  const direct = await resolveExpression(obj);
243
- if (isJsTsLanguage(sup.id) && sup.nodeTypes.identifier.includes(obj.type)) {
244
- if (direct?.kind === "resolved" && direct.def.kind === SymbolKind.Class) {
245
- return { def: direct.def, memberScope: "static" };
246
- }
247
- if (direct?.kind === "resolved" && direct.def.kind === SymbolKind.TypeAlias) {
242
+ if (direct?.kind === "resolved" && declaresMembers(direct.def)) {
243
+ if (isJsTsLanguage(sup.id) && direct.def.kind === SymbolKind.TypeAlias) {
248
244
  return { def: direct.def, memberScope: "any", runtimeTypeOnly: true };
249
245
  }
246
+ const memberScope = hasStaticMemberDistinction(sup.id) ? "static" : "any";
247
+ return { def: direct.def, memberScope };
248
+ }
249
+ if (isJsTsLanguage(sup.id) && isReceiverNameNode(sup, obj.type)) {
250
250
  return null;
251
251
  }
252
252
  if (direct?.kind === "resolved") {
@@ -254,320 +254,6 @@ async function resolveReceiverDefinition(obj, source, sup, resolveExpression) {
254
254
  }
255
255
  return null;
256
256
  }
257
- /**
258
- * Resolves the node naming the type a receiver expression was constructed from, or
259
- * null when no constructor is proven for it. Shared with detailed symbol-graph call
260
- * extraction so `goto` and resolved `calls` edges accept the same receiver forms.
261
- */
262
- export function receiverConstructorExpression(obj, source, sup) {
263
- if (obj.type === "new_expression" || obj.type === "object_creation_expression") {
264
- return constructorNameNode(obj, sup);
265
- }
266
- if (sup.id === "ruby" && obj.type === "call") {
267
- const rubyConstructor = rubyNewReceiverNameNode(obj, source, sup);
268
- if (rubyConstructor)
269
- return rubyConstructor;
270
- }
271
- if (!sup.nodeTypes.identifier.includes(obj.type)) {
272
- return null;
273
- }
274
- const receiverName = sliceText(obj, source);
275
- return findVisiblePriorNewConstructor(obj, receiverName, source, sup);
276
- }
277
- function constructorNameNode(node, sup) {
278
- const constructor = node.childForFieldName("constructor") ?? node.child(0);
279
- if (constructor && sup.nodeTypes.identifier.includes(constructor.type)) {
280
- return constructor;
281
- }
282
- for (const child of node.namedChildren) {
283
- if (sup.nodeTypes.identifier.includes(child.type) ||
284
- child.type === "type_identifier" ||
285
- child.type === "constant") {
286
- return child;
287
- }
288
- }
289
- return null;
290
- }
291
- function rubyNewReceiverNameNode(node, source, sup) {
292
- if (!new RegExp(String.raw `^(?:${RUBY_CONSTANT_SOURCE})\.new$`, "u").test(sliceText(node, source)))
293
- return null;
294
- return (node.namedChildren.find((child) => sup.nodeTypes.identifier.includes(child.type) || child.type === "constant") ??
295
- null);
296
- }
297
- function rootOf(node) {
298
- let current = node;
299
- while (current.parent) {
300
- current = current.parent;
301
- }
302
- return current;
303
- }
304
- const BINDING_CONTAINER_TYPES = new Set([
305
- "program",
306
- "compilation_unit",
307
- "source_file",
308
- "statement_block",
309
- "block",
310
- "function_declaration",
311
- "function_item",
312
- "function_definition",
313
- "function",
314
- "function_expression",
315
- "arrow_function",
316
- "method_definition",
317
- "method_declaration",
318
- "method",
319
- ]);
320
- const BINDING_DECLARATION_TYPES = new Set([
321
- "variable_declarator",
322
- "let_declaration",
323
- "assignment",
324
- "formal_parameter",
325
- "required_parameter",
326
- "optional_parameter",
327
- "parameter_declaration",
328
- "short_var_declaration",
329
- "var_spec",
330
- ]);
331
- function findVisiblePriorNewConstructor(receiver, receiverName, source, sup) {
332
- let current = receiver;
333
- while (current) {
334
- if (BINDING_CONTAINER_TYPES.has(current.type)) {
335
- const constructor = findPriorNewConstructorInContainer(current, receiver, receiverName, source, sup);
336
- if (constructor || bindingContainerDeclaresNameBefore(current, receiver, receiverName, source, sup)) {
337
- return constructor;
338
- }
339
- }
340
- current = current.parent;
341
- }
342
- return findPriorNewConstructorInContainer(rootOf(receiver), receiver, receiverName, source, sup);
343
- }
344
- function findPriorNewConstructorInContainer(node, receiver, receiverName, source, sup) {
345
- let constructor = null;
346
- const visit = (current) => {
347
- if (current.startIndex >= receiver.startIndex) {
348
- return true;
349
- }
350
- if (current !== node && isSkippableBindingContainer(current, receiver)) {
351
- return true;
352
- }
353
- if (current.type === "variable_declarator") {
354
- const name = current.childForFieldName("name") ?? current.child(0);
355
- const value = current.childForFieldName("value");
356
- if (name &&
357
- value &&
358
- (value.type === "new_expression" ||
359
- value.type === "object_creation_expression" ||
360
- sup.nodeTypes.identifier.includes(value.type)) &&
361
- sup.nodeTypes.identifier.includes(name.type) &&
362
- sliceText(name, source) === receiverName) {
363
- const candidate = constructorNameNode(value, sup);
364
- if (!candidate) {
365
- return true;
366
- }
367
- if (constructor && sliceText(constructor, source) !== sliceText(candidate, source)) {
368
- constructor = null;
369
- return false;
370
- }
371
- constructor = candidate;
372
- }
373
- }
374
- if (current.type === "assignment" || current.type === "let_declaration") {
375
- const candidate = constructorFromAssignmentLike(current, receiverName, source, sup);
376
- if (candidate) {
377
- if (constructor && sliceText(constructor, source) !== sliceText(candidate, source)) {
378
- constructor = null;
379
- return false;
380
- }
381
- constructor = candidate;
382
- }
383
- }
384
- if (current.type === "local_variable_declaration" ||
385
- current.type === "local_declaration_statement" ||
386
- current.type === "variable_declaration") {
387
- const candidate = constructorFromTypedLocalDeclaration(current, receiverName, source, sup);
388
- if (candidate) {
389
- if (constructor && sliceText(constructor, source) !== sliceText(candidate, source)) {
390
- constructor = null;
391
- return false;
392
- }
393
- constructor = candidate;
394
- }
395
- }
396
- if (sup.id === "go" && (current.type === "short_var_declaration" || current.type === "var_spec")) {
397
- const candidate = constructorFromGoBinding(current, receiverName, source, sup);
398
- if (candidate) {
399
- if (constructor && sliceText(constructor, source) !== sliceText(candidate, source)) {
400
- constructor = null;
401
- return false;
402
- }
403
- constructor = candidate;
404
- }
405
- }
406
- for (const child of current.namedChildren) {
407
- if (!visit(child)) {
408
- return false;
409
- }
410
- }
411
- return true;
412
- };
413
- visit(node);
414
- return constructor;
415
- }
416
- function constructorFromTypedLocalDeclaration(node, receiverName, source, sup) {
417
- if (sup.id !== "csharp" && sup.id !== "java")
418
- return null;
419
- const text = sliceText(node, source);
420
- const typeNameSource = sup.id === "java" ? JAVA_CONSTANT_SOURCE : CSHARP_CONSTANT_SOURCE;
421
- const match = text.match(new RegExp(String.raw `^\s*(${typeNameSource})\s+${escapeRegExp(receiverName)}\s*=\s*new\s+(${typeNameSource})(?![\p{L}\p{Nl}\p{Sc}\p{Pc}\p{Nd}\p{Mn}\p{Mc}\p{Cf}])`, "u"));
422
- const typeName = match?.[2] ?? match?.[1];
423
- return typeName ? findNamedChildText(node, typeName, source, sup) : null;
424
- }
425
- function bindingContainerDeclaresNameBefore(node, receiver, receiverName, source, sup) {
426
- const visit = (current) => {
427
- if (current.startIndex >= receiver.startIndex) {
428
- return false;
429
- }
430
- if (current !== node && isSkippableBindingContainer(current, receiver)) {
431
- return false;
432
- }
433
- if (BINDING_DECLARATION_TYPES.has(current.type)) {
434
- if (goBindingDeclaresName(current, receiverName, source, sup))
435
- return true;
436
- const name = current.childForFieldName("name") ?? current.child(0);
437
- if (name && sup.nodeTypes.identifier.includes(name.type) && sliceText(name, source) === receiverName) {
438
- return true;
439
- }
440
- }
441
- for (const child of current.namedChildren) {
442
- if (visit(child)) {
443
- return true;
444
- }
445
- }
446
- return false;
447
- };
448
- return visit(node);
449
- }
450
- function isSkippableBindingContainer(node, receiver) {
451
- return BINDING_CONTAINER_TYPES.has(node.type) && !nodeContainsIndex(node, receiver.startIndex);
452
- }
453
- function nodeContainsIndex(node, index) {
454
- return node.startIndex <= index && node.endIndex >= index;
455
- }
456
- function constructorFromAssignmentLike(node, receiverName, source, sup) {
457
- const text = sliceText(node, source);
458
- if (!new RegExp(String.raw `(?<!${IDENTIFIER_BOUNDARY_SOURCE})${escapeRegExp(receiverName)}(?!${IDENTIFIER_BOUNDARY_SOURCE})`, "u").test(text))
459
- return null;
460
- if (sup.id === "ruby") {
461
- const match = text.match(new RegExp(String.raw `^\s*${escapeRegExp(receiverName)}\s*=\s*(${RUBY_CONSTANT_SOURCE})\.new(?!${IDENTIFIER_BOUNDARY_SOURCE})`, "u"));
462
- if (!match?.[1])
463
- return null;
464
- return findNamedChildText(node, match[1], source, sup);
465
- }
466
- if (sup.id === "rust") {
467
- const match = text.match(new RegExp(String.raw `^\s*(?:let\s+)?${escapeRegExp(receiverName)}\s*=\s*(${RUST_CONSTANT_SOURCE})(?!${IDENTIFIER_BOUNDARY_SOURCE})`, "u"));
468
- if (!match?.[1])
469
- return null;
470
- return findNamedChildText(node, match[1], source, sup);
471
- }
472
- if (sup.id === "python") {
473
- return pythonConstructorFromAssignment(node, receiverName, source, sup);
474
- }
475
- return null;
476
- }
477
- function goBindingNameNodes(node) {
478
- if (node.type === "short_var_declaration") {
479
- const left = node.childForFieldName("left");
480
- return (left?.namedChildren ?? []).filter((child) => child.type === "identifier");
481
- }
482
- if (node.type === "var_spec") {
483
- return (node.namedChildren ?? []).filter((child) => child.type === "identifier");
484
- }
485
- return [];
486
- }
487
- function goBindingDeclaresName(node, receiverName, source, sup) {
488
- if (sup.id !== "go")
489
- return false;
490
- return goBindingNameNodes(node).some((name) => sliceText(name, source) === receiverName);
491
- }
492
- function constructorFromGoBinding(node, receiverName, source, sup) {
493
- if (!goBindingDeclaresName(node, receiverName, source, sup))
494
- return null;
495
- if (node.type === "short_var_declaration") {
496
- const left = node.childForFieldName("left");
497
- const right = node.childForFieldName("right");
498
- if (!left || !right)
499
- return null;
500
- const names = (left.namedChildren ?? []).filter((child) => child.type === "identifier");
501
- const values = right.namedChildren ?? [];
502
- const index = names.findIndex((name) => sliceText(name, source) === receiverName);
503
- if (index < 0)
504
- return null;
505
- const value = values[index] ?? null;
506
- return value ? goCompositeLiteralTypeName(value, source) : null;
507
- }
508
- if (node.type !== "var_spec")
509
- return null;
510
- const value = node.childForFieldName("value");
511
- if (value) {
512
- const first = value.type === "expression_list" ? (value.namedChildren[0] ?? null) : value;
513
- const fromValue = first ? goCompositeLiteralTypeName(first, source) : null;
514
- if (fromValue)
515
- return fromValue;
516
- }
517
- const typeNode = node.childForFieldName("type");
518
- return typeNode ? unwrapGoConstructorType(typeNode) : null;
519
- }
520
- function goCompositeLiteralTypeName(expr, source) {
521
- let current = expr;
522
- if (current.type === "unary_expression") {
523
- const operand = current.childForFieldName("operand");
524
- if (!operand)
525
- return null;
526
- const operator = current.childForFieldName("operator");
527
- let isAddr = sliceText(current, source).startsWith("&");
528
- if (operator)
529
- isAddr = sliceText(operator, source) === "&";
530
- if (!isAddr)
531
- return null;
532
- current = operand;
533
- }
534
- if (current.type !== "composite_literal")
535
- return null;
536
- const typeNode = current.childForFieldName("type");
537
- return typeNode ? unwrapGoConstructorType(typeNode) : null;
538
- }
539
- function unwrapGoConstructorType(node) {
540
- let current = node;
541
- while (current) {
542
- if (current.type === "parenthesized_type" || current.type === "pointer_type") {
543
- current = current.namedChildren[0] ?? null;
544
- continue;
545
- }
546
- if (current.type === "generic_type") {
547
- current = current.childForFieldName("type") ?? current.namedChildren[0] ?? null;
548
- continue;
549
- }
550
- break;
551
- }
552
- return current?.type === "type_identifier" ? current : null;
553
- }
554
- function findNamedChildText(node, name, source, sup) {
555
- const isNameNode = (candidate) => (sup.nodeTypes.identifier.includes(candidate.type) ||
556
- candidate.type === "type_identifier" ||
557
- candidate.type === "constant") &&
558
- sliceText(candidate, source) === name;
559
- const visit = (current) => {
560
- if (isNameNode(current))
561
- return current;
562
- for (const child of current.namedChildren) {
563
- const hit = visit(child);
564
- if (hit)
565
- return hit;
566
- }
567
- return null;
568
- };
569
- return visit(node);
570
- }
571
257
  async function resolveMemberDefinitionForBase(index, baseDef, member) {
572
258
  const targetContext = await ensureParsedContext(baseDef.file, undefined, index.languageExtensions);
573
259
  const start = baseDef.range.start;
@@ -593,16 +279,20 @@ async function resolveMemberDefinitionForBase(index, baseDef, member) {
593
279
  function findReceiverMemberDefinition(locals, member, receiverDef, container, targetContext, normalizeIdentifier, memberScope = "any") {
594
280
  const memberPredicate = memberScope === "any"
595
281
  ? undefined
596
- : (local) => hasStaticModifier(local, targetContext, container) === (memberScope === "static");
282
+ : (local) => matchesReceiverMemberScope(local, memberScope, targetContext, container);
597
283
  const containerHit = memberScope === "any"
598
284
  ? findLocalWithinNode(locals, member, container, normalizeIdentifier)
599
285
  : findDirectLocalWithinNode(locals, member, container, targetContext, normalizeIdentifier, memberPredicate);
600
286
  if (containerHit)
601
287
  return containerHit;
602
- if (targetContext.sup.id !== "rust")
603
- return undefined;
604
- const implNode = findRustImplForType(targetContext.tree.rootNode, receiverDef.localName, targetContext.source);
605
- return implNode ? findLocalWithinNode(locals, member, implNode, normalizeIdentifier) : undefined;
288
+ if (targetContext.sup.id === "rust") {
289
+ const implNode = findRustImplForType(targetContext.tree.rootNode, receiverDef.localName, targetContext.source);
290
+ return implNode ? findLocalWithinNode(locals, member, implNode, normalizeIdentifier) : undefined;
291
+ }
292
+ if (targetContext.sup.id === "go") {
293
+ return findGoReceiverMember(locals, member, receiverDef.localName, targetContext, normalizeIdentifier);
294
+ }
295
+ return undefined;
606
296
  }
607
297
  function findLocalWithinNode(locals, member, node, normalizeIdentifier = (name) => name, predicate) {
608
298
  const containerStart = node.startIndex;
@@ -619,6 +309,28 @@ function findLocalWithinNode(locals, member, node, normalizeIdentifier = (name)
619
309
  (!predicate || predicate(local)));
620
310
  });
621
311
  }
312
+ function matchesReceiverMemberScope(local, memberScope, targetContext, container) {
313
+ if (memberScope === "any")
314
+ return true;
315
+ return hasStaticModifier(local, targetContext, container) === (memberScope === "static");
316
+ }
317
+ function nodeDeclaresStatic(node, source) {
318
+ if (node.type === "static" || node.type === "static_modifier")
319
+ return true;
320
+ if (node.type === "storage_class_specifier" || node.type === "modifier" || node.type === "property_modifier") {
321
+ return sliceText(node, source).trim() === "static";
322
+ }
323
+ if (node.type === "modifiers") {
324
+ for (let childIndex = 0;; childIndex += 1) {
325
+ const child = node.child(childIndex);
326
+ if (!child)
327
+ break;
328
+ if (nodeDeclaresStatic(child, source))
329
+ return true;
330
+ }
331
+ }
332
+ return false;
333
+ }
622
334
  function hasStaticModifier(local, targetContext, container) {
623
335
  const position = {
624
336
  row: local.range.start.line - 1,
@@ -630,7 +342,7 @@ function hasStaticModifier(local, targetContext, container) {
630
342
  const child = current.child(childIndex);
631
343
  if (!child)
632
344
  break;
633
- if (child.type === "static")
345
+ if (nodeDeclaresStatic(child, targetContext.source))
634
346
  return true;
635
347
  }
636
348
  current = current.parent;
@@ -713,18 +425,106 @@ function findRustImplForType(root, typeName, source) {
713
425
  visit(root);
714
426
  return found;
715
427
  }
716
- function pythonConstructorFromAssignment(node, receiverName, source, sup) {
717
- const left = node.childForFieldName("left");
718
- if (!left || !sup.nodeTypes.identifier.includes(left.type) || sliceText(left, source) !== receiverName) {
719
- return null;
720
- }
721
- const right = node.childForFieldName("right");
722
- if (!right || right.type !== "call")
428
+ const GO_EMBED_DEPTH = 16;
429
+ function goMethodReceiverTypeName(methodNode, source, sup) {
430
+ const receiver = methodNode.childForFieldName("receiver");
431
+ if (!receiver)
723
432
  return null;
724
- const callee = right.childForFieldName("function") ?? right.namedChildren[0] ?? null;
725
- if (!callee || !sup.nodeTypes.identifier.includes(callee.type))
433
+ const parameter = receiver.namedChildren.find((child) => child.type === "parameter_declaration") ?? receiver.namedChildren[0] ?? null;
434
+ const typeNode = parameter?.childForFieldName("type") ?? null;
435
+ if (!typeNode)
726
436
  return null;
727
- return callee;
437
+ const named = unwrapNamedType(typeNode, sup);
438
+ return named ? sliceText(named, source) : null;
439
+ }
440
+ function goTypeSpecNamed(root, typeName, source, normalizeIdentifier) {
441
+ const normalized = normalizeIdentifier(typeName);
442
+ let found = null;
443
+ const visit = (node) => {
444
+ if (node.type === "type_spec") {
445
+ const name = node.childForFieldName("name");
446
+ if (name && normalizeIdentifier(sliceText(name, source)) === normalized) {
447
+ found = node;
448
+ return false;
449
+ }
450
+ }
451
+ for (const child of node.namedChildren) {
452
+ if (!visit(child))
453
+ return false;
454
+ }
455
+ return true;
456
+ };
457
+ visit(root);
458
+ return found;
459
+ }
460
+ function goEmbeddedTypeNames(typeName, targetContext, normalizeIdentifier) {
461
+ const spec = goTypeSpecNamed(targetContext.tree.rootNode, typeName, targetContext.source, normalizeIdentifier);
462
+ if (!spec)
463
+ return [];
464
+ const typeNode = spec.childForFieldName("type");
465
+ if (!typeNode)
466
+ return [];
467
+ const names = [];
468
+ const visit = (node) => {
469
+ if (node.type === "field_declaration") {
470
+ if (node.childForFieldName("name"))
471
+ return;
472
+ const fieldType = node.childForFieldName("type");
473
+ const named = fieldType ? unwrapNamedType(fieldType, targetContext.sup) : null;
474
+ if (named)
475
+ names.push(sliceText(named, targetContext.source));
476
+ return;
477
+ }
478
+ for (const child of node.namedChildren)
479
+ visit(child);
480
+ };
481
+ visit(typeNode);
482
+ return names;
483
+ }
484
+ function goMethodsNamedOnType(locals, member, typeName, targetContext, normalizeIdentifier) {
485
+ const matches = [];
486
+ const visit = (node) => {
487
+ if (node.type === "method_declaration") {
488
+ const receiverType = goMethodReceiverTypeName(node, targetContext.source, targetContext.sup);
489
+ if (receiverType && normalizeIdentifier(receiverType) === normalizeIdentifier(typeName)) {
490
+ const local = findLocalWithinNode(locals, member, node, normalizeIdentifier);
491
+ if (local && !matches.includes(local))
492
+ matches.push(local);
493
+ }
494
+ return;
495
+ }
496
+ for (const child of node.namedChildren)
497
+ visit(child);
498
+ };
499
+ visit(targetContext.tree.rootNode);
500
+ return matches;
501
+ }
502
+ function findGoReceiverMember(locals, member, typeName, targetContext, normalizeIdentifier) {
503
+ const visited = new Set();
504
+ let level = [typeName];
505
+ for (let depth = 0; depth < GO_EMBED_DEPTH && level.length; depth += 1) {
506
+ const matches = [];
507
+ const next = [];
508
+ for (const currentType of level) {
509
+ if (visited.has(currentType))
510
+ continue;
511
+ visited.add(currentType);
512
+ for (const method of goMethodsNamedOnType(locals, member, currentType, targetContext, normalizeIdentifier)) {
513
+ if (!matches.includes(method))
514
+ matches.push(method);
515
+ }
516
+ for (const embedded of goEmbeddedTypeNames(currentType, targetContext, normalizeIdentifier)) {
517
+ if (!visited.has(embedded) && !next.includes(embedded))
518
+ next.push(embedded);
519
+ }
520
+ }
521
+ if (matches.length === 1)
522
+ return matches[0];
523
+ if (matches.length > 1)
524
+ return undefined;
525
+ level = next;
526
+ }
527
+ return undefined;
728
528
  }
729
529
  const PYTHON_SUPERTYPE_DEPTH = 16;
730
530
  function pythonClassKey(def) {