gitnexus 1.6.2-rc.9 → 1.6.2

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 (220) hide show
  1. package/dist/_shared/lbug/schema-constants.d.ts +1 -1
  2. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  3. package/dist/_shared/lbug/schema-constants.js +1 -0
  4. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  5. package/dist/_shared/mro-strategy.d.ts +38 -16
  6. package/dist/_shared/mro-strategy.d.ts.map +1 -1
  7. package/dist/cli/ai-context.js +0 -58
  8. package/dist/cli/analyze.js +3 -0
  9. package/dist/core/embeddings/ast-utils.d.ts +22 -0
  10. package/dist/core/embeddings/ast-utils.js +105 -0
  11. package/dist/core/embeddings/character-chunk.d.ts +12 -0
  12. package/dist/core/embeddings/character-chunk.js +43 -0
  13. package/dist/core/embeddings/chunker.d.ts +14 -0
  14. package/dist/core/embeddings/chunker.js +234 -0
  15. package/dist/core/embeddings/embedding-pipeline.d.ts +20 -24
  16. package/dist/core/embeddings/embedding-pipeline.js +176 -107
  17. package/dist/core/embeddings/line-index.d.ts +7 -0
  18. package/dist/core/embeddings/line-index.js +42 -0
  19. package/dist/core/embeddings/server-mapping.d.ts +15 -0
  20. package/dist/core/embeddings/server-mapping.js +33 -0
  21. package/dist/core/embeddings/structural-extractor.d.ts +15 -0
  22. package/dist/core/embeddings/structural-extractor.js +58 -0
  23. package/dist/core/embeddings/text-generator.d.ts +20 -13
  24. package/dist/core/embeddings/text-generator.js +151 -119
  25. package/dist/core/embeddings/types.d.ts +81 -3
  26. package/dist/core/embeddings/types.js +105 -3
  27. package/dist/core/group/extractors/http-patterns/node.js +130 -0
  28. package/dist/core/ingestion/call-extractors/configs/c-cpp.d.ts +3 -0
  29. package/dist/core/ingestion/call-extractors/configs/c-cpp.js +8 -0
  30. package/dist/core/ingestion/call-extractors/configs/csharp.d.ts +2 -0
  31. package/dist/core/ingestion/call-extractors/configs/csharp.js +6 -0
  32. package/dist/core/ingestion/call-extractors/configs/dart.d.ts +2 -0
  33. package/dist/core/ingestion/call-extractors/configs/dart.js +5 -0
  34. package/dist/core/ingestion/call-extractors/configs/go.d.ts +2 -0
  35. package/dist/core/ingestion/call-extractors/configs/go.js +5 -0
  36. package/dist/core/ingestion/call-extractors/configs/jvm.d.ts +3 -0
  37. package/dist/core/ingestion/call-extractors/configs/jvm.js +51 -0
  38. package/dist/core/ingestion/call-extractors/configs/php.d.ts +2 -0
  39. package/dist/core/ingestion/call-extractors/configs/php.js +5 -0
  40. package/dist/core/ingestion/call-extractors/configs/python.d.ts +2 -0
  41. package/dist/core/ingestion/call-extractors/configs/python.js +5 -0
  42. package/dist/core/ingestion/call-extractors/configs/ruby.d.ts +2 -0
  43. package/dist/core/ingestion/call-extractors/configs/ruby.js +5 -0
  44. package/dist/core/ingestion/call-extractors/configs/rust.d.ts +2 -0
  45. package/dist/core/ingestion/call-extractors/configs/rust.js +5 -0
  46. package/dist/core/ingestion/call-extractors/configs/swift.d.ts +2 -0
  47. package/dist/core/ingestion/call-extractors/configs/swift.js +5 -0
  48. package/dist/core/ingestion/call-extractors/configs/typescript-javascript.d.ts +3 -0
  49. package/dist/core/ingestion/call-extractors/configs/typescript-javascript.js +8 -0
  50. package/dist/core/ingestion/call-extractors/generic.d.ts +5 -0
  51. package/dist/core/ingestion/call-extractors/generic.js +59 -0
  52. package/dist/core/ingestion/call-processor.d.ts +2 -4
  53. package/dist/core/ingestion/call-processor.js +221 -89
  54. package/dist/core/ingestion/call-routing.d.ts +8 -12
  55. package/dist/core/ingestion/call-routing.js +13 -34
  56. package/dist/core/ingestion/call-types.d.ts +135 -0
  57. package/dist/core/ingestion/call-types.js +2 -0
  58. package/dist/core/ingestion/class-extractors/configs/c-cpp.d.ts +3 -0
  59. package/dist/core/ingestion/class-extractors/configs/c-cpp.js +11 -0
  60. package/dist/core/ingestion/class-extractors/configs/csharp.d.ts +2 -0
  61. package/dist/core/ingestion/class-extractors/configs/csharp.js +21 -0
  62. package/dist/core/ingestion/class-extractors/configs/dart.d.ts +2 -0
  63. package/dist/core/ingestion/class-extractors/configs/dart.js +7 -0
  64. package/dist/core/ingestion/class-extractors/configs/go.d.ts +2 -0
  65. package/dist/core/ingestion/class-extractors/configs/go.js +20 -0
  66. package/dist/core/ingestion/class-extractors/configs/jvm.d.ts +3 -0
  67. package/dist/core/ingestion/class-extractors/configs/jvm.js +35 -0
  68. package/dist/core/ingestion/class-extractors/configs/php.d.ts +2 -0
  69. package/dist/core/ingestion/class-extractors/configs/php.js +7 -0
  70. package/dist/core/ingestion/class-extractors/configs/python.d.ts +2 -0
  71. package/dist/core/ingestion/class-extractors/configs/python.js +7 -0
  72. package/dist/core/ingestion/class-extractors/configs/ruby.d.ts +2 -0
  73. package/dist/core/ingestion/class-extractors/configs/ruby.js +7 -0
  74. package/dist/core/ingestion/class-extractors/configs/rust.d.ts +2 -0
  75. package/dist/core/ingestion/class-extractors/configs/rust.js +7 -0
  76. package/dist/core/ingestion/class-extractors/configs/swift.d.ts +2 -0
  77. package/dist/core/ingestion/class-extractors/configs/swift.js +18 -0
  78. package/dist/core/ingestion/class-extractors/configs/typescript-javascript.d.ts +4 -0
  79. package/dist/core/ingestion/class-extractors/configs/typescript-javascript.js +28 -0
  80. package/dist/core/ingestion/field-types.d.ts +1 -1
  81. package/dist/core/ingestion/heritage-extractors/configs/go.d.ts +13 -0
  82. package/dist/core/ingestion/heritage-extractors/configs/go.js +20 -0
  83. package/dist/core/ingestion/heritage-extractors/configs/ruby.d.ts +18 -0
  84. package/dist/core/ingestion/heritage-extractors/configs/ruby.js +65 -0
  85. package/dist/core/ingestion/heritage-extractors/generic.d.ts +23 -0
  86. package/dist/core/ingestion/heritage-extractors/generic.js +47 -0
  87. package/dist/core/ingestion/heritage-processor.d.ts +9 -0
  88. package/dist/core/ingestion/heritage-processor.js +120 -85
  89. package/dist/core/ingestion/heritage-types.d.ts +73 -0
  90. package/dist/core/ingestion/heritage-types.js +2 -0
  91. package/dist/core/ingestion/import-resolvers/configs/c-cpp.d.ts +7 -0
  92. package/dist/core/ingestion/import-resolvers/configs/c-cpp.js +14 -0
  93. package/dist/core/ingestion/import-resolvers/configs/csharp.d.ts +8 -0
  94. package/dist/core/ingestion/import-resolvers/configs/csharp.js +27 -0
  95. package/dist/core/ingestion/import-resolvers/configs/dart.d.ts +17 -0
  96. package/dist/core/ingestion/import-resolvers/{dart.js → configs/dart.js} +26 -16
  97. package/dist/core/ingestion/import-resolvers/configs/go.d.ts +8 -0
  98. package/dist/core/ingestion/import-resolvers/configs/go.js +26 -0
  99. package/dist/core/ingestion/import-resolvers/configs/jvm.d.ts +13 -0
  100. package/dist/core/ingestion/import-resolvers/configs/jvm.js +68 -0
  101. package/dist/core/ingestion/import-resolvers/configs/php.d.ts +8 -0
  102. package/dist/core/ingestion/import-resolvers/configs/php.js +15 -0
  103. package/dist/core/ingestion/import-resolvers/configs/python.d.ts +12 -0
  104. package/dist/core/ingestion/import-resolvers/configs/python.js +41 -0
  105. package/dist/core/ingestion/import-resolvers/configs/ruby.d.ts +8 -0
  106. package/dist/core/ingestion/import-resolvers/configs/ruby.js +16 -0
  107. package/dist/core/ingestion/import-resolvers/configs/rust.d.ts +8 -0
  108. package/dist/core/ingestion/import-resolvers/configs/rust.js +54 -0
  109. package/dist/core/ingestion/import-resolvers/configs/swift.d.ts +8 -0
  110. package/dist/core/ingestion/import-resolvers/{swift.js → configs/swift.js} +10 -5
  111. package/dist/core/ingestion/import-resolvers/configs/typescript-javascript.d.ts +9 -0
  112. package/dist/core/ingestion/import-resolvers/configs/typescript-javascript.js +23 -0
  113. package/dist/core/ingestion/import-resolvers/csharp.d.ts +4 -5
  114. package/dist/core/ingestion/import-resolvers/csharp.js +4 -20
  115. package/dist/core/ingestion/import-resolvers/go.d.ts +4 -5
  116. package/dist/core/ingestion/import-resolvers/go.js +4 -19
  117. package/dist/core/ingestion/import-resolvers/jvm.d.ts +5 -10
  118. package/dist/core/ingestion/import-resolvers/jvm.js +5 -58
  119. package/dist/core/ingestion/import-resolvers/php.d.ts +4 -5
  120. package/dist/core/ingestion/import-resolvers/php.js +4 -7
  121. package/dist/core/ingestion/import-resolvers/python.d.ts +3 -6
  122. package/dist/core/ingestion/import-resolvers/python.js +3 -18
  123. package/dist/core/ingestion/import-resolvers/resolver-factory.d.ts +24 -0
  124. package/dist/core/ingestion/import-resolvers/resolver-factory.js +33 -0
  125. package/dist/core/ingestion/import-resolvers/ruby.d.ts +4 -5
  126. package/dist/core/ingestion/import-resolvers/ruby.js +4 -7
  127. package/dist/core/ingestion/import-resolvers/rust.d.ts +4 -5
  128. package/dist/core/ingestion/import-resolvers/rust.js +4 -47
  129. package/dist/core/ingestion/import-resolvers/standard.d.ts +3 -9
  130. package/dist/core/ingestion/import-resolvers/standard.js +7 -8
  131. package/dist/core/ingestion/import-resolvers/types.d.ts +24 -0
  132. package/dist/core/ingestion/language-provider.d.ts +80 -0
  133. package/dist/core/ingestion/languages/c-cpp.js +18 -12
  134. package/dist/core/ingestion/languages/csharp.js +13 -21
  135. package/dist/core/ingestion/languages/dart.js +13 -7
  136. package/dist/core/ingestion/languages/go.js +14 -20
  137. package/dist/core/ingestion/languages/java.js +13 -18
  138. package/dist/core/ingestion/languages/kotlin.js +13 -13
  139. package/dist/core/ingestion/languages/php.js +13 -7
  140. package/dist/core/ingestion/languages/python.js +13 -7
  141. package/dist/core/ingestion/languages/ruby.js +103 -22
  142. package/dist/core/ingestion/languages/rust.js +13 -7
  143. package/dist/core/ingestion/languages/swift.js +13 -18
  144. package/dist/core/ingestion/languages/typescript.js +18 -23
  145. package/dist/core/ingestion/languages/vue.js +13 -17
  146. package/dist/core/ingestion/model/heritage-map.d.ts +35 -0
  147. package/dist/core/ingestion/model/heritage-map.js +110 -9
  148. package/dist/core/ingestion/model/index.d.ts +2 -2
  149. package/dist/core/ingestion/model/index.js +1 -1
  150. package/dist/core/ingestion/model/resolve.d.ts +33 -28
  151. package/dist/core/ingestion/model/resolve.js +111 -27
  152. package/dist/core/ingestion/parsing-processor.d.ts +1 -2
  153. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +1 -0
  154. package/dist/core/ingestion/pipeline-phases/parse-impl.js +9 -3
  155. package/dist/core/ingestion/pipeline-phases/parse.d.ts +7 -0
  156. package/dist/core/ingestion/pipeline.d.ts +11 -0
  157. package/dist/core/ingestion/pipeline.js +9 -2
  158. package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
  159. package/dist/core/ingestion/tree-sitter-queries.js +81 -0
  160. package/dist/core/ingestion/type-env.d.ts +1 -1
  161. package/dist/core/ingestion/utils/ast-helpers.d.ts +1 -1
  162. package/dist/core/ingestion/utils/ast-helpers.js +22 -2
  163. package/dist/core/ingestion/utils/ruby-self-call.d.ts +52 -0
  164. package/dist/core/ingestion/utils/ruby-self-call.js +59 -0
  165. package/dist/core/ingestion/variable-extractors/configs/c-cpp.d.ts +3 -0
  166. package/dist/core/ingestion/variable-extractors/configs/c-cpp.js +81 -0
  167. package/dist/core/ingestion/variable-extractors/configs/csharp.d.ts +9 -0
  168. package/dist/core/ingestion/variable-extractors/configs/csharp.js +63 -0
  169. package/dist/core/ingestion/variable-extractors/configs/dart.d.ts +2 -0
  170. package/dist/core/ingestion/variable-extractors/configs/dart.js +94 -0
  171. package/dist/core/ingestion/variable-extractors/configs/go.d.ts +2 -0
  172. package/dist/core/ingestion/variable-extractors/configs/go.js +83 -0
  173. package/dist/core/ingestion/variable-extractors/configs/jvm.d.ts +18 -0
  174. package/dist/core/ingestion/variable-extractors/configs/jvm.js +115 -0
  175. package/dist/core/ingestion/variable-extractors/configs/php.d.ts +14 -0
  176. package/dist/core/ingestion/variable-extractors/configs/php.js +58 -0
  177. package/dist/core/ingestion/variable-extractors/configs/python.d.ts +2 -0
  178. package/dist/core/ingestion/variable-extractors/configs/python.js +101 -0
  179. package/dist/core/ingestion/variable-extractors/configs/ruby.d.ts +11 -0
  180. package/dist/core/ingestion/variable-extractors/configs/ruby.js +52 -0
  181. package/dist/core/ingestion/variable-extractors/configs/rust.d.ts +2 -0
  182. package/dist/core/ingestion/variable-extractors/configs/rust.js +76 -0
  183. package/dist/core/ingestion/variable-extractors/configs/swift.d.ts +2 -0
  184. package/dist/core/ingestion/variable-extractors/configs/swift.js +88 -0
  185. package/dist/core/ingestion/variable-extractors/configs/typescript-javascript.d.ts +3 -0
  186. package/dist/core/ingestion/variable-extractors/configs/typescript-javascript.js +83 -0
  187. package/dist/core/ingestion/variable-extractors/generic.d.ts +5 -0
  188. package/dist/core/ingestion/variable-extractors/generic.js +80 -0
  189. package/dist/core/ingestion/variable-types.d.ts +82 -0
  190. package/dist/core/ingestion/variable-types.js +2 -0
  191. package/dist/core/ingestion/workers/parse-worker.js +244 -217
  192. package/dist/core/ingestion/workers/worker-pool.js +3 -0
  193. package/dist/core/lbug/csv-generator.js +1 -0
  194. package/dist/core/lbug/lbug-adapter.d.ts +4 -5
  195. package/dist/core/lbug/lbug-adapter.js +38 -14
  196. package/dist/core/lbug/schema.d.ts +2 -1
  197. package/dist/core/lbug/schema.js +10 -1
  198. package/dist/core/run-analyze.js +6 -7
  199. package/dist/core/tree-sitter/parser-loader.d.ts +3 -0
  200. package/dist/core/tree-sitter/parser-loader.js +17 -8
  201. package/dist/mcp/local/local-backend.js +29 -19
  202. package/dist/server/api.js +2 -0
  203. package/dist/types/pipeline.d.ts +6 -0
  204. package/package.json +8 -7
  205. package/scripts/build-tree-sitter-proto.cjs +82 -0
  206. package/vendor/node_modules/node-addon-api/node_addon_api.Makefile +6 -0
  207. package/vendor/node_modules/node-addon-api/node_addon_api.target.mk +104 -0
  208. package/vendor/node_modules/node-addon-api/node_addon_api_except.target.mk +108 -0
  209. package/vendor/node_modules/node-addon-api/node_addon_api_except_all.target.mk +104 -0
  210. package/vendor/node_modules/node-addon-api/node_addon_api_maybe.target.mk +104 -0
  211. package/vendor/tree-sitter-proto/package.json +1 -7
  212. package/dist/core/ingestion/call-sites/extract-language-call-site.d.ts +0 -10
  213. package/dist/core/ingestion/call-sites/extract-language-call-site.js +0 -22
  214. package/dist/core/ingestion/call-sites/java.d.ts +0 -9
  215. package/dist/core/ingestion/call-sites/java.js +0 -30
  216. package/dist/core/ingestion/import-resolvers/dart.d.ts +0 -7
  217. package/dist/core/ingestion/import-resolvers/swift.d.ts +0 -7
  218. package/dist/core/ingestion/import-resolvers/vue.d.ts +0 -8
  219. package/dist/core/ingestion/import-resolvers/vue.js +0 -9
  220. package/scripts/preinstall-cleanup.cjs +0 -34
@@ -7,10 +7,12 @@
7
7
  */
8
8
  import { SupportedLanguages } from '../../../_shared/index.js';
9
9
  import { createClassExtractor } from '../class-extractors/generic.js';
10
+ import { phpClassConfig } from '../class-extractors/configs/php.js';
10
11
  import { defineLanguage } from '../language-provider.js';
11
12
  import { typeConfig as phpConfig } from '../type-extractors/php.js';
12
13
  import { phpExportChecker } from '../export-detection.js';
13
- import { resolvePhpImport } from '../import-resolvers/php.js';
14
+ import { createImportResolver } from '../import-resolvers/resolver-factory.js';
15
+ import { phpImportConfig } from '../import-resolvers/configs/php.js';
14
16
  import { extractPhpNamedBindings } from '../named-bindings/php.js';
15
17
  import { PHP_QUERIES } from '../tree-sitter-queries.js';
16
18
  import { findDescendant, extractStringContent } from '../utils/ast-helpers.js';
@@ -18,6 +20,11 @@ import { createFieldExtractor } from '../field-extractors/generic.js';
18
20
  import { phpConfig as phpFieldConfig } from '../field-extractors/configs/php.js';
19
21
  import { createMethodExtractor } from '../method-extractors/generic.js';
20
22
  import { phpMethodConfig } from '../method-extractors/configs/php.js';
23
+ import { createVariableExtractor } from '../variable-extractors/generic.js';
24
+ import { phpVariableConfig } from '../variable-extractors/configs/php.js';
25
+ import { createCallExtractor } from '../call-extractors/generic.js';
26
+ import { phpCallConfig } from '../call-extractors/configs/php.js';
27
+ import { createHeritageExtractor } from '../heritage-extractors/generic.js';
21
28
  const BUILT_INS = new Set([
22
29
  'echo',
23
30
  'isset',
@@ -219,15 +226,14 @@ export const phpProvider = defineLanguage({
219
226
  treeSitterQueries: PHP_QUERIES,
220
227
  typeConfig: phpConfig,
221
228
  exportChecker: phpExportChecker,
222
- importResolver: resolvePhpImport,
229
+ importResolver: createImportResolver(phpImportConfig),
223
230
  namedBindingExtractor: extractPhpNamedBindings,
231
+ callExtractor: createCallExtractor(phpCallConfig),
224
232
  fieldExtractor: createFieldExtractor(phpFieldConfig),
225
233
  methodExtractor: createMethodExtractor(phpMethodConfig),
226
- classExtractor: createClassExtractor({
227
- language: SupportedLanguages.PHP,
228
- typeDeclarationNodes: ['class_declaration', 'interface_declaration', 'enum_declaration'],
229
- ancestorScopeNodeTypes: ['namespace_definition'],
230
- }),
234
+ variableExtractor: createVariableExtractor(phpVariableConfig),
235
+ classExtractor: createClassExtractor(phpClassConfig),
236
+ heritageExtractor: createHeritageExtractor(SupportedLanguages.PHP),
231
237
  descriptionExtractor: phpDescriptionExtractor,
232
238
  isRouteFile: isPhpRouteFile,
233
239
  builtInNames: BUILT_INS,
@@ -11,16 +11,23 @@
11
11
  */
12
12
  import { SupportedLanguages } from '../../../_shared/index.js';
13
13
  import { createClassExtractor } from '../class-extractors/generic.js';
14
+ import { pythonClassConfig } from '../class-extractors/configs/python.js';
14
15
  import { defineLanguage } from '../language-provider.js';
15
16
  import { typeConfig as pythonConfig } from '../type-extractors/python.js';
16
17
  import { pythonExportChecker } from '../export-detection.js';
17
- import { resolvePythonImport } from '../import-resolvers/python.js';
18
+ import { createImportResolver } from '../import-resolvers/resolver-factory.js';
19
+ import { pythonImportConfig } from '../import-resolvers/configs/python.js';
18
20
  import { extractPythonNamedBindings } from '../named-bindings/python.js';
19
21
  import { PYTHON_QUERIES } from '../tree-sitter-queries.js';
20
22
  import { createFieldExtractor } from '../field-extractors/generic.js';
21
23
  import { pythonConfig as pythonFieldConfig } from '../field-extractors/configs/python.js';
22
24
  import { createMethodExtractor } from '../method-extractors/generic.js';
23
25
  import { pythonMethodConfig } from '../method-extractors/configs/python.js';
26
+ import { createVariableExtractor } from '../variable-extractors/generic.js';
27
+ import { pythonVariableConfig } from '../variable-extractors/configs/python.js';
28
+ import { createCallExtractor } from '../call-extractors/generic.js';
29
+ import { pythonCallConfig } from '../call-extractors/configs/python.js';
30
+ import { createHeritageExtractor } from '../heritage-extractors/generic.js';
24
31
  const BUILT_INS = new Set([
25
32
  'print',
26
33
  'len',
@@ -56,16 +63,15 @@ export const pythonProvider = defineLanguage({
56
63
  treeSitterQueries: PYTHON_QUERIES,
57
64
  typeConfig: pythonConfig,
58
65
  exportChecker: pythonExportChecker,
59
- importResolver: resolvePythonImport,
66
+ importResolver: createImportResolver(pythonImportConfig),
60
67
  namedBindingExtractor: extractPythonNamedBindings,
61
68
  importSemantics: 'namespace',
62
69
  mroStrategy: 'c3',
70
+ callExtractor: createCallExtractor(pythonCallConfig),
63
71
  fieldExtractor: createFieldExtractor(pythonFieldConfig),
64
72
  methodExtractor: createMethodExtractor(pythonMethodConfig),
65
- classExtractor: createClassExtractor({
66
- language: SupportedLanguages.Python,
67
- typeDeclarationNodes: ['class_definition'],
68
- ancestorScopeNodeTypes: ['class_definition'],
69
- }),
73
+ variableExtractor: createVariableExtractor(pythonVariableConfig),
74
+ classExtractor: createClassExtractor(pythonClassConfig),
75
+ heritageExtractor: createHeritageExtractor(SupportedLanguages.Python),
70
76
  builtInNames: BUILT_INS,
71
77
  });
@@ -8,16 +8,43 @@
8
8
  */
9
9
  import { SupportedLanguages } from '../../../_shared/index.js';
10
10
  import { createClassExtractor } from '../class-extractors/generic.js';
11
+ import { rubyClassConfig } from '../class-extractors/configs/ruby.js';
11
12
  import { defineLanguage } from '../language-provider.js';
12
13
  import { typeConfig as rubyConfig } from '../type-extractors/ruby.js';
13
14
  import { routeRubyCall } from '../call-routing.js';
14
15
  import { rubyExportChecker } from '../export-detection.js';
15
- import { resolveRubyImport } from '../import-resolvers/ruby.js';
16
+ import { createImportResolver } from '../import-resolvers/resolver-factory.js';
17
+ import { rubyImportConfig } from '../import-resolvers/configs/ruby.js';
16
18
  import { RUBY_QUERIES } from '../tree-sitter-queries.js';
17
19
  import { createFieldExtractor } from '../field-extractors/generic.js';
18
20
  import { rubyConfig as rubyFieldConfig } from '../field-extractors/configs/ruby.js';
19
21
  import { createMethodExtractor } from '../method-extractors/generic.js';
20
22
  import { rubyMethodConfig } from '../method-extractors/configs/ruby.js';
23
+ import { createVariableExtractor } from '../variable-extractors/generic.js';
24
+ import { rubyVariableConfig } from '../variable-extractors/configs/ruby.js';
25
+ import { createCallExtractor } from '../call-extractors/generic.js';
26
+ import { rubyCallConfig } from '../call-extractors/configs/ruby.js';
27
+ import { createHeritageExtractor } from '../heritage-extractors/generic.js';
28
+ import { rubyHeritageConfig } from '../heritage-extractors/configs/ruby.js';
29
+ import { maybeRewriteRubyBareCallToSelf } from '../utils/ruby-self-call.js';
30
+ import { findEnclosingClassInfo } from '../utils/ast-helpers.js';
31
+ /**
32
+ * Ruby label override. Applied to:
33
+ * - `definition.module` captures in the structure phase — remaps to `Trait`
34
+ * so Ruby modules are registered in the class-like type registry and are
35
+ * therefore resolvable by `lookupClassByName` during mixin heritage
36
+ * resolution (`include`/`extend`/`prepend`).
37
+ * - `definition.function` captures — Ruby has no bare "function" construct
38
+ * (top-level `def` is a method on `main`); return the default so generic
39
+ * logic continues to apply.
40
+ *
41
+ * Returning `null` means "skip this definition"; we never do that here.
42
+ */
43
+ const rubyLabelOverride = (_node, defaultLabel) => {
44
+ if (defaultLabel === 'Module')
45
+ return 'Trait';
46
+ return defaultLabel;
47
+ };
21
48
  /** Ruby method/singleton_method: extract name from 'name' field, label as Method. */
22
49
  const rubyExtractFunctionName = (node) => {
23
50
  if (node.type !== 'method' && node.type !== 'singleton_method')
@@ -91,39 +118,93 @@ const BUILT_INS = new Set([
91
118
  'flatten',
92
119
  'uniq',
93
120
  ]);
121
+ /**
122
+ * Remaps `class << self` (singleton_class) to its enclosing class/module for
123
+ * receiver inference. A `singleton_class` node is not itself a type — walking
124
+ * up to the real owner lets `inferImplicitReceiver` set `hint='singleton'`.
125
+ * Returns null for orphaned singleton_class (no enclosing class/module found).
126
+ * All other container types are returned as-is.
127
+ */
128
+ const rubyResolveEnclosingOwner = (node) => {
129
+ if (node.type === 'singleton_class') {
130
+ let ancestor = node.parent;
131
+ while (ancestor) {
132
+ if (ancestor.type === 'class' || ancestor.type === 'module') {
133
+ return ancestor;
134
+ }
135
+ ancestor = ancestor.parent;
136
+ }
137
+ return null; // no enclosing class/module — skip
138
+ }
139
+ return node; // use as-is for all other container types
140
+ };
94
141
  export const rubyProvider = defineLanguage({
95
142
  id: SupportedLanguages.Ruby,
96
143
  extensions: ['.rb', '.rake', '.gemspec'],
97
144
  treeSitterQueries: RUBY_QUERIES,
98
145
  typeConfig: rubyConfig,
99
146
  exportChecker: rubyExportChecker,
100
- importResolver: resolveRubyImport,
147
+ importResolver: createImportResolver(rubyImportConfig),
101
148
  callRouter: routeRubyCall,
102
149
  importSemantics: 'wildcard-leaf',
103
- resolveEnclosingOwner(node) {
104
- // Ruby singleton_class (class << self) should resolve to the enclosing
105
- // class or module for owner/container resolution (HAS_METHOD edges, class IDs).
106
- if (node.type === 'singleton_class') {
107
- let ancestor = node.parent;
108
- while (ancestor) {
109
- if (ancestor.type === 'class' || ancestor.type === 'module') {
110
- return ancestor;
111
- }
112
- ancestor = ancestor.parent;
113
- }
114
- return null; // no enclosing class/module — skip
115
- }
116
- return node; // use as-is for all other container types
117
- },
150
+ callExtractor: createCallExtractor(rubyCallConfig),
151
+ resolveEnclosingOwner: rubyResolveEnclosingOwner,
118
152
  fieldExtractor: createFieldExtractor(rubyFieldConfig),
119
153
  methodExtractor: createMethodExtractor({
120
154
  ...rubyMethodConfig,
121
155
  extractFunctionName: rubyExtractFunctionName,
122
156
  }),
123
- classExtractor: createClassExtractor({
124
- language: SupportedLanguages.Ruby,
125
- typeDeclarationNodes: ['class'],
126
- ancestorScopeNodeTypes: ['module', 'class'],
127
- }),
157
+ variableExtractor: createVariableExtractor(rubyVariableConfig),
158
+ classExtractor: createClassExtractor(rubyClassConfig),
159
+ heritageExtractor: createHeritageExtractor(rubyHeritageConfig),
160
+ labelOverride: rubyLabelOverride,
161
+ // Ruby MRO is kind-aware: prepend providers beat the class's own method,
162
+ // which in turn beats include providers. See `lookupMethodByOwnerWithMRO`
163
+ // in `model/resolve.ts` for the walk order.
164
+ mroStrategy: 'ruby-mixin',
165
+ // ── DAG hooks ────────────────────────────────────────────────────
166
+ //
167
+ // DAG stage 3: rewrite bare calls (e.g. `serialize` in Account#call_serialize)
168
+ // as `self.serialize` so they route through owner-scoped MRO instead of
169
+ // global free-call lookup. `dispatchKind` goes into `hint` for stage 4.
170
+ inferImplicitReceiver: ({ calledName, callForm, receiverName, receiverTypeName, callNode, filePath, }) => {
171
+ // Only fire when no receiver has been resolved already.
172
+ if (receiverName || receiverTypeName)
173
+ return null;
174
+ const enclosing = findEnclosingClassInfo(callNode, filePath, rubyResolveEnclosingOwner);
175
+ const rewrite = maybeRewriteRubyBareCallToSelf(calledName, callForm, callNode, enclosing?.className ?? null, { isBuiltInName: (n) => BUILT_INS.has(n), mroStrategy: 'ruby-mixin' });
176
+ if (!rewrite)
177
+ return null;
178
+ return {
179
+ callForm: rewrite.callForm,
180
+ receiverName: rewrite.receiverName,
181
+ receiverTypeName: rewrite.receiverTypeName,
182
+ receiverSource: 'implicit-self',
183
+ hint: rewrite.dispatchKind, // 'instance' | 'singleton'
184
+ };
185
+ },
186
+ // DAG stage 4: two Ruby dispatch overrides —
187
+ // implicit-self: MRO walk first, fallback to free-arity-narrowed on miss.
188
+ // class-as-receiver: singleton ancestry (extend providers only); miss null-routes.
189
+ selectDispatch: ({ receiverSource, hint }) => {
190
+ if (receiverSource === 'implicit-self') {
191
+ // hint='instance' → instance ancestry (prepend→direct→include, see mro-strategy.ts § 'ruby-mixin')
192
+ // hint='singleton' → singleton ancestry (extend providers only; miss null-routes)
193
+ const ancestryView = hint === 'singleton' ? 'singleton' : 'instance';
194
+ return {
195
+ primary: 'owner-scoped',
196
+ fallback: 'free-arity-narrowed',
197
+ ancestryView,
198
+ };
199
+ }
200
+ if (receiverSource === 'class-as-receiver') {
201
+ // Class constant receiver (e.g. Account.log): singleton ancestry only; miss null-routes.
202
+ return {
203
+ primary: 'owner-scoped',
204
+ ancestryView: 'singleton',
205
+ };
206
+ }
207
+ return null;
208
+ },
128
209
  builtInNames: BUILT_INS,
129
210
  });
@@ -11,16 +11,23 @@
11
11
  */
12
12
  import { SupportedLanguages } from '../../../_shared/index.js';
13
13
  import { createClassExtractor } from '../class-extractors/generic.js';
14
+ import { rustClassConfig } from '../class-extractors/configs/rust.js';
14
15
  import { defineLanguage } from '../language-provider.js';
15
16
  import { typeConfig as rustConfig } from '../type-extractors/rust.js';
16
17
  import { rustExportChecker } from '../export-detection.js';
17
- import { resolveRustImport } from '../import-resolvers/rust.js';
18
+ import { createImportResolver } from '../import-resolvers/resolver-factory.js';
19
+ import { rustImportConfig } from '../import-resolvers/configs/rust.js';
18
20
  import { extractRustNamedBindings } from '../named-bindings/rust.js';
19
21
  import { RUST_QUERIES } from '../tree-sitter-queries.js';
20
22
  import { createFieldExtractor } from '../field-extractors/generic.js';
21
23
  import { rustConfig as rustFieldConfig } from '../field-extractors/configs/rust.js';
22
24
  import { createMethodExtractor } from '../method-extractors/generic.js';
23
25
  import { rustMethodConfig } from '../method-extractors/configs/rust.js';
26
+ import { createVariableExtractor } from '../variable-extractors/generic.js';
27
+ import { rustVariableConfig } from '../variable-extractors/configs/rust.js';
28
+ import { createCallExtractor } from '../call-extractors/generic.js';
29
+ import { rustCallConfig } from '../call-extractors/configs/rust.js';
30
+ import { createHeritageExtractor } from '../heritage-extractors/generic.js';
24
31
  /** Rust impl_item: find the function_item child and extract its name as a Method. */
25
32
  const rustExtractFunctionName = (node) => {
26
33
  if (node.type !== 'impl_item')
@@ -109,18 +116,17 @@ export const rustProvider = defineLanguage({
109
116
  treeSitterQueries: RUST_QUERIES,
110
117
  typeConfig: rustConfig,
111
118
  exportChecker: rustExportChecker,
112
- importResolver: resolveRustImport,
119
+ importResolver: createImportResolver(rustImportConfig),
113
120
  namedBindingExtractor: extractRustNamedBindings,
114
121
  mroStrategy: 'qualified-syntax',
122
+ callExtractor: createCallExtractor(rustCallConfig),
115
123
  fieldExtractor: createFieldExtractor(rustFieldConfig),
116
124
  methodExtractor: createMethodExtractor({
117
125
  ...rustMethodConfig,
118
126
  extractFunctionName: rustExtractFunctionName,
119
127
  }),
120
- classExtractor: createClassExtractor({
121
- language: SupportedLanguages.Rust,
122
- typeDeclarationNodes: ['struct_item', 'enum_item'],
123
- ancestorScopeNodeTypes: ['mod_item', 'struct_item', 'enum_item'],
124
- }),
128
+ variableExtractor: createVariableExtractor(rustVariableConfig),
129
+ classExtractor: createClassExtractor(rustClassConfig),
130
+ heritageExtractor: createHeritageExtractor(SupportedLanguages.Rust),
125
131
  builtInNames: BUILT_INS,
126
132
  });
@@ -11,15 +11,22 @@
11
11
  */
12
12
  import { SupportedLanguages } from '../../../_shared/index.js';
13
13
  import { createClassExtractor } from '../class-extractors/generic.js';
14
+ import { swiftClassConfig } from '../class-extractors/configs/swift.js';
14
15
  import { defineLanguage } from '../language-provider.js';
15
16
  import { typeConfig as swiftConfig } from '../type-extractors/swift.js';
16
17
  import { swiftExportChecker } from '../export-detection.js';
17
- import { resolveSwiftImport } from '../import-resolvers/swift.js';
18
+ import { createImportResolver } from '../import-resolvers/resolver-factory.js';
19
+ import { swiftImportConfig } from '../import-resolvers/configs/swift.js';
18
20
  import { SWIFT_QUERIES } from '../tree-sitter-queries.js';
19
21
  import { createFieldExtractor } from '../field-extractors/generic.js';
20
22
  import { swiftConfig as swiftFieldConfig } from '../field-extractors/configs/swift.js';
21
23
  import { createMethodExtractor } from '../method-extractors/generic.js';
22
24
  import { swiftMethodConfig } from '../method-extractors/configs/swift.js';
25
+ import { createVariableExtractor } from '../variable-extractors/generic.js';
26
+ import { swiftVariableConfig } from '../variable-extractors/configs/swift.js';
27
+ import { createCallExtractor } from '../call-extractors/generic.js';
28
+ import { swiftCallConfig } from '../call-extractors/configs/swift.js';
29
+ import { createHeritageExtractor } from '../heritage-extractors/generic.js';
23
30
  /**
24
31
  * Group Swift files by SPM target for implicit module visibility.
25
32
  * If SwiftPackageConfig is available, use target -> directory mappings.
@@ -220,30 +227,18 @@ export const swiftProvider = defineLanguage({
220
227
  treeSitterQueries: SWIFT_QUERIES,
221
228
  typeConfig: swiftConfig,
222
229
  exportChecker: swiftExportChecker,
223
- importResolver: resolveSwiftImport,
230
+ importResolver: createImportResolver(swiftImportConfig),
224
231
  importSemantics: 'wildcard-leaf',
225
232
  heritageDefaultEdge: 'IMPLEMENTS',
233
+ callExtractor: createCallExtractor(swiftCallConfig),
226
234
  fieldExtractor: createFieldExtractor(swiftFieldConfig),
227
235
  methodExtractor: createMethodExtractor({
228
236
  ...swiftMethodConfig,
229
237
  extractFunctionName: swiftExtractFunctionName,
230
238
  }),
231
- classExtractor: createClassExtractor({
232
- language: SupportedLanguages.Swift,
233
- typeDeclarationNodes: ['class_declaration', 'protocol_declaration'],
234
- ancestorScopeNodeTypes: ['class_declaration', 'protocol_declaration'],
235
- extractType(node) {
236
- if (node.type === 'protocol_declaration')
237
- return 'Interface';
238
- if (node.type !== 'class_declaration')
239
- return undefined;
240
- if (node.children.some((child) => child?.text === 'struct'))
241
- return 'Struct';
242
- if (node.children.some((child) => child?.text === 'enum'))
243
- return 'Enum';
244
- return 'Class';
245
- },
246
- }),
239
+ variableExtractor: createVariableExtractor(swiftVariableConfig),
240
+ classExtractor: createClassExtractor(swiftClassConfig),
241
+ heritageExtractor: createHeritageExtractor(SupportedLanguages.Swift),
247
242
  implicitImportWirer: wireSwiftImplicitImports,
248
243
  builtInNames: BUILT_INS,
249
244
  });
@@ -9,9 +9,11 @@
9
9
  import { SupportedLanguages } from '../../../_shared/index.js';
10
10
  import { defineLanguage } from '../language-provider.js';
11
11
  import { createClassExtractor } from '../class-extractors/generic.js';
12
+ import { typescriptClassConfig, javascriptClassConfig, } from '../class-extractors/configs/typescript-javascript.js';
12
13
  import { typeConfig as typescriptConfig } from '../type-extractors/typescript.js';
13
14
  import { tsExportChecker } from '../export-detection.js';
14
- import { resolveTypescriptImport, resolveJavascriptImport } from '../import-resolvers/standard.js';
15
+ import { createImportResolver } from '../import-resolvers/resolver-factory.js';
16
+ import { typescriptImportConfig, javascriptImportConfig, } from '../import-resolvers/configs/typescript-javascript.js';
15
17
  import { extractTsNamedBindings } from '../named-bindings/typescript.js';
16
18
  import { TYPESCRIPT_QUERIES, JAVASCRIPT_QUERIES } from '../tree-sitter-queries.js';
17
19
  import { typescriptFieldExtractor } from '../field-extractors/typescript.js';
@@ -19,6 +21,11 @@ import { createFieldExtractor } from '../field-extractors/generic.js';
19
21
  import { javascriptConfig } from '../field-extractors/configs/typescript-javascript.js';
20
22
  import { createMethodExtractor } from '../method-extractors/generic.js';
21
23
  import { typescriptMethodConfig, javascriptMethodConfig, } from '../method-extractors/configs/typescript-javascript.js';
24
+ import { createVariableExtractor } from '../variable-extractors/generic.js';
25
+ import { typescriptVariableConfig, javascriptVariableConfig, } from '../variable-extractors/configs/typescript-javascript.js';
26
+ import { createCallExtractor } from '../call-extractors/generic.js';
27
+ import { typescriptCallConfig, javascriptCallConfig, } from '../call-extractors/configs/typescript-javascript.js';
28
+ import { createHeritageExtractor } from '../heritage-extractors/generic.js';
22
29
  /**
23
30
  * TypeScript/JavaScript: arrow_function and function_expression get their name
24
31
  * from the parent variable_declarator (e.g. `const foo = () => {}`).
@@ -137,35 +144,23 @@ export const BUILT_INS = new Set([
137
144
  'toString',
138
145
  'valueOf',
139
146
  ]);
140
- const tsJsClassConfig = {
141
- language: SupportedLanguages.TypeScript,
142
- typeDeclarationNodes: [
143
- 'class_declaration',
144
- 'abstract_class_declaration',
145
- 'interface_declaration',
146
- 'enum_declaration',
147
- ],
148
- ancestorScopeNodeTypes: [
149
- 'class_declaration',
150
- 'abstract_class_declaration',
151
- 'interface_declaration',
152
- 'enum_declaration',
153
- ],
154
- };
155
147
  export const typescriptProvider = defineLanguage({
156
148
  id: SupportedLanguages.TypeScript,
157
149
  extensions: ['.ts', '.tsx'],
158
150
  treeSitterQueries: TYPESCRIPT_QUERIES,
159
151
  typeConfig: typescriptConfig,
160
152
  exportChecker: tsExportChecker,
161
- importResolver: resolveTypescriptImport,
153
+ importResolver: createImportResolver(typescriptImportConfig),
162
154
  namedBindingExtractor: extractTsNamedBindings,
155
+ callExtractor: createCallExtractor(typescriptCallConfig),
163
156
  fieldExtractor: typescriptFieldExtractor,
164
157
  methodExtractor: createMethodExtractor({
165
158
  ...typescriptMethodConfig,
166
159
  extractFunctionName: tsExtractFunctionName,
167
160
  }),
168
- classExtractor: createClassExtractor(tsJsClassConfig),
161
+ variableExtractor: createVariableExtractor(typescriptVariableConfig),
162
+ classExtractor: createClassExtractor(typescriptClassConfig),
163
+ heritageExtractor: createHeritageExtractor(SupportedLanguages.TypeScript),
169
164
  builtInNames: BUILT_INS,
170
165
  });
171
166
  export const javascriptProvider = defineLanguage({
@@ -174,16 +169,16 @@ export const javascriptProvider = defineLanguage({
174
169
  treeSitterQueries: JAVASCRIPT_QUERIES,
175
170
  typeConfig: typescriptConfig,
176
171
  exportChecker: tsExportChecker,
177
- importResolver: resolveJavascriptImport,
172
+ importResolver: createImportResolver(javascriptImportConfig),
178
173
  namedBindingExtractor: extractTsNamedBindings,
174
+ callExtractor: createCallExtractor(javascriptCallConfig),
179
175
  fieldExtractor: createFieldExtractor(javascriptConfig),
180
176
  methodExtractor: createMethodExtractor({
181
177
  ...javascriptMethodConfig,
182
178
  extractFunctionName: tsExtractFunctionName,
183
179
  }),
184
- classExtractor: createClassExtractor({
185
- ...tsJsClassConfig,
186
- language: SupportedLanguages.JavaScript,
187
- }),
180
+ variableExtractor: createVariableExtractor(javascriptVariableConfig),
181
+ classExtractor: createClassExtractor(javascriptClassConfig),
182
+ heritageExtractor: createHeritageExtractor(SupportedLanguages.JavaScript),
188
183
  builtInNames: BUILT_INS,
189
184
  });
@@ -12,14 +12,21 @@
12
12
  */
13
13
  import { SupportedLanguages } from '../../../_shared/index.js';
14
14
  import { createClassExtractor } from '../class-extractors/generic.js';
15
+ import { vueClassConfig } from '../class-extractors/configs/typescript-javascript.js';
15
16
  import { defineLanguage } from '../language-provider.js';
16
17
  import { typeConfig as typescriptConfig } from '../type-extractors/typescript.js';
17
18
  import { tsExportChecker } from '../export-detection.js';
18
- import { resolveVueImport } from '../import-resolvers/vue.js';
19
+ import { createImportResolver } from '../import-resolvers/resolver-factory.js';
20
+ import { vueImportConfig } from '../import-resolvers/configs/typescript-javascript.js';
19
21
  import { extractTsNamedBindings } from '../named-bindings/typescript.js';
20
22
  import { TYPESCRIPT_QUERIES } from '../tree-sitter-queries.js';
21
23
  import { typescriptFieldExtractor } from '../field-extractors/typescript.js';
22
24
  import { BUILT_INS as TS_BUILT_INS } from './typescript.js';
25
+ import { createVariableExtractor } from '../variable-extractors/generic.js';
26
+ import { typescriptVariableConfig } from '../variable-extractors/configs/typescript-javascript.js';
27
+ import { createCallExtractor } from '../call-extractors/generic.js';
28
+ import { typescriptCallConfig } from '../call-extractors/configs/typescript-javascript.js';
29
+ import { createHeritageExtractor } from '../heritage-extractors/generic.js';
23
30
  const VUE_SPECIFIC_BUILT_INS = [
24
31
  'ref',
25
32
  'reactive',
@@ -52,30 +59,19 @@ const VUE_SPECIFIC_BUILT_INS = [
52
59
  'useAttrs',
53
60
  ];
54
61
  const VUE_BUILT_INS = new Set([...TS_BUILT_INS, ...VUE_SPECIFIC_BUILT_INS]);
55
- const vueClassExtractor = createClassExtractor({
56
- language: SupportedLanguages.Vue,
57
- typeDeclarationNodes: [
58
- 'class_declaration',
59
- 'abstract_class_declaration',
60
- 'interface_declaration',
61
- 'enum_declaration',
62
- ],
63
- ancestorScopeNodeTypes: [
64
- 'class_declaration',
65
- 'abstract_class_declaration',
66
- 'interface_declaration',
67
- 'enum_declaration',
68
- ],
69
- });
62
+ const vueClassExtractor = createClassExtractor(vueClassConfig);
70
63
  export const vueProvider = defineLanguage({
71
64
  id: SupportedLanguages.Vue,
72
65
  extensions: ['.vue'],
73
66
  treeSitterQueries: TYPESCRIPT_QUERIES,
74
67
  typeConfig: typescriptConfig,
75
68
  exportChecker: tsExportChecker,
76
- importResolver: resolveVueImport,
69
+ importResolver: createImportResolver(vueImportConfig),
77
70
  namedBindingExtractor: extractTsNamedBindings,
71
+ callExtractor: createCallExtractor(typescriptCallConfig),
78
72
  fieldExtractor: typescriptFieldExtractor,
73
+ variableExtractor: createVariableExtractor(typescriptVariableConfig),
79
74
  classExtractor: vueClassExtractor,
75
+ heritageExtractor: createHeritageExtractor(SupportedLanguages.TypeScript),
80
76
  builtInNames: VUE_BUILT_INS,
81
77
  });
@@ -43,11 +43,46 @@ export declare const resolveExtendsType: (parentName: string, currentFilePath: s
43
43
  type: "EXTENDS" | "IMPLEMENTS";
44
44
  idPrefix: string;
45
45
  };
46
+ /**
47
+ * Direct parent entry with the heritage kind that produced it. Preserved
48
+ * so kind-aware consumers (Ruby MRO, see `lookupMethodByOwnerWithMRO`) can
49
+ * walk prepend/include providers in the correct order. Flat-string consumers
50
+ * use `getParents` / `getAncestors` and see only the parent nodeIds.
51
+ */
52
+ export interface ParentEntry {
53
+ readonly parentId: string;
54
+ /** 'extends' | 'implements' | 'trait-impl' | 'include' | 'extend' | 'prepend' */
55
+ readonly kind: string;
56
+ }
46
57
  export interface HeritageMap {
47
58
  /** Direct parents of `childNodeId` (extends + implements + trait-impl). */
48
59
  getParents(childNodeId: string): string[];
49
60
  /** Full ancestor chain (BFS, bounded depth, cycle-safe). */
50
61
  getAncestors(childNodeId: string): string[];
62
+ /**
63
+ * Direct parents with heritage kind preserved, insertion-ordered. Used by
64
+ * kind-aware consumers (Ruby MRO) that need to distinguish prepend /
65
+ * include / extend / extends for walk-order decisions.
66
+ *
67
+ * Insertion order mirrors the order `ExtractedHeritage` records were fed
68
+ * into `buildHeritageMap`, which in turn mirrors tree-sitter match order.
69
+ * For Ruby, this matches source declaration order for `prepend` / `include`
70
+ * statements — the MRO walk reverses this (last-declared-first) at the
71
+ * consumer side.
72
+ */
73
+ getParentEntries(childNodeId: string): readonly ParentEntry[];
74
+ /**
75
+ * Ordered ancestry for instance method dispatch (Ruby-aware): includes
76
+ * `extends`, `implements`, `trait-impl`, `include`, `prepend` kinds.
77
+ * Excludes `extend` (singleton-only). Order is caller-determined in Unit 3.
78
+ * For non-Ruby callers (first-wins, c3, etc.), this matches `getAncestors`.
79
+ */
80
+ getInstanceAncestry(childNodeId: string): readonly ParentEntry[];
81
+ /**
82
+ * Ordered ancestry for singleton / class-method dispatch (Ruby-aware):
83
+ * only `extend` kind parents. For non-Ruby languages this is always empty.
84
+ */
85
+ getSingletonAncestry(childNodeId: string): readonly ParentEntry[];
51
86
  /**
52
87
  * File paths of classes that directly implement or extend-as-interface the
53
88
  * given interface/abstract-class **name**. Replaces the standalone