@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.
@@ -0,0 +1,473 @@
1
+ /**
2
+ * Dynamic-behaviour enrichment.
3
+ *
4
+ * Static call graphs answer "what does the source say is called?". Runtime
5
+ * behaviour differs in two important ways that this module approximates on top
6
+ * of the static graph:
7
+ *
8
+ * 1. **Virtual dispatch** — a call to an interface/base-class method may run
9
+ * any override. `DYNAMIC_DISPATCH` edges connect the statically-declared
10
+ * target to every override found in the project.
11
+ * 2. **Aspects and decorators** — AOP advice intercepts matched methods at
12
+ * runtime, and framework decorator annotations (transactional, cached,
13
+ * asynchronous, ...) change how a method executes. `ADVISES` edges connect
14
+ * advice methods to the methods their pointcuts match.
15
+ *
16
+ * The traversal layer can then follow both edge kinds, producing a static
17
+ * approximation of runtime execution rather than just the literal source calls.
18
+ */
19
+ /** Framework annotations that behave as runtime decorators. */
20
+ export const DECORATOR_ANNOTATIONS = new Set([
21
+ "Transactional",
22
+ "Cacheable",
23
+ "CachePut",
24
+ "CacheEvict",
25
+ "Async",
26
+ "Retryable",
27
+ "Secured",
28
+ "PreAuthorize",
29
+ "RolesAllowed",
30
+ "Timed",
31
+ "Scheduled",
32
+ "Loggable",
33
+ "Measured",
34
+ "RateLimit",
35
+ "Idempotent",
36
+ "Validated",
37
+ ]);
38
+ /** True when an annotation/decorator changes runtime execution semantics. */
39
+ export function isDecoratorAnnotation(name) {
40
+ return DECORATOR_ANNOTATIONS.has(name);
41
+ }
42
+ /**
43
+ * Build `ADVISES` and `DYNAMIC_DISPATCH` edges.
44
+ *
45
+ * `calls` should contain every CALLS edge in the project (used to seed virtual
46
+ * dispatch). Both endpoints must already exist in `knownNodeIds`.
47
+ */
48
+ export function buildDynamicEdges(parsedFiles, index, knownNodeIds, calls) {
49
+ const typeAnnotations = new Map();
50
+ for (const file of parsedFiles) {
51
+ for (const type of file.types)
52
+ typeAnnotations.set(type.id, type.annotations);
53
+ if (file.packageName) {
54
+ for (const type of file.types)
55
+ typeAnnotations.set(type.id, type.annotations);
56
+ }
57
+ }
58
+ const advice = collectAdvice(parsedFiles, typeAnnotations);
59
+ const adviceEdges = buildAdviceEdges(advice, index, typeAnnotations, knownNodeIds);
60
+ const dispatchEdges = buildDispatchEdges(index, knownNodeIds, calls);
61
+ return {
62
+ edges: [...adviceEdges, ...dispatchEdges],
63
+ adviceCount: adviceEdges.length,
64
+ dispatchCount: dispatchEdges.length,
65
+ aspects: new Set(advice.map((a) => a.typeId)).size,
66
+ };
67
+ }
68
+ /** Collect advice methods and resolve named pointcut references. */
69
+ export function collectAdvice(parsedFiles, typeAnnotations) {
70
+ const pointcutsByType = new Map();
71
+ const allMethods = [];
72
+ for (const file of parsedFiles) {
73
+ for (const method of file.methods) {
74
+ allMethods.push({ method, typeAnnotations: typeAnnotations.get(method.typeId) ?? [] });
75
+ if (method.adviceKind === "pointcut" && method.pointcut) {
76
+ const byType = pointcutsByType.get(method.typeId) ?? new Map();
77
+ byType.set(method.name, method.pointcut);
78
+ pointcutsByType.set(method.typeId, byType);
79
+ }
80
+ }
81
+ }
82
+ const advice = [];
83
+ for (const { method } of allMethods) {
84
+ if (!method.adviceKind || method.adviceKind === "pointcut" || !method.pointcut)
85
+ continue;
86
+ const expression = resolvePointcutReference(method.pointcut, method.typeId, pointcutsByType, new Set());
87
+ advice.push({
88
+ id: method.id,
89
+ typeId: method.typeId,
90
+ name: method.name,
91
+ adviceKind: method.adviceKind,
92
+ pointcut: expression,
93
+ });
94
+ }
95
+ return advice;
96
+ }
97
+ /** Expand `@Around("myPointcut()")` to the referenced expression. */
98
+ function resolvePointcutReference(expression, typeId, pointcutsByType, seen) {
99
+ const trimmed = expression.trim();
100
+ const ref = trimmed.match(/^([\w.$]+)\s*\(\s*\)$/);
101
+ if (!ref || !ref[1])
102
+ return trimmed;
103
+ // Do not treat pointcut keywords (execution(...) etc.) as references.
104
+ if (POINTCUT_KEYWORDS.has(ref[1]))
105
+ return trimmed;
106
+ const raw = ref[1];
107
+ const simple = raw.split(".").pop() ?? raw;
108
+ const key = `${typeId}#${simple}`;
109
+ if (seen.has(key))
110
+ return trimmed;
111
+ seen.add(key);
112
+ const local = pointcutsByType.get(typeId)?.get(simple);
113
+ if (local)
114
+ return resolvePointcutReference(local, typeId, pointcutsByType, seen);
115
+ for (const [owner, byType] of pointcutsByType) {
116
+ if (raw.includes(".") && !owner.endsWith(raw.slice(0, raw.lastIndexOf("."))))
117
+ continue;
118
+ const found = byType.get(simple);
119
+ if (found)
120
+ return resolvePointcutReference(found, owner, pointcutsByType, seen);
121
+ }
122
+ return trimmed;
123
+ }
124
+ function buildAdviceEdges(advice, index, typeAnnotations, knownNodeIds) {
125
+ const edges = [];
126
+ const seen = new Set();
127
+ for (const entry of advice) {
128
+ if (!knownNodeIds.has(entry.id))
129
+ continue;
130
+ for (const [typeId, methods] of index.methodsByFqn) {
131
+ const annotations = typeAnnotations.get(typeId) ?? [];
132
+ for (const method of methods) {
133
+ if (method.id === entry.id)
134
+ continue;
135
+ if (!knownNodeIds.has(method.id))
136
+ continue;
137
+ const result = matchPointcut(entry.pointcut, method, annotations, method.annotations);
138
+ if (!result.matched)
139
+ continue;
140
+ const key = `${entry.id}->${method.id}`;
141
+ if (seen.has(key))
142
+ continue;
143
+ seen.add(key);
144
+ edges.push({
145
+ source: entry.id,
146
+ target: method.id,
147
+ kind: "ADVISES",
148
+ properties: {
149
+ adviceKind: entry.adviceKind,
150
+ pointcut: entry.pointcut,
151
+ confidence: round(result.confidence),
152
+ reason: result.reason,
153
+ },
154
+ });
155
+ }
156
+ }
157
+ }
158
+ return edges;
159
+ }
160
+ function buildDispatchEdges(index, knownNodeIds, calls) {
161
+ const edges = [];
162
+ const seen = new Set();
163
+ for (const call of calls) {
164
+ if (call.kind !== "CALLS" || call.properties.resolved !== true)
165
+ continue;
166
+ const target = call.target;
167
+ if (!target.includes("#"))
168
+ continue;
169
+ const separator = target.lastIndexOf("#");
170
+ const declaringType = target.slice(0, separator);
171
+ const methodName = target.slice(separator + 1);
172
+ if (!methodName || methodName === "<init>")
173
+ continue;
174
+ const declared = (index.methodsByFqn.get(declaringType) ?? []).filter((m) => m.name === methodName);
175
+ if (declared.length === 0)
176
+ continue;
177
+ // Java only dispatches virtually for instance methods that are not final.
178
+ if (declared.some((m) => m.modifiers.some((mod) => mod === "private" || mod === "static" || mod === "final"))) {
179
+ continue;
180
+ }
181
+ const targetMethod = declared.find((m) => m.id === target) ?? declared[0];
182
+ const arity = targetMethod?.params.length;
183
+ const subtypes = index.subtypesOf(declaringType);
184
+ if (subtypes.length === 0)
185
+ continue;
186
+ for (const subtype of subtypes) {
187
+ const candidates = (index.methodsByFqn.get(subtype) ?? []).filter((m) => m.name === methodName);
188
+ if (candidates.length === 0)
189
+ continue;
190
+ const impl = candidates.find((m) => arity === undefined || m.params.length === arity) ?? candidates[0];
191
+ if (!impl || impl.id === target || !knownNodeIds.has(impl.id))
192
+ continue;
193
+ const key = `${target}->${impl.id}`;
194
+ if (seen.has(key))
195
+ continue;
196
+ seen.add(key);
197
+ edges.push({
198
+ source: target,
199
+ target: impl.id,
200
+ kind: "DYNAMIC_DISPATCH",
201
+ properties: {
202
+ resolved: true,
203
+ confidence: 0.8,
204
+ via: `virtual dispatch to ${subtype}`,
205
+ reason: `possible override of ${target} in ${subtype}`,
206
+ },
207
+ });
208
+ }
209
+ }
210
+ return edges;
211
+ }
212
+ // ---------------------------------------------------------------- pointcuts
213
+ const POINTCUT_KEYWORDS = new Set([
214
+ "execution",
215
+ "call",
216
+ "within",
217
+ "withincode",
218
+ "target",
219
+ "this",
220
+ "args",
221
+ "bean",
222
+ "annotation",
223
+ ]);
224
+ const MODIFIER_KEYWORDS = new Set([
225
+ "public",
226
+ "protected",
227
+ "private",
228
+ "static",
229
+ "final",
230
+ "abstract",
231
+ "synchronized",
232
+ "native",
233
+ "default",
234
+ "strictfp",
235
+ ]);
236
+ /**
237
+ * Match an AspectJ-style pointcut against a declared method.
238
+ *
239
+ * Supported primitives: `execution`/`call`, `within`, `@annotation`,
240
+ * `@within`, `target`, `this`, `args`, plus `&&`, `||` and `!`. Unsupported
241
+ * primitives (e.g. `bean`, `controlflow`) simply do not match, so advice is
242
+ * never over-applied.
243
+ */
244
+ export function matchPointcut(expression, method, typeAnnotations, methodAnnotations) {
245
+ const expr = (expression ?? "").trim();
246
+ if (!expr) {
247
+ // An empty pointcut is treated as "matches everything" with low confidence.
248
+ return { matched: true, confidence: 0.3, reason: "empty pointcut" };
249
+ }
250
+ const orGroups = splitTopLevel(expr, "||");
251
+ const reasons = [];
252
+ let best = null;
253
+ for (const group of orGroups) {
254
+ const terms = splitTopLevel(group, "&&");
255
+ if (terms.length === 0)
256
+ continue;
257
+ let matched = true;
258
+ let confidence = 1;
259
+ const termReasons = [];
260
+ for (const term of terms) {
261
+ const result = evaluateTerm(term, method, typeAnnotations, methodAnnotations);
262
+ if (!result.matched) {
263
+ matched = false;
264
+ break;
265
+ }
266
+ confidence = Math.min(confidence, result.confidence);
267
+ termReasons.push(result.reason);
268
+ }
269
+ if (matched) {
270
+ const candidate = {
271
+ matched: true,
272
+ confidence,
273
+ reason: termReasons.join(" && "),
274
+ };
275
+ if (!best || candidate.confidence > best.confidence)
276
+ best = candidate;
277
+ reasons.push(candidate.reason);
278
+ }
279
+ }
280
+ return best ?? { matched: false, confidence: 0, reason: "no pointcut branch matched" };
281
+ }
282
+ function evaluateTerm(term, method, typeAnnotations, methodAnnotations) {
283
+ let raw = term.trim();
284
+ let negate = false;
285
+ while (raw.startsWith("!")) {
286
+ negate = true;
287
+ raw = raw.slice(1).trim();
288
+ }
289
+ if (!raw)
290
+ return { matched: false, confidence: 0, reason: "empty pointcut term" };
291
+ const result = evaluatePrimitive(raw, method, typeAnnotations, methodAnnotations);
292
+ if (!negate)
293
+ return result;
294
+ return {
295
+ matched: !result.matched,
296
+ confidence: result.matched ? result.confidence : 0,
297
+ reason: `!(${result.reason})`,
298
+ };
299
+ }
300
+ function evaluatePrimitive(raw, method, typeAnnotations, methodAnnotations) {
301
+ const parsed = raw.match(/^([\w@]+)\s*\(([\s\S]*)\)$/);
302
+ if (!parsed) {
303
+ return { matched: false, confidence: 0, reason: `unsupported pointcut "${raw}"` };
304
+ }
305
+ const primitive = parsed[1] ?? "";
306
+ const body = (parsed[2] ?? "").trim();
307
+ switch (primitive) {
308
+ case "execution":
309
+ case "call": {
310
+ const matched = matchExecution(body, method);
311
+ return {
312
+ matched,
313
+ confidence: primitive === "execution" ? 0.9 : 0.85,
314
+ reason: `${primitive}(${body})${matched ? "" : " did not match"}`,
315
+ };
316
+ }
317
+ case "within": {
318
+ const matched = matchTypePattern(body, method.typeId);
319
+ return {
320
+ matched,
321
+ confidence: 0.85,
322
+ reason: `within(${body})${matched ? "" : " did not match"} ${method.typeId}`,
323
+ };
324
+ }
325
+ case "@annotation": {
326
+ const matched = matchAnnotationPattern(body, methodAnnotations);
327
+ return {
328
+ matched,
329
+ confidence: 0.85,
330
+ reason: `@annotation(${body})${matched ? "" : " did not match"}`,
331
+ };
332
+ }
333
+ case "@within": {
334
+ const matched = matchAnnotationPattern(body, typeAnnotations);
335
+ return {
336
+ matched,
337
+ confidence: 0.8,
338
+ reason: `@within(${body})${matched ? "" : " did not match"}`,
339
+ };
340
+ }
341
+ case "target":
342
+ case "this": {
343
+ const matched = matchTypePattern(body, method.typeId);
344
+ return {
345
+ matched,
346
+ confidence: 0.55,
347
+ reason: `${primitive}(${body})${matched ? "" : " did not match"} (static approximation)`,
348
+ };
349
+ }
350
+ case "args": {
351
+ const matched = matchArity(body, method.params.length);
352
+ return {
353
+ matched,
354
+ confidence: 0.6,
355
+ reason: `args(${body})${matched ? "" : " did not match"} arity ${method.params.length}`,
356
+ };
357
+ }
358
+ default:
359
+ return {
360
+ matched: false,
361
+ confidence: 0,
362
+ reason: `unsupported pointcut primitive "${primitive}"`,
363
+ };
364
+ }
365
+ }
366
+ /** Match an `execution(...)` signature against a method. */
367
+ export function matchExecution(signature, method) {
368
+ const open = signature.indexOf("(");
369
+ const close = signature.lastIndexOf(")");
370
+ if (open < 0 || close < open)
371
+ return false;
372
+ const paramsText = signature.slice(open + 1, close);
373
+ const before = signature.slice(0, open).trim();
374
+ const tokens = before.split(/\s+/).filter(Boolean);
375
+ // Drop modifiers and leading annotations.
376
+ const filtered = tokens.filter((token) => !MODIFIER_KEYWORDS.has(token) && !token.startsWith("@"));
377
+ const target = filtered[filtered.length - 1];
378
+ if (!target)
379
+ return false;
380
+ const dot = target.lastIndexOf(".");
381
+ const methodPattern = dot >= 0 ? target.slice(dot + 1) : target;
382
+ const typePattern = dot >= 0 ? target.slice(0, dot) : "*";
383
+ if (!matchNameGlob(methodPattern, method.name))
384
+ return false;
385
+ if (!matchTypePattern(typePattern, method.typeId))
386
+ return false;
387
+ return matchArity(paramsText, method.params.length);
388
+ }
389
+ /** Simple `*` glob over method names. */
390
+ function matchNameGlob(pattern, name) {
391
+ if (!pattern || pattern === "*")
392
+ return true;
393
+ const source = pattern
394
+ .split("*")
395
+ .map((part) => escapeRegExp(part))
396
+ .join(".*");
397
+ return new RegExp(`^${source}$`).test(name);
398
+ }
399
+ /**
400
+ * Match an AspectJ type pattern.
401
+ * - `*` matches any type
402
+ * - `com.acme.*` matches one package level
403
+ * - `com.acme..*` matches any depth below `com.acme`
404
+ * - `..Foo` matches a type named Foo at any depth
405
+ */
406
+ export function matchTypePattern(pattern, typeFqn) {
407
+ const cleaned = pattern.trim();
408
+ if (!cleaned || cleaned === "*" || cleaned === "..")
409
+ return true;
410
+ const segments = cleaned.split(".");
411
+ let regex = "^";
412
+ let first = true;
413
+ for (const segment of segments) {
414
+ if (segment === "") {
415
+ regex += "(?:\\.[^.]+)*";
416
+ first = false;
417
+ continue;
418
+ }
419
+ if (!first)
420
+ regex += "\\.";
421
+ regex += segment
422
+ .split("*")
423
+ .map((part) => escapeRegExp(part))
424
+ .join("[^.]*");
425
+ first = false;
426
+ }
427
+ regex += "$";
428
+ return new RegExp(regex).test(typeFqn);
429
+ }
430
+ /** Whether any annotation matches a simple/globbed annotation pattern. */
431
+ function matchAnnotationPattern(pattern, annotations) {
432
+ const cleaned = pattern.trim();
433
+ if (!cleaned)
434
+ return annotations.length > 0;
435
+ const simple = cleaned.split(".").pop() ?? cleaned;
436
+ return annotations.some((annotation) => matchNameGlob(simple, annotation.name) ||
437
+ (annotation.fqn !== undefined && matchTypePattern(cleaned, annotation.fqn)));
438
+ }
439
+ function matchArity(paramsText, count) {
440
+ const trimmed = paramsText.trim();
441
+ if (!trimmed)
442
+ return count === 0;
443
+ const parts = splitTopLevel(trimmed, ",").map((p) => p.trim()).filter(Boolean);
444
+ if (parts.some((p) => p === ".."))
445
+ return true;
446
+ return parts.length === count;
447
+ }
448
+ function splitTopLevel(input, separator) {
449
+ const out = [];
450
+ let depth = 0;
451
+ let start = 0;
452
+ for (let i = 0; i < input.length; i++) {
453
+ const ch = input[i];
454
+ if (ch === "(" || ch === "[" || ch === "{")
455
+ depth++;
456
+ else if (ch === ")" || ch === "]" || ch === "}")
457
+ depth--;
458
+ else if (depth === 0 && input.startsWith(separator, i)) {
459
+ out.push(input.slice(start, i));
460
+ i += separator.length - 1;
461
+ start = i + 1;
462
+ }
463
+ }
464
+ out.push(input.slice(start));
465
+ return out;
466
+ }
467
+ function escapeRegExp(text) {
468
+ return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
469
+ }
470
+ function round(value) {
471
+ return Math.round(value * 100) / 100;
472
+ }
473
+ //# sourceMappingURL=dynamic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic.js","sourceRoot":"","sources":["../../src/resolver/dynamic.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AAEH,+DAA+D;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IAC3C,eAAe;IACf,WAAW;IACX,UAAU;IACV,YAAY;IACZ,OAAO;IACP,WAAW;IACX,SAAS;IACT,cAAc;IACd,cAAc;IACd,OAAO;IACP,WAAW;IACX,UAAU;IACV,UAAU;IACV,WAAW;IACX,YAAY;IACZ,WAAW;CACZ,CAAC,CAAC;AAEH,6EAA6E;AAC7E,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAwBD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,WAAyB,EACzB,KAAgB,EAChB,YAAyB,EACzB,KAAkB;IAElB,MAAM,eAAe,GAAG,IAAI,GAAG,EAA4B,CAAC;IAC5D,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9E,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;gBAAE,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;IACnF,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IAErE,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,WAAW,EAAE,GAAG,aAAa,CAAC;QACzC,WAAW,EAAE,WAAW,CAAC,MAAM;QAC/B,aAAa,EAAE,aAAa,CAAC,MAAM;QACnC,OAAO,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;KACnD,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,aAAa,CAC3B,WAAyB,EACzB,eAA8C;IAE9C,MAAM,eAAe,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC/D,MAAM,UAAU,GAAoB,EAAE,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACvF,IAAI,MAAM,CAAC,UAAU,KAAK,UAAU,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACxD,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAkB,CAAC;gBAC/E,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACzC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,KAAK,UAAU,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,SAAS;QACzF,MAAM,UAAU,GAAG,wBAAwB,CACzC,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,MAAM,EACb,eAAe,EACf,IAAI,GAAG,EAAE,CACV,CAAC;QACF,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,QAAQ,EAAE,UAAU;SACrB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,qEAAqE;AACrE,SAAS,wBAAwB,CAC/B,UAAkB,EAClB,MAAc,EACd,eAAiD,EACjD,IAAiB;IAEjB,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACnD,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IACpC,sEAAsE;IACtE,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAElD,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACnB,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC;IAC3C,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;IAClC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAClC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEd,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvD,IAAI,KAAK;QAAE,OAAO,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;IAEjF,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;QAC9C,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,SAAS;QACvF,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,KAAK;YAAE,OAAO,wBAAwB,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,gBAAgB,CACvB,MAAoB,EACpB,KAAgB,EAChB,eAA8C,EAC9C,YAAyB;IAEzB,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,SAAS;QAC1C,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACnD,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACtD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE;oBAAE,SAAS;gBACrC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBAAE,SAAS;gBAC3C,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;gBACtF,IAAI,CAAC,MAAM,CAAC,OAAO;oBAAE,SAAS;gBAE9B,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC;gBACxC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAEd,KAAK,CAAC,IAAI,CAAC;oBACT,MAAM,EAAE,KAAK,CAAC,EAAE;oBAChB,MAAM,EAAE,MAAM,CAAC,EAAE;oBACjB,IAAI,EAAE,SAAS;oBACf,UAAU,EAAE;wBACV,UAAU,EAAE,KAAK,CAAC,UAAU;wBAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC;wBACpC,MAAM,EAAE,MAAM,CAAC,MAAM;qBACtB;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAgB,EAChB,YAAyB,EACzB,KAAkB;IAElB,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,KAAK,IAAI;YAAE,SAAS;QACzE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QACpC,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,QAAQ;YAAE,SAAS;QAErD,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAC7B,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACpC,0EAA0E;QAC1E,IACE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAClB,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,OAAO,CAAC,CACpF,EACD,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1E,MAAM,KAAK,GAAG,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC;QAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACjD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEpC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAC/D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAC7B,CAAC;YACF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACtC,MAAM,IAAI,GACR,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;YAC5F,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAE,SAAS;YAExE,MAAM,GAAG,GAAG,GAAG,MAAM,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEd,KAAK,CAAC,IAAI,CAAC;gBACT,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,IAAI,EAAE,kBAAkB;gBACxB,UAAU,EAAE;oBACV,QAAQ,EAAE,IAAI;oBACd,UAAU,EAAE,GAAG;oBACf,GAAG,EAAE,uBAAuB,OAAO,EAAE;oBACrC,MAAM,EAAE,wBAAwB,MAAM,OAAO,OAAO,EAAE;iBACvD;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6EAA6E;AAE7E,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,WAAW;IACX,MAAM;IACN,QAAQ;IACR,YAAY;IACZ,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,YAAY;CACb,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,QAAQ;IACR,WAAW;IACX,SAAS;IACT,QAAQ;IACR,OAAO;IACP,UAAU;IACV,cAAc;IACd,QAAQ;IACR,SAAS;IACT,UAAU;CACX,CAAC,CAAC;AAQH;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,UAAkB,EAClB,MAAkB,EAClB,eAAiC,EACjC,iBAAmC;IAEnC,MAAM,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,4EAA4E;QAC5E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,IAAI,GAAyB,IAAI,CAAC;IAEtC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACjC,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,MAAM,WAAW,GAAa,EAAE,CAAC;QAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,iBAAiB,CAAC,CAAC;YAC9E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,GAAG,KAAK,CAAC;gBAChB,MAAM;YACR,CAAC;YACD,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YACrD,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,SAAS,GAAkB;gBAC/B,OAAO,EAAE,IAAI;gBACb,UAAU;gBACV,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;aACjC,CAAC;YACF,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;gBAAE,IAAI,GAAG,SAAS,CAAC;YACtE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;AACzF,CAAC;AAED,SAAS,YAAY,CACnB,IAAY,EACZ,MAAkB,EAClB,eAAiC,EACjC,iBAAmC;IAEnC,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,IAAI,CAAC;QACd,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAElF,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,iBAAiB,CAAC,CAAC;IAClF,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,OAAO;QACL,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO;QACxB,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,EAAE,KAAK,MAAM,CAAC,MAAM,GAAG;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,GAAW,EACX,MAAkB,EAClB,eAAiC,EACjC,iBAAmC;IAEnC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,yBAAyB,GAAG,GAAG,EAAE,CAAC;IACpF,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAEtC,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,WAAW,CAAC;QACjB,KAAK,MAAM,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC7C,OAAO;gBACL,OAAO;gBACP,UAAU,EAAE,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;gBAClD,MAAM,EAAE,GAAG,SAAS,IAAI,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE;aAClE,CAAC;QACJ,CAAC;QACD,KAAK,QAAQ,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACtD,OAAO;gBACL,OAAO;gBACP,UAAU,EAAE,IAAI;gBAChB,MAAM,EAAE,UAAU,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE;aAC7E,CAAC;QACJ,CAAC;QACD,KAAK,aAAa,EAAE,CAAC;YACnB,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;YAChE,OAAO;gBACL,OAAO;gBACP,UAAU,EAAE,IAAI;gBAChB,MAAM,EAAE,eAAe,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE;aACjE,CAAC;QACJ,CAAC;QACD,KAAK,SAAS,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YAC9D,OAAO;gBACL,OAAO;gBACP,UAAU,EAAE,GAAG;gBACf,MAAM,EAAE,WAAW,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE;aAC7D,CAAC;QACJ,CAAC;QACD,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACtD,OAAO;gBACL,OAAO;gBACP,UAAU,EAAE,IAAI;gBAChB,MAAM,EAAE,GAAG,SAAS,IAAI,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,yBAAyB;aACzF,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvD,OAAO;gBACL,OAAO;gBACP,UAAU,EAAE,GAAG;gBACf,MAAM,EAAE,QAAQ,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,UAAU,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;aACxF,CAAC;QACJ,CAAC;QACD;YACE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,CAAC;gBACb,MAAM,EAAE,mCAAmC,SAAS,GAAG;aACxD,CAAC;IACN,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,MAAkB;IAClE,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,KAAK,CAAC;IAE3C,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnD,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAC5B,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CACnE,CAAC;IACF,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAE1B,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,aAAa,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAChE,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAE1D,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7D,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAChE,OAAO,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,yCAAyC;AACzC,SAAS,aAAa,CAAC,OAAe,EAAE,IAAY;IAClD,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,MAAM,GAAG,OAAO;SACnB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;SACjC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,IAAI,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,OAAe;IAC/D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,GAAG,GAAG,CAAC;IAChB,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YACnB,KAAK,IAAI,eAAe,CAAC;YACzB,KAAK,GAAG,KAAK,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK;YAAE,KAAK,IAAI,KAAK,CAAC;QAC3B,KAAK,IAAI,OAAO;aACb,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;aACjC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjB,KAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IACD,KAAK,IAAI,GAAG,CAAC;IACb,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,0EAA0E;AAC1E,SAAS,sBAAsB,CAAC,OAAe,EAAE,WAA6B;IAC5E,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,OAAO;QAAE,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC;IACnD,OAAO,WAAW,CAAC,IAAI,CACrB,CAAC,UAAU,EAAE,EAAE,CACb,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC;QACtC,CAAC,UAAU,CAAC,GAAG,KAAK,SAAS,IAAI,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAC9E,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,UAAkB,EAAE,KAAa;IACnD,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,KAAK,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/E,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC;AAChC,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,SAAiB;IACrD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aAC/C,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aACpD,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YAC1B,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,KAAK,CAAC,KAAa;IAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACvC,CAAC"}
@@ -30,7 +30,21 @@ export declare class TypeIndex {
30
30
  methodsByFqn: Map<string, MethodInfo[]>;
31
31
  /** FQN -> parent FQNs (extends/implements, resolved where possible). */
32
32
  parentsByFqn: Map<string, string[]>;
33
+ /** Resolved parent FQN -> directly-declared child FQNs. */
34
+ childrenByFqn: Map<string, string[]>;
35
+ private hierarchyDirty;
33
36
  addFile(file: ParsedFile): void;
37
+ /**
38
+ * Resolve extend/implements names to FQNs and build the reverse hierarchy.
39
+ * Called lazily so `addFile` can arrive in any order.
40
+ */
41
+ linkHierarchy(): void;
42
+ /** Direct subtypes (implementors/subclasses) of a type. */
43
+ directSubtypes(typeFqn: string): string[];
44
+ /** Transitive subtypes, breadth-first, depth-bounded. */
45
+ subtypesOf(typeFqn: string, maxDepth?: number): string[];
46
+ /** True when `candidate` is a (transitive) subtype of `base`. */
47
+ isSubtypeOf(candidate: string, base: string): boolean;
34
48
  /** Resolve a (possibly qualified) type name to candidate FQNs. */
35
49
  resolveType(name: string): string[];
36
50
  /** All methods named `methodName` declared on a type (or inherited). */
@@ -11,6 +11,9 @@ export class TypeIndex {
11
11
  methodsByFqn = new Map();
12
12
  /** FQN -> parent FQNs (extends/implements, resolved where possible). */
13
13
  parentsByFqn = new Map();
14
+ /** Resolved parent FQN -> directly-declared child FQNs. */
15
+ childrenByFqn = new Map();
16
+ hierarchyDirty = false;
14
17
  addFile(file) {
15
18
  for (const t of file.types) {
16
19
  const list = this.typesBySimpleName.get(t.name) ?? [];
@@ -25,6 +28,59 @@ export class TypeIndex {
25
28
  list.push(m);
26
29
  this.methodsByFqn.set(m.typeId, list);
27
30
  }
31
+ this.hierarchyDirty = true;
32
+ }
33
+ /**
34
+ * Resolve extend/implements names to FQNs and build the reverse hierarchy.
35
+ * Called lazily so `addFile` can arrive in any order.
36
+ */
37
+ linkHierarchy() {
38
+ this.childrenByFqn.clear();
39
+ for (const child of this.kindByFqn.keys()) {
40
+ for (const parentName of this.parentsByFqn.get(child) ?? []) {
41
+ for (const parent of this.resolveType(parentName)) {
42
+ if (parent === child)
43
+ continue;
44
+ const list = this.childrenByFqn.get(parent) ?? [];
45
+ if (!list.includes(child))
46
+ list.push(child);
47
+ this.childrenByFqn.set(parent, list);
48
+ }
49
+ }
50
+ }
51
+ this.hierarchyDirty = false;
52
+ }
53
+ /** Direct subtypes (implementors/subclasses) of a type. */
54
+ directSubtypes(typeFqn) {
55
+ if (this.hierarchyDirty)
56
+ this.linkHierarchy();
57
+ return this.childrenByFqn.get(typeFqn) ?? [];
58
+ }
59
+ /** Transitive subtypes, breadth-first, depth-bounded. */
60
+ subtypesOf(typeFqn, maxDepth = 10) {
61
+ if (this.hierarchyDirty)
62
+ this.linkHierarchy();
63
+ const out = [];
64
+ const seen = new Set([typeFqn]);
65
+ let frontier = [typeFqn];
66
+ for (let depth = 0; depth < maxDepth && frontier.length > 0; depth++) {
67
+ const next = [];
68
+ for (const current of frontier) {
69
+ for (const child of this.directSubtypes(current)) {
70
+ if (seen.has(child))
71
+ continue;
72
+ seen.add(child);
73
+ out.push(child);
74
+ next.push(child);
75
+ }
76
+ }
77
+ frontier = next;
78
+ }
79
+ return out;
80
+ }
81
+ /** True when `candidate` is a (transitive) subtype of `base`. */
82
+ isSubtypeOf(candidate, base) {
83
+ return candidate === base || this.subtypesOf(base).includes(candidate);
28
84
  }
29
85
  /** Resolve a (possibly qualified) type name to candidate FQNs. */
30
86
  resolveType(name) {
@@ -66,6 +122,7 @@ export function buildTypeIndex(files) {
66
122
  const index = new TypeIndex();
67
123
  for (const f of files)
68
124
  index.addFile(f);
125
+ index.linkHierarchy();
69
126
  return index;
70
127
  }
71
128
  /** Node id for an unresolved (phantom) call. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/resolver/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/resolver/types.ts"],"names":[],"mappings":"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"}