@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.
- package/README.md +38 -31
- package/dist/ast-analysis/engine.d.ts.map +1 -1
- package/dist/ast-analysis/engine.js +91 -60
- package/dist/ast-analysis/engine.js.map +1 -1
- package/dist/ast-analysis/visitor-utils.d.ts +3 -0
- package/dist/ast-analysis/visitor-utils.d.ts.map +1 -1
- package/dist/ast-analysis/visitor-utils.js +83 -49
- package/dist/ast-analysis/visitor-utils.js.map +1 -1
- package/dist/ast-analysis/visitors/ast-store-visitor.d.ts.map +1 -1
- package/dist/ast-analysis/visitors/ast-store-visitor.js +78 -62
- package/dist/ast-analysis/visitors/ast-store-visitor.js.map +1 -1
- package/dist/ast-analysis/visitors/dataflow-visitor.d.ts.map +1 -1
- package/dist/ast-analysis/visitors/dataflow-visitor.js +61 -42
- package/dist/ast-analysis/visitors/dataflow-visitor.js.map +1 -1
- package/dist/cli/commands/embed.d.ts.map +1 -1
- package/dist/cli/commands/embed.js +49 -4
- package/dist/cli/commands/embed.js.map +1 -1
- package/dist/domain/analysis/dependencies.d.ts.map +1 -1
- package/dist/domain/analysis/dependencies.js +106 -80
- package/dist/domain/analysis/dependencies.js.map +1 -1
- package/dist/domain/analysis/fn-impact.d.ts.map +1 -1
- package/dist/domain/analysis/fn-impact.js +77 -52
- package/dist/domain/analysis/fn-impact.js.map +1 -1
- package/dist/domain/analysis/module-map.d.ts.map +1 -1
- package/dist/domain/analysis/module-map.js +132 -121
- package/dist/domain/analysis/module-map.js.map +1 -1
- package/dist/domain/graph/builder/call-resolver.d.ts +71 -0
- package/dist/domain/graph/builder/call-resolver.d.ts.map +1 -0
- package/dist/domain/graph/builder/call-resolver.js +130 -0
- package/dist/domain/graph/builder/call-resolver.js.map +1 -0
- package/dist/domain/graph/builder/helpers.d.ts +4 -4
- package/dist/domain/graph/builder/helpers.d.ts.map +1 -1
- package/dist/domain/graph/builder/helpers.js +47 -33
- package/dist/domain/graph/builder/helpers.js.map +1 -1
- package/dist/domain/graph/builder/incremental.d.ts +6 -0
- package/dist/domain/graph/builder/incremental.d.ts.map +1 -1
- package/dist/domain/graph/builder/incremental.js +214 -127
- package/dist/domain/graph/builder/incremental.js.map +1 -1
- package/dist/domain/graph/builder/pipeline.d.ts +1 -44
- package/dist/domain/graph/builder/pipeline.d.ts.map +1 -1
- package/dist/domain/graph/builder/pipeline.js +10 -766
- package/dist/domain/graph/builder/pipeline.js.map +1 -1
- package/dist/domain/graph/builder/stages/build-edges.d.ts.map +1 -1
- package/dist/domain/graph/builder/stages/build-edges.js +151 -192
- package/dist/domain/graph/builder/stages/build-edges.js.map +1 -1
- package/dist/domain/graph/builder/stages/build-structure.d.ts.map +1 -1
- package/dist/domain/graph/builder/stages/build-structure.js +82 -65
- package/dist/domain/graph/builder/stages/build-structure.js.map +1 -1
- package/dist/domain/graph/builder/stages/detect-changes.d.ts.map +1 -1
- package/dist/domain/graph/builder/stages/detect-changes.js +84 -56
- package/dist/domain/graph/builder/stages/detect-changes.js.map +1 -1
- package/dist/domain/graph/builder/stages/finalize.d.ts.map +1 -1
- package/dist/domain/graph/builder/stages/finalize.js +60 -51
- package/dist/domain/graph/builder/stages/finalize.js.map +1 -1
- package/dist/domain/graph/builder/stages/insert-nodes.d.ts +8 -6
- package/dist/domain/graph/builder/stages/insert-nodes.d.ts.map +1 -1
- package/dist/domain/graph/builder/stages/insert-nodes.js +107 -122
- package/dist/domain/graph/builder/stages/insert-nodes.js.map +1 -1
- package/dist/domain/graph/builder/stages/native-db-lifecycle.d.ts +14 -0
- package/dist/domain/graph/builder/stages/native-db-lifecycle.d.ts.map +1 -0
- package/dist/domain/graph/builder/stages/native-db-lifecycle.js +77 -0
- package/dist/domain/graph/builder/stages/native-db-lifecycle.js.map +1 -0
- package/dist/domain/graph/builder/stages/native-orchestrator.d.ts +62 -0
- package/dist/domain/graph/builder/stages/native-orchestrator.d.ts.map +1 -0
- package/dist/domain/graph/builder/stages/native-orchestrator.js +747 -0
- package/dist/domain/graph/builder/stages/native-orchestrator.js.map +1 -0
- package/dist/domain/graph/cycles.d.ts +6 -4
- package/dist/domain/graph/cycles.d.ts.map +1 -1
- package/dist/domain/graph/cycles.js +50 -55
- package/dist/domain/graph/cycles.js.map +1 -1
- package/dist/domain/graph/journal.d.ts.map +1 -1
- package/dist/domain/graph/journal.js +89 -70
- package/dist/domain/graph/journal.js.map +1 -1
- package/dist/domain/graph/watcher.d.ts.map +1 -1
- package/dist/domain/graph/watcher.js +10 -4
- package/dist/domain/graph/watcher.js.map +1 -1
- package/dist/domain/parser.d.ts +12 -23
- package/dist/domain/parser.d.ts.map +1 -1
- package/dist/domain/parser.js +126 -79
- package/dist/domain/parser.js.map +1 -1
- package/dist/domain/search/generator.d.ts +3 -1
- package/dist/domain/search/generator.d.ts.map +1 -1
- package/dist/domain/search/generator.js +68 -45
- package/dist/domain/search/generator.js.map +1 -1
- package/dist/domain/search/models.d.ts +2 -0
- package/dist/domain/search/models.d.ts.map +1 -1
- package/dist/domain/search/models.js +37 -3
- package/dist/domain/search/models.js.map +1 -1
- package/dist/domain/search/search/hybrid.d.ts.map +1 -1
- package/dist/domain/search/search/hybrid.js +49 -40
- package/dist/domain/search/search/hybrid.js.map +1 -1
- package/dist/domain/search/search/semantic.d.ts.map +1 -1
- package/dist/domain/search/search/semantic.js +69 -49
- package/dist/domain/search/search/semantic.js.map +1 -1
- package/dist/domain/wasm-worker-entry.js +201 -136
- package/dist/domain/wasm-worker-entry.js.map +1 -1
- package/dist/extractors/elixir.js +95 -71
- package/dist/extractors/elixir.js.map +1 -1
- package/dist/extractors/gleam.d.ts.map +1 -1
- package/dist/extractors/gleam.js +23 -31
- package/dist/extractors/gleam.js.map +1 -1
- package/dist/extractors/helpers.d.ts +79 -1
- package/dist/extractors/helpers.d.ts.map +1 -1
- package/dist/extractors/helpers.js +137 -0
- package/dist/extractors/helpers.js.map +1 -1
- package/dist/extractors/java.d.ts.map +1 -1
- package/dist/extractors/java.js +37 -49
- package/dist/extractors/java.js.map +1 -1
- package/dist/extractors/javascript.d.ts.map +1 -1
- package/dist/extractors/javascript.js +44 -44
- package/dist/extractors/javascript.js.map +1 -1
- package/dist/extractors/julia.js +27 -34
- package/dist/extractors/julia.js.map +1 -1
- package/dist/extractors/r.d.ts.map +1 -1
- package/dist/extractors/r.js +33 -58
- package/dist/extractors/r.js.map +1 -1
- package/dist/extractors/solidity.d.ts.map +1 -1
- package/dist/extractors/solidity.js +38 -61
- package/dist/extractors/solidity.js.map +1 -1
- package/dist/features/boundaries.d.ts.map +1 -1
- package/dist/features/boundaries.js +49 -39
- package/dist/features/boundaries.js.map +1 -1
- package/dist/features/cfg.d.ts.map +1 -1
- package/dist/features/cfg.js +90 -63
- package/dist/features/cfg.js.map +1 -1
- package/dist/features/check.d.ts.map +1 -1
- package/dist/features/check.js +43 -34
- package/dist/features/check.js.map +1 -1
- package/dist/features/cochange.d.ts.map +1 -1
- package/dist/features/cochange.js +68 -56
- package/dist/features/cochange.js.map +1 -1
- package/dist/features/complexity.d.ts.map +1 -1
- package/dist/features/complexity.js +105 -75
- package/dist/features/complexity.js.map +1 -1
- package/dist/features/dataflow.d.ts.map +1 -1
- package/dist/features/dataflow.js +37 -29
- package/dist/features/dataflow.js.map +1 -1
- package/dist/features/flow.d.ts.map +1 -1
- package/dist/features/flow.js +31 -22
- package/dist/features/flow.js.map +1 -1
- package/dist/features/graph-enrichment.d.ts.map +1 -1
- package/dist/features/graph-enrichment.js +77 -70
- package/dist/features/graph-enrichment.js.map +1 -1
- package/dist/features/owners.d.ts +17 -26
- package/dist/features/owners.d.ts.map +1 -1
- package/dist/features/owners.js +120 -109
- package/dist/features/owners.js.map +1 -1
- package/dist/features/sequence.d.ts.map +1 -1
- package/dist/features/sequence.js +59 -54
- package/dist/features/sequence.js.map +1 -1
- package/dist/features/structure-query.d.ts.map +1 -1
- package/dist/features/structure-query.js +60 -60
- package/dist/features/structure-query.js.map +1 -1
- package/dist/features/structure.d.ts.map +1 -1
- package/dist/features/structure.js +149 -52
- package/dist/features/structure.js.map +1 -1
- package/dist/graph/algorithms/leiden/optimiser.d.ts.map +1 -1
- package/dist/graph/algorithms/leiden/optimiser.js +100 -69
- package/dist/graph/algorithms/leiden/optimiser.js.map +1 -1
- package/dist/graph/classifiers/roles.d.ts.map +1 -1
- package/dist/graph/classifiers/roles.js +63 -59
- package/dist/graph/classifiers/roles.js.map +1 -1
- package/dist/infrastructure/config.d.ts +1 -1
- package/dist/infrastructure/config.d.ts.map +1 -1
- package/dist/infrastructure/config.js +1 -1
- package/dist/infrastructure/config.js.map +1 -1
- package/dist/presentation/cfg.d.ts.map +1 -1
- package/dist/presentation/cfg.js +44 -29
- package/dist/presentation/cfg.js.map +1 -1
- package/dist/presentation/flow.d.ts.map +1 -1
- package/dist/presentation/flow.js +58 -38
- package/dist/presentation/flow.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/grammars/tree-sitter-erlang.wasm +0 -0
- package/package.json +9 -9
- package/src/ast-analysis/engine.ts +145 -61
- package/src/ast-analysis/visitor-utils.ts +86 -46
- package/src/ast-analysis/visitors/ast-store-visitor.ts +104 -69
- package/src/ast-analysis/visitors/dataflow-visitor.ts +86 -47
- package/src/cli/commands/embed.ts +54 -4
- package/src/domain/analysis/dependencies.ts +166 -85
- package/src/domain/analysis/fn-impact.ts +120 -50
- package/src/domain/analysis/module-map.ts +175 -140
- package/src/domain/graph/builder/call-resolver.ts +181 -0
- package/src/domain/graph/builder/helpers.ts +85 -76
- package/src/domain/graph/builder/incremental.ts +321 -152
- package/src/domain/graph/builder/pipeline.ts +19 -957
- package/src/domain/graph/builder/stages/build-edges.ts +229 -275
- package/src/domain/graph/builder/stages/build-structure.ts +115 -82
- package/src/domain/graph/builder/stages/detect-changes.ts +107 -64
- package/src/domain/graph/builder/stages/finalize.ts +72 -70
- package/src/domain/graph/builder/stages/insert-nodes.ts +154 -120
- package/src/domain/graph/builder/stages/native-db-lifecycle.ts +74 -0
- package/src/domain/graph/builder/stages/native-orchestrator.ts +942 -0
- package/src/domain/graph/cycles.ts +51 -49
- package/src/domain/graph/journal.ts +84 -69
- package/src/domain/graph/watcher.ts +12 -4
- package/src/domain/parser.ts +143 -66
- package/src/domain/search/generator.ts +132 -74
- package/src/domain/search/models.ts +39 -3
- package/src/domain/search/search/hybrid.ts +53 -42
- package/src/domain/search/search/semantic.ts +105 -65
- package/src/domain/wasm-worker-entry.ts +235 -152
- package/src/extractors/elixir.ts +91 -64
- package/src/extractors/gleam.ts +33 -37
- package/src/extractors/helpers.ts +205 -1
- package/src/extractors/java.ts +42 -45
- package/src/extractors/javascript.ts +44 -43
- package/src/extractors/julia.ts +28 -35
- package/src/extractors/r.ts +38 -56
- package/src/extractors/solidity.ts +43 -71
- package/src/features/boundaries.ts +64 -46
- package/src/features/cfg.ts +145 -74
- package/src/features/check.ts +60 -43
- package/src/features/cochange.ts +95 -72
- package/src/features/complexity.ts +134 -79
- package/src/features/dataflow.ts +57 -34
- package/src/features/flow.ts +48 -24
- package/src/features/graph-enrichment.ts +105 -70
- package/src/features/owners.ts +186 -146
- package/src/features/sequence.ts +99 -69
- package/src/features/structure-query.ts +94 -79
- package/src/features/structure.ts +199 -79
- package/src/graph/algorithms/leiden/optimiser.ts +142 -87
- package/src/graph/classifiers/roles.ts +64 -54
- package/src/infrastructure/config.ts +1 -1
- package/src/presentation/cfg.ts +48 -32
- package/src/presentation/flow.ts +100 -52
- 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
|
-
|
|
72
|
-
|
|
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
|
|
78
|
+
return true;
|
|
89
79
|
}
|
|
90
|
-
if (
|
|
80
|
+
if (visited.has(realDir)) {
|
|
91
81
|
warn(`Symlink loop detected, skipping: ${dir}`);
|
|
92
|
-
return
|
|
82
|
+
return true;
|
|
93
83
|
}
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
90
|
+
return fs.readdirSync(dir, { withFileTypes: true });
|
|
98
91
|
}
|
|
99
92
|
catch (err) {
|
|
100
93
|
warn(`Cannot read directory ${dir}: ${err.message}`);
|
|
101
|
-
return
|
|
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
|
-
|
|
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 (
|
|
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 (
|
|
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":"AAAA;;;;GAIG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,mCAAmC,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAQpE,MAAM,CAAC,MAAM,iBAAiB,GAAgB,IAAI,GAAG,CAAC;IACpD,SAAS;IACT,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,MAAM;IACN,QAAQ;IACR,KAAK;IACL,KAAK;IACL,SAAS;IACT,SAAS;IACT,SAAS;IACT,QAAQ;IACR,OAAO;IACP,WAAW;IACX,YAAY;IACZ,OAAO;IACP,SAAS;IACT,MAAM;IACN,YAAY;IACZ,QAAQ;IACR,UAAU;IACV,SAAS;IACT,QAAQ;IACR,SAAS;CACV,CAAC,CAAC;AAEH,6EAA6E;AAC7E,SAAS,eAAe,CAAC,KAAgB,EAAE,WAA+B;IACxE,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;QACrD,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,IAAI,KAAK,CAAC,WAAW,EAAE;YAAE,OAAO,IAAI,CAAC;IACvC,CAAC;IACD,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAe,EACf,cAAiC,EACjC,cAAiC;IAEjC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACpF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACnF,OAAO,IAAI,CAAC;AACd,CAAC;
|
|
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;
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
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
|
|
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,
|
|
311
|
-
const { targets, importedFrom } = resolveCallTargets(
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
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,
|