@nithin554/code-crawler 0.1.35 → 0.1.37
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 +97 -13
- package/dist/crawler.d.ts +8 -0
- package/dist/crawler.js +133 -14
- package/dist/crawler.js.map +1 -1
- package/dist/graph/queries.d.ts +136 -6
- package/dist/graph/queries.js +386 -40
- package/dist/graph/queries.js.map +1 -1
- package/dist/graph/schema.d.ts +26 -3
- package/dist/graph/schema.js +24 -0
- package/dist/graph/schema.js.map +1 -1
- package/dist/graph/store.d.ts +6 -0
- package/dist/graph/store.js +15 -0
- package/dist/graph/store.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +19 -5
- package/dist/index.js.map +1 -1
- package/dist/parser/language.d.ts +32 -1
- package/dist/parser/languages/java.js +95 -7
- package/dist/parser/languages/java.js.map +1 -1
- package/dist/resolver/dynamic.d.ts +73 -0
- package/dist/resolver/dynamic.js +473 -0
- package/dist/resolver/dynamic.js.map +1 -0
- package/dist/resolver/types.d.ts +14 -0
- package/dist/resolver/types.js +57 -0
- package/dist/resolver/types.js.map +1 -1
- package/dist/server.js +227 -11
- package/dist/server.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
# Code-Crawler
|
|
2
2
|
|
|
3
|
-
**Static call tracing MCP server backed by a persistent property graph of your codebase.**
|
|
3
|
+
**Static + dynamic call tracing MCP server backed by a persistent property graph of your codebase.**
|
|
4
4
|
|
|
5
5
|
Code-Crawler indexes a project into a SQLite-backed property graph — files, packages,
|
|
6
|
-
classes, methods, fields, imports,
|
|
7
|
-
clients as MCP tools: find callers,
|
|
8
|
-
|
|
6
|
+
classes, methods, fields, imports, annotations, **call edges**, **virtual dispatch**, and
|
|
7
|
+
**aspect advice** — then exposes that graph to LLM clients as MCP tools: find callers,
|
|
8
|
+
trace call paths, explore neighborhoods, follow runtime dispatch, and search symbols
|
|
9
|
+
across the whole codebase.
|
|
10
|
+
|
|
11
|
+
📖 **Documentation site:** <https://nithin554.github.io/code-crawler/>
|
|
9
12
|
|
|
10
13
|
```
|
|
11
14
|
┌─────────────────────── MCP (stdio) ───────────────────────┐
|
|
12
15
|
│ crawl_project search_symbols get_callers get_callees │
|
|
13
|
-
│ trace_path
|
|
16
|
+
│ trace_path trace_execution find_aspects get_decorators│
|
|
17
|
+
│ find_implementations find_hotspots find_dead_code ... │
|
|
14
18
|
└───────────────┬──────────────────────────────┬───────────────┘
|
|
15
19
|
│ │
|
|
16
20
|
┌──────▼───────┐ ┌────────▼────────┐
|
|
@@ -39,13 +43,22 @@ and answers them instantly with bounded recursive SQL queries.
|
|
|
39
43
|
|
|
40
44
|
- **Java-first** via the `tree-sitter-java` grammar (WASM — no native build step).
|
|
41
45
|
The parser/resolver layer is designed so more languages plug in per-language config modules.
|
|
46
|
+
- **Dynamic tracing on a static graph** — `DYNAMIC_DISPATCH` edges connect interface/base
|
|
47
|
+
calls to every override in the project, and `ADVISES` edges weave AspectJ/Spring AOP
|
|
48
|
+
advice into execution traces (`before`, `after`, `around`, `after-returning`,
|
|
49
|
+
`after-throwing`, named `@Pointcut` references, `&&`/`||`/`!` and `execution`, `within`,
|
|
50
|
+
`@annotation`, `@within`, `target`, `this`, `args` primitives).
|
|
51
|
+
- **Annotations as first-class nodes** — `@Transactional`, `@Cacheable`, `@Async`, `@Retryable`
|
|
52
|
+
and friends become `annotation` nodes with `ANNOTATED_WITH` edges, so you can query
|
|
53
|
+
decorators on types, methods, and fields.
|
|
42
54
|
- **Call resolution heuristics** that go beyond naive string matching:
|
|
43
55
|
receiver types inferred from locals, parameters, fields, `new T()` expressions,
|
|
44
56
|
bare/`this`/`super` calls, static/qualified calls, and superclass chains.
|
|
45
57
|
Unresolvable calls become `unknown_symbol` phantom nodes with `resolved:false` edges,
|
|
46
58
|
so the graph stays traversable.
|
|
47
|
-
- **Idempotent, file-scoped indexing** — re-crawling refreshes changed files
|
|
48
|
-
stale ones without duplicating the graph.
|
|
59
|
+
- **Idempotent, file-scoped indexing** — re-crawling refreshes changed files, rebuilds
|
|
60
|
+
derived dynamic edges, and removes stale ones without duplicating the graph.
|
|
61
|
+
- **Analytics** — hotspots (fan-in/fan-out/advice counts) and dead-code candidates.
|
|
49
62
|
- **Self-contained**: single SQLite file, no external services.
|
|
50
63
|
- **LLM-friendly**: every tool returns structured JSON, unknown symbols come back with
|
|
51
64
|
fuzzy search suggestions.
|
|
@@ -57,7 +70,7 @@ Requires Node.js ≥ 20.
|
|
|
57
70
|
```bash
|
|
58
71
|
npm install
|
|
59
72
|
npm run build # tsc → dist/
|
|
60
|
-
npm test # vitest (
|
|
73
|
+
npm test # vitest (80 tests)
|
|
61
74
|
```
|
|
62
75
|
|
|
63
76
|
## CLI
|
|
@@ -77,6 +90,7 @@ Environment variables:
|
|
|
77
90
|
| `CODECRAWLER_EXCLUDE_DIRS` | `.git,node_modules,dist,build,target,...` | Dirs skipped during crawl |
|
|
78
91
|
| `CODECRAWLER_DEFAULT_LIMIT` | `50` | Default result cap |
|
|
79
92
|
| `CODECRAWLER_MAX_DEPTH` | `10` | Traversal depth cap |
|
|
93
|
+
| `CODECRAWLER_HELPFUL_ERRORS` | `true` | Fuzzy suggestions on symbol misses |
|
|
80
94
|
|
|
81
95
|
## CI & publishing
|
|
82
96
|
|
|
@@ -117,6 +131,8 @@ Point the client at the same command. The typical flow for an LLM agent:
|
|
|
117
131
|
1. `crawl_project` the repo once.
|
|
118
132
|
2. `search_symbols` to locate the symbol of interest.
|
|
119
133
|
3. `get_callers` / `get_callees` / `trace_path` to reason about the call graph.
|
|
134
|
+
4. `trace_execution` to follow runtime dispatch and aspect advice; `find_aspects`,
|
|
135
|
+
`get_decorators`, and `find_annotated` to inspect behaviour-changing annotations.
|
|
120
136
|
|
|
121
137
|
## MCP surface
|
|
122
138
|
|
|
@@ -131,6 +147,13 @@ Point the client at the same command. The typical flow for an LLM agent:
|
|
|
131
147
|
| `get_callers` | Direct or transitive callers (depth-bounded) |
|
|
132
148
|
| `get_callees` | Direct or transitive callees (depth-bounded) |
|
|
133
149
|
| `trace_path` | Static call paths between two symbols (BFS, shortest first) |
|
|
150
|
+
| `trace_execution` | Dynamic trace: static calls + virtual dispatch + woven advice |
|
|
151
|
+
| `find_implementations` | Implementers/subclasses of an interface or superclass |
|
|
152
|
+
| `find_aspects` | Aspects, advice kinds, pointcuts, and intercepted methods |
|
|
153
|
+
| `get_decorators` | Annotations/decorators on a symbol and optionally its members |
|
|
154
|
+
| `find_annotated` | Every symbol annotated with a given annotation |
|
|
155
|
+
| `find_hotspots` | Rank methods by fan-in, fan-out, and advice interceptions |
|
|
156
|
+
| `find_dead_code` | Methods with no incoming call/dispatch/advice edges |
|
|
134
157
|
| `get_subgraph` | Neighborhood extraction for visualization |
|
|
135
158
|
| `get_schema` | Describe the graph model |
|
|
136
159
|
| `clear_index` | Reset the database |
|
|
@@ -141,11 +164,14 @@ Point the client at the same command. The typical flow for an LLM agent:
|
|
|
141
164
|
## Graph model
|
|
142
165
|
|
|
143
166
|
**Nodes** — `kind` is one of `file | package | class | interface | enum | method |
|
|
144
|
-
constructor | field | import |
|
|
145
|
-
`qualifiedName` and a JSON `properties` blob
|
|
167
|
+
constructor | field | import | aspect | annotation_type | annotation | unknown_symbol`.
|
|
168
|
+
Every node has a globally unique `qualifiedName` and a JSON `properties` blob
|
|
169
|
+
(signature, modifiers, lines, annotations, ...).
|
|
146
170
|
|
|
147
171
|
**Edges** — `kind` is one of `CALLS | DECLARED_IN | CONTAINS | IMPLEMENTS | EXTENDS |
|
|
148
|
-
IMPORTS | REFERENCES`. `CALLS` edges carry
|
|
172
|
+
IMPORTS | REFERENCES | DYNAMIC_DISPATCH | ADVISES | ANNOTATED_WITH`. `CALLS` edges carry
|
|
173
|
+
`line`, `resolved`, and `confidence`; `ANNOTATED_WITH` edges carry `line` and `arguments`;
|
|
174
|
+
`ADVISES` edges carry `adviceKind` and the resolved `pointcut`.
|
|
149
175
|
|
|
150
176
|
Id scheme:
|
|
151
177
|
|
|
@@ -155,9 +181,61 @@ Id scheme:
|
|
|
155
181
|
| method | `com.acme.OrderService#place` |
|
|
156
182
|
| constructor | `com.acme.OrderService#<init>` |
|
|
157
183
|
| field | `com.acme.OrderService$repo` |
|
|
184
|
+
| annotation | `@Transactional` |
|
|
158
185
|
| import | `__import__:java.util.List` |
|
|
159
186
|
| unresolved call | `__unknown__:System.out.println` |
|
|
160
187
|
|
|
188
|
+
## Dynamic behaviour
|
|
189
|
+
|
|
190
|
+
Static call edges answer *"what does the source literally call?"*. Runtime behaviour
|
|
191
|
+
differs in two ways, both modelled as derived edges rebuilt on every crawl:
|
|
192
|
+
|
|
193
|
+
### Virtual dispatch
|
|
194
|
+
|
|
195
|
+
A call to an interface or base-class method may execute any override. After all files
|
|
196
|
+
are indexed, every resolved `CALLS` edge whose target is an overridable method gets
|
|
197
|
+
`DYNAMIC_DISPATCH` edges to each override found in the project:
|
|
198
|
+
|
|
199
|
+
```text
|
|
200
|
+
Checkout#checkout --CALLS--> Payment#pay
|
|
201
|
+
Payment#pay --DYNAMIC_DISPATCH--> CardPayment#pay
|
|
202
|
+
Payment#pay --DYNAMIC_DISPATCH--> UpiPayment#pay
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Constructors and `private`/`static`/`final` methods are excluded because they cannot be
|
|
206
|
+
overridden. Use `find_implementations` to list candidates and `trace_execution` to follow
|
|
207
|
+
them.
|
|
208
|
+
|
|
209
|
+
### Aspects, advice, and decorators
|
|
210
|
+
|
|
211
|
+
`@Aspect` types are indexed as `aspect` nodes. Advice methods are recognised by
|
|
212
|
+
`@Before`, `@After`, `@Around`, `@AfterReturning`, `@AfterThrowing`, and `@Pointcut`.
|
|
213
|
+
Named pointcuts (`@Around("paymentCall()")`) are resolved to their `@Pointcut`
|
|
214
|
+
expression, then matched against every project method to create `ADVISES` edges:
|
|
215
|
+
|
|
216
|
+
```text
|
|
217
|
+
AuditAspect#auditPayment --ADVISES--> Payment#pay
|
|
218
|
+
AuditAspect#auditPayment --ADVISES--> CardPayment#pay
|
|
219
|
+
AuditAspect#auditPayment --ADVISES--> UpiPayment#pay
|
|
220
|
+
AuditAspect#beforeCheckout --ADVISES--> Checkout#checkout
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
`trace_execution` weaves these in as `INTERCEPT` hops, so the trace reads:
|
|
224
|
+
|
|
225
|
+
```text
|
|
226
|
+
Checkout#checkout
|
|
227
|
+
INTERCEPT AuditAspect#beforeCheckout
|
|
228
|
+
CALLS Payment#pay
|
|
229
|
+
INTERCEPT AuditAspect#auditPayment
|
|
230
|
+
DYNAMIC_DISPATCH CardPayment#pay -> authorize
|
|
231
|
+
DYNAMIC_DISPATCH UpiPayment#pay -> settle
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Every other annotation is indexed as an `annotation` node with an `ANNOTATED_WITH` edge.
|
|
235
|
+
Framework decorators (`@Transactional`, `@Cacheable`, `@Async`, `@Retryable`,
|
|
236
|
+
`@PreAuthorize`, `@Scheduled`, ...) are additionally flagged `decorator: true` so
|
|
237
|
+
`get_decorators` and `find_annotated` can surface runtime-semantic annotations.
|
|
238
|
+
|
|
161
239
|
## Java resolution heuristics
|
|
162
240
|
|
|
163
241
|
1. **Constructor calls** (`new Foo(...)`) → resolve `Foo` → `#<init>` (default ctor if implicit).
|
|
@@ -188,8 +266,6 @@ queries, and MCP surface all stay the same.
|
|
|
188
266
|
Planned enhancements:
|
|
189
267
|
|
|
190
268
|
- Package-level dependency graphs (module boundaries, cycle detection).
|
|
191
|
-
- Global call-graph analytics: hotspots (most-called methods), dead-code candidates
|
|
192
|
-
(methods with no incoming CALLS edges), fan-in/fan-out metrics.
|
|
193
269
|
- Test coverage mapping (which tests exercise a given symbol).
|
|
194
270
|
- Incremental crawling (watch mode) and git-blame aware invalidation.
|
|
195
271
|
|
|
@@ -213,9 +289,17 @@ src/
|
|
|
213
289
|
│ └── java.ts Java structural extraction
|
|
214
290
|
└── resolver/
|
|
215
291
|
├── types.ts TypeIndex (global name/method index) + ResolvedCall
|
|
292
|
+
├── dynamic.ts virtual dispatch + AspectJ pointcut matching/advice edges
|
|
216
293
|
└── javaResolver.ts Java call-target resolution heuristics
|
|
217
294
|
```
|
|
218
295
|
|
|
296
|
+
## Documentation site
|
|
297
|
+
|
|
298
|
+
The static documentation site in `docs/` is deployed to GitHub Pages by
|
|
299
|
+
`.github/workflows/pages.yml`. It covers quickstart, the MCP tool reference, and worked
|
|
300
|
+
examples. Open `docs/index.html` locally or visit
|
|
301
|
+
<https://nithin554.github.io/code-crawler/>.
|
|
302
|
+
|
|
219
303
|
## License
|
|
220
304
|
|
|
221
305
|
MIT
|
package/dist/crawler.d.ts
CHANGED
|
@@ -21,6 +21,14 @@ export interface CrawlResult {
|
|
|
21
21
|
edges: number;
|
|
22
22
|
resolvedCalls: number;
|
|
23
23
|
unresolvedCalls: number;
|
|
24
|
+
/** Virtual-dispatch edges discovered across the project. */
|
|
25
|
+
dynamicDispatchEdges: number;
|
|
26
|
+
/** Aspect advice -> advised-method edges. */
|
|
27
|
+
adviceEdges: number;
|
|
28
|
+
/** Number of aspect types that produced advice. */
|
|
29
|
+
aspects: number;
|
|
30
|
+
/** Number of annotation/decorator usages indexed. */
|
|
31
|
+
decorators: number;
|
|
24
32
|
languages: string[];
|
|
25
33
|
durationMs: number;
|
|
26
34
|
}
|
package/dist/crawler.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import { fieldNodeId, importNodeId } from "./graph/schema.js";
|
|
3
|
+
import { annotationNodeId, fieldNodeId, importNodeId } from "./graph/schema.js";
|
|
4
4
|
import { languageForFile } from "./parser/languages/index.js";
|
|
5
5
|
import { buildTypeIndex, phantomNodeId } from "./resolver/types.js";
|
|
6
6
|
import { resolveJavaFile } from "./resolver/javaResolver.js";
|
|
7
|
+
import { buildDynamicEdges, isDecoratorAnnotation } from "./resolver/dynamic.js";
|
|
7
8
|
/** Discover source files under a project, respecting exclusion dirs. */
|
|
8
9
|
export function discoverSourceFiles(projectPath, excludeDirs, language) {
|
|
9
10
|
const excluded = new Set(excludeDirs.map((d) => d.replace(/\/+$/, "")));
|
|
@@ -44,11 +45,14 @@ export function buildDeclarationGraph(parsed) {
|
|
|
44
45
|
properties: { language: parsed.language, startLine: 0, endLine: fileLines },
|
|
45
46
|
});
|
|
46
47
|
if (parsed.packageName) {
|
|
48
|
+
// Package nodes are shared by every file in the package. They are not
|
|
49
|
+
// owned by one file (filePath: null) so deleting one file cannot cascade
|
|
50
|
+
// through the package node into unrelated files.
|
|
47
51
|
nodes.push({
|
|
48
52
|
id: parsed.packageName,
|
|
49
53
|
kind: "package",
|
|
50
54
|
qualifiedName: parsed.packageName,
|
|
51
|
-
filePath:
|
|
55
|
+
filePath: null,
|
|
52
56
|
properties: {},
|
|
53
57
|
});
|
|
54
58
|
edges.push({
|
|
@@ -69,13 +73,51 @@ export function buildDeclarationGraph(parsed) {
|
|
|
69
73
|
});
|
|
70
74
|
edges.push({ source: fileId, target: importId, kind: "IMPORTS", properties: {} });
|
|
71
75
|
}
|
|
76
|
+
const addDecorators = (ownerId, annotations) => {
|
|
77
|
+
for (const annotation of annotations) {
|
|
78
|
+
const name = annotation.fqn ?? annotation.name;
|
|
79
|
+
const id = annotationNodeId(name);
|
|
80
|
+
// Annotation nodes are shared across files and therefore file-less.
|
|
81
|
+
nodes.push({
|
|
82
|
+
id,
|
|
83
|
+
kind: "annotation",
|
|
84
|
+
qualifiedName: name,
|
|
85
|
+
filePath: null,
|
|
86
|
+
properties: {
|
|
87
|
+
name: annotation.name,
|
|
88
|
+
...(annotation.fqn ? { fqn: annotation.fqn } : {}),
|
|
89
|
+
decorator: isDecoratorAnnotation(annotation.name),
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
edges.push({
|
|
93
|
+
source: ownerId,
|
|
94
|
+
target: id,
|
|
95
|
+
kind: "ANNOTATED_WITH",
|
|
96
|
+
properties: {
|
|
97
|
+
line: annotation.line,
|
|
98
|
+
arguments: annotation.arguments,
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
};
|
|
72
103
|
for (const t of parsed.types) {
|
|
104
|
+
const kind = t.isAspect
|
|
105
|
+
? "aspect"
|
|
106
|
+
: t.kind === "annotation"
|
|
107
|
+
? "annotation_type"
|
|
108
|
+
: t.kind;
|
|
73
109
|
nodes.push({
|
|
74
110
|
id: t.id,
|
|
75
|
-
kind
|
|
111
|
+
kind,
|
|
76
112
|
qualifiedName: t.id,
|
|
77
113
|
filePath: fileId,
|
|
78
|
-
properties: {
|
|
114
|
+
properties: {
|
|
115
|
+
name: t.name,
|
|
116
|
+
startLine: t.startLine,
|
|
117
|
+
endLine: t.endLine,
|
|
118
|
+
annotations: t.annotations.map((a) => a.name),
|
|
119
|
+
...(t.isAspect ? { aspect: true } : {}),
|
|
120
|
+
},
|
|
79
121
|
});
|
|
80
122
|
edges.push({ source: fileId, target: t.id, kind: "CONTAINS", properties: {} });
|
|
81
123
|
if (parsed.packageName) {
|
|
@@ -87,6 +129,7 @@ export function buildDeclarationGraph(parsed) {
|
|
|
87
129
|
for (const parent of t.implementsTypes) {
|
|
88
130
|
edges.push({ source: t.id, target: parent, kind: "IMPLEMENTS", properties: {} });
|
|
89
131
|
}
|
|
132
|
+
addDecorators(t.id, t.annotations);
|
|
90
133
|
}
|
|
91
134
|
for (const m of parsed.methods) {
|
|
92
135
|
nodes.push({
|
|
@@ -101,6 +144,9 @@ export function buildDeclarationGraph(parsed) {
|
|
|
101
144
|
modifiers: m.modifiers,
|
|
102
145
|
startLine: m.startLine,
|
|
103
146
|
endLine: m.endLine,
|
|
147
|
+
annotations: m.annotations.map((a) => a.name),
|
|
148
|
+
...(m.adviceKind ? { adviceKind: m.adviceKind } : {}),
|
|
149
|
+
...(m.pointcut ? { pointcut: m.pointcut } : {}),
|
|
104
150
|
},
|
|
105
151
|
});
|
|
106
152
|
edges.push({
|
|
@@ -109,6 +155,7 @@ export function buildDeclarationGraph(parsed) {
|
|
|
109
155
|
kind: "CONTAINS",
|
|
110
156
|
properties: { line: m.startLine },
|
|
111
157
|
});
|
|
158
|
+
addDecorators(m.id, m.annotations);
|
|
112
159
|
}
|
|
113
160
|
for (const f of parsed.fields) {
|
|
114
161
|
nodes.push({
|
|
@@ -116,7 +163,12 @@ export function buildDeclarationGraph(parsed) {
|
|
|
116
163
|
kind: "field",
|
|
117
164
|
qualifiedName: f.id,
|
|
118
165
|
filePath: fileId,
|
|
119
|
-
properties: {
|
|
166
|
+
properties: {
|
|
167
|
+
name: f.name,
|
|
168
|
+
type: f.type,
|
|
169
|
+
startLine: f.startLine,
|
|
170
|
+
annotations: f.annotations.map((a) => a.name),
|
|
171
|
+
},
|
|
120
172
|
});
|
|
121
173
|
edges.push({
|
|
122
174
|
source: f.typeId,
|
|
@@ -124,8 +176,28 @@ export function buildDeclarationGraph(parsed) {
|
|
|
124
176
|
kind: "CONTAINS",
|
|
125
177
|
properties: { line: f.startLine },
|
|
126
178
|
});
|
|
179
|
+
addDecorators(fieldNodeId(f.typeId, f.name), f.annotations);
|
|
127
180
|
}
|
|
128
|
-
return { nodes, edges };
|
|
181
|
+
return { nodes: dedupeById(nodes), edges: dedupeEdges(edges) };
|
|
182
|
+
}
|
|
183
|
+
function dedupeById(nodes) {
|
|
184
|
+
const seen = new Set();
|
|
185
|
+
return nodes.filter((node) => {
|
|
186
|
+
if (seen.has(node.id))
|
|
187
|
+
return false;
|
|
188
|
+
seen.add(node.id);
|
|
189
|
+
return true;
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
function dedupeEdges(edges) {
|
|
193
|
+
const seen = new Set();
|
|
194
|
+
return edges.filter((edge) => {
|
|
195
|
+
const key = `${edge.source}\u0000${edge.target}\u0000${edge.kind}`;
|
|
196
|
+
if (seen.has(key))
|
|
197
|
+
return false;
|
|
198
|
+
seen.add(key);
|
|
199
|
+
return true;
|
|
200
|
+
});
|
|
129
201
|
}
|
|
130
202
|
/** Resolve call sites for a parsed file into CALLS edges + phantom nodes. */
|
|
131
203
|
export function buildCallEdges(parsed, index, knownNodeIds) {
|
|
@@ -235,21 +307,51 @@ export async function crawlProject(store, projectPath, excludeDirs, options = {}
|
|
|
235
307
|
const previouslyIndexed = new Set(store.raw("SELECT DISTINCT file_path FROM nodes WHERE file_path IS NOT NULL").map((r) => r.file_path));
|
|
236
308
|
const currentFiles = new Set(files);
|
|
237
309
|
let filesRemoved = 0;
|
|
238
|
-
let totalNodes = 0;
|
|
239
|
-
let totalEdges = 0;
|
|
240
310
|
let totalResolved = 0;
|
|
241
311
|
let totalUnresolved = 0;
|
|
312
|
+
let totalDecorators = 0;
|
|
313
|
+
let dynamicDispatchCount = 0;
|
|
314
|
+
let adviceCount = 0;
|
|
315
|
+
let aspectCount = 0;
|
|
316
|
+
// Every resolved call edge across the project, used to derive virtual
|
|
317
|
+
// dispatch edges once the whole type hierarchy is known.
|
|
318
|
+
const allCallEdges = [];
|
|
242
319
|
// Pre-compute every declared node id so synthetic targets (default
|
|
243
320
|
// constructors) can be created on demand, and so EXTENDS/IMPLEMENTS edges
|
|
244
321
|
// to external types can be dropped instead of violating FK constraints.
|
|
245
322
|
const allNodeIds = new Set();
|
|
323
|
+
const declarations = new Map();
|
|
246
324
|
for (const parsed of parsedFiles) {
|
|
247
|
-
|
|
325
|
+
const decl = buildDeclarationGraph(parsed);
|
|
326
|
+
declarations.set(parsed.filePath, decl);
|
|
327
|
+
for (const n of decl.nodes)
|
|
248
328
|
allNodeIds.add(n.id);
|
|
249
329
|
}
|
|
330
|
+
// Hierarchy metadata is emitted with whatever name the source used
|
|
331
|
+
// (`implements Payment`), which is not always the fully-qualified node id.
|
|
332
|
+
// Resolve unique simple names so EXTENDS/IMPLEMENTS edges survive the
|
|
333
|
+
// project-membership filter below.
|
|
334
|
+
const typeIdsByName = new Map();
|
|
335
|
+
for (const parsed of parsedFiles) {
|
|
336
|
+
for (const t of parsed.types) {
|
|
337
|
+
const ids = typeIdsByName.get(t.name) ?? [];
|
|
338
|
+
if (!ids.includes(t.id))
|
|
339
|
+
ids.push(t.id);
|
|
340
|
+
typeIdsByName.set(t.name, ids);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
const normalizeHierarchyTarget = (edge) => {
|
|
344
|
+
if (edge.kind !== "EXTENDS" && edge.kind !== "IMPLEMENTS")
|
|
345
|
+
return edge;
|
|
346
|
+
if (allNodeIds.has(edge.target))
|
|
347
|
+
return edge;
|
|
348
|
+
const candidates = typeIdsByName.get(edge.target);
|
|
349
|
+
const resolved = candidates?.length === 1 ? candidates[0] : undefined;
|
|
350
|
+
return resolved ? { ...edge, target: resolved } : edge;
|
|
351
|
+
};
|
|
250
352
|
store.withTransaction(() => {
|
|
251
353
|
for (const parsed of parsedFiles) {
|
|
252
|
-
const decl =
|
|
354
|
+
const decl = declarations.get(parsed.filePath);
|
|
253
355
|
const calls = buildCallEdges(parsed, index, allNodeIds);
|
|
254
356
|
for (const p of calls.phantomNodes)
|
|
255
357
|
allNodeIds.add(p.id);
|
|
@@ -259,12 +361,17 @@ export async function crawlProject(store, projectPath, excludeDirs, options = {}
|
|
|
259
361
|
// Drop edges whose endpoints aren't part of the indexed project
|
|
260
362
|
// (external EXTENDS/IMPLEMENTS/IMPORTS targets).
|
|
261
363
|
const edges = decl.edges
|
|
364
|
+
.map(normalizeHierarchyTarget)
|
|
262
365
|
.concat(calls.edges)
|
|
263
366
|
.filter((e) => allNodeIds.has(e.source) && allNodeIds.has(e.target));
|
|
264
367
|
const nodes = decl.nodes.concat(calls.phantomNodes);
|
|
265
368
|
store.replaceFile(parsed.filePath, nodes, edges);
|
|
266
|
-
|
|
267
|
-
|
|
369
|
+
for (const edge of calls.edges) {
|
|
370
|
+
if (allNodeIds.has(edge.source) && allNodeIds.has(edge.target)) {
|
|
371
|
+
allCallEdges.push(edge);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
totalDecorators += decl.edges.filter((e) => e.kind === "ANNOTATED_WITH" && isDecoratorAnnotation(e.target.slice(1))).length;
|
|
268
375
|
totalResolved += calls.resolved;
|
|
269
376
|
totalUnresolved += calls.unresolved;
|
|
270
377
|
previouslyIndexed.delete(parsed.filePath);
|
|
@@ -276,18 +383,30 @@ export async function crawlProject(store, projectPath, excludeDirs, options = {}
|
|
|
276
383
|
filesRemoved++;
|
|
277
384
|
}
|
|
278
385
|
}
|
|
386
|
+
// Rebuild project-wide derived edges: virtual dispatch and AOP advice.
|
|
387
|
+
store.deleteEdgesByKind(["DYNAMIC_DISPATCH", "ADVISES"]);
|
|
388
|
+
const dynamic = buildDynamicEdges(parsedFiles, index, allNodeIds, allCallEdges);
|
|
389
|
+
store.upsertEdges(dynamic.edges);
|
|
390
|
+
dynamicDispatchCount = dynamic.dispatchCount;
|
|
391
|
+
adviceCount = dynamic.adviceCount;
|
|
392
|
+
aspectCount = dynamic.aspects;
|
|
279
393
|
});
|
|
280
394
|
store.setMeta("last_crawl_at", new Date().toISOString());
|
|
281
395
|
store.setMeta("last_project_path", absPath);
|
|
396
|
+
const stats = store.stats();
|
|
282
397
|
return {
|
|
283
398
|
projectPath: absPath,
|
|
284
399
|
filesScanned: files.length,
|
|
285
400
|
filesParsed: parsedFiles.length,
|
|
286
401
|
filesRemoved,
|
|
287
|
-
nodes:
|
|
288
|
-
edges:
|
|
402
|
+
nodes: stats.nodes,
|
|
403
|
+
edges: stats.edges,
|
|
289
404
|
resolvedCalls: totalResolved,
|
|
290
405
|
unresolvedCalls: totalUnresolved,
|
|
406
|
+
dynamicDispatchEdges: dynamicDispatchCount,
|
|
407
|
+
adviceEdges: adviceCount,
|
|
408
|
+
aspects: aspectCount,
|
|
409
|
+
decorators: totalDecorators,
|
|
291
410
|
languages: [...new Set(parsedFiles.map((p) => p.language))],
|
|
292
411
|
durationMs: Date.now() - started,
|
|
293
412
|
};
|
package/dist/crawler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crawler.js","sourceRoot":"","sources":["../src/crawler.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"crawler.js","sourceRoot":"","sources":["../src/crawler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAoCjF,wEAAwE;AACxE,MAAM,UAAU,mBAAmB,CACjC,WAAmB,EACnB,WAAqB,EACrB,QAAiB;IAEjB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,GAAG,GAAa,EAAE,CAAC;IAEzB,SAAS,IAAI,CAAC,GAAW;QACvB,IAAI,OAAoB,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,sCAAsC;QAChD,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;gBACnE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,CAAC;IAClB,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,qBAAqB,CAAC,MAAkB;IACtD,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAgB,EAAE,CAAC;IAE9B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC/B,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC;QACT,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,MAAM;QACZ,aAAa,EAAE,MAAM;QACrB,QAAQ,EAAE,MAAM;QAChB,UAAU,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE;KAC5E,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,sEAAsE;QACtE,yEAAyE;QACzE,iDAAiD;QACjD,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,MAAM,CAAC,WAAW;YACtB,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,MAAM,CAAC,WAAW;YACjC,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,EAAE;SACf,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC;YACT,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,IAAI,EAAE,aAAa;YACnB,UAAU,EAAE,EAAE;SACf,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,QAAQ;YACd,aAAa,EAAE,GAAG,CAAC,GAAG;YACtB,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE;SACjE,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,WAA6B,EAAQ,EAAE;QAC7E,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC;YAC/C,MAAM,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAClC,oEAAoE;YACpE,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE;gBACF,IAAI,EAAE,YAAY;gBAClB,aAAa,EAAE,IAAI;gBACnB,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,UAAU,CAAC,IAAI;oBACrB,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClD,SAAS,EAAE,qBAAqB,CAAC,UAAU,CAAC,IAAI,CAAC;iBAClD;aACF,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC;gBACT,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,EAAE;gBACV,IAAI,EAAE,gBAAgB;gBACtB,UAAU,EAAE;oBACV,IAAI,EAAE,UAAU,CAAC,IAAI;oBACrB,SAAS,EAAE,UAAU,CAAC,SAAS;iBAChC;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAa,CAAC,CAAC,QAAQ;YAC/B,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY;gBACvB,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACb,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI;YACJ,aAAa,EAAE,CAAC,CAAC,EAAE;YACnB,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE;gBACV,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC7C,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxC;SACF,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/E,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAChG,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ;YAChD,aAAa,EAAE,CAAC,CAAC,EAAE;YACnB,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE;gBACV,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,SAAS,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBACxD,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC7C,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD;SACF,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC;YACT,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,MAAM,EAAE,CAAC,CAAC,EAAE;YACZ,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE;SAClC,CAAC,CAAC;QACH,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;YACjC,IAAI,EAAE,OAAO;YACb,aAAa,EAAE,CAAC,CAAC,EAAE;YACnB,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE;gBACV,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAC9C;SACF,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC;YACT,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;YACrC,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE;SAClC,CAAC,CAAC;QACH,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,UAAU,CAAC,KAAkB;IACpC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,KAAkB;IACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,SAAS,IAAI,CAAC,MAAM,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC;QACnE,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,cAAc,CAC5B,MAAkB,EAClB,KAAwC,EACxC,YAAyB;IAEzB,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,YAAY,GAAgB,EAAE,CAAC;IACrC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,MAAM,UAAU,GAAG,MAAwB,CAAC;IAC5C,MAAM,aAAa,GACjB,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvE,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;QAC/B,yEAAyE;QACzE,oEAAoE;QACpE,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,iBAAiB,IAAI,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC5E,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YAChB,QAAQ,EAAE,CAAC;YACX,iEAAiE;YACjE,wEAAwE;YACxE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnC,MAAM,SAAS,GAAc;oBAC3B,EAAE,EAAE,EAAE,CAAC,QAAQ;oBACf,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ;oBAChE,aAAa,EAAE,EAAE,CAAC,QAAQ;oBAC1B,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,UAAU,EAAE;wBACV,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ;wBAClF,SAAS,EAAE,IAAI;wBACf,MAAM,EAAE,EAAE,CAAC,MAAM;qBAClB;iBACF,CAAC;gBACF,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC7B,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;YACD,KAAK,CAAC,IAAI,CAAC;gBACT,MAAM;gBACN,MAAM,EAAE,EAAE,CAAC,QAAQ;gBACnB,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;oBACtB,QAAQ,EAAE,IAAI;oBACd,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,GAAG;oBACjD,MAAM,EAAE,EAAE,CAAC,MAAM;iBAClB;aACF,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,UAAU,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;YAC7C,YAAY,CAAC,IAAI,CAAC;gBAChB,EAAE,EAAE,SAAS;gBACb,IAAI,EAAE,gBAAgB;gBACtB,aAAa,EAAE,SAAS;gBACxB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE;oBACvI,MAAM,EAAE,EAAE,CAAC,MAAM;iBAClB;aACF,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC;gBACT,MAAM;gBACN,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;oBACtB,QAAQ,EAAE,KAAK;oBACf,UAAU,EAAE,CAAC;oBACb,MAAM,EAAE,EAAE,CAAC,MAAM;iBAClB;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAiB,EACjB,WAAmB,EACnB,WAAqB,EACrB,OAAO,GAAiB,EAAE;IAE1B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,oCAAoC,WAAW,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;QAClC,KAAK,CAAC,MAAM,CACV,CAAC,EACD,KAAK,CAAC,MAAM,EACZ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAC3C,CAAC;IACJ,CAAC;IAED,uEAAuE;IACvE,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,WAAW,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,MAAM,KAAK,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAE1C,wDAAwD;IACxD,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC9B,KAAK,CAAC,GAAG,CAAC,kEAAkE,CAA6B,CAAC,GAAG,CAC5G,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CACnB,CACF,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,sEAAsE;IACtE,yDAAyD;IACzD,MAAM,YAAY,GAAgB,EAAE,CAAC;IAErC,mEAAmE;IACnE,0EAA0E;IAC1E,wEAAwE;IACxE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoD,CAAC;IACjF,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC3C,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK;YAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,mEAAmE;IACnE,2EAA2E;IAC3E,sEAAsE;IACtE,mCAAmC;IACnC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAoB,CAAC;IAClD,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,MAAM,wBAAwB,GAAG,CAAC,IAAe,EAAa,EAAE;QAC9D,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO,IAAI,CAAC;QACvE,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,UAAU,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtE,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,CAAC,CAAC;IAEF,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE;QACzB,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAE,CAAC;YAChD,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YAExD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY;gBAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAEzD,8DAA8D;YAC9D,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY;gBAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAExD,gEAAgE;YAChE,iDAAiD;YACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;iBACrB,GAAG,CAAC,wBAAwB,CAAC;iBAC7B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;iBACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACpD,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAEjD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC/B,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC/D,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YAED,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAClC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB,IAAI,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAC/E,CAAC,MAAM,CAAC;YACT,aAAa,IAAI,KAAK,CAAC,QAAQ,CAAC;YAChC,eAAe,IAAI,KAAK,CAAC,UAAU,CAAC;YACpC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC;QAED,kDAAkD;QAClD,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;YACtC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACxB,YAAY,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;QAED,uEAAuE;QACvE,KAAK,CAAC,iBAAiB,CAAC,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,iBAAiB,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QAChF,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC;QAC7C,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QAClC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACzD,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAE5C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;IAC5B,OAAO;QACL,WAAW,EAAE,OAAO;QACpB,YAAY,EAAE,KAAK,CAAC,MAAM;QAC1B,WAAW,EAAE,WAAW,CAAC,MAAM;QAC/B,YAAY;QACZ,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,aAAa,EAAE,aAAa;QAC5B,eAAe,EAAE,eAAe;QAChC,oBAAoB,EAAE,oBAAoB;QAC1C,WAAW,EAAE,WAAW;QACxB,OAAO,EAAE,WAAW;QACpB,UAAU,EAAE,eAAe;QAC3B,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3D,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;KACjC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB;IACvC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
|