@nithin554/code-crawler 0.0.0 → 0.1.1
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 +226 -45
- package/dist/config.d.ts +13 -0
- package/dist/config.js +32 -0
- package/dist/config.js.map +1 -0
- package/dist/crawler.d.ts +46 -0
- package/dist/crawler.js +303 -0
- package/dist/crawler.js.map +1 -0
- package/dist/graph/queries.d.ts +111 -0
- package/dist/graph/queries.js +265 -0
- package/dist/graph/queries.js.map +1 -0
- package/dist/graph/schema.d.ts +63 -0
- package/dist/graph/schema.js +54 -0
- package/dist/graph/schema.js.map +1 -0
- package/dist/graph/store.d.ts +66 -0
- package/dist/graph/store.js +251 -0
- package/dist/graph/store.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +133 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/language.d.ts +111 -0
- package/dist/parser/language.js +13 -0
- package/dist/parser/language.js.map +1 -0
- package/dist/parser/languages/index.d.ts +5 -0
- package/dist/parser/languages/index.js +31 -0
- package/dist/parser/languages/index.js.map +1 -0
- package/dist/parser/languages/java.d.ts +10 -0
- package/dist/parser/languages/java.js +334 -0
- package/dist/parser/languages/java.js.map +1 -0
- package/dist/parser/treeSitter.d.ts +28 -0
- package/dist/parser/treeSitter.js +114 -0
- package/dist/parser/treeSitter.js.map +1 -0
- package/dist/resolver/javaResolver.d.ts +20 -0
- package/dist/resolver/javaResolver.js +253 -0
- package/dist/resolver/javaResolver.js.map +1 -0
- package/dist/resolver/types.d.ts +45 -0
- package/dist/resolver/types.js +80 -0
- package/dist/resolver/types.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.js +282 -0
- package/dist/server.js.map +1 -0
- package/package.json +44 -7
package/dist/crawler.js
ADDED
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fieldNodeId, importNodeId } from "./graph/schema.js";
|
|
4
|
+
import { languageForFile } from "./parser/languages/index.js";
|
|
5
|
+
import { buildTypeIndex, phantomNodeId } from "./resolver/types.js";
|
|
6
|
+
import { resolveJavaFile } from "./resolver/javaResolver.js";
|
|
7
|
+
/** Discover source files under a project, respecting exclusion dirs. */
|
|
8
|
+
export function discoverSourceFiles(projectPath, excludeDirs, language) {
|
|
9
|
+
const excluded = new Set(excludeDirs.map((d) => d.replace(/\/+$/, "")));
|
|
10
|
+
const out = [];
|
|
11
|
+
function walk(dir) {
|
|
12
|
+
let entries;
|
|
13
|
+
try {
|
|
14
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return; // unreadable dir (permissions) — skip
|
|
18
|
+
}
|
|
19
|
+
for (const entry of entries) {
|
|
20
|
+
const full = path.join(dir, entry.name);
|
|
21
|
+
if (entry.isDirectory()) {
|
|
22
|
+
if (!excluded.has(entry.name))
|
|
23
|
+
walk(full);
|
|
24
|
+
}
|
|
25
|
+
else if (entry.isFile() && languageForFile(entry.name, language)) {
|
|
26
|
+
out.push(full);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
walk(projectPath);
|
|
31
|
+
return out.sort();
|
|
32
|
+
}
|
|
33
|
+
/** Convert a ParsedFile into graph nodes + edges (declarations only). */
|
|
34
|
+
export function buildDeclarationGraph(parsed) {
|
|
35
|
+
const nodes = [];
|
|
36
|
+
const edges = [];
|
|
37
|
+
const fileId = parsed.filePath;
|
|
38
|
+
const fileLines = sourceLineCount(parsed.filePath);
|
|
39
|
+
nodes.push({
|
|
40
|
+
id: fileId,
|
|
41
|
+
kind: "file",
|
|
42
|
+
qualifiedName: fileId,
|
|
43
|
+
filePath: fileId,
|
|
44
|
+
properties: { language: parsed.language, startLine: 0, endLine: fileLines },
|
|
45
|
+
});
|
|
46
|
+
if (parsed.packageName) {
|
|
47
|
+
nodes.push({
|
|
48
|
+
id: parsed.packageName,
|
|
49
|
+
kind: "package",
|
|
50
|
+
qualifiedName: parsed.packageName,
|
|
51
|
+
filePath: fileId,
|
|
52
|
+
properties: {},
|
|
53
|
+
});
|
|
54
|
+
edges.push({
|
|
55
|
+
source: fileId,
|
|
56
|
+
target: parsed.packageName,
|
|
57
|
+
kind: "DECLARED_IN",
|
|
58
|
+
properties: {},
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
for (const imp of parsed.imports) {
|
|
62
|
+
const importId = importNodeId(imp.fqn);
|
|
63
|
+
nodes.push({
|
|
64
|
+
id: importId,
|
|
65
|
+
kind: "import",
|
|
66
|
+
qualifiedName: imp.fqn,
|
|
67
|
+
filePath: fileId,
|
|
68
|
+
properties: { simpleName: imp.simpleName, static: imp.isStatic },
|
|
69
|
+
});
|
|
70
|
+
edges.push({ source: fileId, target: importId, kind: "IMPORTS", properties: {} });
|
|
71
|
+
}
|
|
72
|
+
for (const t of parsed.types) {
|
|
73
|
+
nodes.push({
|
|
74
|
+
id: t.id,
|
|
75
|
+
kind: t.kind,
|
|
76
|
+
qualifiedName: t.id,
|
|
77
|
+
filePath: fileId,
|
|
78
|
+
properties: { name: t.name, startLine: t.startLine, endLine: t.endLine },
|
|
79
|
+
});
|
|
80
|
+
edges.push({ source: fileId, target: t.id, kind: "CONTAINS", properties: {} });
|
|
81
|
+
if (parsed.packageName) {
|
|
82
|
+
edges.push({ source: t.id, target: parsed.packageName, kind: "DECLARED_IN", properties: {} });
|
|
83
|
+
}
|
|
84
|
+
for (const parent of t.extendsTypes) {
|
|
85
|
+
edges.push({ source: t.id, target: parent, kind: "EXTENDS", properties: {} });
|
|
86
|
+
}
|
|
87
|
+
for (const parent of t.implementsTypes) {
|
|
88
|
+
edges.push({ source: t.id, target: parent, kind: "IMPLEMENTS", properties: {} });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
for (const m of parsed.methods) {
|
|
92
|
+
nodes.push({
|
|
93
|
+
id: m.id,
|
|
94
|
+
kind: m.isConstructor ? "constructor" : "method",
|
|
95
|
+
qualifiedName: m.id,
|
|
96
|
+
filePath: fileId,
|
|
97
|
+
properties: {
|
|
98
|
+
name: m.name,
|
|
99
|
+
signature: `(${m.params.map((p) => p.type).join(", ")})`,
|
|
100
|
+
returnType: m.returnType,
|
|
101
|
+
modifiers: m.modifiers,
|
|
102
|
+
startLine: m.startLine,
|
|
103
|
+
endLine: m.endLine,
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
edges.push({
|
|
107
|
+
source: m.typeId,
|
|
108
|
+
target: m.id,
|
|
109
|
+
kind: "CONTAINS",
|
|
110
|
+
properties: { line: m.startLine },
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
for (const f of parsed.fields) {
|
|
114
|
+
nodes.push({
|
|
115
|
+
id: fieldNodeId(f.typeId, f.name),
|
|
116
|
+
kind: "field",
|
|
117
|
+
qualifiedName: f.id,
|
|
118
|
+
filePath: fileId,
|
|
119
|
+
properties: { name: f.name, type: f.type, startLine: f.startLine },
|
|
120
|
+
});
|
|
121
|
+
edges.push({
|
|
122
|
+
source: f.typeId,
|
|
123
|
+
target: fieldNodeId(f.typeId, f.name),
|
|
124
|
+
kind: "CONTAINS",
|
|
125
|
+
properties: { line: f.startLine },
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
return { nodes, edges };
|
|
129
|
+
}
|
|
130
|
+
/** Resolve call sites for a parsed file into CALLS edges + phantom nodes. */
|
|
131
|
+
export function buildCallEdges(parsed, index, knownNodeIds) {
|
|
132
|
+
const edges = [];
|
|
133
|
+
const phantomNodes = [];
|
|
134
|
+
let resolved = 0;
|
|
135
|
+
let unresolved = 0;
|
|
136
|
+
const javaParsed = parsed;
|
|
137
|
+
const resolvedCalls = parsed.language === "java" ? resolveJavaFile(javaParsed, index) : [];
|
|
138
|
+
for (const rc of resolvedCalls) {
|
|
139
|
+
// Calls in field/static initializers have no enclosing method; attribute
|
|
140
|
+
// them to the enclosing type so the edge always has a valid source.
|
|
141
|
+
const source = rc.callSite.enclosingMethodId || rc.callSite.enclosingTypeId;
|
|
142
|
+
if (rc.resolved) {
|
|
143
|
+
resolved++;
|
|
144
|
+
// Targets can reference synthetic methods (e.g. implicit default
|
|
145
|
+
// constructors) that are not declared anywhere; create a node for them.
|
|
146
|
+
if (!knownNodeIds.has(rc.targetId)) {
|
|
147
|
+
const synthetic = {
|
|
148
|
+
id: rc.targetId,
|
|
149
|
+
kind: rc.targetId.endsWith("#<init>") ? "constructor" : "method",
|
|
150
|
+
qualifiedName: rc.targetId,
|
|
151
|
+
filePath: parsed.filePath,
|
|
152
|
+
properties: {
|
|
153
|
+
name: rc.targetId.includes("#") ? rc.targetId.split("#").pop() ?? "" : rc.targetId,
|
|
154
|
+
synthetic: true,
|
|
155
|
+
reason: rc.reason,
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
phantomNodes.push(synthetic);
|
|
159
|
+
knownNodeIds.add(rc.targetId);
|
|
160
|
+
}
|
|
161
|
+
edges.push({
|
|
162
|
+
source,
|
|
163
|
+
target: rc.targetId,
|
|
164
|
+
kind: "CALLS",
|
|
165
|
+
properties: {
|
|
166
|
+
line: rc.callSite.line,
|
|
167
|
+
resolved: true,
|
|
168
|
+
confidence: Math.round(rc.confidence * 100) / 100,
|
|
169
|
+
reason: rc.reason,
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
unresolved++;
|
|
175
|
+
const phantomId = phantomNodeId(rc.callSite);
|
|
176
|
+
phantomNodes.push({
|
|
177
|
+
id: phantomId,
|
|
178
|
+
kind: "unknown_symbol",
|
|
179
|
+
qualifiedName: phantomId,
|
|
180
|
+
filePath: parsed.filePath,
|
|
181
|
+
properties: {
|
|
182
|
+
name: rc.callSite.isConstructorCall ? rc.callSite.name : `${rc.callSite.receiver ? `${rc.callSite.receiver}.` : ""}${rc.callSite.name}`,
|
|
183
|
+
reason: rc.reason,
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
edges.push({
|
|
187
|
+
source,
|
|
188
|
+
target: phantomId,
|
|
189
|
+
kind: "CALLS",
|
|
190
|
+
properties: {
|
|
191
|
+
line: rc.callSite.line,
|
|
192
|
+
resolved: false,
|
|
193
|
+
confidence: 0,
|
|
194
|
+
reason: rc.reason,
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return { edges, phantomNodes, resolved, unresolved };
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Crawl a project directory and index it into the store.
|
|
203
|
+
* Idempotent: re-crawling refreshes the graph; files that disappeared are
|
|
204
|
+
* removed from the index.
|
|
205
|
+
*/
|
|
206
|
+
export async function crawlProject(store, projectPath, excludeDirs, options = {}) {
|
|
207
|
+
const started = Date.now();
|
|
208
|
+
const absPath = path.resolve(projectPath);
|
|
209
|
+
if (!fs.existsSync(absPath) || !fs.statSync(absPath).isDirectory()) {
|
|
210
|
+
throw new Error(`project path is not a directory: ${projectPath}`);
|
|
211
|
+
}
|
|
212
|
+
const files = discoverSourceFiles(absPath, excludeDirs, options.language);
|
|
213
|
+
if (options.fileFilter) {
|
|
214
|
+
const filter = options.fileFilter;
|
|
215
|
+
files.splice(0, files.length, ...files.filter((f) => f.includes(filter)));
|
|
216
|
+
}
|
|
217
|
+
// Parse every file (grammar is cached, so subsequent parses are fast).
|
|
218
|
+
const parsedFiles = [];
|
|
219
|
+
const parseErrors = [];
|
|
220
|
+
for (const file of files) {
|
|
221
|
+
try {
|
|
222
|
+
const source = fs.readFileSync(file, "utf8");
|
|
223
|
+
const config = languageForFile(file, options.language);
|
|
224
|
+
if (!config)
|
|
225
|
+
continue;
|
|
226
|
+
parsedFiles.push(await config.parseFile(source, file));
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
parseErrors.push(`${file}: ${err.message}`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// Global index for cross-file resolution.
|
|
233
|
+
const index = buildTypeIndex(parsedFiles);
|
|
234
|
+
// Build nodes + edges per file and persist file-scoped.
|
|
235
|
+
const previouslyIndexed = new Set(store.raw("SELECT DISTINCT file_path FROM nodes WHERE file_path IS NOT NULL").map((r) => r.file_path));
|
|
236
|
+
const currentFiles = new Set(files);
|
|
237
|
+
let filesRemoved = 0;
|
|
238
|
+
let totalNodes = 0;
|
|
239
|
+
let totalEdges = 0;
|
|
240
|
+
let totalResolved = 0;
|
|
241
|
+
let totalUnresolved = 0;
|
|
242
|
+
// Pre-compute every declared node id so synthetic targets (default
|
|
243
|
+
// constructors) can be created on demand, and so EXTENDS/IMPLEMENTS edges
|
|
244
|
+
// to external types can be dropped instead of violating FK constraints.
|
|
245
|
+
const allNodeIds = new Set();
|
|
246
|
+
for (const parsed of parsedFiles) {
|
|
247
|
+
for (const n of buildDeclarationGraph(parsed).nodes)
|
|
248
|
+
allNodeIds.add(n.id);
|
|
249
|
+
}
|
|
250
|
+
store.withTransaction(() => {
|
|
251
|
+
for (const parsed of parsedFiles) {
|
|
252
|
+
const decl = buildDeclarationGraph(parsed);
|
|
253
|
+
const calls = buildCallEdges(parsed, index, allNodeIds);
|
|
254
|
+
for (const p of calls.phantomNodes)
|
|
255
|
+
allNodeIds.add(p.id);
|
|
256
|
+
// Phantom nodes must exist as edge endpoints (FK constraint).
|
|
257
|
+
for (const p of calls.phantomNodes)
|
|
258
|
+
store.ensureNode(p);
|
|
259
|
+
// Drop edges whose endpoints aren't part of the indexed project
|
|
260
|
+
// (external EXTENDS/IMPLEMENTS/IMPORTS targets).
|
|
261
|
+
const edges = decl.edges
|
|
262
|
+
.concat(calls.edges)
|
|
263
|
+
.filter((e) => allNodeIds.has(e.source) && allNodeIds.has(e.target));
|
|
264
|
+
const nodes = decl.nodes.concat(calls.phantomNodes);
|
|
265
|
+
store.replaceFile(parsed.filePath, nodes, edges);
|
|
266
|
+
totalNodes += decl.nodes.length;
|
|
267
|
+
totalEdges += edges.length;
|
|
268
|
+
totalResolved += calls.resolved;
|
|
269
|
+
totalUnresolved += calls.unresolved;
|
|
270
|
+
previouslyIndexed.delete(parsed.filePath);
|
|
271
|
+
}
|
|
272
|
+
// Remove files that disappeared from the project.
|
|
273
|
+
for (const stale of previouslyIndexed) {
|
|
274
|
+
if (!currentFiles.has(stale)) {
|
|
275
|
+
store.removeFile(stale);
|
|
276
|
+
filesRemoved++;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
store.setMeta("last_crawl_at", new Date().toISOString());
|
|
281
|
+
store.setMeta("last_project_path", absPath);
|
|
282
|
+
return {
|
|
283
|
+
projectPath: absPath,
|
|
284
|
+
filesScanned: files.length,
|
|
285
|
+
filesParsed: parsedFiles.length,
|
|
286
|
+
filesRemoved,
|
|
287
|
+
nodes: totalNodes,
|
|
288
|
+
edges: totalEdges,
|
|
289
|
+
resolvedCalls: totalResolved,
|
|
290
|
+
unresolvedCalls: totalUnresolved,
|
|
291
|
+
languages: [...new Set(parsedFiles.map((p) => p.language))],
|
|
292
|
+
durationMs: Date.now() - started,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
function sourceLineCount(filePath) {
|
|
296
|
+
try {
|
|
297
|
+
return fs.readFileSync(filePath, "utf8").split("\n").length;
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
return 0;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=crawler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crawler.js","sourceRoot":"","sources":["../src/crawler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import type { GraphStore } from "./store.js";
|
|
2
|
+
import type { EdgeKind, NodeKind } from "./schema.js";
|
|
3
|
+
/**
|
|
4
|
+
* Traversal queries over the property graph.
|
|
5
|
+
*
|
|
6
|
+
* All queries operate on CALLS edges (directed: caller -> callee) plus
|
|
7
|
+
* arbitrary edge kinds where relevant. Depth-bounded recursive CTEs keep
|
|
8
|
+
* queries bounded even on large graphs.
|
|
9
|
+
*/
|
|
10
|
+
export interface SymbolRef {
|
|
11
|
+
id: string;
|
|
12
|
+
qualifiedName: string;
|
|
13
|
+
name?: string;
|
|
14
|
+
kind: NodeKind;
|
|
15
|
+
filePath: string | null;
|
|
16
|
+
line?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface CallerInfo {
|
|
19
|
+
caller: SymbolRef;
|
|
20
|
+
/** Properties of the CALLS edge (call site line, resolution, confidence). */
|
|
21
|
+
callSiteLine?: number;
|
|
22
|
+
resolved?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface CallerQueryOptions {
|
|
25
|
+
/** Include transitive callers (whole call graph above). Default true. */
|
|
26
|
+
transitive?: boolean;
|
|
27
|
+
/** Max depth for transitive traversal. Bounded by config maxDepth. */
|
|
28
|
+
maxDepth?: number;
|
|
29
|
+
/** Cap total rows returned. */
|
|
30
|
+
limit?: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Find every symbol that calls the given symbol, directly or transitively.
|
|
34
|
+
* Each row includes the edge chain depth so clients can render a call tree.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getCallers(store: GraphStore, symbol: string, opts?: CallerQueryOptions): {
|
|
37
|
+
target: SymbolRef;
|
|
38
|
+
callers: {
|
|
39
|
+
caller: SymbolRef;
|
|
40
|
+
depth: number;
|
|
41
|
+
callSiteLine?: number;
|
|
42
|
+
}[];
|
|
43
|
+
} | null;
|
|
44
|
+
export interface CalleeQueryOptions {
|
|
45
|
+
/** Include transitive callees (whole call graph below). Default true. */
|
|
46
|
+
transitive?: boolean;
|
|
47
|
+
maxDepth?: number;
|
|
48
|
+
limit?: number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Find every symbol the given symbol calls, directly or transitively.
|
|
52
|
+
*/
|
|
53
|
+
export declare function getCallees(store: GraphStore, symbol: string, opts?: CalleeQueryOptions): {
|
|
54
|
+
source: SymbolRef;
|
|
55
|
+
callees: {
|
|
56
|
+
callee: SymbolRef;
|
|
57
|
+
depth: number;
|
|
58
|
+
callSiteLine?: number;
|
|
59
|
+
}[];
|
|
60
|
+
} | null;
|
|
61
|
+
export interface PathEntry {
|
|
62
|
+
/** Ordered list of symbol ids from source to target (inclusive). */
|
|
63
|
+
path: string[];
|
|
64
|
+
length: number;
|
|
65
|
+
edges: {
|
|
66
|
+
source: string;
|
|
67
|
+
target: string;
|
|
68
|
+
callSiteLine?: number;
|
|
69
|
+
resolved?: boolean;
|
|
70
|
+
}[];
|
|
71
|
+
}
|
|
72
|
+
export interface TracePathOptions {
|
|
73
|
+
maxDepth?: number;
|
|
74
|
+
limit?: number;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Find up to `limit` static call paths between two symbols.
|
|
78
|
+
* BFS over CALLS edges so the shortest paths come first.
|
|
79
|
+
*/
|
|
80
|
+
export declare function tracePath(store: GraphStore, from: string, to: string, opts?: TracePathOptions): PathEntry[] | null;
|
|
81
|
+
export interface SubgraphOptions {
|
|
82
|
+
radius?: number;
|
|
83
|
+
edgeKinds?: EdgeKind[];
|
|
84
|
+
limit?: number;
|
|
85
|
+
}
|
|
86
|
+
export interface SubgraphResult {
|
|
87
|
+
center: SymbolRef | null;
|
|
88
|
+
nodes: SymbolRef[];
|
|
89
|
+
edges: {
|
|
90
|
+
source: string;
|
|
91
|
+
target: string;
|
|
92
|
+
kind: EdgeKind;
|
|
93
|
+
callSiteLine?: number;
|
|
94
|
+
}[];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Extract the neighborhood around a symbol (any edge kinds), useful for
|
|
98
|
+
* visualization and for letting an LLM see the local shape of the graph.
|
|
99
|
+
*/
|
|
100
|
+
export declare function getSubgraph(store: GraphStore, symbol: string, opts?: SubgraphOptions): SubgraphResult;
|
|
101
|
+
export interface SearchOptions {
|
|
102
|
+
kind?: NodeKind | null;
|
|
103
|
+
limit?: number;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Fuzzy symbol lookup by short name or FQN. Matches substring of either the
|
|
107
|
+
* id, the qualified name, or the display name.
|
|
108
|
+
*/
|
|
109
|
+
export declare function searchSymbols(store: GraphStore, query: string, opts?: SearchOptions): SymbolRef[];
|
|
110
|
+
/** Suggest similar symbols when an exact lookup fails. */
|
|
111
|
+
export declare function suggestSymbols(store: GraphStore, symbol: string, limit?: number): SymbolRef[];
|