@mduenas/codegraph 0.4.0
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/LICENSE +21 -0
- package/README.md +641 -0
- package/dist/bin/codegraph.d.ts +20 -0
- package/dist/bin/codegraph.d.ts.map +1 -0
- package/dist/bin/codegraph.js +704 -0
- package/dist/bin/codegraph.js.map +1 -0
- package/dist/config.d.ts +51 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +291 -0
- package/dist/config.js.map +1 -0
- package/dist/context/formatter.d.ts +30 -0
- package/dist/context/formatter.d.ts.map +1 -0
- package/dist/context/formatter.js +244 -0
- package/dist/context/formatter.js.map +1 -0
- package/dist/context/index.d.ts +86 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +402 -0
- package/dist/context/index.js.map +1 -0
- package/dist/db/index.d.ts +64 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +170 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrations.d.ts +44 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +105 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/queries.d.ts +148 -0
- package/dist/db/queries.d.ts.map +1 -0
- package/dist/db/queries.js +669 -0
- package/dist/db/queries.js.map +1 -0
- package/dist/directory.d.ts +45 -0
- package/dist/directory.d.ts.map +1 -0
- package/dist/directory.js +191 -0
- package/dist/directory.js.map +1 -0
- package/dist/errors.d.ts +136 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +219 -0
- package/dist/errors.js.map +1 -0
- package/dist/extraction/grammars.d.ts +36 -0
- package/dist/extraction/grammars.d.ts.map +1 -0
- package/dist/extraction/grammars.js +181 -0
- package/dist/extraction/grammars.js.map +1 -0
- package/dist/extraction/index.d.ts +91 -0
- package/dist/extraction/index.d.ts.map +1 -0
- package/dist/extraction/index.js +493 -0
- package/dist/extraction/index.js.map +1 -0
- package/dist/extraction/tree-sitter.d.ts +176 -0
- package/dist/extraction/tree-sitter.d.ts.map +1 -0
- package/dist/extraction/tree-sitter.js +1798 -0
- package/dist/extraction/tree-sitter.js.map +1 -0
- package/dist/graph/index.d.ts +8 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +13 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/queries.d.ts +106 -0
- package/dist/graph/queries.d.ts.map +1 -0
- package/dist/graph/queries.js +355 -0
- package/dist/graph/queries.js.map +1 -0
- package/dist/graph/traversal.d.ts +127 -0
- package/dist/graph/traversal.d.ts.map +1 -0
- package/dist/graph/traversal.js +465 -0
- package/dist/graph/traversal.js.map +1 -0
- package/dist/index.d.ts +496 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +818 -0
- package/dist/index.js.map +1 -0
- package/dist/installer/banner.d.ts +40 -0
- package/dist/installer/banner.d.ts.map +1 -0
- package/dist/installer/banner.js +162 -0
- package/dist/installer/banner.js.map +1 -0
- package/dist/installer/claude-md-template.d.ts +10 -0
- package/dist/installer/claude-md-template.d.ts.map +1 -0
- package/dist/installer/claude-md-template.js +46 -0
- package/dist/installer/claude-md-template.js.map +1 -0
- package/dist/installer/config-writer.d.ts +36 -0
- package/dist/installer/config-writer.d.ts.map +1 -0
- package/dist/installer/config-writer.js +282 -0
- package/dist/installer/config-writer.js.map +1 -0
- package/dist/installer/index.d.ts +13 -0
- package/dist/installer/index.d.ts.map +1 -0
- package/dist/installer/index.js +155 -0
- package/dist/installer/index.js.map +1 -0
- package/dist/installer/prompts.d.ts +18 -0
- package/dist/installer/prompts.d.ts.map +1 -0
- package/dist/installer/prompts.js +113 -0
- package/dist/installer/prompts.js.map +1 -0
- package/dist/mcp/index.d.ts +64 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +207 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools.d.ts +93 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +442 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/transport.d.ts +89 -0
- package/dist/mcp/transport.d.ts.map +1 -0
- package/dist/mcp/transport.js +170 -0
- package/dist/mcp/transport.js.map +1 -0
- package/dist/resolution/frameworks/csharp.d.ts +8 -0
- package/dist/resolution/frameworks/csharp.d.ts.map +1 -0
- package/dist/resolution/frameworks/csharp.js +274 -0
- package/dist/resolution/frameworks/csharp.js.map +1 -0
- package/dist/resolution/frameworks/express.d.ts +8 -0
- package/dist/resolution/frameworks/express.d.ts.map +1 -0
- package/dist/resolution/frameworks/express.js +208 -0
- package/dist/resolution/frameworks/express.js.map +1 -0
- package/dist/resolution/frameworks/go.d.ts +8 -0
- package/dist/resolution/frameworks/go.d.ts.map +1 -0
- package/dist/resolution/frameworks/go.js +225 -0
- package/dist/resolution/frameworks/go.js.map +1 -0
- package/dist/resolution/frameworks/index.d.ts +33 -0
- package/dist/resolution/frameworks/index.d.ts.map +1 -0
- package/dist/resolution/frameworks/index.js +113 -0
- package/dist/resolution/frameworks/index.js.map +1 -0
- package/dist/resolution/frameworks/java.d.ts +8 -0
- package/dist/resolution/frameworks/java.d.ts.map +1 -0
- package/dist/resolution/frameworks/java.js +239 -0
- package/dist/resolution/frameworks/java.js.map +1 -0
- package/dist/resolution/frameworks/laravel.d.ts +13 -0
- package/dist/resolution/frameworks/laravel.d.ts.map +1 -0
- package/dist/resolution/frameworks/laravel.js +198 -0
- package/dist/resolution/frameworks/laravel.js.map +1 -0
- package/dist/resolution/frameworks/python.d.ts +10 -0
- package/dist/resolution/frameworks/python.d.ts.map +1 -0
- package/dist/resolution/frameworks/python.js +331 -0
- package/dist/resolution/frameworks/python.js.map +1 -0
- package/dist/resolution/frameworks/react.d.ts +8 -0
- package/dist/resolution/frameworks/react.d.ts.map +1 -0
- package/dist/resolution/frameworks/react.js +294 -0
- package/dist/resolution/frameworks/react.js.map +1 -0
- package/dist/resolution/frameworks/ruby.d.ts +8 -0
- package/dist/resolution/frameworks/ruby.d.ts.map +1 -0
- package/dist/resolution/frameworks/ruby.js +262 -0
- package/dist/resolution/frameworks/ruby.js.map +1 -0
- package/dist/resolution/frameworks/rust.d.ts +8 -0
- package/dist/resolution/frameworks/rust.d.ts.map +1 -0
- package/dist/resolution/frameworks/rust.js +222 -0
- package/dist/resolution/frameworks/rust.js.map +1 -0
- package/dist/resolution/frameworks/swift.d.ts +10 -0
- package/dist/resolution/frameworks/swift.d.ts.map +1 -0
- package/dist/resolution/frameworks/swift.js +486 -0
- package/dist/resolution/frameworks/swift.js.map +1 -0
- package/dist/resolution/import-resolver.d.ts +20 -0
- package/dist/resolution/import-resolver.d.ts.map +1 -0
- package/dist/resolution/import-resolver.js +445 -0
- package/dist/resolution/import-resolver.js.map +1 -0
- package/dist/resolution/index.d.ts +72 -0
- package/dist/resolution/index.d.ts.map +1 -0
- package/dist/resolution/index.js +301 -0
- package/dist/resolution/index.js.map +1 -0
- package/dist/resolution/name-matcher.d.ts +27 -0
- package/dist/resolution/name-matcher.d.ts.map +1 -0
- package/dist/resolution/name-matcher.js +210 -0
- package/dist/resolution/name-matcher.js.map +1 -0
- package/dist/resolution/types.d.ts +108 -0
- package/dist/resolution/types.d.ts.map +1 -0
- package/dist/resolution/types.js +8 -0
- package/dist/resolution/types.js.map +1 -0
- package/dist/sync/git-hooks.d.ts +66 -0
- package/dist/sync/git-hooks.d.ts.map +1 -0
- package/dist/sync/git-hooks.js +281 -0
- package/dist/sync/git-hooks.js.map +1 -0
- package/dist/sync/index.d.ts +13 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +18 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/types.d.ts +410 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +165 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +116 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +295 -0
- package/dist/utils.js.map +1 -0
- package/dist/vectors/embedder.d.ts +140 -0
- package/dist/vectors/embedder.d.ts.map +1 -0
- package/dist/vectors/embedder.js +336 -0
- package/dist/vectors/embedder.js.map +1 -0
- package/dist/vectors/index.d.ts +9 -0
- package/dist/vectors/index.d.ts.map +1 -0
- package/dist/vectors/index.js +20 -0
- package/dist/vectors/index.js.map +1 -0
- package/dist/vectors/manager.d.ts +119 -0
- package/dist/vectors/manager.d.ts.map +1 -0
- package/dist/vectors/manager.js +274 -0
- package/dist/vectors/manager.js.map +1 -0
- package/dist/vectors/search.d.ts +134 -0
- package/dist/vectors/search.d.ts.map +1 -0
- package/dist/vectors/search.js +409 -0
- package/dist/vectors/search.js.map +1 -0
- package/package.json +67 -0
- package/scripts/postinstall.js +68 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graph Traversal Algorithms
|
|
3
|
+
*
|
|
4
|
+
* BFS and DFS traversal for the code knowledge graph.
|
|
5
|
+
*/
|
|
6
|
+
import { Node, Edge, Subgraph, TraversalOptions, EdgeKind } from '../types';
|
|
7
|
+
import { QueryBuilder } from '../db/queries';
|
|
8
|
+
/**
|
|
9
|
+
* Graph traverser for BFS and DFS traversal
|
|
10
|
+
*/
|
|
11
|
+
export declare class GraphTraverser {
|
|
12
|
+
private queries;
|
|
13
|
+
constructor(queries: QueryBuilder);
|
|
14
|
+
/**
|
|
15
|
+
* Traverse the graph using breadth-first search
|
|
16
|
+
*
|
|
17
|
+
* @param startId - Starting node ID
|
|
18
|
+
* @param options - Traversal options
|
|
19
|
+
* @returns Subgraph containing traversed nodes and edges
|
|
20
|
+
*/
|
|
21
|
+
traverseBFS(startId: string, options?: TraversalOptions): Subgraph;
|
|
22
|
+
/**
|
|
23
|
+
* Traverse the graph using depth-first search
|
|
24
|
+
*
|
|
25
|
+
* @param startId - Starting node ID
|
|
26
|
+
* @param options - Traversal options
|
|
27
|
+
* @returns Subgraph containing traversed nodes and edges
|
|
28
|
+
*/
|
|
29
|
+
traverseDFS(startId: string, options?: TraversalOptions): Subgraph;
|
|
30
|
+
/**
|
|
31
|
+
* Recursive DFS helper
|
|
32
|
+
*/
|
|
33
|
+
private dfsRecursive;
|
|
34
|
+
/**
|
|
35
|
+
* Get adjacent edges based on direction
|
|
36
|
+
*/
|
|
37
|
+
private getAdjacentEdges;
|
|
38
|
+
/**
|
|
39
|
+
* Find all callers of a function/method
|
|
40
|
+
*
|
|
41
|
+
* @param nodeId - ID of the function/method node
|
|
42
|
+
* @param maxDepth - Maximum depth to traverse (default: 1)
|
|
43
|
+
* @returns Array of nodes that call this function
|
|
44
|
+
*/
|
|
45
|
+
getCallers(nodeId: string, maxDepth?: number): Array<{
|
|
46
|
+
node: Node;
|
|
47
|
+
edge: Edge;
|
|
48
|
+
}>;
|
|
49
|
+
private getCallersRecursive;
|
|
50
|
+
/**
|
|
51
|
+
* Find all functions/methods called by a function
|
|
52
|
+
*
|
|
53
|
+
* @param nodeId - ID of the function/method node
|
|
54
|
+
* @param maxDepth - Maximum depth to traverse (default: 1)
|
|
55
|
+
* @returns Array of nodes called by this function
|
|
56
|
+
*/
|
|
57
|
+
getCallees(nodeId: string, maxDepth?: number): Array<{
|
|
58
|
+
node: Node;
|
|
59
|
+
edge: Edge;
|
|
60
|
+
}>;
|
|
61
|
+
private getCalleesRecursive;
|
|
62
|
+
/**
|
|
63
|
+
* Get the call graph for a function (both callers and callees)
|
|
64
|
+
*
|
|
65
|
+
* @param nodeId - ID of the function/method node
|
|
66
|
+
* @param depth - Maximum depth in each direction (default: 2)
|
|
67
|
+
* @returns Subgraph containing the call graph
|
|
68
|
+
*/
|
|
69
|
+
getCallGraph(nodeId: string, depth?: number): Subgraph;
|
|
70
|
+
/**
|
|
71
|
+
* Get the type hierarchy for a class/interface
|
|
72
|
+
*
|
|
73
|
+
* @param nodeId - ID of the class/interface node
|
|
74
|
+
* @returns Subgraph containing the type hierarchy
|
|
75
|
+
*/
|
|
76
|
+
getTypeHierarchy(nodeId: string): Subgraph;
|
|
77
|
+
private getTypeAncestors;
|
|
78
|
+
private getTypeDescendants;
|
|
79
|
+
/**
|
|
80
|
+
* Find all usages of a symbol
|
|
81
|
+
*
|
|
82
|
+
* @param nodeId - ID of the symbol node
|
|
83
|
+
* @returns Array of nodes and edges that reference this symbol
|
|
84
|
+
*/
|
|
85
|
+
findUsages(nodeId: string): Array<{
|
|
86
|
+
node: Node;
|
|
87
|
+
edge: Edge;
|
|
88
|
+
}>;
|
|
89
|
+
/**
|
|
90
|
+
* Calculate the impact radius of a node
|
|
91
|
+
*
|
|
92
|
+
* Returns all nodes that could be affected by changes to this node.
|
|
93
|
+
*
|
|
94
|
+
* @param nodeId - ID of the node
|
|
95
|
+
* @param maxDepth - Maximum depth to traverse (default: 3)
|
|
96
|
+
* @returns Subgraph containing potentially impacted nodes
|
|
97
|
+
*/
|
|
98
|
+
getImpactRadius(nodeId: string, maxDepth?: number): Subgraph;
|
|
99
|
+
private getImpactRecursive;
|
|
100
|
+
/**
|
|
101
|
+
* Find the shortest path between two nodes
|
|
102
|
+
*
|
|
103
|
+
* @param fromId - Starting node ID
|
|
104
|
+
* @param toId - Target node ID
|
|
105
|
+
* @param edgeKinds - Edge types to consider (all if empty)
|
|
106
|
+
* @returns Array of nodes and edges forming the path, or null if no path exists
|
|
107
|
+
*/
|
|
108
|
+
findPath(fromId: string, toId: string, edgeKinds?: EdgeKind[]): Array<{
|
|
109
|
+
node: Node;
|
|
110
|
+
edge: Edge | null;
|
|
111
|
+
}> | null;
|
|
112
|
+
/**
|
|
113
|
+
* Get the containment hierarchy for a node (ancestors)
|
|
114
|
+
*
|
|
115
|
+
* @param nodeId - ID of the node
|
|
116
|
+
* @returns Array of ancestor nodes from immediate parent to root
|
|
117
|
+
*/
|
|
118
|
+
getAncestors(nodeId: string): Node[];
|
|
119
|
+
/**
|
|
120
|
+
* Get immediate children of a node
|
|
121
|
+
*
|
|
122
|
+
* @param nodeId - ID of the node
|
|
123
|
+
* @returns Array of child nodes
|
|
124
|
+
*/
|
|
125
|
+
getChildren(nodeId: string): Node[];
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=traversal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traversal.d.ts","sourceRoot":"","sources":["../../src/graph/traversal.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAuB7C;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAe;gBAElB,OAAO,EAAE,YAAY;IAIjC;;;;;;OAMG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,QAAQ;IAuEtE;;;;;;OAMG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,QAAQ;IAyBtE;;OAEG;IACH,OAAO,CAAC,YAAY;IA2CpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAmBxB;;;;;;OAMG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC;IASnF,OAAO,CAAC,mBAAmB;IAuB3B;;;;;;OAMG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC;IASnF,OAAO,CAAC,mBAAmB;IAuB3B;;;;;;OAMG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,QAAQ;IAiCzD;;;;;OAKG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ;IA0B1C,OAAO,CAAC,gBAAgB;IAuBxB,OAAO,CAAC,kBAAkB;IAuB1B;;;;;OAKG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC;IAgB7D;;;;;;;;OAQG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,QAAQ;IAuB/D,OAAO,CAAC,kBAAkB;IA0B1B;;;;;;;OAOG;IACH,QAAQ,CACN,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,QAAQ,EAAO,GACzB,KAAK,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;KAAE,CAAC,GAAG,IAAI;IAgDlD;;;;;OAKG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE;IAgCpC;;;;;OAKG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE;CAapC"}
|
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Graph Traversal Algorithms
|
|
4
|
+
*
|
|
5
|
+
* BFS and DFS traversal for the code knowledge graph.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.GraphTraverser = void 0;
|
|
9
|
+
/**
|
|
10
|
+
* Default traversal options
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_OPTIONS = {
|
|
13
|
+
maxDepth: Infinity,
|
|
14
|
+
edgeKinds: [],
|
|
15
|
+
nodeKinds: [],
|
|
16
|
+
direction: 'outgoing',
|
|
17
|
+
limit: 1000,
|
|
18
|
+
includeStart: true,
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Graph traverser for BFS and DFS traversal
|
|
22
|
+
*/
|
|
23
|
+
class GraphTraverser {
|
|
24
|
+
queries;
|
|
25
|
+
constructor(queries) {
|
|
26
|
+
this.queries = queries;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Traverse the graph using breadth-first search
|
|
30
|
+
*
|
|
31
|
+
* @param startId - Starting node ID
|
|
32
|
+
* @param options - Traversal options
|
|
33
|
+
* @returns Subgraph containing traversed nodes and edges
|
|
34
|
+
*/
|
|
35
|
+
traverseBFS(startId, options = {}) {
|
|
36
|
+
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
37
|
+
const startNode = this.queries.getNodeById(startId);
|
|
38
|
+
if (!startNode) {
|
|
39
|
+
return { nodes: new Map(), edges: [], roots: [] };
|
|
40
|
+
}
|
|
41
|
+
const nodes = new Map();
|
|
42
|
+
const edges = [];
|
|
43
|
+
const visited = new Set();
|
|
44
|
+
const queue = [{ node: startNode, edge: null, depth: 0 }];
|
|
45
|
+
if (opts.includeStart) {
|
|
46
|
+
nodes.set(startNode.id, startNode);
|
|
47
|
+
}
|
|
48
|
+
while (queue.length > 0 && nodes.size < opts.limit) {
|
|
49
|
+
const step = queue.shift();
|
|
50
|
+
const { node, edge, depth } = step;
|
|
51
|
+
if (visited.has(node.id)) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
visited.add(node.id);
|
|
55
|
+
// Add edge to result
|
|
56
|
+
if (edge) {
|
|
57
|
+
edges.push(edge);
|
|
58
|
+
}
|
|
59
|
+
// Check depth limit
|
|
60
|
+
if (depth >= opts.maxDepth) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
// Get adjacent edges
|
|
64
|
+
const adjacentEdges = this.getAdjacentEdges(node.id, opts.direction, opts.edgeKinds);
|
|
65
|
+
for (const adjEdge of adjacentEdges) {
|
|
66
|
+
const nextNodeId = opts.direction === 'incoming' ? adjEdge.source : adjEdge.target;
|
|
67
|
+
if (visited.has(nextNodeId)) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const nextNode = this.queries.getNodeById(nextNodeId);
|
|
71
|
+
if (!nextNode) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
// Apply node kind filter
|
|
75
|
+
if (opts.nodeKinds && opts.nodeKinds.length > 0 && !opts.nodeKinds.includes(nextNode.kind)) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
// Add node to result
|
|
79
|
+
nodes.set(nextNode.id, nextNode);
|
|
80
|
+
// Queue for further traversal
|
|
81
|
+
queue.push({ node: nextNode, edge: adjEdge, depth: depth + 1 });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
nodes,
|
|
86
|
+
edges,
|
|
87
|
+
roots: [startId],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Traverse the graph using depth-first search
|
|
92
|
+
*
|
|
93
|
+
* @param startId - Starting node ID
|
|
94
|
+
* @param options - Traversal options
|
|
95
|
+
* @returns Subgraph containing traversed nodes and edges
|
|
96
|
+
*/
|
|
97
|
+
traverseDFS(startId, options = {}) {
|
|
98
|
+
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
99
|
+
const startNode = this.queries.getNodeById(startId);
|
|
100
|
+
if (!startNode) {
|
|
101
|
+
return { nodes: new Map(), edges: [], roots: [] };
|
|
102
|
+
}
|
|
103
|
+
const nodes = new Map();
|
|
104
|
+
const edges = [];
|
|
105
|
+
const visited = new Set();
|
|
106
|
+
if (opts.includeStart) {
|
|
107
|
+
nodes.set(startNode.id, startNode);
|
|
108
|
+
}
|
|
109
|
+
this.dfsRecursive(startNode, 0, opts, nodes, edges, visited);
|
|
110
|
+
return {
|
|
111
|
+
nodes,
|
|
112
|
+
edges,
|
|
113
|
+
roots: [startId],
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Recursive DFS helper
|
|
118
|
+
*/
|
|
119
|
+
dfsRecursive(node, depth, opts, nodes, edges, visited) {
|
|
120
|
+
if (visited.has(node.id) || nodes.size >= opts.limit || depth >= opts.maxDepth) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
visited.add(node.id);
|
|
124
|
+
// Get adjacent edges
|
|
125
|
+
const adjacentEdges = this.getAdjacentEdges(node.id, opts.direction, opts.edgeKinds);
|
|
126
|
+
for (const edge of adjacentEdges) {
|
|
127
|
+
const nextNodeId = opts.direction === 'incoming' ? edge.source : edge.target;
|
|
128
|
+
if (visited.has(nextNodeId)) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
const nextNode = this.queries.getNodeById(nextNodeId);
|
|
132
|
+
if (!nextNode) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
// Apply node kind filter
|
|
136
|
+
if (opts.nodeKinds && opts.nodeKinds.length > 0 && !opts.nodeKinds.includes(nextNode.kind)) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
// Add node and edge to result
|
|
140
|
+
nodes.set(nextNode.id, nextNode);
|
|
141
|
+
edges.push(edge);
|
|
142
|
+
// Recurse
|
|
143
|
+
this.dfsRecursive(nextNode, depth + 1, opts, nodes, edges, visited);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Get adjacent edges based on direction
|
|
148
|
+
*/
|
|
149
|
+
getAdjacentEdges(nodeId, direction, edgeKinds) {
|
|
150
|
+
const kinds = edgeKinds && edgeKinds.length > 0 ? edgeKinds : undefined;
|
|
151
|
+
if (direction === 'outgoing') {
|
|
152
|
+
return this.queries.getOutgoingEdges(nodeId, kinds);
|
|
153
|
+
}
|
|
154
|
+
else if (direction === 'incoming') {
|
|
155
|
+
return this.queries.getIncomingEdges(nodeId, kinds);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
// Both directions
|
|
159
|
+
const outgoing = this.queries.getOutgoingEdges(nodeId, kinds);
|
|
160
|
+
const incoming = this.queries.getIncomingEdges(nodeId, kinds);
|
|
161
|
+
return [...outgoing, ...incoming];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Find all callers of a function/method
|
|
166
|
+
*
|
|
167
|
+
* @param nodeId - ID of the function/method node
|
|
168
|
+
* @param maxDepth - Maximum depth to traverse (default: 1)
|
|
169
|
+
* @returns Array of nodes that call this function
|
|
170
|
+
*/
|
|
171
|
+
getCallers(nodeId, maxDepth = 1) {
|
|
172
|
+
const result = [];
|
|
173
|
+
const visited = new Set();
|
|
174
|
+
this.getCallersRecursive(nodeId, maxDepth, 0, result, visited);
|
|
175
|
+
return result;
|
|
176
|
+
}
|
|
177
|
+
getCallersRecursive(nodeId, maxDepth, currentDepth, result, visited) {
|
|
178
|
+
if (currentDepth >= maxDepth || visited.has(nodeId)) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
visited.add(nodeId);
|
|
182
|
+
const incomingEdges = this.queries.getIncomingEdges(nodeId, ['calls']);
|
|
183
|
+
for (const edge of incomingEdges) {
|
|
184
|
+
const callerNode = this.queries.getNodeById(edge.source);
|
|
185
|
+
if (callerNode && !visited.has(callerNode.id)) {
|
|
186
|
+
result.push({ node: callerNode, edge });
|
|
187
|
+
this.getCallersRecursive(callerNode.id, maxDepth, currentDepth + 1, result, visited);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Find all functions/methods called by a function
|
|
193
|
+
*
|
|
194
|
+
* @param nodeId - ID of the function/method node
|
|
195
|
+
* @param maxDepth - Maximum depth to traverse (default: 1)
|
|
196
|
+
* @returns Array of nodes called by this function
|
|
197
|
+
*/
|
|
198
|
+
getCallees(nodeId, maxDepth = 1) {
|
|
199
|
+
const result = [];
|
|
200
|
+
const visited = new Set();
|
|
201
|
+
this.getCalleesRecursive(nodeId, maxDepth, 0, result, visited);
|
|
202
|
+
return result;
|
|
203
|
+
}
|
|
204
|
+
getCalleesRecursive(nodeId, maxDepth, currentDepth, result, visited) {
|
|
205
|
+
if (currentDepth >= maxDepth || visited.has(nodeId)) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
visited.add(nodeId);
|
|
209
|
+
const outgoingEdges = this.queries.getOutgoingEdges(nodeId, ['calls']);
|
|
210
|
+
for (const edge of outgoingEdges) {
|
|
211
|
+
const calleeNode = this.queries.getNodeById(edge.target);
|
|
212
|
+
if (calleeNode && !visited.has(calleeNode.id)) {
|
|
213
|
+
result.push({ node: calleeNode, edge });
|
|
214
|
+
this.getCalleesRecursive(calleeNode.id, maxDepth, currentDepth + 1, result, visited);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Get the call graph for a function (both callers and callees)
|
|
220
|
+
*
|
|
221
|
+
* @param nodeId - ID of the function/method node
|
|
222
|
+
* @param depth - Maximum depth in each direction (default: 2)
|
|
223
|
+
* @returns Subgraph containing the call graph
|
|
224
|
+
*/
|
|
225
|
+
getCallGraph(nodeId, depth = 2) {
|
|
226
|
+
const focalNode = this.queries.getNodeById(nodeId);
|
|
227
|
+
if (!focalNode) {
|
|
228
|
+
return { nodes: new Map(), edges: [], roots: [] };
|
|
229
|
+
}
|
|
230
|
+
const nodes = new Map();
|
|
231
|
+
const edges = [];
|
|
232
|
+
// Add focal node
|
|
233
|
+
nodes.set(focalNode.id, focalNode);
|
|
234
|
+
// Get callers
|
|
235
|
+
const callers = this.getCallers(nodeId, depth);
|
|
236
|
+
for (const { node, edge } of callers) {
|
|
237
|
+
nodes.set(node.id, node);
|
|
238
|
+
edges.push(edge);
|
|
239
|
+
}
|
|
240
|
+
// Get callees
|
|
241
|
+
const callees = this.getCallees(nodeId, depth);
|
|
242
|
+
for (const { node, edge } of callees) {
|
|
243
|
+
nodes.set(node.id, node);
|
|
244
|
+
edges.push(edge);
|
|
245
|
+
}
|
|
246
|
+
return {
|
|
247
|
+
nodes,
|
|
248
|
+
edges,
|
|
249
|
+
roots: [nodeId],
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Get the type hierarchy for a class/interface
|
|
254
|
+
*
|
|
255
|
+
* @param nodeId - ID of the class/interface node
|
|
256
|
+
* @returns Subgraph containing the type hierarchy
|
|
257
|
+
*/
|
|
258
|
+
getTypeHierarchy(nodeId) {
|
|
259
|
+
const focalNode = this.queries.getNodeById(nodeId);
|
|
260
|
+
if (!focalNode) {
|
|
261
|
+
return { nodes: new Map(), edges: [], roots: [] };
|
|
262
|
+
}
|
|
263
|
+
const nodes = new Map();
|
|
264
|
+
const edges = [];
|
|
265
|
+
const visited = new Set();
|
|
266
|
+
// Add focal node
|
|
267
|
+
nodes.set(focalNode.id, focalNode);
|
|
268
|
+
// Get ancestors (what this extends/implements)
|
|
269
|
+
this.getTypeAncestors(nodeId, nodes, edges, visited);
|
|
270
|
+
// Get descendants (what extends/implements this)
|
|
271
|
+
this.getTypeDescendants(nodeId, nodes, edges, visited);
|
|
272
|
+
return {
|
|
273
|
+
nodes,
|
|
274
|
+
edges,
|
|
275
|
+
roots: [nodeId],
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
getTypeAncestors(nodeId, nodes, edges, visited) {
|
|
279
|
+
if (visited.has(nodeId)) {
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
visited.add(nodeId);
|
|
283
|
+
const outgoingEdges = this.queries.getOutgoingEdges(nodeId, ['extends', 'implements']);
|
|
284
|
+
for (const edge of outgoingEdges) {
|
|
285
|
+
const parentNode = this.queries.getNodeById(edge.target);
|
|
286
|
+
if (parentNode && !nodes.has(parentNode.id)) {
|
|
287
|
+
nodes.set(parentNode.id, parentNode);
|
|
288
|
+
edges.push(edge);
|
|
289
|
+
this.getTypeAncestors(parentNode.id, nodes, edges, visited);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
getTypeDescendants(nodeId, nodes, edges, visited) {
|
|
294
|
+
if (visited.has(nodeId)) {
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
visited.add(nodeId);
|
|
298
|
+
const incomingEdges = this.queries.getIncomingEdges(nodeId, ['extends', 'implements']);
|
|
299
|
+
for (const edge of incomingEdges) {
|
|
300
|
+
const childNode = this.queries.getNodeById(edge.source);
|
|
301
|
+
if (childNode && !nodes.has(childNode.id)) {
|
|
302
|
+
nodes.set(childNode.id, childNode);
|
|
303
|
+
edges.push(edge);
|
|
304
|
+
this.getTypeDescendants(childNode.id, nodes, edges, visited);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Find all usages of a symbol
|
|
310
|
+
*
|
|
311
|
+
* @param nodeId - ID of the symbol node
|
|
312
|
+
* @returns Array of nodes and edges that reference this symbol
|
|
313
|
+
*/
|
|
314
|
+
findUsages(nodeId) {
|
|
315
|
+
const result = [];
|
|
316
|
+
// Get all incoming edges (references, calls, type_of, etc.)
|
|
317
|
+
const incomingEdges = this.queries.getIncomingEdges(nodeId);
|
|
318
|
+
for (const edge of incomingEdges) {
|
|
319
|
+
const sourceNode = this.queries.getNodeById(edge.source);
|
|
320
|
+
if (sourceNode) {
|
|
321
|
+
result.push({ node: sourceNode, edge });
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return result;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Calculate the impact radius of a node
|
|
328
|
+
*
|
|
329
|
+
* Returns all nodes that could be affected by changes to this node.
|
|
330
|
+
*
|
|
331
|
+
* @param nodeId - ID of the node
|
|
332
|
+
* @param maxDepth - Maximum depth to traverse (default: 3)
|
|
333
|
+
* @returns Subgraph containing potentially impacted nodes
|
|
334
|
+
*/
|
|
335
|
+
getImpactRadius(nodeId, maxDepth = 3) {
|
|
336
|
+
const focalNode = this.queries.getNodeById(nodeId);
|
|
337
|
+
if (!focalNode) {
|
|
338
|
+
return { nodes: new Map(), edges: [], roots: [] };
|
|
339
|
+
}
|
|
340
|
+
const nodes = new Map();
|
|
341
|
+
const edges = [];
|
|
342
|
+
const visited = new Set();
|
|
343
|
+
// Add focal node
|
|
344
|
+
nodes.set(focalNode.id, focalNode);
|
|
345
|
+
// Traverse incoming edges to find all dependents
|
|
346
|
+
this.getImpactRecursive(nodeId, maxDepth, 0, nodes, edges, visited);
|
|
347
|
+
return {
|
|
348
|
+
nodes,
|
|
349
|
+
edges,
|
|
350
|
+
roots: [nodeId],
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
getImpactRecursive(nodeId, maxDepth, currentDepth, nodes, edges, visited) {
|
|
354
|
+
if (currentDepth >= maxDepth || visited.has(nodeId)) {
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
visited.add(nodeId);
|
|
358
|
+
// Get all incoming edges (things that depend on this node)
|
|
359
|
+
const incomingEdges = this.queries.getIncomingEdges(nodeId);
|
|
360
|
+
for (const edge of incomingEdges) {
|
|
361
|
+
const sourceNode = this.queries.getNodeById(edge.source);
|
|
362
|
+
if (sourceNode && !nodes.has(sourceNode.id)) {
|
|
363
|
+
nodes.set(sourceNode.id, sourceNode);
|
|
364
|
+
edges.push(edge);
|
|
365
|
+
this.getImpactRecursive(sourceNode.id, maxDepth, currentDepth + 1, nodes, edges, visited);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Find the shortest path between two nodes
|
|
371
|
+
*
|
|
372
|
+
* @param fromId - Starting node ID
|
|
373
|
+
* @param toId - Target node ID
|
|
374
|
+
* @param edgeKinds - Edge types to consider (all if empty)
|
|
375
|
+
* @returns Array of nodes and edges forming the path, or null if no path exists
|
|
376
|
+
*/
|
|
377
|
+
findPath(fromId, toId, edgeKinds = []) {
|
|
378
|
+
const fromNode = this.queries.getNodeById(fromId);
|
|
379
|
+
const toNode = this.queries.getNodeById(toId);
|
|
380
|
+
if (!fromNode || !toNode) {
|
|
381
|
+
return null;
|
|
382
|
+
}
|
|
383
|
+
// BFS to find shortest path
|
|
384
|
+
const visited = new Set();
|
|
385
|
+
const queue = [
|
|
386
|
+
{ nodeId: fromId, path: [{ node: fromNode, edge: null }] },
|
|
387
|
+
];
|
|
388
|
+
while (queue.length > 0) {
|
|
389
|
+
const { nodeId, path } = queue.shift();
|
|
390
|
+
if (nodeId === toId) {
|
|
391
|
+
return path;
|
|
392
|
+
}
|
|
393
|
+
if (visited.has(nodeId)) {
|
|
394
|
+
continue;
|
|
395
|
+
}
|
|
396
|
+
visited.add(nodeId);
|
|
397
|
+
// Get outgoing edges
|
|
398
|
+
const outgoingEdges = this.queries.getOutgoingEdges(nodeId, edgeKinds.length > 0 ? edgeKinds : undefined);
|
|
399
|
+
for (const edge of outgoingEdges) {
|
|
400
|
+
if (!visited.has(edge.target)) {
|
|
401
|
+
const nextNode = this.queries.getNodeById(edge.target);
|
|
402
|
+
if (nextNode) {
|
|
403
|
+
queue.push({
|
|
404
|
+
nodeId: edge.target,
|
|
405
|
+
path: [...path, { node: nextNode, edge }],
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return null; // No path found
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Get the containment hierarchy for a node (ancestors)
|
|
415
|
+
*
|
|
416
|
+
* @param nodeId - ID of the node
|
|
417
|
+
* @returns Array of ancestor nodes from immediate parent to root
|
|
418
|
+
*/
|
|
419
|
+
getAncestors(nodeId) {
|
|
420
|
+
const ancestors = [];
|
|
421
|
+
const visited = new Set();
|
|
422
|
+
let currentId = nodeId;
|
|
423
|
+
while (true) {
|
|
424
|
+
if (visited.has(currentId)) {
|
|
425
|
+
break;
|
|
426
|
+
}
|
|
427
|
+
visited.add(currentId);
|
|
428
|
+
// Look for 'contains' edges pointing to this node
|
|
429
|
+
const containingEdges = this.queries.getIncomingEdges(currentId, ['contains']);
|
|
430
|
+
const firstEdge = containingEdges[0];
|
|
431
|
+
if (!firstEdge) {
|
|
432
|
+
break;
|
|
433
|
+
}
|
|
434
|
+
// Typically there should be at most one containing parent
|
|
435
|
+
const parentNode = this.queries.getNodeById(firstEdge.source);
|
|
436
|
+
if (parentNode) {
|
|
437
|
+
ancestors.push(parentNode);
|
|
438
|
+
currentId = parentNode.id;
|
|
439
|
+
}
|
|
440
|
+
else {
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
return ancestors;
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Get immediate children of a node
|
|
448
|
+
*
|
|
449
|
+
* @param nodeId - ID of the node
|
|
450
|
+
* @returns Array of child nodes
|
|
451
|
+
*/
|
|
452
|
+
getChildren(nodeId) {
|
|
453
|
+
const containsEdges = this.queries.getOutgoingEdges(nodeId, ['contains']);
|
|
454
|
+
const children = [];
|
|
455
|
+
for (const edge of containsEdges) {
|
|
456
|
+
const childNode = this.queries.getNodeById(edge.target);
|
|
457
|
+
if (childNode) {
|
|
458
|
+
children.push(childNode);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
return children;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
exports.GraphTraverser = GraphTraverser;
|
|
465
|
+
//# sourceMappingURL=traversal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traversal.js","sourceRoot":"","sources":["../../src/graph/traversal.ts"],"names":[],"mappings":"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"}
|