@optave/codegraph 3.11.0 → 3.11.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 (230) hide show
  1. package/README.md +38 -31
  2. package/dist/ast-analysis/engine.d.ts.map +1 -1
  3. package/dist/ast-analysis/engine.js +91 -60
  4. package/dist/ast-analysis/engine.js.map +1 -1
  5. package/dist/ast-analysis/visitor-utils.d.ts +3 -0
  6. package/dist/ast-analysis/visitor-utils.d.ts.map +1 -1
  7. package/dist/ast-analysis/visitor-utils.js +83 -49
  8. package/dist/ast-analysis/visitor-utils.js.map +1 -1
  9. package/dist/ast-analysis/visitors/ast-store-visitor.d.ts.map +1 -1
  10. package/dist/ast-analysis/visitors/ast-store-visitor.js +78 -62
  11. package/dist/ast-analysis/visitors/ast-store-visitor.js.map +1 -1
  12. package/dist/ast-analysis/visitors/dataflow-visitor.d.ts.map +1 -1
  13. package/dist/ast-analysis/visitors/dataflow-visitor.js +61 -42
  14. package/dist/ast-analysis/visitors/dataflow-visitor.js.map +1 -1
  15. package/dist/cli/commands/embed.d.ts.map +1 -1
  16. package/dist/cli/commands/embed.js +49 -4
  17. package/dist/cli/commands/embed.js.map +1 -1
  18. package/dist/domain/analysis/dependencies.d.ts.map +1 -1
  19. package/dist/domain/analysis/dependencies.js +106 -80
  20. package/dist/domain/analysis/dependencies.js.map +1 -1
  21. package/dist/domain/analysis/fn-impact.d.ts.map +1 -1
  22. package/dist/domain/analysis/fn-impact.js +77 -52
  23. package/dist/domain/analysis/fn-impact.js.map +1 -1
  24. package/dist/domain/analysis/module-map.d.ts.map +1 -1
  25. package/dist/domain/analysis/module-map.js +132 -121
  26. package/dist/domain/analysis/module-map.js.map +1 -1
  27. package/dist/domain/graph/builder/call-resolver.d.ts +71 -0
  28. package/dist/domain/graph/builder/call-resolver.d.ts.map +1 -0
  29. package/dist/domain/graph/builder/call-resolver.js +130 -0
  30. package/dist/domain/graph/builder/call-resolver.js.map +1 -0
  31. package/dist/domain/graph/builder/helpers.d.ts +4 -4
  32. package/dist/domain/graph/builder/helpers.d.ts.map +1 -1
  33. package/dist/domain/graph/builder/helpers.js +47 -33
  34. package/dist/domain/graph/builder/helpers.js.map +1 -1
  35. package/dist/domain/graph/builder/incremental.d.ts +6 -0
  36. package/dist/domain/graph/builder/incremental.d.ts.map +1 -1
  37. package/dist/domain/graph/builder/incremental.js +214 -127
  38. package/dist/domain/graph/builder/incremental.js.map +1 -1
  39. package/dist/domain/graph/builder/pipeline.d.ts +1 -44
  40. package/dist/domain/graph/builder/pipeline.d.ts.map +1 -1
  41. package/dist/domain/graph/builder/pipeline.js +10 -766
  42. package/dist/domain/graph/builder/pipeline.js.map +1 -1
  43. package/dist/domain/graph/builder/stages/build-edges.d.ts.map +1 -1
  44. package/dist/domain/graph/builder/stages/build-edges.js +151 -192
  45. package/dist/domain/graph/builder/stages/build-edges.js.map +1 -1
  46. package/dist/domain/graph/builder/stages/build-structure.d.ts.map +1 -1
  47. package/dist/domain/graph/builder/stages/build-structure.js +82 -65
  48. package/dist/domain/graph/builder/stages/build-structure.js.map +1 -1
  49. package/dist/domain/graph/builder/stages/detect-changes.d.ts.map +1 -1
  50. package/dist/domain/graph/builder/stages/detect-changes.js +84 -56
  51. package/dist/domain/graph/builder/stages/detect-changes.js.map +1 -1
  52. package/dist/domain/graph/builder/stages/finalize.d.ts.map +1 -1
  53. package/dist/domain/graph/builder/stages/finalize.js +60 -51
  54. package/dist/domain/graph/builder/stages/finalize.js.map +1 -1
  55. package/dist/domain/graph/builder/stages/insert-nodes.d.ts +8 -6
  56. package/dist/domain/graph/builder/stages/insert-nodes.d.ts.map +1 -1
  57. package/dist/domain/graph/builder/stages/insert-nodes.js +107 -122
  58. package/dist/domain/graph/builder/stages/insert-nodes.js.map +1 -1
  59. package/dist/domain/graph/builder/stages/native-db-lifecycle.d.ts +14 -0
  60. package/dist/domain/graph/builder/stages/native-db-lifecycle.d.ts.map +1 -0
  61. package/dist/domain/graph/builder/stages/native-db-lifecycle.js +77 -0
  62. package/dist/domain/graph/builder/stages/native-db-lifecycle.js.map +1 -0
  63. package/dist/domain/graph/builder/stages/native-orchestrator.d.ts +62 -0
  64. package/dist/domain/graph/builder/stages/native-orchestrator.d.ts.map +1 -0
  65. package/dist/domain/graph/builder/stages/native-orchestrator.js +747 -0
  66. package/dist/domain/graph/builder/stages/native-orchestrator.js.map +1 -0
  67. package/dist/domain/graph/cycles.d.ts +6 -4
  68. package/dist/domain/graph/cycles.d.ts.map +1 -1
  69. package/dist/domain/graph/cycles.js +50 -55
  70. package/dist/domain/graph/cycles.js.map +1 -1
  71. package/dist/domain/graph/journal.d.ts.map +1 -1
  72. package/dist/domain/graph/journal.js +89 -70
  73. package/dist/domain/graph/journal.js.map +1 -1
  74. package/dist/domain/graph/watcher.d.ts.map +1 -1
  75. package/dist/domain/graph/watcher.js +10 -4
  76. package/dist/domain/graph/watcher.js.map +1 -1
  77. package/dist/domain/parser.d.ts +12 -23
  78. package/dist/domain/parser.d.ts.map +1 -1
  79. package/dist/domain/parser.js +126 -79
  80. package/dist/domain/parser.js.map +1 -1
  81. package/dist/domain/search/generator.d.ts +3 -1
  82. package/dist/domain/search/generator.d.ts.map +1 -1
  83. package/dist/domain/search/generator.js +68 -45
  84. package/dist/domain/search/generator.js.map +1 -1
  85. package/dist/domain/search/models.d.ts +2 -0
  86. package/dist/domain/search/models.d.ts.map +1 -1
  87. package/dist/domain/search/models.js +37 -3
  88. package/dist/domain/search/models.js.map +1 -1
  89. package/dist/domain/search/search/hybrid.d.ts.map +1 -1
  90. package/dist/domain/search/search/hybrid.js +49 -40
  91. package/dist/domain/search/search/hybrid.js.map +1 -1
  92. package/dist/domain/search/search/semantic.d.ts.map +1 -1
  93. package/dist/domain/search/search/semantic.js +69 -49
  94. package/dist/domain/search/search/semantic.js.map +1 -1
  95. package/dist/domain/wasm-worker-entry.js +201 -136
  96. package/dist/domain/wasm-worker-entry.js.map +1 -1
  97. package/dist/extractors/elixir.js +95 -71
  98. package/dist/extractors/elixir.js.map +1 -1
  99. package/dist/extractors/gleam.d.ts.map +1 -1
  100. package/dist/extractors/gleam.js +23 -31
  101. package/dist/extractors/gleam.js.map +1 -1
  102. package/dist/extractors/helpers.d.ts +79 -1
  103. package/dist/extractors/helpers.d.ts.map +1 -1
  104. package/dist/extractors/helpers.js +137 -0
  105. package/dist/extractors/helpers.js.map +1 -1
  106. package/dist/extractors/java.d.ts.map +1 -1
  107. package/dist/extractors/java.js +37 -49
  108. package/dist/extractors/java.js.map +1 -1
  109. package/dist/extractors/javascript.d.ts.map +1 -1
  110. package/dist/extractors/javascript.js +44 -44
  111. package/dist/extractors/javascript.js.map +1 -1
  112. package/dist/extractors/julia.js +27 -34
  113. package/dist/extractors/julia.js.map +1 -1
  114. package/dist/extractors/r.d.ts.map +1 -1
  115. package/dist/extractors/r.js +33 -58
  116. package/dist/extractors/r.js.map +1 -1
  117. package/dist/extractors/solidity.d.ts.map +1 -1
  118. package/dist/extractors/solidity.js +38 -61
  119. package/dist/extractors/solidity.js.map +1 -1
  120. package/dist/features/boundaries.d.ts.map +1 -1
  121. package/dist/features/boundaries.js +49 -39
  122. package/dist/features/boundaries.js.map +1 -1
  123. package/dist/features/cfg.d.ts.map +1 -1
  124. package/dist/features/cfg.js +90 -63
  125. package/dist/features/cfg.js.map +1 -1
  126. package/dist/features/check.d.ts.map +1 -1
  127. package/dist/features/check.js +43 -34
  128. package/dist/features/check.js.map +1 -1
  129. package/dist/features/cochange.d.ts.map +1 -1
  130. package/dist/features/cochange.js +68 -56
  131. package/dist/features/cochange.js.map +1 -1
  132. package/dist/features/complexity.d.ts.map +1 -1
  133. package/dist/features/complexity.js +105 -75
  134. package/dist/features/complexity.js.map +1 -1
  135. package/dist/features/dataflow.d.ts.map +1 -1
  136. package/dist/features/dataflow.js +37 -29
  137. package/dist/features/dataflow.js.map +1 -1
  138. package/dist/features/flow.d.ts.map +1 -1
  139. package/dist/features/flow.js +31 -22
  140. package/dist/features/flow.js.map +1 -1
  141. package/dist/features/graph-enrichment.d.ts.map +1 -1
  142. package/dist/features/graph-enrichment.js +77 -70
  143. package/dist/features/graph-enrichment.js.map +1 -1
  144. package/dist/features/owners.d.ts +17 -26
  145. package/dist/features/owners.d.ts.map +1 -1
  146. package/dist/features/owners.js +120 -109
  147. package/dist/features/owners.js.map +1 -1
  148. package/dist/features/sequence.d.ts.map +1 -1
  149. package/dist/features/sequence.js +59 -54
  150. package/dist/features/sequence.js.map +1 -1
  151. package/dist/features/structure-query.d.ts.map +1 -1
  152. package/dist/features/structure-query.js +60 -60
  153. package/dist/features/structure-query.js.map +1 -1
  154. package/dist/features/structure.d.ts.map +1 -1
  155. package/dist/features/structure.js +149 -52
  156. package/dist/features/structure.js.map +1 -1
  157. package/dist/graph/algorithms/leiden/optimiser.d.ts.map +1 -1
  158. package/dist/graph/algorithms/leiden/optimiser.js +100 -69
  159. package/dist/graph/algorithms/leiden/optimiser.js.map +1 -1
  160. package/dist/graph/classifiers/roles.d.ts.map +1 -1
  161. package/dist/graph/classifiers/roles.js +63 -59
  162. package/dist/graph/classifiers/roles.js.map +1 -1
  163. package/dist/infrastructure/config.d.ts +1 -1
  164. package/dist/infrastructure/config.d.ts.map +1 -1
  165. package/dist/infrastructure/config.js +1 -1
  166. package/dist/infrastructure/config.js.map +1 -1
  167. package/dist/presentation/cfg.d.ts.map +1 -1
  168. package/dist/presentation/cfg.js +44 -29
  169. package/dist/presentation/cfg.js.map +1 -1
  170. package/dist/presentation/flow.d.ts.map +1 -1
  171. package/dist/presentation/flow.js +58 -38
  172. package/dist/presentation/flow.js.map +1 -1
  173. package/dist/types.d.ts +1 -1
  174. package/dist/types.d.ts.map +1 -1
  175. package/grammars/tree-sitter-erlang.wasm +0 -0
  176. package/package.json +9 -9
  177. package/src/ast-analysis/engine.ts +145 -61
  178. package/src/ast-analysis/visitor-utils.ts +86 -46
  179. package/src/ast-analysis/visitors/ast-store-visitor.ts +104 -69
  180. package/src/ast-analysis/visitors/dataflow-visitor.ts +86 -47
  181. package/src/cli/commands/embed.ts +54 -4
  182. package/src/domain/analysis/dependencies.ts +166 -85
  183. package/src/domain/analysis/fn-impact.ts +120 -50
  184. package/src/domain/analysis/module-map.ts +175 -140
  185. package/src/domain/graph/builder/call-resolver.ts +181 -0
  186. package/src/domain/graph/builder/helpers.ts +85 -76
  187. package/src/domain/graph/builder/incremental.ts +321 -152
  188. package/src/domain/graph/builder/pipeline.ts +19 -957
  189. package/src/domain/graph/builder/stages/build-edges.ts +229 -275
  190. package/src/domain/graph/builder/stages/build-structure.ts +115 -82
  191. package/src/domain/graph/builder/stages/detect-changes.ts +107 -64
  192. package/src/domain/graph/builder/stages/finalize.ts +72 -70
  193. package/src/domain/graph/builder/stages/insert-nodes.ts +154 -120
  194. package/src/domain/graph/builder/stages/native-db-lifecycle.ts +74 -0
  195. package/src/domain/graph/builder/stages/native-orchestrator.ts +942 -0
  196. package/src/domain/graph/cycles.ts +51 -49
  197. package/src/domain/graph/journal.ts +84 -69
  198. package/src/domain/graph/watcher.ts +12 -4
  199. package/src/domain/parser.ts +143 -66
  200. package/src/domain/search/generator.ts +132 -74
  201. package/src/domain/search/models.ts +39 -3
  202. package/src/domain/search/search/hybrid.ts +53 -42
  203. package/src/domain/search/search/semantic.ts +105 -65
  204. package/src/domain/wasm-worker-entry.ts +235 -152
  205. package/src/extractors/elixir.ts +91 -64
  206. package/src/extractors/gleam.ts +33 -37
  207. package/src/extractors/helpers.ts +205 -1
  208. package/src/extractors/java.ts +42 -45
  209. package/src/extractors/javascript.ts +44 -43
  210. package/src/extractors/julia.ts +28 -35
  211. package/src/extractors/r.ts +38 -56
  212. package/src/extractors/solidity.ts +43 -71
  213. package/src/features/boundaries.ts +64 -46
  214. package/src/features/cfg.ts +145 -74
  215. package/src/features/check.ts +60 -43
  216. package/src/features/cochange.ts +95 -72
  217. package/src/features/complexity.ts +134 -79
  218. package/src/features/dataflow.ts +57 -34
  219. package/src/features/flow.ts +48 -24
  220. package/src/features/graph-enrichment.ts +105 -70
  221. package/src/features/owners.ts +186 -146
  222. package/src/features/sequence.ts +99 -69
  223. package/src/features/structure-query.ts +94 -79
  224. package/src/features/structure.ts +199 -79
  225. package/src/graph/algorithms/leiden/optimiser.ts +142 -87
  226. package/src/graph/classifiers/roles.ts +64 -54
  227. package/src/infrastructure/config.ts +1 -1
  228. package/src/presentation/cfg.ts +48 -32
  229. package/src/presentation/flow.ts +100 -52
  230. package/src/types.ts +1 -1
@@ -68,63 +68,77 @@ export function passesIncludeExclude(relPath, includeRegexes, excludeRegexes) {
68
68
  return false;
69
69
  return true;
70
70
  }
71
- export function collectFiles(dir, files = [], config = {}, directories = null, _visited = new Set(), _rootDir, _includeRegexes, _excludeRegexes) {
72
- const trackDirs = directories instanceof Set;
73
- let hasFiles = false;
74
- // First call: compute root and compile include/exclude patterns once,
75
- // then pass them down recursive calls so we don't recompile per directory.
76
- const rootDir = _rootDir ?? dir;
77
- const includeRegexes = _includeRegexes ?? compileGlobs(config.include);
78
- const excludeRegexes = _excludeRegexes ?? compileGlobs(config.exclude);
79
- const hasGlobFilters = includeRegexes.length > 0 || excludeRegexes.length > 0;
80
- // Merge config ignoreDirs with defaults
81
- const extraIgnore = config.ignoreDirs ? new Set(config.ignoreDirs) : null;
82
- // Detect symlink loops (before I/O to avoid wasted readdirSync)
71
+ /** Detect a symlink loop for `dir`. Returns true if `dir` was already visited. */
72
+ function isSymlinkLoop(dir, visited) {
83
73
  let realDir;
84
74
  try {
85
75
  realDir = fs.realpathSync(dir);
86
76
  }
87
77
  catch {
88
- return trackDirs ? { files, directories: directories } : files;
78
+ return true;
89
79
  }
90
- if (_visited.has(realDir)) {
80
+ if (visited.has(realDir)) {
91
81
  warn(`Symlink loop detected, skipping: ${dir}`);
92
- return trackDirs ? { files, directories: directories } : files;
82
+ return true;
93
83
  }
94
- _visited.add(realDir);
95
- let entries;
84
+ visited.add(realDir);
85
+ return false;
86
+ }
87
+ /** Read directory entries, returning null on error (already logged). */
88
+ function readDirSafe(dir) {
96
89
  try {
97
- entries = fs.readdirSync(dir, { withFileTypes: true });
90
+ return fs.readdirSync(dir, { withFileTypes: true });
98
91
  }
99
92
  catch (err) {
100
93
  warn(`Cannot read directory ${dir}: ${err.message}`);
101
- return trackDirs ? { files, directories: directories } : files;
94
+ return null;
102
95
  }
96
+ }
97
+ /** True if `entry` is a source file we should collect under `ctx`. */
98
+ function isCollectableSourceFile(full, entry, ctx) {
99
+ if (!EXTENSIONS.has(path.extname(entry.name)))
100
+ return false;
101
+ if (!ctx.hasGlobFilters)
102
+ return true;
103
+ const rel = normalizePath(path.relative(ctx.rootDir, full));
104
+ return passesIncludeExclude(rel, ctx.includeRegexes, ctx.excludeRegexes);
105
+ }
106
+ function walkCollect(dir, files, directories, ctx) {
107
+ if (isSymlinkLoop(dir, ctx.visited))
108
+ return;
109
+ const entries = readDirSafe(dir);
110
+ if (!entries)
111
+ return;
112
+ let hasFiles = false;
103
113
  for (const entry of entries) {
104
- if (shouldSkipEntry(entry, extraIgnore))
114
+ if (shouldSkipEntry(entry, ctx.extraIgnore))
105
115
  continue;
106
116
  const full = path.join(dir, entry.name);
107
117
  if (entry.isDirectory()) {
108
- if (trackDirs) {
109
- collectFiles(full, files, config, directories, _visited, rootDir, includeRegexes, excludeRegexes);
110
- }
111
- else {
112
- collectFiles(full, files, config, null, _visited, rootDir, includeRegexes, excludeRegexes);
113
- }
118
+ walkCollect(full, files, directories, ctx);
114
119
  }
115
- else if (EXTENSIONS.has(path.extname(entry.name))) {
116
- if (hasGlobFilters) {
117
- const rel = normalizePath(path.relative(rootDir, full));
118
- if (!passesIncludeExclude(rel, includeRegexes, excludeRegexes))
119
- continue;
120
- }
120
+ else if (isCollectableSourceFile(full, entry, ctx)) {
121
121
  files.push(full);
122
122
  hasFiles = true;
123
123
  }
124
124
  }
125
- if (trackDirs && hasFiles) {
125
+ if (directories && hasFiles) {
126
126
  directories.add(dir);
127
127
  }
128
+ }
129
+ export function collectFiles(dir, files = [], config = {}, directories = null) {
130
+ const trackDirs = directories instanceof Set;
131
+ const includeRegexes = compileGlobs(config.include);
132
+ const excludeRegexes = compileGlobs(config.exclude);
133
+ const ctx = {
134
+ rootDir: dir,
135
+ includeRegexes,
136
+ excludeRegexes,
137
+ hasGlobFilters: includeRegexes.length > 0 || excludeRegexes.length > 0,
138
+ extraIgnore: config.ignoreDirs ? new Set(config.ignoreDirs) : null,
139
+ visited: new Set(),
140
+ };
141
+ walkCollect(dir, files, trackDirs ? directories : null, ctx);
128
142
  return trackDirs ? { files, directories: directories } : files;
129
143
  }
130
144
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/domain/graph/builder/helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/domain/graph/builder/helpers.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,11 @@ export interface IncrementalStmts {
16
16
  c: number;
17
17
  } | undefined;
18
18
  };
19
+ countEdges: {
20
+ get: (...params: unknown[]) => {
21
+ c: number;
22
+ } | undefined;
23
+ };
19
24
  listSymbols: {
20
25
  all: (...params: unknown[]) => unknown[];
21
26
  };
@@ -31,6 +36,7 @@ interface RebuildResult {
31
36
  nodesAdded: number;
32
37
  nodesRemoved: number;
33
38
  edgesAdded: number;
39
+ edgesBefore: number;
34
40
  deleted?: boolean;
35
41
  event?: string;
36
42
  symbolDiff?: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"incremental.d.ts","sourceRoot":"","sources":["../../../../src/domain/graph/builder/incremental.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,qBAAqB,EACrB,UAAU,EAIX,MAAM,mBAAmB,CAAC;AAO3B,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,CAAA;KAAE,CAAC;IACvD,UAAU,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,CAAA;KAAE,CAAC;IACvD,SAAS,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAA;KAAE,CAAC;IACzE,UAAU,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK;YAAE,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAA;KAAE,CAAC;IACzE,WAAW,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,CAAA;KAAE,CAAC;IAC1D,cAAc,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,CAAA;KAAE,CAAC;IAC7D,cAAc,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,CAAA;KAAE,CAAC;CAC9D;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA8bD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,qBAAqB,EACzB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,gBAAgB,EACvB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,OAAO,EACd,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAA;CAAO,GAC3E,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAyG/B"}
1
+ {"version":3,"file":"incremental.d.ts","sourceRoot":"","sources":["../../../../src/domain/graph/builder/incremental.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,qBAAqB,EACrB,UAAU,EAIX,MAAM,mBAAmB,CAAC;AAa3B,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,CAAA;KAAE,CAAC;IACvD,UAAU,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,CAAA;KAAE,CAAC;IACvD,SAAS,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAA;KAAE,CAAC;IACzE,UAAU,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK;YAAE,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAA;KAAE,CAAC;IACzE,UAAU,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK;YAAE,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAA;KAAE,CAAC;IACzE,WAAW,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,CAAA;KAAE,CAAC;IAC1D,cAAc,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,CAAA;KAAE,CAAC;IAC7D,cAAc,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,CAAA;KAAE,CAAC;CAC9D;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA2nBD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,qBAAqB,EACzB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,gBAAgB,EACvB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,OAAO,EACd,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAA;CAAO,GAC3E,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA6E/B"}
@@ -14,6 +14,7 @@ import { debug, warn } from '../../../infrastructure/logger.js';
14
14
  import { normalizePath } from '../../../shared/constants.js';
15
15
  import { parseFileIncremental } from '../../parser.js';
16
16
  import { computeConfidence, resolveImportPath } from '../resolve.js';
17
+ import { findCaller, resolveCallTargets, resolveReceiverEdge, } from './call-resolver.js';
17
18
  import { BUILTIN_RECEIVERS, readFileSafe } from './helpers.js';
18
19
  // ── Node insertion ──────────────────────────────────────────────────────
19
20
  function insertFileNodes(stmts, relPath, symbols) {
@@ -109,8 +110,9 @@ function rebuildReverseDepEdges(db, rootDir, depRelPath, symbols, stmts, skipBar
109
110
  let edgesAdded = buildContainmentEdges(db, stmts, depRelPath, symbols);
110
111
  // Don't rebuild dir->file containment for reverse-deps (it was never deleted)
111
112
  edgesAdded += buildImportEdges(stmts, depRelPath, symbols, rootDir, fileNodeRow.id, aliases, skipBarrel ? null : db);
112
- const importedNames = buildImportedNamesMap(symbols, rootDir, depRelPath, aliases);
113
- edgesAdded += buildCallEdges(stmts, depRelPath, symbols, fileNodeRow, importedNames);
113
+ const importedNames = buildImportedNamesMap(symbols, rootDir, depRelPath, aliases, db);
114
+ edgesAdded += buildCallEdges(db, stmts, depRelPath, symbols, fileNodeRow, importedNames);
115
+ edgesAdded += buildClassHierarchyEdges(stmts, depRelPath, symbols);
114
116
  return edgesAdded;
115
117
  }
116
118
  // ── Directory containment edges ────────────────────────────────────────
@@ -200,100 +202,114 @@ function resolveBarrelImportEdges(db, stmts, fileNodeId, resolvedPath, imp) {
200
202
  }
201
203
  return edgesAdded;
202
204
  }
205
+ /** Emit symbol-level `imports-type` edges for a single `import type` statement. */
206
+ function emitTypeOnlySymbolEdges(db, stmts, imp, resolvedPath, fileNodeId) {
207
+ let edgesAdded = 0;
208
+ for (const name of imp.names) {
209
+ const cleanName = name.replace(/^\*\s+as\s+/, '');
210
+ let targetFile = resolvedPath;
211
+ if (db && isBarrelFile(db, resolvedPath)) {
212
+ const actual = resolveBarrelTarget(db, resolvedPath, cleanName);
213
+ if (actual)
214
+ targetFile = actual;
215
+ }
216
+ const candidates = stmts.findNodeInFile.all(cleanName, targetFile);
217
+ if (candidates.length === 0)
218
+ continue;
219
+ stmts.insertEdge.run(fileNodeId, candidates[0].id, 'imports-type', 1.0, 0);
220
+ edgesAdded++;
221
+ }
222
+ return edgesAdded;
223
+ }
224
+ /**
225
+ * Process a single import statement: emit the file→file edge, any
226
+ * symbol-level type-only edges, and barrel re-export edges.
227
+ */
228
+ function emitEdgesForImport(stmts, imp, fileNodeId, relPath, rootDir, aliases, db) {
229
+ const resolvedPath = resolveImportPath(path.join(rootDir, relPath), imp.source, rootDir, aliases);
230
+ const targetRow = stmts.getNodeId.get(resolvedPath, 'file', resolvedPath, 0);
231
+ if (!targetRow)
232
+ return 0;
233
+ const edgeKind = imp.reexport
234
+ ? 'reexports'
235
+ : imp.typeOnly
236
+ ? 'imports-type'
237
+ : imp.dynamicImport
238
+ ? 'dynamic-imports'
239
+ : 'imports';
240
+ stmts.insertEdge.run(fileNodeId, targetRow.id, edgeKind, 1.0, 0);
241
+ let edgesAdded = 1;
242
+ if (imp.typeOnly) {
243
+ edgesAdded += emitTypeOnlySymbolEdges(db, stmts, imp, resolvedPath, fileNodeId);
244
+ }
245
+ if (!imp.reexport && db) {
246
+ edgesAdded += resolveBarrelImportEdges(db, stmts, fileNodeId, resolvedPath, imp);
247
+ }
248
+ return edgesAdded;
249
+ }
203
250
  function buildImportEdges(stmts, relPath, symbols, rootDir, fileNodeId, aliases, db) {
204
251
  let edgesAdded = 0;
205
252
  for (const imp of symbols.imports) {
206
- const resolvedPath = resolveImportPath(path.join(rootDir, relPath), imp.source, rootDir, aliases);
207
- const targetRow = stmts.getNodeId.get(resolvedPath, 'file', resolvedPath, 0);
208
- if (targetRow) {
209
- const edgeKind = imp.reexport ? 'reexports' : imp.typeOnly ? 'imports-type' : 'imports';
210
- stmts.insertEdge.run(fileNodeId, targetRow.id, edgeKind, 1.0, 0);
211
- edgesAdded++;
212
- // Type-only imports: create symbol-level edges so the target symbols
213
- // get fan-in credit and aren't falsely classified as dead code.
214
- if (imp.typeOnly) {
215
- for (const name of imp.names) {
216
- const cleanName = name.replace(/^\*\s+as\s+/, '');
217
- let targetFile = resolvedPath;
218
- if (db && isBarrelFile(db, resolvedPath)) {
219
- const actual = resolveBarrelTarget(db, resolvedPath, cleanName);
220
- if (actual)
221
- targetFile = actual;
222
- }
223
- const candidates = stmts.findNodeInFile.all(cleanName, targetFile);
224
- if (candidates.length > 0) {
225
- stmts.insertEdge.run(fileNodeId, candidates[0].id, 'imports-type', 1.0, 0);
226
- edgesAdded++;
227
- }
228
- }
229
- }
230
- // Barrel resolution: create edges through re-export chains
231
- if (!imp.reexport && db) {
232
- edgesAdded += resolveBarrelImportEdges(db, stmts, fileNodeId, resolvedPath, imp);
233
- }
234
- }
253
+ edgesAdded += emitEdgesForImport(stmts, imp, fileNodeId, relPath, rootDir, aliases, db);
235
254
  }
236
255
  return edgesAdded;
237
256
  }
238
- function buildImportedNamesMap(symbols, rootDir, relPath, aliases) {
257
+ function buildImportedNamesMap(symbols, rootDir, relPath, aliases, db) {
239
258
  const importedNames = new Map();
240
259
  for (const imp of symbols.imports) {
241
260
  const resolvedPath = resolveImportPath(path.join(rootDir, relPath), imp.source, rootDir, aliases);
242
261
  for (const name of imp.names) {
243
- importedNames.set(name.replace(/^\*\s+as\s+/, ''), resolvedPath);
262
+ const cleanName = name.replace(/^\*\s+as\s+/, '');
263
+ // Mirror full-build's `buildImportedNamesMap`: follow barrel re-exports so
264
+ // `importedNames` maps to the *defining* file, not the barrel. This ensures
265
+ // `computeConfidence` gets `importedFrom === targetFile` and returns 1.0
266
+ // instead of the cross-directory fallback (0.3).
267
+ let targetFile = resolvedPath;
268
+ if (isBarrelFile(db, resolvedPath)) {
269
+ const actual = resolveBarrelTarget(db, resolvedPath, cleanName);
270
+ if (actual)
271
+ targetFile = actual;
272
+ }
273
+ importedNames.set(cleanName, targetFile);
244
274
  }
245
275
  }
246
276
  return importedNames;
247
277
  }
248
- // ── Call edge building ──────────────────────────────────────────────────
249
- function findCaller(call, definitions, relPath, stmts) {
250
- let caller = null;
251
- let callerSpan = Infinity;
252
- for (const def of definitions) {
253
- if (def.line <= call.line) {
254
- const end = def.endLine || Infinity;
255
- if (call.line <= end) {
256
- const span = end - def.line;
257
- if (span < callerSpan) {
258
- const row = stmts.getNodeId.get(def.name, def.kind, relPath, def.line);
259
- if (row) {
260
- caller = row;
261
- callerSpan = span;
262
- }
263
- }
278
+ const HIERARCHY_SOURCE_KINDS = new Set(['class', 'struct', 'record', 'enum']);
279
+ const EXTENDS_TARGET_KINDS = new Set(['class', 'struct', 'trait', 'record']);
280
+ const IMPLEMENTS_TARGET_KINDS = new Set(['interface', 'trait', 'class']);
281
+ function buildClassHierarchyEdges(stmts, relPath, symbols) {
282
+ let edgesAdded = 0;
283
+ for (const cls of symbols.classes) {
284
+ const sourceRow = stmts.findNodeInFile.all(cls.name, relPath).find((n) => HIERARCHY_SOURCE_KINDS.has(n.kind));
285
+ if (!sourceRow)
286
+ continue;
287
+ if (cls.extends) {
288
+ for (const t of stmts.findNodeByName.all(cls.extends).filter((n) => EXTENDS_TARGET_KINDS.has(n.kind))) {
289
+ stmts.insertEdge.run(sourceRow.id, t.id, 'extends', 1.0, 0);
290
+ edgesAdded++;
264
291
  }
265
292
  }
266
- }
267
- return caller;
268
- }
269
- function resolveCallTargets(stmts, call, relPath, importedNames, typeMap) {
270
- const importedFrom = importedNames.get(call.name);
271
- let targets;
272
- if (importedFrom) {
273
- targets = stmts.findNodeInFile.all(call.name, importedFrom);
274
- }
275
- if (!targets || targets.length === 0) {
276
- targets = stmts.findNodeInFile.all(call.name, relPath);
277
- if (targets.length === 0) {
278
- targets = stmts.findNodeByName.all(call.name);
279
- }
280
- }
281
- // Type-aware resolution: translate variable receiver to declared type
282
- if ((!targets || targets.length === 0) && call.receiver && typeMap) {
283
- const typeEntry = typeMap.get(call.receiver);
284
- const typeName = typeEntry
285
- ? typeof typeEntry === 'string'
286
- ? typeEntry
287
- : typeEntry.type
288
- : null;
289
- if (typeName) {
290
- const qualified = `${typeName}.${call.name}`;
291
- targets = stmts.findNodeByName.all(qualified);
293
+ if (cls.implements) {
294
+ for (const t of stmts.findNodeByName.all(cls.implements).filter((n) => IMPLEMENTS_TARGET_KINDS.has(n.kind))) {
295
+ stmts.insertEdge.run(sourceRow.id, t.id, 'implements', 1.0, 0);
296
+ edgesAdded++;
297
+ }
292
298
  }
293
299
  }
294
- return { targets: targets ?? [], importedFrom };
300
+ return edgesAdded;
301
+ }
302
+ // ── Call edge building ──────────────────────────────────────────────────
303
+ function makeIncrementalLookup(db, stmts) {
304
+ return {
305
+ byNameAndFile: (name, file) => stmts.findNodeInFile.all(name, file),
306
+ byName: (name) => stmts.findNodeByName.all(name),
307
+ isBarrel: (file) => isBarrelFile(db, file),
308
+ resolveBarrel: (barrelFile, symbolName) => resolveBarrelTarget(db, barrelFile, symbolName),
309
+ nodeId: (name, kind, file, line) => stmts.getNodeId.get(name, kind, file, line),
310
+ };
295
311
  }
296
- function buildCallEdges(stmts, relPath, symbols, fileNodeRow, importedNames) {
312
+ function buildCallEdges(db, stmts, relPath, symbols, fileNodeRow, importedNames) {
297
313
  const rawTM = symbols.typeMap;
298
314
  const typeMap = rawTM instanceof Map
299
315
  ? rawTM
@@ -303,23 +319,124 @@ function buildCallEdges(stmts, relPath, symbols, fileNodeRow, importedNames) {
303
319
  e.typeName ?? e.type ?? null,
304
320
  ]))
305
321
  : new Map();
322
+ const seenCallEdges = new Set();
323
+ const lookup = makeIncrementalLookup(db, stmts);
306
324
  let edgesAdded = 0;
307
325
  for (const call of symbols.calls) {
308
326
  if (call.receiver && BUILTIN_RECEIVERS.has(call.receiver))
309
327
  continue;
310
- const caller = findCaller(call, symbols.definitions, relPath, stmts) || fileNodeRow;
311
- const { targets, importedFrom } = resolveCallTargets(stmts, call, relPath, importedNames, typeMap);
328
+ const caller = findCaller(lookup, call, symbols.definitions, relPath, fileNodeRow);
329
+ const { targets, importedFrom } = resolveCallTargets(lookup, call, relPath, importedNames, typeMap);
312
330
  for (const t of targets) {
313
- if (t.id !== caller.id) {
331
+ const edgeKey = `${caller.id}|${t.id}`;
332
+ if (t.id !== caller.id && !seenCallEdges.has(edgeKey)) {
333
+ seenCallEdges.add(edgeKey);
314
334
  const confidence = computeConfidence(relPath, t.file, importedFrom ?? null);
315
335
  stmts.insertEdge.run(caller.id, t.id, 'calls', confidence, call.dynamic ? 1 : 0);
316
336
  edgesAdded++;
317
337
  }
318
338
  }
339
+ if (call.receiver &&
340
+ !BUILTIN_RECEIVERS.has(call.receiver) &&
341
+ call.receiver !== 'this' &&
342
+ call.receiver !== 'self' &&
343
+ call.receiver !== 'super') {
344
+ const recv = resolveReceiverEdge(lookup, { name: call.name, receiver: call.receiver }, caller, relPath, typeMap, seenCallEdges);
345
+ if (recv) {
346
+ stmts.insertEdge.run(recv.callerId, recv.receiverId, 'receiver', recv.confidence, 0);
347
+ edgesAdded++;
348
+ }
349
+ }
319
350
  }
320
351
  return edgesAdded;
321
352
  }
322
353
  // ── Main entry point ────────────────────────────────────────────────────
354
+ /** Build the "this file was deleted" result returned by `rebuildFile`. */
355
+ function buildDeletionResult(relPath, oldNodes, edgesBefore, oldSymbols, diffSymbols) {
356
+ const symbolDiff = diffSymbols ? diffSymbols(oldSymbols, []) : null;
357
+ return {
358
+ file: relPath,
359
+ nodesAdded: 0,
360
+ nodesRemoved: oldNodes,
361
+ edgesAdded: 0,
362
+ edgesBefore,
363
+ deleted: true,
364
+ event: 'deleted',
365
+ symbolDiff,
366
+ nodesBefore: oldNodes,
367
+ nodesAfter: 0,
368
+ };
369
+ }
370
+ /** Rebuild all edges originating in the single (just-parsed) target file. */
371
+ function rebuildEdgesForTargetFile(db, stmts, relPath, symbols, fileNodeRow, rootDir) {
372
+ const aliases = { baseUrl: null, paths: {} };
373
+ let edgesAdded = buildContainmentEdges(db, stmts, relPath, symbols);
374
+ edgesAdded += rebuildDirContainment(db, stmts, relPath);
375
+ edgesAdded += buildImportEdges(stmts, relPath, symbols, rootDir, fileNodeRow.id, aliases, db);
376
+ const importedNames = buildImportedNamesMap(symbols, rootDir, relPath, aliases, db);
377
+ edgesAdded += buildCallEdges(db, stmts, relPath, symbols, fileNodeRow, importedNames);
378
+ edgesAdded += buildClassHierarchyEdges(stmts, relPath, symbols);
379
+ return edgesAdded;
380
+ }
381
+ /**
382
+ * Re-parse the reverse-deps and delete their outgoing edges so the cascade
383
+ * can rebuild them. Returns the parsed symbols map together with the total
384
+ * edge count across all deps measured *before* deletion — callers add this
385
+ * to their own `edgesBefore` so the net delta stays correct even when the
386
+ * reverse-dep cascade re-inserts edges.
387
+ */
388
+ async function parseReverseDeps(db, rootDir, reverseDeps, stmts, engineOpts, cache) {
389
+ const depSymbols = new Map();
390
+ let reverseDepsEdgesBefore = 0;
391
+ for (const depRelPath of reverseDeps) {
392
+ const symbols_ = await parseReverseDep(rootDir, depRelPath, engineOpts, cache);
393
+ if (symbols_) {
394
+ reverseDepsEdgesBefore += stmts.countEdges.get(depRelPath)?.c ?? 0;
395
+ deleteOutgoingEdges(db, depRelPath);
396
+ depSymbols.set(depRelPath, symbols_);
397
+ }
398
+ }
399
+ return { depSymbols, reverseDepsEdgesBefore };
400
+ }
401
+ /**
402
+ * Pass 2 of the reverse-dep cascade: now that the changed file's `reexports`
403
+ * edges exist, resolve barrel imports for every reverse-dep so transitive
404
+ * call edges through the barrel still find their targets.
405
+ */
406
+ function emitBarrelImportEdgesForReverseDeps(db, stmts, depSymbols, rootDir) {
407
+ let edgesAdded = 0;
408
+ for (const [depRelPath, symbols_] of depSymbols) {
409
+ const fileNodeRow_ = stmts.getNodeId.get(depRelPath, 'file', depRelPath, 0);
410
+ if (!fileNodeRow_)
411
+ continue;
412
+ const aliases_ = { baseUrl: null, paths: {} };
413
+ for (const imp of symbols_.imports) {
414
+ if (imp.reexport)
415
+ continue;
416
+ const resolvedPath = resolveImportPath(path.join(rootDir, depRelPath), imp.source, rootDir, aliases_);
417
+ edgesAdded += resolveBarrelImportEdges(db, stmts, fileNodeRow_.id, resolvedPath, imp);
418
+ }
419
+ }
420
+ return edgesAdded;
421
+ }
422
+ /**
423
+ * Two-pass reverse-dep cascade:
424
+ * 1. Rebuild direct edges (creating `reexports` edges for barrels).
425
+ * 2. Add barrel import edges (which need `reexports` edges to exist).
426
+ * Returns both the gross edges-added count and the pre-deletion edge count
427
+ * for all reverse deps so callers can compute a true net delta.
428
+ */
429
+ async function runReverseDepCascade(db, rootDir, reverseDeps, stmts, engineOpts, cache) {
430
+ const { depSymbols, reverseDepsEdgesBefore } = await parseReverseDeps(db, rootDir, reverseDeps, stmts, engineOpts, cache);
431
+ let edgesAdded = 0;
432
+ // Pass 1: direct edges only (no barrel resolution) — creates reexports edges
433
+ for (const [depRelPath, symbols_] of depSymbols) {
434
+ edgesAdded += rebuildReverseDepEdges(db, rootDir, depRelPath, symbols_, stmts, true);
435
+ }
436
+ // Pass 2: add barrel import edges (reexports edges now exist)
437
+ edgesAdded += emitBarrelImportEdgesForReverseDeps(db, stmts, depSymbols, rootDir);
438
+ return { edgesAdded, reverseDepsEdgesBefore };
439
+ }
323
440
  /**
324
441
  * Parse a single file and update the database incrementally.
325
442
  */
@@ -327,6 +444,7 @@ export async function rebuildFile(db, rootDir, filePath, stmts, engineOpts, cach
327
444
  const { diffSymbols } = options;
328
445
  const relPath = normalizePath(path.relative(rootDir, filePath));
329
446
  const oldNodes = stmts.countNodes.get(relPath)?.c || 0;
447
+ const edgesBefore = stmts.countEdges.get(relPath)?.c || 0;
330
448
  const oldSymbols = diffSymbols ? stmts.listSymbols.all(relPath) : [];
331
449
  // Find reverse-deps BEFORE purging (edges still reference the old nodes)
332
450
  const reverseDeps = findReverseDeps(db, relPath);
@@ -338,18 +456,7 @@ export async function rebuildFile(db, rootDir, filePath, stmts, engineOpts, cach
338
456
  if (!fs.existsSync(filePath)) {
339
457
  if (cache)
340
458
  cache.remove(filePath);
341
- const symbolDiff = diffSymbols ? diffSymbols(oldSymbols, []) : null;
342
- return {
343
- file: relPath,
344
- nodesAdded: 0,
345
- nodesRemoved: oldNodes,
346
- edgesAdded: 0,
347
- deleted: true,
348
- event: 'deleted',
349
- symbolDiff,
350
- nodesBefore: oldNodes,
351
- nodesAfter: 0,
352
- };
459
+ return buildDeletionResult(relPath, oldNodes, edgesBefore, oldSymbols, diffSymbols);
353
460
  }
354
461
  let code;
355
462
  try {
@@ -367,41 +474,20 @@ export async function rebuildFile(db, rootDir, filePath, stmts, engineOpts, cach
367
474
  const newSymbols = diffSymbols ? stmts.listSymbols.all(relPath) : [];
368
475
  const fileNodeRow = stmts.getNodeId.get(relPath, 'file', relPath, 0);
369
476
  if (!fileNodeRow)
370
- return { file: relPath, nodesAdded: newNodes, nodesRemoved: oldNodes, edgesAdded: 0 };
371
- const aliases = { baseUrl: null, paths: {} };
372
- let edgesAdded = buildContainmentEdges(db, stmts, relPath, symbols);
373
- edgesAdded += rebuildDirContainment(db, stmts, relPath);
374
- edgesAdded += buildImportEdges(stmts, relPath, symbols, rootDir, fileNodeRow.id, aliases, db);
375
- const importedNames = buildImportedNamesMap(symbols, rootDir, relPath, aliases);
376
- edgesAdded += buildCallEdges(stmts, relPath, symbols, fileNodeRow, importedNames);
377
- // Cascade: rebuild outgoing edges for reverse-dep files.
378
- // Two-pass approach: first rebuild direct edges (creating reexports edges for barrels),
379
- // then add barrel import edges (which need reexports edges to exist for resolution).
380
- const depSymbols = new Map();
381
- for (const depRelPath of reverseDeps) {
382
- const symbols_ = await parseReverseDep(rootDir, depRelPath, engineOpts, cache);
383
- if (symbols_) {
384
- deleteOutgoingEdges(db, depRelPath);
385
- depSymbols.set(depRelPath, symbols_);
386
- }
387
- }
388
- // Pass 1: direct edges only (no barrel resolution) — creates reexports edges
389
- for (const [depRelPath, symbols_] of depSymbols) {
390
- edgesAdded += rebuildReverseDepEdges(db, rootDir, depRelPath, symbols_, stmts, true);
391
- }
392
- // Pass 2: add barrel import edges (reexports edges now exist)
393
- for (const [depRelPath, symbols_] of depSymbols) {
394
- const fileNodeRow_ = stmts.getNodeId.get(depRelPath, 'file', depRelPath, 0);
395
- if (!fileNodeRow_)
396
- continue;
397
- const aliases_ = { baseUrl: null, paths: {} };
398
- for (const imp of symbols_.imports) {
399
- if (imp.reexport)
400
- continue;
401
- const resolvedPath = resolveImportPath(path.join(rootDir, depRelPath), imp.source, rootDir, aliases_);
402
- edgesAdded += resolveBarrelImportEdges(db, stmts, fileNodeRow_.id, resolvedPath, imp);
403
- }
404
- }
477
+ return {
478
+ file: relPath,
479
+ nodesAdded: newNodes,
480
+ nodesRemoved: oldNodes,
481
+ edgesAdded: 0,
482
+ edgesBefore,
483
+ };
484
+ let edgesAdded = rebuildEdgesForTargetFile(db, stmts, relPath, symbols, fileNodeRow, rootDir);
485
+ const { edgesAdded: cascadeEdges, reverseDepsEdgesBefore } = await runReverseDepCascade(db, rootDir, reverseDeps, stmts, engineOpts, cache);
486
+ edgesAdded += cascadeEdges;
487
+ // Include pre-deletion edge counts from reverse deps so the net delta
488
+ // (edgesAdded - edgesBefore) is correct even when the cascade re-inserts
489
+ // their edges unchanged.
490
+ const totalEdgesBefore = edgesBefore + reverseDepsEdgesBefore;
405
491
  const symbolDiff = diffSymbols ? diffSymbols(oldSymbols, newSymbols) : null;
406
492
  const event = oldNodes === 0 ? 'added' : 'modified';
407
493
  return {
@@ -409,6 +495,7 @@ export async function rebuildFile(db, rootDir, filePath, stmts, engineOpts, cach
409
495
  nodesAdded: newNodes,
410
496
  nodesRemoved: oldNodes,
411
497
  edgesAdded,
498
+ edgesBefore: totalEdgesBefore,
412
499
  deleted: false,
413
500
  event,
414
501
  symbolDiff,