driftdetect-core 0.4.0 → 0.4.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/dist/boundaries/boundary-scanner.d.ts +76 -0
- package/dist/boundaries/boundary-scanner.d.ts.map +1 -0
- package/dist/boundaries/boundary-scanner.js +801 -0
- package/dist/boundaries/boundary-scanner.js.map +1 -0
- package/dist/boundaries/data-access-learner.d.ts +126 -0
- package/dist/boundaries/data-access-learner.d.ts.map +1 -0
- package/dist/boundaries/data-access-learner.js +486 -0
- package/dist/boundaries/data-access-learner.js.map +1 -0
- package/dist/boundaries/index.d.ts +6 -0
- package/dist/boundaries/index.d.ts.map +1 -1
- package/dist/boundaries/index.js +6 -0
- package/dist/boundaries/index.js.map +1 -1
- package/dist/boundaries/security-prioritizer.d.ts +118 -0
- package/dist/boundaries/security-prioritizer.d.ts.map +1 -0
- package/dist/boundaries/security-prioritizer.js +316 -0
- package/dist/boundaries/security-prioritizer.js.map +1 -0
- package/dist/call-graph/analysis/coverage-analyzer.d.ts +201 -0
- package/dist/call-graph/analysis/coverage-analyzer.d.ts.map +1 -0
- package/dist/call-graph/analysis/coverage-analyzer.js +553 -0
- package/dist/call-graph/analysis/coverage-analyzer.js.map +1 -0
- package/dist/call-graph/analysis/dead-code-detector.d.ts +145 -0
- package/dist/call-graph/analysis/dead-code-detector.d.ts.map +1 -0
- package/dist/call-graph/analysis/dead-code-detector.js +391 -0
- package/dist/call-graph/analysis/dead-code-detector.js.map +1 -0
- package/dist/call-graph/analysis/graph-builder.d.ts +142 -0
- package/dist/call-graph/analysis/graph-builder.d.ts.map +1 -0
- package/dist/call-graph/analysis/graph-builder.js +624 -0
- package/dist/call-graph/analysis/graph-builder.js.map +1 -0
- package/dist/call-graph/analysis/impact-analyzer.d.ts +150 -0
- package/dist/call-graph/analysis/impact-analyzer.d.ts.map +1 -0
- package/dist/call-graph/analysis/impact-analyzer.js +329 -0
- package/dist/call-graph/analysis/impact-analyzer.js.map +1 -0
- package/dist/call-graph/analysis/index.d.ts +11 -0
- package/dist/call-graph/analysis/index.d.ts.map +1 -0
- package/dist/call-graph/analysis/index.js +9 -0
- package/dist/call-graph/analysis/index.js.map +1 -0
- package/dist/call-graph/analysis/path-finder.d.ts +117 -0
- package/dist/call-graph/analysis/path-finder.d.ts.map +1 -0
- package/dist/call-graph/analysis/path-finder.js +360 -0
- package/dist/call-graph/analysis/path-finder.js.map +1 -0
- package/dist/call-graph/analysis/reachability.d.ts +56 -0
- package/dist/call-graph/analysis/reachability.d.ts.map +1 -0
- package/dist/call-graph/analysis/reachability.js +357 -0
- package/dist/call-graph/analysis/reachability.js.map +1 -0
- package/dist/call-graph/demo.d.ts +11 -0
- package/dist/call-graph/demo.d.ts.map +1 -0
- package/dist/call-graph/demo.js +339 -0
- package/dist/call-graph/demo.js.map +1 -0
- package/dist/call-graph/enrichment/enrichment-engine.d.ts +126 -0
- package/dist/call-graph/enrichment/enrichment-engine.d.ts.map +1 -0
- package/dist/call-graph/enrichment/enrichment-engine.js +760 -0
- package/dist/call-graph/enrichment/enrichment-engine.js.map +1 -0
- package/dist/call-graph/enrichment/impact-scorer.d.ts +59 -0
- package/dist/call-graph/enrichment/impact-scorer.d.ts.map +1 -0
- package/dist/call-graph/enrichment/impact-scorer.js +328 -0
- package/dist/call-graph/enrichment/impact-scorer.js.map +1 -0
- package/dist/call-graph/enrichment/index.d.ts +12 -0
- package/dist/call-graph/enrichment/index.d.ts.map +1 -0
- package/dist/call-graph/enrichment/index.js +15 -0
- package/dist/call-graph/enrichment/index.js.map +1 -0
- package/dist/call-graph/enrichment/remediation-generator.d.ts +41 -0
- package/dist/call-graph/enrichment/remediation-generator.d.ts.map +1 -0
- package/dist/call-graph/enrichment/remediation-generator.js +609 -0
- package/dist/call-graph/enrichment/remediation-generator.js.map +1 -0
- package/dist/call-graph/enrichment/sensitivity-classifier.d.ts +71 -0
- package/dist/call-graph/enrichment/sensitivity-classifier.d.ts.map +1 -0
- package/dist/call-graph/enrichment/sensitivity-classifier.js +454 -0
- package/dist/call-graph/enrichment/sensitivity-classifier.js.map +1 -0
- package/dist/call-graph/enrichment/types.d.ts +402 -0
- package/dist/call-graph/enrichment/types.d.ts.map +1 -0
- package/dist/call-graph/enrichment/types.js +9 -0
- package/dist/call-graph/enrichment/types.js.map +1 -0
- package/dist/call-graph/extractors/base-extractor.d.ts +112 -0
- package/dist/call-graph/extractors/base-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/base-extractor.js +140 -0
- package/dist/call-graph/extractors/base-extractor.js.map +1 -0
- package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts +76 -0
- package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/csharp-data-access-extractor.js +387 -0
- package/dist/call-graph/extractors/csharp-data-access-extractor.js.map +1 -0
- package/dist/call-graph/extractors/csharp-extractor.d.ts +87 -0
- package/dist/call-graph/extractors/csharp-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/csharp-extractor.js +470 -0
- package/dist/call-graph/extractors/csharp-extractor.js.map +1 -0
- package/dist/call-graph/extractors/data-access-extractor.d.ts +76 -0
- package/dist/call-graph/extractors/data-access-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/data-access-extractor.js +234 -0
- package/dist/call-graph/extractors/data-access-extractor.js.map +1 -0
- package/dist/call-graph/extractors/index.d.ts +26 -0
- package/dist/call-graph/extractors/index.d.ts.map +1 -0
- package/dist/call-graph/extractors/index.js +36 -0
- package/dist/call-graph/extractors/index.js.map +1 -0
- package/dist/call-graph/extractors/java-data-access-extractor.d.ts +101 -0
- package/dist/call-graph/extractors/java-data-access-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/java-data-access-extractor.js +611 -0
- package/dist/call-graph/extractors/java-data-access-extractor.js.map +1 -0
- package/dist/call-graph/extractors/java-extractor.d.ts +87 -0
- package/dist/call-graph/extractors/java-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/java-extractor.js +510 -0
- package/dist/call-graph/extractors/java-extractor.js.map +1 -0
- package/dist/call-graph/extractors/php-data-access-extractor.d.ts +93 -0
- package/dist/call-graph/extractors/php-data-access-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/php-data-access-extractor.js +589 -0
- package/dist/call-graph/extractors/php-data-access-extractor.js.map +1 -0
- package/dist/call-graph/extractors/php-extractor.d.ts +104 -0
- package/dist/call-graph/extractors/php-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/php-extractor.js +619 -0
- package/dist/call-graph/extractors/php-extractor.js.map +1 -0
- package/dist/call-graph/extractors/python-data-access-extractor.d.ts +90 -0
- package/dist/call-graph/extractors/python-data-access-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/python-data-access-extractor.js +537 -0
- package/dist/call-graph/extractors/python-data-access-extractor.js.map +1 -0
- package/dist/call-graph/extractors/python-extractor.d.ts +98 -0
- package/dist/call-graph/extractors/python-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/python-extractor.js +681 -0
- package/dist/call-graph/extractors/python-extractor.js.map +1 -0
- package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts +91 -0
- package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts.map +1 -0
- package/dist/call-graph/extractors/semantic-data-access-scanner.js +498 -0
- package/dist/call-graph/extractors/semantic-data-access-scanner.js.map +1 -0
- package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts +122 -0
- package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/typescript-data-access-extractor.js +788 -0
- package/dist/call-graph/extractors/typescript-data-access-extractor.js.map +1 -0
- package/dist/call-graph/extractors/typescript-extractor.d.ts +145 -0
- package/dist/call-graph/extractors/typescript-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/typescript-extractor.js +904 -0
- package/dist/call-graph/extractors/typescript-extractor.js.map +1 -0
- package/dist/call-graph/index.d.ts +127 -0
- package/dist/call-graph/index.d.ts.map +1 -0
- package/dist/call-graph/index.js +247 -0
- package/dist/call-graph/index.js.map +1 -0
- package/dist/call-graph/store/call-graph-store.d.ts +70 -0
- package/dist/call-graph/store/call-graph-store.d.ts.map +1 -0
- package/dist/call-graph/store/call-graph-store.js +210 -0
- package/dist/call-graph/store/call-graph-store.js.map +1 -0
- package/dist/call-graph/store/index.d.ts +7 -0
- package/dist/call-graph/store/index.d.ts.map +1 -0
- package/dist/call-graph/store/index.js +7 -0
- package/dist/call-graph/store/index.js.map +1 -0
- package/dist/call-graph/types.d.ts +376 -0
- package/dist/call-graph/types.d.ts.map +1 -0
- package/dist/call-graph/types.js +8 -0
- package/dist/call-graph/types.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/lake/callgraph-shard-store.d.ts +168 -0
- package/dist/lake/callgraph-shard-store.d.ts.map +1 -0
- package/dist/lake/callgraph-shard-store.js +466 -0
- package/dist/lake/callgraph-shard-store.js.map +1 -0
- package/dist/lake/examples-store.d.ts +127 -0
- package/dist/lake/examples-store.d.ts.map +1 -0
- package/dist/lake/examples-store.js +389 -0
- package/dist/lake/examples-store.js.map +1 -0
- package/dist/lake/index-store.d.ts +82 -0
- package/dist/lake/index-store.d.ts.map +1 -0
- package/dist/lake/index-store.js +359 -0
- package/dist/lake/index-store.js.map +1 -0
- package/dist/lake/index.d.ts +93 -0
- package/dist/lake/index.d.ts.map +1 -0
- package/dist/lake/index.js +138 -0
- package/dist/lake/index.js.map +1 -0
- package/dist/lake/lake.bak/index-store.d.ts +82 -0
- package/dist/lake/lake.bak/index-store.d.ts.map +1 -0
- package/dist/lake/lake.bak/index-store.js +357 -0
- package/dist/lake/lake.bak/index-store.js.map +1 -0
- package/dist/lake/lake.bak/index.d.ts +81 -0
- package/dist/lake/lake.bak/index.d.ts.map +1 -0
- package/dist/lake/lake.bak/index.js +114 -0
- package/dist/lake/lake.bak/index.js.map +1 -0
- package/dist/lake/lake.bak/manifest-store.d.ts +51 -0
- package/dist/lake/lake.bak/manifest-store.d.ts.map +1 -0
- package/dist/lake/lake.bak/manifest-store.js +347 -0
- package/dist/lake/lake.bak/manifest-store.js.map +1 -0
- package/dist/lake/lake.bak/query-engine.d.ts +112 -0
- package/dist/lake/lake.bak/query-engine.d.ts.map +1 -0
- package/dist/lake/lake.bak/query-engine.js +370 -0
- package/dist/lake/lake.bak/query-engine.js.map +1 -0
- package/dist/lake/lake.bak/types.d.ts +428 -0
- package/dist/lake/lake.bak/types.d.ts.map +1 -0
- package/dist/lake/lake.bak/types.js +46 -0
- package/dist/lake/lake.bak/types.js.map +1 -0
- package/dist/lake/lake.bak/view-materializer.d.ts +70 -0
- package/dist/lake/lake.bak/view-materializer.d.ts.map +1 -0
- package/dist/lake/lake.bak/view-materializer.js +314 -0
- package/dist/lake/lake.bak/view-materializer.js.map +1 -0
- package/dist/lake/lake.bak/view-store.d.ts +57 -0
- package/dist/lake/lake.bak/view-store.d.ts.map +1 -0
- package/dist/lake/lake.bak/view-store.js +348 -0
- package/dist/lake/lake.bak/view-store.js.map +1 -0
- package/dist/lake/manifest-store.d.ts +51 -0
- package/dist/lake/manifest-store.d.ts.map +1 -0
- package/dist/lake/manifest-store.js +348 -0
- package/dist/lake/manifest-store.js.map +1 -0
- package/dist/lake/pattern-shard-store.d.ts +87 -0
- package/dist/lake/pattern-shard-store.d.ts.map +1 -0
- package/dist/lake/pattern-shard-store.js +347 -0
- package/dist/lake/pattern-shard-store.js.map +1 -0
- package/dist/lake/query-engine.d.ts +124 -0
- package/dist/lake/query-engine.d.ts.map +1 -0
- package/dist/lake/query-engine.js +453 -0
- package/dist/lake/query-engine.js.map +1 -0
- package/dist/lake/security-shard-store.d.ts +156 -0
- package/dist/lake/security-shard-store.d.ts.map +1 -0
- package/dist/lake/security-shard-store.js +498 -0
- package/dist/lake/security-shard-store.js.map +1 -0
- package/dist/lake/types.d.ts +428 -0
- package/dist/lake/types.d.ts.map +1 -0
- package/dist/lake/types.js +46 -0
- package/dist/lake/types.js.map +1 -0
- package/dist/lake/view-materializer.d.ts +70 -0
- package/dist/lake/view-materializer.d.ts.map +1 -0
- package/dist/lake/view-materializer.js +314 -0
- package/dist/lake/view-materializer.js.map +1 -0
- package/dist/lake/view-store.d.ts +57 -0
- package/dist/lake/view-store.d.ts.map +1 -0
- package/dist/lake/view-store.js +348 -0
- package/dist/lake/view-store.js.map +1 -0
- package/dist/parsers/tree-sitter/index.d.ts +1 -0
- package/dist/parsers/tree-sitter/index.d.ts.map +1 -1
- package/dist/parsers/tree-sitter/index.js +4 -0
- package/dist/parsers/tree-sitter/index.js.map +1 -1
- package/dist/parsers/tree-sitter/typescript-loader.d.ts +58 -0
- package/dist/parsers/tree-sitter/typescript-loader.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/typescript-loader.js +250 -0
- package/dist/parsers/tree-sitter/typescript-loader.js.map +1 -0
- package/dist/store/project-config.d.ts +154 -0
- package/dist/store/project-config.d.ts.map +1 -0
- package/dist/store/project-config.js +235 -0
- package/dist/store/project-config.js.map +1 -0
- package/dist/store/project-registry.d.ts +241 -0
- package/dist/store/project-registry.d.ts.map +1 -0
- package/dist/store/project-registry.js +557 -0
- package/dist/store/project-registry.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1,624 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call Graph Builder
|
|
3
|
+
*
|
|
4
|
+
* Builds the complete call graph from extracted file information.
|
|
5
|
+
* Handles function registration, call resolution, and graph construction.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Call Graph Builder
|
|
9
|
+
*/
|
|
10
|
+
export class GraphBuilder {
|
|
11
|
+
functions = new Map();
|
|
12
|
+
classes = new Map();
|
|
13
|
+
imports = new Map();
|
|
14
|
+
pendingCalls = new Map();
|
|
15
|
+
dataAccessPoints = new Map();
|
|
16
|
+
options;
|
|
17
|
+
constructor(options) {
|
|
18
|
+
this.options = {
|
|
19
|
+
includeUnresolved: true,
|
|
20
|
+
minConfidence: 0.5,
|
|
21
|
+
...options,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Add extraction results from a file
|
|
26
|
+
*/
|
|
27
|
+
addFile(extraction) {
|
|
28
|
+
const { file, functions, calls, imports, classes } = extraction;
|
|
29
|
+
// Store imports for resolution
|
|
30
|
+
this.imports.set(file, imports);
|
|
31
|
+
// Register classes
|
|
32
|
+
for (const cls of classes) {
|
|
33
|
+
const classKey = `${file}:${cls.name}`;
|
|
34
|
+
this.classes.set(classKey, cls);
|
|
35
|
+
}
|
|
36
|
+
// Register functions
|
|
37
|
+
for (const func of functions) {
|
|
38
|
+
const funcNode = this.createFunctionNode(func, file, extraction.language);
|
|
39
|
+
this.functions.set(funcNode.id, funcNode);
|
|
40
|
+
}
|
|
41
|
+
// Store calls for later resolution
|
|
42
|
+
this.storePendingCalls(calls, file, functions);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Add data access points for a file
|
|
46
|
+
*/
|
|
47
|
+
addDataAccess(file, accessPoints) {
|
|
48
|
+
this.dataAccessPoints.set(file, accessPoints);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Build the complete call graph
|
|
52
|
+
*/
|
|
53
|
+
build() {
|
|
54
|
+
// Resolve all pending calls
|
|
55
|
+
this.resolveAllCalls();
|
|
56
|
+
// Associate data access with functions
|
|
57
|
+
this.associateDataAccess();
|
|
58
|
+
// Identify entry points
|
|
59
|
+
const entryPoints = this.identifyEntryPoints();
|
|
60
|
+
// Identify data accessors
|
|
61
|
+
const dataAccessors = this.identifyDataAccessors();
|
|
62
|
+
// Calculate stats
|
|
63
|
+
const stats = this.calculateStats();
|
|
64
|
+
return {
|
|
65
|
+
version: '1.0',
|
|
66
|
+
generatedAt: new Date().toISOString(),
|
|
67
|
+
projectRoot: this.options.projectRoot,
|
|
68
|
+
functions: this.functions,
|
|
69
|
+
entryPoints,
|
|
70
|
+
dataAccessors,
|
|
71
|
+
stats,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Create a FunctionNode from extraction
|
|
76
|
+
*/
|
|
77
|
+
createFunctionNode(func, file, language) {
|
|
78
|
+
const id = this.generateFunctionId(file, func.qualifiedName, func.startLine);
|
|
79
|
+
return {
|
|
80
|
+
id,
|
|
81
|
+
name: func.name,
|
|
82
|
+
qualifiedName: func.qualifiedName,
|
|
83
|
+
file,
|
|
84
|
+
startLine: func.startLine,
|
|
85
|
+
endLine: func.endLine,
|
|
86
|
+
language,
|
|
87
|
+
calls: [],
|
|
88
|
+
calledBy: [],
|
|
89
|
+
dataAccess: [],
|
|
90
|
+
className: func.className,
|
|
91
|
+
moduleName: func.moduleName,
|
|
92
|
+
isExported: func.isExported,
|
|
93
|
+
isConstructor: func.isConstructor,
|
|
94
|
+
isAsync: func.isAsync,
|
|
95
|
+
decorators: func.decorators,
|
|
96
|
+
parameters: func.parameters,
|
|
97
|
+
returnType: func.returnType,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Store calls for later resolution
|
|
102
|
+
*/
|
|
103
|
+
storePendingCalls(calls, file, functions) {
|
|
104
|
+
for (const call of calls) {
|
|
105
|
+
// Find the containing function
|
|
106
|
+
const containingFunc = this.findContainingFunction(call.line, functions);
|
|
107
|
+
if (!containingFunc)
|
|
108
|
+
continue;
|
|
109
|
+
const containingFunctionId = this.generateFunctionId(file, containingFunc.qualifiedName, containingFunc.startLine);
|
|
110
|
+
const pending = this.pendingCalls.get(file) ?? [];
|
|
111
|
+
pending.push({ call, file, containingFunction: containingFunctionId });
|
|
112
|
+
this.pendingCalls.set(file, pending);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Find the function containing a given line
|
|
117
|
+
* Includes parameter default values (which are before the body)
|
|
118
|
+
*/
|
|
119
|
+
findContainingFunction(line, functions) {
|
|
120
|
+
// Find the innermost function containing this line
|
|
121
|
+
let best = null;
|
|
122
|
+
let bestSize = Infinity;
|
|
123
|
+
for (const func of functions) {
|
|
124
|
+
// Check full function range (startLine to endLine) to include:
|
|
125
|
+
// - Parameter default values (e.g., Depends(get_current_user))
|
|
126
|
+
// - Function body
|
|
127
|
+
// - Decorators are before startLine, so they're handled separately
|
|
128
|
+
if (line >= func.startLine && line <= func.endLine) {
|
|
129
|
+
const size = func.endLine - func.startLine;
|
|
130
|
+
if (size < bestSize) {
|
|
131
|
+
best = func;
|
|
132
|
+
bestSize = size;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return best;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Resolve all pending calls
|
|
140
|
+
*/
|
|
141
|
+
resolveAllCalls() {
|
|
142
|
+
for (const [file, pending] of this.pendingCalls) {
|
|
143
|
+
const fileImports = this.imports.get(file) ?? [];
|
|
144
|
+
for (const { call, containingFunction } of pending) {
|
|
145
|
+
const resolved = this.resolveCall(call, file, fileImports, containingFunction);
|
|
146
|
+
const callSite = this.createCallSite(call, file, containingFunction, resolved);
|
|
147
|
+
// Add to caller's calls
|
|
148
|
+
const caller = this.functions.get(containingFunction);
|
|
149
|
+
if (caller) {
|
|
150
|
+
caller.calls.push(callSite);
|
|
151
|
+
}
|
|
152
|
+
// Add to callee's calledBy (if resolved)
|
|
153
|
+
if (resolved.resolved && resolved.candidates.length > 0) {
|
|
154
|
+
for (const candidateId of resolved.candidates) {
|
|
155
|
+
const callee = this.functions.get(candidateId);
|
|
156
|
+
if (callee) {
|
|
157
|
+
callee.calledBy.push(callSite);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Resolve a call to its target function(s)
|
|
166
|
+
*/
|
|
167
|
+
resolveCall(call, file, imports, callerId) {
|
|
168
|
+
const candidates = [];
|
|
169
|
+
let confidence = 0;
|
|
170
|
+
let reason = 'unresolved';
|
|
171
|
+
// Strategy 1: Local function in same file (with nested function awareness)
|
|
172
|
+
const localMatch = this.findLocalFunction(call, file, callerId);
|
|
173
|
+
if (localMatch) {
|
|
174
|
+
candidates.push(localMatch);
|
|
175
|
+
confidence = 0.95;
|
|
176
|
+
reason = 'local-function';
|
|
177
|
+
}
|
|
178
|
+
// Strategy 2: Method on known class
|
|
179
|
+
if (candidates.length === 0 && call.receiver) {
|
|
180
|
+
const methodMatches = this.findMethodByReceiver(call, file, imports);
|
|
181
|
+
if (methodMatches.length > 0) {
|
|
182
|
+
candidates.push(...methodMatches);
|
|
183
|
+
confidence = methodMatches.length === 1 ? 0.85 : 0.6;
|
|
184
|
+
reason = methodMatches.length === 1 ? 'method-single' : 'method-multiple';
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Strategy 3: Dependency Injection patterns
|
|
188
|
+
if (candidates.length === 0) {
|
|
189
|
+
const diMatch = this.resolveDependencyInjection(call, file, imports);
|
|
190
|
+
if (diMatch.length > 0) {
|
|
191
|
+
candidates.push(...diMatch);
|
|
192
|
+
confidence = diMatch.length === 1 ? 0.9 : 0.7;
|
|
193
|
+
reason = 'dependency-injection';
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Strategy 4: Imported function
|
|
197
|
+
if (candidates.length === 0) {
|
|
198
|
+
const importMatch = this.findImportedFunction(call, imports);
|
|
199
|
+
if (importMatch) {
|
|
200
|
+
candidates.push(importMatch);
|
|
201
|
+
confidence = 0.8;
|
|
202
|
+
reason = 'imported';
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Strategy 5: Fuzzy match by name
|
|
206
|
+
if (candidates.length === 0) {
|
|
207
|
+
const fuzzyMatches = this.findByName(call.calleeName);
|
|
208
|
+
if (fuzzyMatches.length > 0) {
|
|
209
|
+
candidates.push(...fuzzyMatches.slice(0, 3)); // Limit to top 3
|
|
210
|
+
confidence = fuzzyMatches.length === 1 ? 0.5 : 0.3;
|
|
211
|
+
reason = 'fuzzy-match';
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
resolved: candidates.length > 0,
|
|
216
|
+
candidates,
|
|
217
|
+
confidence,
|
|
218
|
+
reason,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Resolve Dependency Injection patterns
|
|
223
|
+
* Handles: FastAPI Depends(), Flask inject, Spring @Autowired, etc.
|
|
224
|
+
*/
|
|
225
|
+
resolveDependencyInjection(call, _file, _imports) {
|
|
226
|
+
const matches = [];
|
|
227
|
+
// Pattern 1: FastAPI Depends(function_name)
|
|
228
|
+
// The call looks like: Depends(get_current_user)
|
|
229
|
+
if (call.calleeName === 'Depends' && call.fullExpression) {
|
|
230
|
+
const dependsMatch = call.fullExpression.match(/Depends\s*\(\s*([a-zA-Z_][a-zA-Z0-9_]*)/);
|
|
231
|
+
if (dependsMatch) {
|
|
232
|
+
const depFuncName = dependsMatch[1];
|
|
233
|
+
// Find the function being depended on
|
|
234
|
+
for (const [id, func] of this.functions) {
|
|
235
|
+
if (func.name === depFuncName) {
|
|
236
|
+
matches.push(id);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Pattern 2: Function parameter with type hint that matches a class
|
|
242
|
+
// e.g., def route(user: User = Depends(get_user))
|
|
243
|
+
// The actual dependency is get_user, which we handle above
|
|
244
|
+
// Pattern 3: Direct function reference passed as argument
|
|
245
|
+
// e.g., app.add_middleware(AuthMiddleware)
|
|
246
|
+
if (call.isConstructorCall || /^[A-Z]/.test(call.calleeName)) {
|
|
247
|
+
// This might be a class being instantiated for DI
|
|
248
|
+
for (const [id, func] of this.functions) {
|
|
249
|
+
if (func.className === call.calleeName && func.isConstructor) {
|
|
250
|
+
matches.push(id);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Pattern 4: Service locator pattern
|
|
255
|
+
// e.g., container.get(UserService), injector.get('user_service')
|
|
256
|
+
if (call.calleeName === 'get' && call.receiver) {
|
|
257
|
+
const containerPatterns = ['container', 'injector', 'locator', 'provider', 'services'];
|
|
258
|
+
if (containerPatterns.some(p => call.receiver.toLowerCase().includes(p))) {
|
|
259
|
+
// Try to find the service being requested
|
|
260
|
+
// This is heuristic - we look for classes/functions matching the argument
|
|
261
|
+
for (const [id, func] of this.functions) {
|
|
262
|
+
if (func.className && call.fullExpression.includes(func.className)) {
|
|
263
|
+
matches.push(id);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// Pattern 5: Decorator-based injection
|
|
269
|
+
// Functions with @inject, @autowired decorators are called by the framework
|
|
270
|
+
// We handle this in entry point detection, but also track the injected function
|
|
271
|
+
return matches;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Find a local function in the same file
|
|
275
|
+
* Prioritizes nested functions within the caller's scope
|
|
276
|
+
*/
|
|
277
|
+
findLocalFunction(call, file, callerId) {
|
|
278
|
+
// For method calls on self/this, look for method in same class
|
|
279
|
+
if (call.receiver === 'self' || call.receiver === 'this') {
|
|
280
|
+
// Find the class context from the containing function
|
|
281
|
+
for (const [id, func] of this.functions) {
|
|
282
|
+
if (func.file === file && func.name === call.calleeName && func.className) {
|
|
283
|
+
return id;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// If we have a caller, first look for nested functions within that caller's scope
|
|
288
|
+
if (callerId) {
|
|
289
|
+
const caller = this.functions.get(callerId);
|
|
290
|
+
if (caller) {
|
|
291
|
+
// Look for a nested function with qualifiedName like "ParentFunc.childFunc"
|
|
292
|
+
const nestedQualifiedName = `${caller.qualifiedName}.${call.calleeName}`;
|
|
293
|
+
for (const [id, func] of this.functions) {
|
|
294
|
+
if (func.file === file && func.qualifiedName === nestedQualifiedName) {
|
|
295
|
+
return id;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
// Also check if the caller is itself nested and look for sibling functions
|
|
299
|
+
// e.g., if caller is "Parent.child1", look for "Parent.child2"
|
|
300
|
+
const callerParts = caller.qualifiedName.split('.');
|
|
301
|
+
if (callerParts.length > 1) {
|
|
302
|
+
const parentName = callerParts.slice(0, -1).join('.');
|
|
303
|
+
const siblingQualifiedName = `${parentName}.${call.calleeName}`;
|
|
304
|
+
for (const [id, func] of this.functions) {
|
|
305
|
+
if (func.file === file && func.qualifiedName === siblingQualifiedName) {
|
|
306
|
+
return id;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// Direct function call - find top-level function
|
|
313
|
+
for (const [id, func] of this.functions) {
|
|
314
|
+
if (func.file === file && func.name === call.calleeName && !func.className) {
|
|
315
|
+
// Prefer non-nested functions (no dots in qualifiedName except for class methods)
|
|
316
|
+
if (!func.qualifiedName.includes('.') || func.className) {
|
|
317
|
+
return id;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// Fallback: any function with matching name in the file
|
|
322
|
+
for (const [id, func] of this.functions) {
|
|
323
|
+
if (func.file === file && func.name === call.calleeName && !func.className) {
|
|
324
|
+
return id;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return null;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Find method by receiver type
|
|
331
|
+
*/
|
|
332
|
+
findMethodByReceiver(call, file, imports) {
|
|
333
|
+
const matches = [];
|
|
334
|
+
// Try to resolve receiver to a class
|
|
335
|
+
const receiverClass = this.resolveReceiverType(call.receiver, file, imports);
|
|
336
|
+
if (receiverClass) {
|
|
337
|
+
// Find method in that class
|
|
338
|
+
for (const [id, func] of this.functions) {
|
|
339
|
+
if (func.className === receiverClass && func.name === call.calleeName) {
|
|
340
|
+
matches.push(id);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// If no specific class found, find all methods with this name
|
|
345
|
+
if (matches.length === 0) {
|
|
346
|
+
for (const [id, func] of this.functions) {
|
|
347
|
+
if (func.name === call.calleeName && func.className) {
|
|
348
|
+
matches.push(id);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return matches;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Try to resolve a receiver to a class name
|
|
356
|
+
*/
|
|
357
|
+
resolveReceiverType(receiver, _file, _imports) {
|
|
358
|
+
// Simple heuristics:
|
|
359
|
+
// - If receiver is PascalCase, it might be a class name
|
|
360
|
+
if (/^[A-Z][a-zA-Z0-9]*$/.test(receiver)) {
|
|
361
|
+
return receiver;
|
|
362
|
+
}
|
|
363
|
+
// - Common patterns like user_service -> UserService
|
|
364
|
+
const camelCase = receiver
|
|
365
|
+
.split('_')
|
|
366
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
367
|
+
.join('');
|
|
368
|
+
if (this.classExists(camelCase)) {
|
|
369
|
+
return camelCase;
|
|
370
|
+
}
|
|
371
|
+
return null;
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Check if a class exists
|
|
375
|
+
*/
|
|
376
|
+
classExists(name) {
|
|
377
|
+
for (const [, cls] of this.classes) {
|
|
378
|
+
if (cls.name === name)
|
|
379
|
+
return true;
|
|
380
|
+
}
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Find an imported function
|
|
385
|
+
*/
|
|
386
|
+
findImportedFunction(call, imports) {
|
|
387
|
+
// Check if the callee name matches an import
|
|
388
|
+
for (const imp of imports) {
|
|
389
|
+
for (const name of imp.names) {
|
|
390
|
+
if (name.local === call.calleeName || name.imported === call.calleeName) {
|
|
391
|
+
// Try to find the function in the imported module
|
|
392
|
+
// This is simplified - real implementation would resolve paths
|
|
393
|
+
for (const [id, func] of this.functions) {
|
|
394
|
+
if (func.name === name.imported && func.isExported) {
|
|
395
|
+
return id;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return null;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Find functions by name (fuzzy match)
|
|
405
|
+
*/
|
|
406
|
+
findByName(name) {
|
|
407
|
+
const matches = [];
|
|
408
|
+
for (const [id, func] of this.functions) {
|
|
409
|
+
if (func.name === name) {
|
|
410
|
+
matches.push(id);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
return matches;
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Create a CallSite from extraction and resolution
|
|
417
|
+
*/
|
|
418
|
+
createCallSite(call, file, callerId, resolved) {
|
|
419
|
+
return {
|
|
420
|
+
callerId,
|
|
421
|
+
calleeId: resolved.candidates[0] ?? null,
|
|
422
|
+
calleeName: call.calleeName,
|
|
423
|
+
receiver: call.receiver,
|
|
424
|
+
file,
|
|
425
|
+
line: call.line,
|
|
426
|
+
column: call.column,
|
|
427
|
+
resolved: resolved.resolved,
|
|
428
|
+
resolvedCandidates: resolved.candidates,
|
|
429
|
+
confidence: resolved.confidence,
|
|
430
|
+
resolutionReason: resolved.reason,
|
|
431
|
+
argumentCount: call.argumentCount,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Associate data access points with functions
|
|
436
|
+
*/
|
|
437
|
+
associateDataAccess() {
|
|
438
|
+
for (const [file, accessPoints] of this.dataAccessPoints) {
|
|
439
|
+
for (const access of accessPoints) {
|
|
440
|
+
// Find the function containing this access
|
|
441
|
+
const containingFunc = this.findFunctionAtLine(file, access.line);
|
|
442
|
+
if (containingFunc) {
|
|
443
|
+
containingFunc.dataAccess.push(access);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Find function at a specific line
|
|
450
|
+
*/
|
|
451
|
+
findFunctionAtLine(file, line) {
|
|
452
|
+
let best = null;
|
|
453
|
+
let bestSize = Infinity;
|
|
454
|
+
for (const [, func] of this.functions) {
|
|
455
|
+
if (func.file === file && line >= func.startLine && line <= func.endLine) {
|
|
456
|
+
const size = func.endLine - func.startLine;
|
|
457
|
+
if (size < bestSize) {
|
|
458
|
+
best = func;
|
|
459
|
+
bestSize = size;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
return best;
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Identify entry points (exported functions, API handlers, main)
|
|
467
|
+
*
|
|
468
|
+
* Entry points are functions that can be called from outside the codebase:
|
|
469
|
+
* - Exported module functions
|
|
470
|
+
* - API route handlers (detected by decorators/attributes)
|
|
471
|
+
* - Main/entry functions
|
|
472
|
+
* - Controller methods in web frameworks
|
|
473
|
+
*/
|
|
474
|
+
identifyEntryPoints() {
|
|
475
|
+
const entryPoints = [];
|
|
476
|
+
for (const [id, func] of this.functions) {
|
|
477
|
+
// Exported functions (not class methods)
|
|
478
|
+
if (func.isExported && !func.className) {
|
|
479
|
+
entryPoints.push(id);
|
|
480
|
+
continue;
|
|
481
|
+
}
|
|
482
|
+
// Check decorators/attributes for API route patterns
|
|
483
|
+
if (this.isApiRouteHandler(func)) {
|
|
484
|
+
entryPoints.push(id);
|
|
485
|
+
continue;
|
|
486
|
+
}
|
|
487
|
+
// Check if this is a controller method (PHP Laravel, etc.)
|
|
488
|
+
if (this.isControllerMethod(func)) {
|
|
489
|
+
entryPoints.push(id);
|
|
490
|
+
continue;
|
|
491
|
+
}
|
|
492
|
+
// Main functions
|
|
493
|
+
if (func.name === 'main' || func.name === '__main__') {
|
|
494
|
+
entryPoints.push(id);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
return entryPoints;
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Check if a function is an API route handler based on decorators/attributes
|
|
501
|
+
*/
|
|
502
|
+
isApiRouteHandler(func) {
|
|
503
|
+
if (func.decorators.length === 0)
|
|
504
|
+
return false;
|
|
505
|
+
// Python/FastAPI/Flask patterns
|
|
506
|
+
const pythonRoutePatterns = [
|
|
507
|
+
'@app.route', '@router.', '@app.get', '@app.post', '@app.put', '@app.delete', '@app.patch',
|
|
508
|
+
'@blueprint.route', '@api.route',
|
|
509
|
+
];
|
|
510
|
+
// Java Spring patterns
|
|
511
|
+
const javaRoutePatterns = [
|
|
512
|
+
'@GetMapping', '@PostMapping', '@PutMapping', '@DeleteMapping', '@PatchMapping',
|
|
513
|
+
'@RequestMapping', '@RestController',
|
|
514
|
+
];
|
|
515
|
+
// C# ASP.NET patterns (attributes use square brackets)
|
|
516
|
+
const csharpRoutePatterns = [
|
|
517
|
+
'[HttpGet', '[HttpPost', '[HttpPut', '[HttpDelete', '[HttpPatch',
|
|
518
|
+
'[Route', '[ApiController',
|
|
519
|
+
];
|
|
520
|
+
// TypeScript/NestJS patterns
|
|
521
|
+
const nestjsPatterns = [
|
|
522
|
+
'@Get', '@Post', '@Put', '@Delete', '@Patch', '@Controller',
|
|
523
|
+
];
|
|
524
|
+
const allPatterns = [
|
|
525
|
+
...pythonRoutePatterns,
|
|
526
|
+
...javaRoutePatterns,
|
|
527
|
+
...csharpRoutePatterns,
|
|
528
|
+
...nestjsPatterns,
|
|
529
|
+
];
|
|
530
|
+
return func.decorators.some((d) => allPatterns.some((pattern) => d.includes(pattern)));
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Check if a function is a controller method (for frameworks without decorators)
|
|
534
|
+
*
|
|
535
|
+
* This handles:
|
|
536
|
+
* - PHP Laravel controllers (public methods in classes extending Controller)
|
|
537
|
+
* - Ruby Rails controllers
|
|
538
|
+
* - Other MVC frameworks
|
|
539
|
+
*/
|
|
540
|
+
isControllerMethod(func) {
|
|
541
|
+
// Must be a public method in a class
|
|
542
|
+
if (!func.className || !func.isExported)
|
|
543
|
+
return false;
|
|
544
|
+
// Check if the class name suggests it's a controller
|
|
545
|
+
const controllerPatterns = [
|
|
546
|
+
/Controller$/i,
|
|
547
|
+
/Handler$/i,
|
|
548
|
+
/Resource$/i, // Laravel API Resources
|
|
549
|
+
/Endpoint$/i,
|
|
550
|
+
];
|
|
551
|
+
const isControllerClass = controllerPatterns.some(pattern => pattern.test(func.className));
|
|
552
|
+
if (!isControllerClass)
|
|
553
|
+
return false;
|
|
554
|
+
// Exclude common non-route methods
|
|
555
|
+
const excludedMethods = [
|
|
556
|
+
'constructor', '__construct', '__destruct',
|
|
557
|
+
'middleware', 'authorize', 'rules', 'messages',
|
|
558
|
+
'boot', 'register', 'handle',
|
|
559
|
+
];
|
|
560
|
+
if (excludedMethods.includes(func.name.toLowerCase()))
|
|
561
|
+
return false;
|
|
562
|
+
// For PHP, check if it's a standard CRUD method or custom action
|
|
563
|
+
// Laravel convention: index, show, store, update, destroy, create, edit
|
|
564
|
+
const laravelCrudMethods = ['index', 'show', 'store', 'update', 'destroy', 'create', 'edit'];
|
|
565
|
+
// If it's a Laravel CRUD method, it's definitely an entry point
|
|
566
|
+
if (func.language === 'php' && laravelCrudMethods.includes(func.name.toLowerCase())) {
|
|
567
|
+
return true;
|
|
568
|
+
}
|
|
569
|
+
// For other public methods in controllers, they're likely entry points
|
|
570
|
+
// This is a heuristic - in real apps, routes are defined in route files
|
|
571
|
+
return true;
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* Identify functions with direct data access
|
|
575
|
+
*/
|
|
576
|
+
identifyDataAccessors() {
|
|
577
|
+
const accessors = [];
|
|
578
|
+
for (const [id, func] of this.functions) {
|
|
579
|
+
if (func.dataAccess.length > 0) {
|
|
580
|
+
accessors.push(id);
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
return accessors;
|
|
584
|
+
}
|
|
585
|
+
/**
|
|
586
|
+
* Calculate graph statistics
|
|
587
|
+
*/
|
|
588
|
+
calculateStats() {
|
|
589
|
+
let totalCallSites = 0;
|
|
590
|
+
let resolvedCallSites = 0;
|
|
591
|
+
const byLanguage = {
|
|
592
|
+
python: 0,
|
|
593
|
+
typescript: 0,
|
|
594
|
+
javascript: 0,
|
|
595
|
+
java: 0,
|
|
596
|
+
csharp: 0,
|
|
597
|
+
php: 0,
|
|
598
|
+
};
|
|
599
|
+
for (const [, func] of this.functions) {
|
|
600
|
+
byLanguage[func.language]++;
|
|
601
|
+
for (const call of func.calls) {
|
|
602
|
+
totalCallSites++;
|
|
603
|
+
if (call.resolved) {
|
|
604
|
+
resolvedCallSites++;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
return {
|
|
609
|
+
totalFunctions: this.functions.size,
|
|
610
|
+
totalCallSites,
|
|
611
|
+
resolvedCallSites,
|
|
612
|
+
unresolvedCallSites: totalCallSites - resolvedCallSites,
|
|
613
|
+
totalDataAccessors: this.identifyDataAccessors().length,
|
|
614
|
+
byLanguage,
|
|
615
|
+
};
|
|
616
|
+
}
|
|
617
|
+
/**
|
|
618
|
+
* Generate a unique function ID
|
|
619
|
+
*/
|
|
620
|
+
generateFunctionId(file, qualifiedName, line) {
|
|
621
|
+
return `${file}:${qualifiedName}:${line}`;
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
//# sourceMappingURL=graph-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-builder.js","sourceRoot":"","sources":["../../../src/call-graph/analysis/graph-builder.ts"],"names":[],"mappings":"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"}
|