docuvia 1.19.2 → 1.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../lib/core/src/ast/ast-worker.ts","../../../lib/core/src/ast/declared-type-facts.ts","../../../lib/core/src/ast/call-site-shape-facts.ts","../../../lib/core/src/ast/tier-a-declaration-index.ts"],"sourcesContent":["import { parentPort } from \"worker_threads\";\nimport { Parser, Language, type Node, type Tree } from \"web-tree-sitter\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\nimport { resolveWasmPath } from \"./resolve-wasm-path.js\";\nimport type { LanguageProvider, LanguageRegistry } from \"@workspace/ast-core\";\nimport {\n parseReexportDescriptors,\n parseImportDescriptors,\n loadDefaultRegistry,\n} from \"@workspace/ast-core\";\nimport {\n IpcLoggerClient,\n SUPPORTED_LANGUAGES,\n type AstImportDescriptor,\n type AstReexportDescriptor,\n type AstDeclaredTypeLanguage,\n type AstExportDescriptor,\n type AstDeclaredTypeFacts,\n type AstCallSiteShapeFacts,\n type AstUtf16Span,\n type SupportedLanguage,\n} from \"@workspace/contracts\";\nimport { AstMessages, AstNodeTypes } from \"./ast-constants.js\";\nimport { extractDeclaredTypeFacts } from \"./declared-type-facts.js\";\nimport { extractCallSiteShapeFacts } from \"./call-site-shape-facts.js\";\nimport {\n collectClassNodes,\n collectFunctionNodes,\n collectVariableNodes,\n findEnclosingContainerName,\n resolveCallableName,\n} from \"./tier-a-declaration-index.js\";\nexport {\n collectFunctionNodes,\n resolveCallableName,\n} from \"./tier-a-declaration-index.js\";\n\n/**\n * Worker threads share the host process's stdout/stderr by default, so `console.*` here would\n * corrupt MCP's stdio JSON-RPC stream exactly like it would in the main thread (see\n * docs/gitbook/architecture/logging-architecture.md). A live `ILogger` callback can't cross the\n * `postMessage` structured-clone boundary, so unexpected crashes are reported through the\n * standard IPC Logger Protocol instead (see\n * docs/gitbook/guidelines/playbook-ipc-logging.md) — `AstWorkerPool` routes it back to its own\n * injected logger via `IpcLogRouter`.\n */\nconst logger = new IpcLoggerClient((message) =>\n parentPort?.postMessage(message),\n);\n\nprocess.on(\"uncaughtException\", (err) => {\n logger.error(AstMessages.WORKER_UNCAUGHT_EXCEPTION, {\n error: err instanceof Error ? err.message : String(err),\n });\n});\nprocess.on(\"unhandledRejection\", (err) => {\n logger.error(AstMessages.WORKER_UNHANDLED_REJECTION, {\n error: err instanceof Error ? err.message : String(err),\n });\n});\n\nexport interface AstParseRequest {\n taskId: string;\n filePath: string;\n code: string;\n language: SupportedLanguage;\n}\n\nexport type ImportDescriptor = AstImportDescriptor;\n\nexport interface AstParseResponse {\n taskId: string;\n success: boolean;\n error?: string;\n data?: {\n imports: ImportDescriptor[];\n exports: AstExportDescriptor[];\n reexports?: AstReexportDescriptor[];\n functions: Array<{\n name: string;\n startLine: number;\n endLine: number;\n declarationSpan?: AstUtf16Span;\n contentHash?: string;\n containerName?: string; // NEW — the enclosing class/struct name, or undefined for a top-level function\n }>;\n classes: Array<{\n name: string;\n startLine: number;\n endLine: number;\n methods: string[];\n contentHash?: string;\n }>;\n /** Exported variable declarators (`export const X = ...`) — TS/JS only today (issue #192\n * gap 1). Function-valued initializers (arrow functions / function expressions) are\n * excluded: they are already indexed as functions via `functions`. */\n variables?: Array<{\n name: string;\n startLine: number;\n endLine: number;\n contentHash?: string;\n }>;\n calls: Array<{\n sourceFunction: string;\n targetFunction: string;\n /** 0-based source position of the call-site's callee expression start (matches Tier A's own\n * `startLine`/`startPosition` convention). The seed Tier B forward resolution (issue #11\n * plan A, Slice 2) issues `textDocument/definition` at this position per call site to\n * resolve the callee precisely -- see\n * forward-tier-b-edge-resolution-plan.md Slice 1. */\n startLine: number;\n startColumn: number;\n /** Issue #192 decomposition of the callee expression -- see `getCalleeEvidence`. */\n calleeName?: string;\n receiverText?: string;\n calleeKind?: \"bare\" | \"member\" | \"this\" | \"arg-chain\" | \"computed\";\n }>;\n implements?: Array<{ sourceClass: string; targetInterface: string }>;\n extends?: Array<{ sourceClass: string; targetClass: string }>;\n /** Optional explicit TypeScript/JavaScript syntax facts; not a resolution or proof. */\n declaredTypeFacts?: AstDeclaredTypeFacts;\n /** Optional binding-scoped, syntax-only call features; not a resolution or proof. */\n callSiteShapeFacts?: AstCallSiteShapeFacts;\n /**\n * `new Worker(<path>)` spawn sites (TS/JS only — see `WORKER_SPAWN_LANGUAGES`), one per\n * resolved spawn call, attributing it to its enclosing function like `calls` does.\n * `persist-ast-graph.ts` resolves `targetPath` to a real file and inserts a `DEPENDS_ON`\n * edge from it — the fix for the `ast-worker-pool.ts` -> `ast-worker.ts` false-negative\n * blast-radius gap (dynamic `worker_threads` spawns are invisible to the static\n * imports/calls pipeline, since the target script is a runtime path string, not a static\n * `import`).\n */\n workerSpawns?: Array<{ sourceFunction: string; targetPath: string }>;\n decisions?: string[];\n };\n}\n\nlet parserInitialized = false;\nlet registryPromise: Promise<LanguageRegistry> | null = null;\n\nfunction getRegistry(): Promise<LanguageRegistry> {\n registryPromise ??= loadDefaultRegistry();\n return registryPromise;\n}\n\n// Worker-lifetime cache for loaded tree-sitter grammars, keyed by the resolved wasmPath\n// (deterministic per language -- see resolveWasmPath()). Language.load() is a real WASM\n// dynamic-library load (WebAssembly.instantiate + relocation into the shared runtime's\n// Table/Memory), not a cheap call -- reloading the same grammar per file (the pre-existing\n// behavior) is pure waste once a worker has already loaded it once. Mirrors registryPromise's\n// own memoization shape immediately above. web-tree-sitter's Language class has no\n// delete()/dispose method (verified against the installed 0.25.10 type defs), so there is\n// nothing to release even if this cache were bounded -- see\n// docs/ai_plans/implement_wasm-language-load-cache.md §2.1 for the full check.\nconst languageCache = new Map<string, Promise<Language>>();\n\nfunction getLanguage(wasmPath: string): Promise<Language> {\n let cached = languageCache.get(wasmPath);\n if (!cached) {\n cached = Language.load(wasmPath);\n languageCache.set(wasmPath, cached);\n }\n return cached;\n}\n\n/**\n * Re-exported for backward compatibility (existing importer: `ast-worker.fixture.unit.test.ts`)\n * — the real implementation moved to `resolve-wasm-path.ts` so it can also be imported from the\n * main thread (by `SemanticDiffAnalyzerService`) without pulling in this file's\n * `worker_threads`-only side effects (`parentPort?.on(...)`, process-level\n * `uncaughtException`/`unhandledRejection` handlers). See that file's doc comment for why.\n */\nexport { resolveWasmPath };\n\n/** Regex fallback for imports so graph edges still work when WASM fails to load (e.g. in tests). */\nfunction extractFallbackImports(code: string): ImportDescriptor[] {\n const fallbackImports: ImportDescriptor[] = [];\n const importMatches = code.matchAll(\n /import\\s+{([^}]+)}\\s+from\\s+['\"]([^'\"]+)['\"]/g,\n );\n for (const match of importMatches) {\n fallbackImports.push({\n localName: match[1].trim(),\n originalName: match[1].trim(),\n modulePath: match[2],\n });\n }\n return fallbackImports;\n}\n\n/**\n * Normalizes the many capture shapes the per-language `calls` queries produce into \"the\n * callee expression\":\n * - TS/JS/Go/Rust/C++/Python capture the callee expression *directly* (`@call` sits on the\n * bracketed `[identifier | member_expression]` alternation inside `function:`), so the\n * captured node IS the callee -- it carries none of the fields below and falls through to\n * itself.\n * - Ruby (`method:`), Java (`name:`), PHP (`name:`) capture the bare callee identifier field.\n * - C# captures whole call nodes (`invocation_expression` / `object_creation_expression`),\n * which need unwrapping to their `expression:` / `type:` child.\n */\nfunction unwrapToCalleeExpression(node: Node): Node {\n return (\n node.childForFieldName(\"function\") ||\n node.childForFieldName(\"expression\") || // C# invocation_expression\n node.childForFieldName(\"type\") || // C# object_creation_expression (`new Foo()` -> Foo)\n node.childForFieldName(\"name\") ||\n node.childForFieldName(\"method\") ||\n node\n );\n}\n\n/**\n * Issue #192 root-cause fix: decomposes a call site's callee into the evidence name-based\n * resolution actually needs, instead of persisting one opaque raw string. `target_function`\n * keeps carrying the (whitespace-normalized) full expression for Tier B seeding and #217's\n * impact fallback; the decomposition answers:\n *\n * - `calleeName` — terminal callee identifier (`doSomething` of `service.doSomething()`),\n * what ScopeResolver's bare-name model matches against. Before this change the raw string\n * including the receiver was persisted, making every OOP-style call structurally\n * unmatchable -- the single largest cause of the ~12.8% distinct-target resolution rate.\n * - `receiverText` — receiver expression (`service`, `this.logger`), kept as evidence for\n * import-binding receiver resolution (ScopeResolver.resolveMemberCall).\n * - `calleeKind` — shape classifier. `'arg-chain'` (receiver is itself an invocation result,\n * e.g. `expect(x).toEqual`, `vi.fn().mockResolvedValue`) and `'computed'` (`obj[expr]()`)\n * are structurally unresolvable by name matching; classifying them lets the health-rate\n * denominators exclude them instead of counting them as failures (~51% of the unresolved\n * distinct targets in this repo's own graph were arg-chain junk from mock chains).\n *\n * Language-generic by construction: for any `receiver.callee` shape the callee expression's\n * rightmost named child is the callee identifier and the second-to-last is the receiver\n * (TS/JS nested `member_expression`, Go `selector_expression`, Rust/C++ `field_expression`,\n * Python `attribute`). A bare identifier has no usable second child -> `'bare'`.\n */\nexport function getCalleeEvidence(node: Node): {\n targetFunction: string;\n calleeName?: string;\n receiverText?: string;\n calleeKind?: \"bare\" | \"member\" | \"this\" | \"arg-chain\" | \"computed\";\n} {\n const callee = unwrapToCalleeExpression(node);\n\n const children = callee.namedChildren;\n const terminal = children[children.length - 1];\n const receiver =\n children.length >= 2 ? children[children.length - 2] : undefined;\n\n // Bare identifier call (`foo()`), or a grammar whose query already captured the callee\n // identifier directly (Java `name:`, PHP `name:`, Ruby `method:`).\n if (!terminal || !receiver) {\n return {\n targetFunction: normalizeCallText(callee.text),\n calleeName: callee.text,\n calleeKind: \"bare\",\n };\n }\n\n if (!CALLEE_IDENTIFIER_NODE_TYPES.has(terminal.type)) {\n // Computed access (`obj[expr]()`) -- no static callee name to match on.\n return {\n targetFunction: normalizeCallText(callee.text),\n calleeKind: \"computed\",\n };\n }\n\n const calleeName = terminal.text;\n const receiverText = receiver.text;\n\n // Invocation-result receivers (`expect(x).toEqual`, `vi.fn().mockResolvedValue`,\n // `new Date().toISOString`) -- the receiver's runtime type is the call's return value,\n // unknowable by name matching. A '(' anywhere in the receiver text catches both direct\n // call receivers and deeper chains (`vi.fn().mock.calls[0]`) in one conservative test.\n if (receiverText.includes(\"(\")) {\n return {\n targetFunction: normalizeCallText(callee.text),\n calleeName,\n receiverText,\n calleeKind: \"arg-chain\",\n };\n }\n\n return {\n targetFunction: normalizeCallText(callee.text),\n calleeName,\n receiverText,\n calleeKind:\n receiverText === \"this\" || receiverText === \"super\" ? \"this\" : \"member\",\n };\n}\n\n/** Collapses insignificant whitespace so multi-line call expressions\n * (`vi\\n .fn()`) persist as one comparable string instead of newline-laced junk\n * that no exact-match consumer (#217's impact fallback) could ever hit. */\nfunction normalizeCallText(text: string): string {\n return text.replace(/\\s+/g, \"\");\n}\n\nconst CALLEE_IDENTIFIER_NODE_TYPES = new Set([\n \"identifier\",\n \"property_identifier\",\n \"field_identifier\",\n \"shorthand_property_identifier\",\n \"attribute\",\n]);\n\n/** Resolves a call-site's *seed position* for Tier B forward resolution (issue #11 plan A,\n * Finding C): for a bare identifier call (`foo()`), `node` already *is* the identifier and its\n * own `startPosition` is correct. But for a compound callee -- JS/TS `member_expression`\n * (`service.doSomething()`), Go `selector_expression`, C++/Rust `field_expression` -- the\n * `calls` tree-sitter query (see `lib/ast-core/src/languages/*.ts`) captures the *whole*\n * expression, whose own `startPosition` sits on the receiver (`service`), not the callee\n * (`doSomething`). `textDocument/definition` must be issued at the callee's own position, or it\n * resolves the receiver's declaration instead -- an invented edge (IMPT-002). Verified against\n * real tree-sitter-typescript output (`property` is the correct field name for\n * `member_expression`, confirmed via a real parse, not assumed) -- see this plan's own\n * instruction not to copy field names blind.\n *\n * No-op (falls through to `node.startPosition`, i.e. itself) for languages whose query already\n * captures the callee identifier directly (Java `name:`, PHP `name:`, Ruby `method:`) or for a\n * bare identifier call. */\nfunction getCallSitePosition(node: Node): { row: number; column: number } {\n const calleeIdentifier =\n node.childForFieldName(\"property\") || // JS/TS member_expression\n node.childForFieldName(\"field\") || // Go selector_expression / C++/Rust field_expression\n node.childForFieldName(\"attribute\") || // Python attribute\n node.childForFieldName(\"name\") || // defensive; Java/PHP already capture this directly\n node.childForFieldName(\"method\"); // defensive; Ruby already captures this directly\n return (calleeIdentifier ?? node).startPosition;\n}\n\n/** Shape of a fully-populated `AstParseResponse[\"data\"]` (i.e. the non-optional variant produced once parsing has actually run). */\ntype AstExtractionResult = NonNullable<AstParseResponse[\"data\"]>;\n\n/** Extracts call-site edges via the provider, attributing each call to its enclosing function (or \"anonymous\"), up to the 1000-call circuit breaker. */\nfunction collectCallEdges(\n tree: Tree,\n provider: LanguageProvider,\n functionNodes: Node[],\n calls: AstExtractionResult[\"calls\"],\n): void {\n const functionIds = new Set(functionNodes.map((n) => n.id));\n const callNodes = provider.extractCalls(tree.rootNode);\n for (const node of callNodes) {\n if (calls.length >= 1000) break; // Circuit breaker limit\n const position = getCallSitePosition(node);\n const evidence = getCalleeEvidence(node);\n calls.push({\n sourceFunction: findEnclosingContainerName(node, functionIds),\n targetFunction: evidence.targetFunction,\n startLine: position.row,\n startColumn: position.column,\n calleeName: evidence.calleeName,\n receiverText: evidence.receiverText,\n calleeKind: evidence.calleeKind,\n });\n }\n}\n\n/** Extracts `implements` edges via the provider, if it supports them, attributing each to its enclosing class. */\nfunction collectImplementsEdges(\n tree: Tree,\n provider: LanguageProvider,\n classNodes: Node[],\n implementsList: NonNullable<AstExtractionResult[\"implements\"]>,\n): void {\n if (!provider.extractImplements) return;\n const classIds = new Set(classNodes.map((n) => n.id));\n for (const node of provider.extractImplements(tree.rootNode)) {\n implementsList.push({\n sourceClass: findEnclosingContainerName(node, classIds),\n targetInterface: node.text,\n });\n }\n}\n\n/** Extracts `extends` edges via the provider, if it supports them, attributing each to its enclosing class. */\nfunction collectExtendsEdges(\n tree: Tree,\n provider: LanguageProvider,\n classNodes: Node[],\n extendsList: NonNullable<AstExtractionResult[\"extends\"]>,\n): void {\n if (!provider.extractExtends) return;\n const classIds = new Set(classNodes.map((n) => n.id));\n for (const node of provider.extractExtends(tree.rootNode)) {\n extendsList.push({\n sourceClass: findEnclosingContainerName(node, classIds),\n targetClass: node.text,\n });\n }\n}\n\n/** Languages `collectWorkerSpawns` runs against — the reported gap (a `new Worker(...)` spawn\n * invisible to the static imports/calls pipeline) is TS/JS-specific: `new_expression` is also a\n * real C++ grammar node (the `new` operator), so gating by language avoids misinterpreting an\n * unrelated `new Worker(...)` construction in another language as a worker_threads spawn. */\nconst WORKER_SPAWN_LANGUAGES: ReadonlySet<SupportedLanguage> = new Set([\n SUPPORTED_LANGUAGES.TYPESCRIPT,\n SUPPORTED_LANGUAGES.JAVASCRIPT,\n]);\n\nconst WORKER_CONSTRUCTOR_NAME = \"Worker\";\nconst PATH_MODULE_OBJECT_NAME = \"path\";\nconst PATH_RESOLVE_METHOD_NAME = \"resolve\";\nconst PATH_JOIN_METHOD_NAME = \"join\";\nconst DIRNAME_IDENTIFIER_NAME = \"__dirname\";\n\n/** True when `node` is a `path.resolve(...)`/`path.join(...)` call expression — the exact idiom\n * `ast-worker-pool.ts` uses to build a worker script's path from `__dirname`. */\nfunction isPathJoinOrResolveCall(node: Node): boolean {\n if (node.type !== \"call_expression\") return false;\n const fn = node.childForFieldName(\"function\");\n if (!fn || fn.type !== \"member_expression\") return false;\n const object = fn.childForFieldName(\"object\")?.text;\n const property = fn.childForFieldName(\"property\")?.text;\n return (\n object === PATH_MODULE_OBJECT_NAME &&\n (property === PATH_RESOLVE_METHOD_NAME ||\n property === PATH_JOIN_METHOD_NAME)\n );\n}\n\n/** Extracts the string-literal path segment from a `path.resolve(__dirname, \"<literal>\")` /\n * `path.join(__dirname, \"<literal>\")` call, or undefined if it doesn't reference `__dirname` or\n * carries no string-literal argument. */\nfunction extractDirnameJoinedLiteral(callNode: Node): string | undefined {\n const args = callNode.childForFieldName(\"arguments\");\n if (!args) return undefined;\n const hasDirname = args.namedChildren.some(\n (n) => n?.type === \"identifier\" && n.text === DIRNAME_IDENTIFIER_NAME,\n );\n if (!hasDirname) return undefined;\n const literal = args.descendantsOfType(\"string\")[0];\n return literal?.text.replace(/['\"]/g, \"\");\n}\n\n/** Bounded same-file scan for `<argText> = path.resolve/join(__dirname, \"<literal>\")` — the\n * exact idiom `ast-worker-pool.ts` uses for `this.wPath = path.resolve(__dirname, \"./ast-worker.js\")`,\n * needed because the `new Worker(...)` call site references the field/variable, not the literal,\n * directly. Matches by comparing the assignment's own left-hand-side text against `argText`\n * verbatim (e.g. both \"this.wPath\"), so it works uniformly whether the argument is a bare\n * identifier or a member expression. */\nfunction findDirnameJoinedAssignment(\n tree: Tree,\n argText: string,\n): string | undefined {\n for (const assignment of tree.rootNode.descendantsOfType(\n AstNodeTypes.ASSIGNMENT_EXPRESSION,\n )) {\n if (!assignment) continue;\n const left = assignment.childForFieldName(\"left\");\n const right = assignment.childForFieldName(\"right\");\n if (left?.text !== argText || !right || !isPathJoinOrResolveCall(right)) {\n continue;\n }\n const literal = extractDirnameJoinedLiteral(right);\n if (literal) return literal;\n }\n return undefined;\n}\n\n/** Resolves `new Worker(<arg>)`'s first argument to a literal relative path: a direct string\n * literal, or a same-file `path.resolve/join(__dirname, \"<literal>\")`-assigned field/variable\n * (the `ast-worker-pool.ts` idiom, via `findDirnameJoinedAssignment`). Returns undefined —\n * skip silently, no guessing — when neither shape matches. */\nfunction resolveWorkerArgumentPath(\n tree: Tree,\n argNode: Node,\n): string | undefined {\n if (argNode.type === \"string\") {\n return argNode.text.replace(/['\"]/g, \"\");\n }\n if (argNode.type === \"identifier\" || argNode.type === \"member_expression\") {\n return findDirnameJoinedAssignment(tree, argNode.text);\n }\n return undefined;\n}\n\n/** Extracts `new Worker(<arg>)` spawn sites (TS/JS only, see `WORKER_SPAWN_LANGUAGES`) and\n * appends a `{sourceFunction, targetPath}` descriptor for each one whose argument resolves to a\n * literal relative path (`resolveWorkerArgumentPath`), attributing it to its enclosing function\n * like `collectCallEdges` does. `persist-ast-graph.ts` resolves `targetPath` to a real file and\n * inserts the corresponding `DEPENDS_ON` edge. */\nexport function collectWorkerSpawns(\n tree: Tree,\n language: SupportedLanguage,\n functionNodes: Node[],\n workerSpawns: NonNullable<AstExtractionResult[\"workerSpawns\"]>,\n): void {\n if (!WORKER_SPAWN_LANGUAGES.has(language)) return;\n const functionIds = new Set(functionNodes.map((n) => n.id));\n for (const node of tree.rootNode.descendantsOfType(\"new_expression\")) {\n if (!node) continue;\n const ctor = node.childForFieldName(\"constructor\");\n if (ctor?.text !== WORKER_CONSTRUCTOR_NAME) continue;\n const args = node.childForFieldName(\"arguments\");\n const firstArg = args?.namedChildren.find((n): n is Node => n !== null);\n if (!firstArg) continue;\n const targetPath = resolveWorkerArgumentPath(tree, firstArg);\n if (!targetPath) continue;\n workerSpawns.push({\n sourceFunction: findEnclosingContainerName(node, functionIds),\n targetPath,\n });\n }\n}\n\nfunction namedChildren(node: Node): Node[] {\n const children: Node[] = [];\n for (let index = 0; index < node.namedChildCount; index += 1) {\n const child = node.namedChild(index);\n if (child) children.push(child);\n }\n return children;\n}\n\nfunction directExportDescriptors(root: Node): AstExtractionResult[\"exports\"] {\n const exports: AstExtractionResult[\"exports\"] = [];\n for (const statement of namedChildren(root))\n exports.push(...directExportForStatement(statement));\n return exports;\n}\n\nfunction directExportForStatement(\n statement: Node,\n): AstExtractionResult[\"exports\"] {\n if (statement.type !== \"export_statement\") return [];\n if (/^export\\s+default\\b/u.test(statement.text))\n return [directDefaultExportDescriptor(statement)];\n const declaration = statement.childForFieldName(\"declaration\");\n return declaration ? directExportForDeclaration(declaration) : [];\n}\n\nfunction directDefaultExportDescriptor(statement: Node): AstExportDescriptor {\n const directFunctionSyntax =\n /^export\\s+default\\s+(?:async\\s+)?function(?:\\s|\\*|\\()/u.test(\n statement.text,\n );\n const defaultDeclarationNodes = [\n ...statement.descendantsOfType(\"function_declaration\"),\n ...statement.descendantsOfType(\"generator_function_declaration\"),\n ...statement.descendantsOfType(\"function_expression\"),\n ...statement.descendantsOfType(\"generator_function\"),\n ...statement.descendantsOfType(\"class_declaration\"),\n ...statement.descendantsOfType(\"abstract_class_declaration\"),\n ].filter((node): node is Node => node !== null);\n const declaration =\n statement.childForFieldName(\"declaration\") ??\n defaultDeclarationNodes.sort(\n (left, right) => left.startIndex - right.startIndex,\n )[0];\n if (\n declaration &&\n directFunctionSyntax &&\n [\n \"function_declaration\",\n \"generator_function_declaration\",\n \"function_expression\",\n \"generator_function\",\n ].includes(declaration.type)\n )\n return {\n name: \"default\",\n type: \"function\",\n declarationSpan: {\n start: declaration.startIndex,\n end: declaration.endIndex,\n },\n };\n\n const isClass =\n declaration?.type === \"class_declaration\" ||\n declaration?.type === \"abstract_class_declaration\";\n return {\n name: \"default\",\n type: isClass ? \"class\" : \"other\",\n declarationSpan: declaration\n ? { start: declaration.startIndex, end: declaration.endIndex }\n : { start: statement.startIndex, end: statement.endIndex },\n };\n}\n\nfunction directExportForDeclaration(\n declaration: Node,\n): AstExtractionResult[\"exports\"] {\n const classExport = directClassExportDescriptor(declaration);\n if (classExport) return [classExport];\n const functionExport = directFunctionExportDescriptor(declaration);\n if (functionExport) return [functionExport];\n if (\n declaration.type !== \"lexical_declaration\" &&\n declaration.type !== \"variable_declaration\"\n )\n return [];\n return directVariableExportDescriptors(declaration);\n}\n\nfunction directClassExportDescriptor(\n declaration: Node,\n): AstExtractionResult[\"exports\"][number] | undefined {\n if (\n declaration.type !== \"class_declaration\" &&\n declaration.type !== \"abstract_class_declaration\"\n )\n return undefined;\n const name = declaration.childForFieldName(\"name\");\n return name && [\"identifier\", \"type_identifier\"].includes(name.type)\n ? { name: name.text, type: \"class\" }\n : undefined;\n}\n\nfunction directFunctionExportDescriptor(\n declaration: Node,\n): AstExtractionResult[\"exports\"][number] | undefined {\n if (\n declaration.type !== \"function_declaration\" &&\n declaration.type !== \"generator_function_declaration\"\n )\n return undefined;\n const name = declaration.childForFieldName(\"name\");\n return name?.type === \"identifier\"\n ? { name: name.text, type: \"function\" }\n : undefined;\n}\n\nfunction directVariableExportDescriptors(\n declaration: Node,\n): AstExtractionResult[\"exports\"] {\n const exports: AstExtractionResult[\"exports\"] = [];\n for (const declarator of namedChildren(declaration)) {\n if (declarator.type !== \"variable_declarator\") continue;\n const name = declarator.childForFieldName(\"name\");\n if (name?.type === \"identifier\")\n exports.push({ name: name.text, type: \"variable\" });\n }\n return exports;\n}\n\n/**\n * Runs every provider-driven extraction against a parsed tree (or returns empty results plus a\n * decision note if parsing produced no tree). A single try/catch wraps the whole pass, matching\n * the original inline behavior of recording a `providerQueryFailed` decision instead of throwing\n * when any one extractor misbehaves.\n */\nfunction extractAstData(\n tree: Tree | null,\n provider: LanguageProvider,\n language: SupportedLanguage,\n): AstExtractionResult {\n const decisions: string[] = [];\n const imports: ImportDescriptor[] = [];\n const exports: AstExtractionResult[\"exports\"] = [];\n let reexports: AstReexportDescriptor[] | undefined;\n const functions: AstExtractionResult[\"functions\"] = [];\n const classes: AstExtractionResult[\"classes\"] = [];\n const variables: NonNullable<AstExtractionResult[\"variables\"]> = [];\n const calls: AstExtractionResult[\"calls\"] = [];\n const implementsList: NonNullable<AstExtractionResult[\"implements\"]> = [];\n const extendsList: NonNullable<AstExtractionResult[\"extends\"]> = [];\n const workerSpawns: NonNullable<AstExtractionResult[\"workerSpawns\"]> = [];\n\n if (tree) {\n decisions.push(AstMessages.parsedViaTreeSitter(tree.rootNode.childCount));\n\n try {\n exports.push(...directExportDescriptors(tree.rootNode));\n if (\n language === SUPPORTED_LANGUAGES.TYPESCRIPT ||\n language === SUPPORTED_LANGUAGES.JAVASCRIPT\n ) {\n reexports = parseReexportDescriptors(tree.rootNode);\n }\n const classNodes = collectClassNodes(tree, provider, classes);\n const functionNodes = collectFunctionNodes(\n tree,\n provider,\n functions,\n classNodes,\n );\n\n const importNodes = provider.extractImports(tree.rootNode);\n imports.push(...parseImportDescriptors(importNodes));\n\n collectVariableNodes(tree, provider, variables);\n\n collectCallEdges(tree, provider, functionNodes, calls);\n collectImplementsEdges(tree, provider, classNodes, implementsList);\n collectExtendsEdges(tree, provider, classNodes, extendsList);\n collectWorkerSpawns(tree, language, functionNodes, workerSpawns);\n\n decisions.push(AstMessages.QUERIED_VIA_LANGUAGE_PROVIDER);\n } catch (e) {\n decisions.push(\n AstMessages.providerQueryFailed(\n e instanceof Error ? e.message : String(e),\n ),\n );\n }\n }\n\n return {\n imports,\n exports,\n ...(reexports === undefined ? {} : { reexports }),\n functions,\n classes,\n variables,\n calls,\n implements: implementsList,\n extends: extendsList,\n workerSpawns,\n decisions,\n };\n}\n\n/** Logs any query pattern that failed to compile, then clears them so a later file of the same\n * language doesn't re-report the same failure. Drained rather than read because the provider is\n * reused for the worker's whole lifetime.\n *\n * Exported for the wiring test: the module-scoped `logger` posts to `parentPort`, which is\n * null outside a real worker, so this path is otherwise unobservable (same reason\n * `buildParseResponse` is exported). */\nexport function reportQueryCompileFailures(\n provider: LanguageProvider,\n language: SupportedLanguage,\n): void {\n for (const failure of provider.drainQueryCompileFailures?.() ?? []) {\n logger.error(AstMessages.QUERY_COMPILE_FAILED, {\n language,\n kind: failure.kind,\n pattern: failure.pattern,\n message: failure.message,\n });\n }\n}\n\n/** Parses `request.code` with the resolved provider/grammar and runs the full AST extraction pass, releasing the tree-sitter tree/parser handles once done. */\nfunction parseAndExtract(\n code: string,\n provider: LanguageProvider,\n langInstance: Language,\n language: SupportedLanguage,\n filePath: string,\n): AstExtractionResult {\n const parser = new Parser();\n parser.setLanguage(langInstance);\n\n // initQueries() is idempotent (DefaultProvider caches compiledQueries after the first call)\n // and the provider instance is reused for every file of this language for the worker's whole\n // lifetime (see getRegistry() above), so this only actually compiles once. A field whose\n // pattern fails to compile against the installed grammar degrades to that field's\n // descendantsOfType fallback (DefaultProvider.compileQuery) rather than throwing.\n provider.initQueries?.(langInstance);\n reportQueryCompileFailures(provider, language);\n\n const tree = parser.parse(code);\n const data = extractAstData(tree, provider, language);\n const declaredTypeLanguage = getDeclaredTypeLanguage(language, filePath);\n const result =\n tree && declaredTypeLanguage\n ? {\n ...data,\n declaredTypeFacts: extractDeclaredTypeFacts(\n tree.rootNode,\n declaredTypeLanguage,\n ),\n callSiteShapeFacts: extractCallSiteShapeFacts(\n tree.rootNode,\n declaredTypeLanguage,\n data.calls,\n data.imports,\n ),\n }\n : data;\n\n if (tree) tree.delete();\n parser.delete();\n\n return result;\n}\n\nfunction getDeclaredTypeLanguage(\n language: SupportedLanguage,\n filePath: string,\n): AstDeclaredTypeLanguage | undefined {\n if (language === SUPPORTED_LANGUAGES.TYPESCRIPT)\n return path.extname(filePath).toLowerCase() === \".tsx\"\n ? \"tsx\"\n : \"typescript\";\n if (language === SUPPORTED_LANGUAGES.JAVASCRIPT) return \"javascript\";\n return undefined;\n}\n\n/**\n * Resolves a language provider for `request.filePath` and produces the full parse response,\n * short-circuiting with an empty-but-successful result (plus an explanatory decision note) when\n * no provider is registered for the extension or its wasm grammar can't be located on disk.\n */\nexport async function buildParseResponse(\n request: AstParseRequest,\n): Promise<AstParseResponse> {\n if (!parserInitialized) {\n await Parser.init();\n parserInitialized = true;\n }\n\n const registry = await getRegistry();\n const ext = path.extname(request.filePath);\n const provider: LanguageProvider | undefined =\n registry.getProviderForExtension(ext);\n\n if (!provider) {\n return {\n taskId: request.taskId,\n success: true,\n data: {\n imports: [],\n exports: [],\n functions: [],\n classes: [],\n calls: [],\n decisions: [AstMessages.noLanguageProviderForExtension(ext)],\n },\n };\n }\n\n const { wasmPath, attemptedPaths } = resolveWasmPath(provider.wasm_file);\n\n if (!fs.existsSync(wasmPath)) {\n return {\n taskId: request.taskId,\n success: true,\n data: {\n imports: extractFallbackImports(request.code),\n exports: [],\n functions: [],\n classes: [],\n calls: [],\n decisions: [\n AstMessages.wasmNotFound(request.language, attemptedPaths.join(\", \")),\n ],\n },\n };\n }\n\n const langInstance = await getLanguage(wasmPath);\n const data = parseAndExtract(\n request.code,\n provider,\n langInstance,\n request.language,\n request.filePath,\n );\n\n return {\n taskId: request.taskId,\n success: true,\n data,\n };\n}\n\nparentPort?.on(\"message\", async (request: AstParseRequest) => {\n try {\n const response = await buildParseResponse(request);\n parentPort?.postMessage(response);\n } catch (err: any) {\n parentPort?.postMessage({\n taskId: request.taskId,\n success: false,\n error: err.stack || String(err),\n });\n }\n});\n","import type { Node } from \"web-tree-sitter\";\nimport {\n AST_DECLARED_TYPE_FACTS_SCHEMA_VERSION,\n AST_Q3_RECEIVER_FACTS_SCHEMA_VERSION,\n type AstDeclaredCallableArity,\n type AstDeclaredDeclaration,\n type AstDeclaredDeclarationKind,\n type AstDeclaredOwnerInventory,\n type AstDeclaredTypeFact,\n type AstDeclaredTypeFactKind,\n type AstDeclaredTypeFacts,\n type AstDeclaredTypeLanguage,\n type AstDeclaredTypeOwner,\n type AstDeclaredTypeOwnerKind,\n type AstDeclaredUnsupportedReason,\n type AstDeclaredVisibility,\n type AstQ3ClassDeclarationFact,\n type AstQ3NewReceiverBindingFact,\n type AstQ3TypeAliasFact,\n type AstUtf16Span,\n} from \"@workspace/contracts\";\n\nconst TYPE_FACT_DECLARATIONS = new Map<string, AstDeclaredTypeFactKind>([\n [\"public_field_definition\", \"field-annotation\"],\n [\"field_definition\", \"field-annotation\"],\n [\"property_signature\", \"field-annotation\"],\n [\"required_parameter\", \"parameter-annotation\"],\n [\"optional_parameter\", \"parameter-annotation\"],\n [\"variable_declarator\", \"variable-annotation\"],\n]);\n\nconst RETURN_ANNOTATION_NODES = new Set([\n \"function_declaration\",\n \"function_expression\",\n \"generator_function\",\n \"generator_function_declaration\",\n \"arrow_function\",\n \"method_definition\",\n \"method_signature\",\n \"abstract_method_signature\",\n]);\n\nconst TYPE_SIGNATURE_NODE_TYPES = new Set([\n \"function_type\",\n \"constructor_type\",\n \"call_signature\",\n \"construct_signature\",\n \"index_signature\",\n]);\n\nconst OWNER_NODE_KINDS = new Map<string, AstDeclaredTypeOwnerKind>([\n [\"program\", \"program\"],\n [\"class_declaration\", \"class\"],\n [\"abstract_class_declaration\", \"class\"],\n [\"interface_declaration\", \"interface\"],\n [\"object\", \"object\"],\n [\"function_declaration\", \"function\"],\n [\"function_expression\", \"function\"],\n [\"generator_function\", \"function\"],\n [\"generator_function_declaration\", \"function\"],\n [\"arrow_function\", \"function\"],\n [\"method_definition\", \"method\"],\n [\"method_signature\", \"method\"],\n [\"abstract_method_signature\", \"method\"],\n]);\n\nconst INVENTORY_OWNER_NODE_TYPES = new Set([\n \"class_declaration\",\n \"abstract_class_declaration\",\n \"interface_declaration\",\n \"object\",\n]);\n\nconst MEMBER_KIND_BY_NODE = new Map<string, AstDeclaredDeclarationKind>([\n [\"method_definition\", \"method\"],\n [\"method_signature\", \"method\"],\n [\"abstract_method_signature\", \"method\"],\n [\"public_field_definition\", \"field\"],\n [\"field_definition\", \"field\"],\n [\"property_signature\", \"field\"],\n]);\n\nconst FREE_CALLABLE_NODE_TYPES = new Map<string, AstDeclaredDeclarationKind>([\n [\"function_declaration\", \"function\"],\n [\"function_expression\", \"function-expression\"],\n [\"generator_function\", \"function-expression\"],\n [\"generator_function_declaration\", \"function\"],\n [\"arrow_function\", \"arrow\"],\n]);\n\nconst SKIPPED_OWNER_CHILDREN = new Set([\"comment\", \"class_static_block\"]);\nconst SIMPLE_NAME_NODE_TYPES = new Set([\n \"identifier\",\n \"type_identifier\",\n \"property_identifier\",\n \"private_property_identifier\",\n]);\n\nfunction span(node: Node): AstUtf16Span {\n return { start: node.startIndex, end: node.endIndex };\n}\n\nfunction namedChildren(node: Node): Node[] {\n const result: Node[] = [];\n for (let index = 0; index < node.namedChildCount; index += 1) {\n const child = node.namedChild(index);\n if (child) result.push(child);\n }\n return result;\n}\n\nfunction children(node: Node): Node[] {\n const result: Node[] = [];\n for (let index = 0; index < node.childCount; index += 1) {\n const child = node.child(index);\n if (child) result.push(child);\n }\n return result;\n}\n\nfunction walk(node: Node, visit: (current: Node) => void): void {\n visit(node);\n for (const child of namedChildren(node)) walk(child, visit);\n}\n\nfunction directName(node: Node): string | null {\n const nameNode = node.childForFieldName(\"name\");\n if (!nameNode || !SIMPLE_NAME_NODE_TYPES.has(nameNode.type)) return null;\n return nameNode.text;\n}\n\nfunction typeParameterNames(node: Node): readonly string[] {\n const parameters = node.childForFieldName(\"type_parameters\");\n if (!parameters) return [];\n return namedChildren(parameters)\n .filter((parameter) => parameter.type === \"type_parameter\")\n .map((parameter) => parameter.childForFieldName(\"name\")?.text)\n .filter((name): name is string => Boolean(name));\n}\n\nfunction ownerFromNode(node: Node): AstDeclaredTypeOwner {\n const kind = OWNER_NODE_KINDS.get(node.type) ?? \"program\";\n const name = kind === \"program\" ? null : directName(node);\n return {\n kind,\n name,\n span: span(node),\n genericTypeParameterNames: typeParameterNames(node),\n };\n}\n\nfunction nearestOwner(node: Node | null): AstDeclaredTypeOwner {\n let current = node;\n while (current) {\n if (OWNER_NODE_KINDS.has(current.type)) return ownerFromNode(current);\n current = current.parent;\n }\n return {\n kind: \"program\",\n name: null,\n span: { start: 0, end: 0 },\n genericTypeParameterNames: [],\n };\n}\n\nfunction nearestAncestor(\n node: Node | null,\n matches: (candidate: Node) => boolean,\n): Node | null {\n let current = node;\n while (current) {\n if (matches(current)) return current;\n current = current.parent;\n }\n return null;\n}\n\nfunction isClassOwnerNode(node: Node): boolean {\n return (\n node.type === \"class_declaration\" ||\n node.type === \"abstract_class_declaration\"\n );\n}\n\nfunction isTypeOwnerNode(node: Node): boolean {\n return isClassOwnerNode(node) || node.type === \"interface_declaration\";\n}\n\nfunction isCallableNode(node: Node): boolean {\n return RETURN_ANNOTATION_NODES.has(node.type);\n}\n\nfunction isParameterInsideTypeSignature(node: Node): boolean {\n let current = node.parent;\n while (current) {\n if (isCallableNode(current)) return false;\n if (TYPE_SIGNATURE_NODE_TYPES.has(current.type)) return true;\n current = current.parent;\n }\n return false;\n}\n\nfunction isInsideObjectType(node: Node): boolean {\n let current = node.parent;\n while (current) {\n if (current.type === \"object_type\") return true;\n current = current.parent;\n }\n return false;\n}\n\nfunction callableName(node: Node): string | null {\n const ownName = directName(node);\n if (ownName) return ownName;\n if (node.type !== \"arrow_function\" && node.type !== \"function_expression\")\n return null;\n const parent = node.parent;\n if (!parent) return null;\n const binding =\n parent.type === \"variable_declarator\"\n ? parent.childForFieldName(\"name\")\n : parent.type === \"pair\"\n ? parent.childForFieldName(\"key\")\n : null;\n return binding && SIMPLE_NAME_NODE_TYPES.has(binding.type)\n ? binding.text\n : null;\n}\n\nfunction lexicalScope(node: Node): AstUtf16Span {\n let current: Node | null = node;\n while (current) {\n if (\n current.type === \"program\" ||\n current.type === \"class_body\" ||\n current.type === \"interface_body\" ||\n current.type === \"statement_block\" ||\n current.type === \"object\"\n )\n return span(current);\n if (isCallableNode(current)) {\n const body = current.childForFieldName(\"body\");\n return span(body ?? current);\n }\n current = current.parent;\n }\n return span(node);\n}\n\nfunction varDeclarationScope(node: Node): AstUtf16Span | null {\n if (node.type !== \"variable_declarator\") return null;\n const declaration = node.parent;\n if (declaration?.type !== \"variable_declaration\") return null;\n let current = declaration.parent;\n while (current) {\n if (isCallableNode(current)) {\n const body = current.childForFieldName(\"body\");\n return span(body ?? current);\n }\n if (current.type === \"program\") return span(current);\n current = current.parent;\n }\n return null;\n}\n\nfunction hasModifier(node: Node, modifier: string): boolean {\n return children(node).some((child) => child.text === modifier);\n}\n\nfunction nearestConstructor(node: Node): Node | null {\n let current = node.parent;\n while (current) {\n if (\n current.type === \"method_definition\" &&\n directName(current) === \"constructor\"\n )\n return current;\n if (current.type === \"class_body\" || current.type === \"program\")\n return null;\n current = current.parent;\n }\n return null;\n}\n\nfunction isParameterProperty(\n node: Node,\n language: AstDeclaredTypeLanguage,\n): boolean {\n if (language === \"javascript\" || !nearestConstructor(node)) return false;\n return children(node).some(\n (child) =>\n child.type === \"accessibility_modifier\" || child.text === \"readonly\",\n );\n}\n\nfunction isShadowedTypeParameter(typeNode: Node, name: string): boolean {\n let current = typeNode.parent;\n while (current) {\n if (typeParameterNames(current).includes(name)) return true;\n current = current.parent;\n }\n return false;\n}\n\nfunction simpleTypeReference(node: Node | null): Node | null {\n if (!node || !SIMPLE_NAME_NODE_TYPES.has(node.type)) return null;\n return node;\n}\n\nfunction annotationTypeNode(annotation: Node | null): Node | null {\n if (!annotation || annotation.type !== \"type_annotation\") return null;\n const types = namedChildren(annotation).filter(\n (child) => child.type !== \"comment\",\n );\n return types.length === 1 ? simpleTypeReference(types[0]) : null;\n}\n\nfunction declarationBindingName(node: Node): string | null {\n if (\n node.type === \"required_parameter\" ||\n node.type === \"optional_parameter\"\n ) {\n const pattern = node.childForFieldName(\"pattern\");\n return pattern && SIMPLE_NAME_NODE_TYPES.has(pattern.type)\n ? pattern.text\n : null;\n }\n const name =\n node.childForFieldName(\"name\") ?? node.childForFieldName(\"property\");\n return name && SIMPLE_NAME_NODE_TYPES.has(name.type) ? name.text : null;\n}\n\nfunction factOwner(\n node: Node,\n kind: AstDeclaredTypeFactKind,\n): AstDeclaredTypeOwner {\n if (kind === \"return-annotation\") return ownerFromNode(node);\n const ownerNode =\n kind === \"parameter-property\"\n ? nearestAncestor(node.parent, isClassOwnerNode)\n : kind === \"parameter-annotation\"\n ? nearestAncestor(node.parent, isCallableNode)\n : kind === \"field-annotation\" ||\n kind === \"implements\" ||\n kind === \"extends\"\n ? nearestAncestor(node.parent, isTypeOwnerNode)\n : null;\n if (ownerNode) return ownerFromNode(ownerNode);\n return nearestOwner(node.parent);\n}\n\nfunction factLexicalScope(\n node: Node,\n kind: AstDeclaredTypeFactKind,\n): AstUtf16Span {\n if (kind === \"variable-annotation\" || kind === \"new-initializer\") {\n const varScope = varDeclarationScope(node);\n if (varScope) return varScope;\n }\n if (\n kind === \"parameter-property\" ||\n kind === \"implements\" ||\n kind === \"extends\"\n ) {\n const classNode = nearestAncestor(node.parent, isClassOwnerNode);\n if (classNode)\n return span(classNode.childForFieldName(\"body\") ?? classNode);\n }\n return lexicalScope(node);\n}\n\nfunction makeFact(\n kind: AstDeclaredTypeFactKind,\n name: string | null,\n typeNode: Node | null,\n declaration: Node,\n ownerNode: Node,\n): AstDeclaredTypeFact | null {\n const simpleType = simpleTypeReference(typeNode);\n if (!simpleType || isShadowedTypeParameter(simpleType, simpleType.text))\n return null;\n const owner = factOwner(ownerNode, kind);\n return {\n kind,\n name,\n typeName: simpleType.text,\n typeText: simpleType.text,\n declarationSpan: span(declaration),\n typeSpan: span(simpleType),\n owner,\n lexicalScopeSpan: factLexicalScope(declaration, kind),\n };\n}\n\nfunction typeFactForDeclaration(\n node: Node,\n language: AstDeclaredTypeLanguage,\n): AstDeclaredTypeFact | null {\n const kind = TYPE_FACT_DECLARATIONS.get(node.type);\n if (!kind || language === \"javascript\") return null;\n if (isRejectedTypeDeclaration(node, kind)) return null;\n const annotation = node.childForFieldName(\"type\");\n if (node.hasError || annotation?.hasError) return null;\n const typeNode = annotationTypeNode(annotation);\n const factKind =\n kind === \"parameter-annotation\" && isParameterProperty(node, language)\n ? \"parameter-property\"\n : kind;\n return makeFact(factKind, declarationBindingName(node), typeNode, node, node);\n}\n\nfunction isRejectedTypeDeclaration(\n node: Node,\n kind: AstDeclaredTypeFactKind,\n): boolean {\n return (\n isInsideObjectType(node) ||\n (kind === \"parameter-annotation\" && isParameterInsideTypeSignature(node))\n );\n}\n\nfunction typeFactForReturn(node: Node): AstDeclaredTypeFact | null {\n if (isInsideObjectType(node)) return null;\n const annotation = node.childForFieldName(\"return_type\");\n if (node.hasError || annotation?.hasError) return null;\n const typeNode = annotationTypeNode(annotation);\n return makeFact(\n \"return-annotation\",\n callableName(node),\n typeNode,\n node,\n node,\n );\n}\n\nfunction typeFactForInitializer(node: Node): AstDeclaredTypeFact | null {\n const constructor = newInitializerConstructor(node);\n if (!constructor) return null;\n return makeFact(\n \"new-initializer\",\n declarationBindingName(node),\n constructor,\n node,\n node,\n );\n}\n\nfunction newInitializerConstructor(node: Node): Node | null {\n if (\n node.type !== \"variable_declarator\" &&\n node.type !== \"public_field_definition\" &&\n node.type !== \"field_definition\"\n )\n return null;\n const value = node.childForFieldName(\"value\");\n if (\n node.hasError ||\n value?.type !== \"new_expression\" ||\n value.hasError ||\n value.childForFieldName(\"type_arguments\")\n )\n return null;\n return simpleTypeReference(value.childForFieldName(\"constructor\"));\n}\n\nfunction typeAliasFactForDeclaration(node: Node): AstQ3TypeAliasFact | null {\n if (node.type !== \"type_alias_declaration\" || node.hasError) return null;\n const name = node.childForFieldName(\"name\");\n const typeNode = simpleTypeReference(node.childForFieldName(\"value\"));\n if (\n !name ||\n !SIMPLE_NAME_NODE_TYPES.has(name.type) ||\n !typeNode ||\n isShadowedTypeParameter(typeNode, typeNode.text)\n )\n return null;\n return {\n name: name.text,\n typeName: typeNode.text,\n declarationSpan: span(node),\n typeSpan: span(typeNode),\n owner: nearestOwner(node.parent),\n scopeSpan: lexicalScope(node.parent ?? node),\n genericTypeParameterNames: typeParameterNames(node),\n isExported: node.parent?.type === \"export_statement\",\n };\n}\n\nfunction q3ClassDeclarationFact(node: Node): AstQ3ClassDeclarationFact | null {\n const kind =\n node.type === \"interface_declaration\"\n ? \"interface\"\n : node.type === \"class_declaration\" ||\n node.type === \"abstract_class_declaration\"\n ? \"class\"\n : null;\n const name = directName(node);\n if (!kind || !name) return null;\n return {\n kind,\n name,\n declarationSpan: span(node),\n scopeSpan: lexicalScope(node.parent ?? node),\n genericTypeParameterNames: typeParameterNames(node),\n };\n}\n\nfunction newBindingKind(node: Node): \"const\" | \"let\" | \"var\" | null {\n if (node.type !== \"variable_declarator\") return null;\n const declaration = node.parent;\n if (!declaration) return null;\n const match = /^(const|let|var)\\b/u.exec(declaration.text);\n return match?.[1] === \"const\" || match?.[1] === \"let\" || match?.[1] === \"var\"\n ? match[1]\n : null;\n}\n\nfunction writeTarget(node: Node): Node | null {\n if (\n node.type === \"assignment_expression\" ||\n node.type === \"augmented_assignment_expression\"\n )\n return node.childForFieldName(\"left\");\n if (node.type === \"for_in_statement\" || node.type === \"for_of_statement\")\n return node.childForFieldName(\"left\");\n if (node.type === \"update_expression\")\n return (\n namedChildren(node).find((child) =>\n SIMPLE_NAME_NODE_TYPES.has(child.type),\n ) ?? null\n );\n return null;\n}\n\nfunction collectSimpleWritePositions(\n root: Node,\n): ReadonlyMap<string, readonly number[]> {\n const positions = new Map<string, number[]>();\n walk(root, (node) => {\n const target = writeTarget(node);\n if (target && SIMPLE_NAME_NODE_TYPES.has(target.type) && target.text) {\n const writes = positions.get(target.text) ?? [];\n writes.push(node.startIndex);\n positions.set(target.text, writes);\n }\n });\n return positions;\n}\n\nfunction hasBindingWrite(\n writesByName: ReadonlyMap<string, readonly number[]>,\n name: string,\n scope: AstUtf16Span,\n declarationEnd: number,\n): boolean {\n return (writesByName.get(name) ?? []).some(\n (position) => position > declarationEnd && position <= scope.end,\n );\n}\n\nfunction q3NewReceiverBindingFact(\n node: Node,\n writesByName: ReadonlyMap<string, readonly number[]>,\n): AstQ3NewReceiverBindingFact | null {\n const typeNode = newInitializerConstructor(node);\n const nameNode = node.childForFieldName(\"name\");\n const bindingKind = newBindingKind(node);\n if (\n !typeNode ||\n !nameNode ||\n !SIMPLE_NAME_NODE_TYPES.has(nameNode.type) ||\n !bindingKind\n )\n return null;\n const scopeNode = varDeclarationScope(node) ?? lexicalScope(node);\n const scopeSpan = scopeNode;\n return {\n name: nameNode.text,\n typeName: typeNode.text,\n declarationSpan: span(node),\n scopeSpan,\n bindingKind,\n isReassigned: hasBindingWrite(\n writesByName,\n nameNode.text,\n scopeSpan,\n nameNode.endIndex,\n ),\n };\n}\n\nfunction typeFactsForHeritage(\n node: Node,\n language: AstDeclaredTypeLanguage,\n): AstDeclaredTypeFact[] {\n if (node.hasError) return [];\n if (language === \"javascript\" && node.type === \"class_heritage\")\n return javascriptHeritageFact(node);\n const kind = heritageFactKind(node);\n if (!kind || !isSupportedHeritageNode(node)) return [];\n const targets = heritageTargets(node);\n const owner = nearestOwner(node.parent);\n return targets\n .map((target) => makeFact(kind, owner.name, target, node, node))\n .filter((fact): fact is AstDeclaredTypeFact => fact !== null);\n}\n\nfunction javascriptHeritageFact(node: Node): AstDeclaredTypeFact[] {\n const target = simpleTypeReference(namedChildren(node)[0] ?? null);\n const owner = nearestOwner(node.parent);\n const fact = makeFact(\"extends\", owner.name, target, node, node);\n return fact ? [fact] : [];\n}\n\nfunction heritageFactKind(node: Node): \"implements\" | \"extends\" | null {\n if (node.type === \"implements_clause\") return \"implements\";\n if (node.type === \"extends_clause\" || node.type === \"extends_type_clause\")\n return \"extends\";\n return null;\n}\n\nfunction heritageDeclaration(node: Node): Node | null {\n const declaration = nearestAncestor(node.parent, isTypeOwnerNode);\n const obstructingType = nearestAncestor(\n node.parent,\n (candidate) =>\n candidate.type === \"conditional_type\" ||\n candidate.type === \"type_alias_declaration\",\n );\n if (\n obstructingType &&\n (!declaration || obstructingType.startIndex > declaration.startIndex)\n )\n return null;\n return declaration;\n}\n\nfunction isSupportedHeritageNode(node: Node): boolean {\n const declaration = heritageDeclaration(node);\n if (!declaration || node.childForFieldName(\"type_arguments\")) return false;\n if (node.type === \"extends_type_clause\")\n return declaration.type === \"interface_declaration\";\n return isClassOwnerNode(declaration);\n}\n\nfunction heritageTargets(node: Node): Node[] {\n if (node.type !== \"extends_clause\") return namedChildren(node);\n const value = node.childForFieldName(\"value\");\n return value ? [value] : [];\n}\n\nfunction hasSyntaxError(node: Node): boolean {\n return node.type === \"ERROR\" || node.isMissing || node.hasError;\n}\n\nfunction visibilityOf(\n node: Node,\n memberName: string | null,\n): AstDeclaredVisibility {\n if (memberName?.startsWith(\"#\")) return \"private\";\n const modifier = namedChildren(node).find(\n (child) => child.type === \"accessibility_modifier\",\n );\n if (modifier?.text === \"private\" || modifier?.text === \"protected\")\n return modifier.text;\n return \"public\";\n}\n\nfunction hasOptionalMarker(node: Node): boolean {\n return children(node).some((child) => child.text === \"?\");\n}\n\nfunction parameterNodes(callable: Node): Node[] {\n const parameters = callable.childForFieldName(\"parameters\");\n if (parameters)\n return namedChildren(parameters).filter(\n (parameter) => parameter.type !== \"comment\",\n );\n const parameter = callable.childForFieldName(\"parameter\");\n return parameter ? [parameter] : [];\n}\n\nfunction parameterPattern(parameter: Node): Node | null {\n return parameter.childForFieldName(\"pattern\") ?? parameter;\n}\n\nfunction isRestParameter(parameter: Node): boolean {\n return (\n parameter.type === \"rest_pattern\" ||\n parameterPattern(parameter)?.type === \"rest_pattern\"\n );\n}\n\nfunction isOptionalParameter(parameter: Node): boolean {\n if (\n parameter.type === \"optional_parameter\" ||\n parameter.type === \"rest_pattern\" ||\n parameter.type === \"assignment_pattern\"\n )\n return true;\n if (parameter.childForFieldName(\"value\")) return true;\n return children(parameter).some((child) => child.text === \"?\");\n}\n\nfunction isThisParameter(parameter: Node): boolean {\n return parameterPattern(parameter)?.text === \"this\";\n}\n\nfunction callableArity(callable: Node): AstDeclaredCallableArity {\n const params = parameterNodes(callable).filter(\n (parameter) => !isThisParameter(parameter),\n );\n let requiredParameterCount = 0;\n let hasRest = false;\n params.forEach((parameter, index) => {\n if (isRestParameter(parameter)) hasRest = true;\n else if (!isOptionalParameter(parameter))\n requiredParameterCount = index + 1;\n });\n return {\n requiredParameterCount,\n maxParameterCount: hasRest ? null : params.length,\n };\n}\n\nfunction staticMemberName(node: Node): string | null {\n const name =\n node.childForFieldName(\"name\") ?? node.childForFieldName(\"property\");\n if (name && SIMPLE_NAME_NODE_TYPES.has(name.type)) return name.text;\n return null;\n}\n\nfunction unknownMemberDeclaration(\n node: Node,\n owner: AstDeclaredTypeOwner,\n reason: AstDeclaredUnsupportedReason,\n name: string | null,\n): AstDeclaredDeclaration {\n return {\n kind: \"unknown\",\n name,\n declarationSpan: span(node),\n owner,\n lexicalScopeSpan: span(node),\n visibility: null,\n isStatic: false,\n isAbstract: false,\n isOptional: false,\n arity: null,\n genericTypeParameterNames: [],\n unsupportedReason: reason,\n };\n}\n\nfunction declaredMemberKind(\n kind: AstDeclaredDeclarationKind,\n node: Node,\n name: string,\n): AstDeclaredDeclarationKind {\n if (kind !== \"method\") return kind;\n if (name === \"constructor\") return \"constructor\";\n if (hasModifier(node, \"get\")) return \"getter\";\n if (hasModifier(node, \"set\")) return \"setter\";\n return kind;\n}\n\nfunction memberCallableArity(\n node: Node,\n kind: AstDeclaredDeclarationKind,\n): AstDeclaredCallableArity | null {\n const callable =\n kind === \"method\" ||\n kind === \"constructor\" ||\n kind === \"getter\" ||\n kind === \"setter\";\n if (callable) return callableArity(node);\n const value = node.childForFieldName(\"value\");\n return value && RETURN_ANNOTATION_NODES.has(value.type)\n ? callableArity(value)\n : null;\n}\n\nfunction memberDeclaration(\n node: Node,\n owner: AstDeclaredTypeOwner,\n): AstDeclaredDeclaration {\n const kind = MEMBER_KIND_BY_NODE.get(node.type);\n const name = staticMemberName(node);\n if (hasSyntaxError(node))\n return unknownMemberDeclaration(node, owner, \"syntax-error\", name);\n if (!kind || !name) {\n const reason: AstDeclaredUnsupportedReason = name\n ? \"unsupported-member\"\n : \"computed-name\";\n return unknownMemberDeclaration(node, owner, reason, name);\n }\n const declaredKind = declaredMemberKind(kind, node, name);\n return {\n kind: declaredKind,\n name,\n declarationSpan: span(node),\n owner,\n lexicalScopeSpan: lexicalScope(node),\n visibility: visibilityOf(node, name),\n isStatic: hasModifier(node, \"static\"),\n isAbstract:\n node.type === \"abstract_method_signature\" ||\n hasModifier(node, \"abstract\"),\n isOptional: hasOptionalMarker(node),\n arity: memberCallableArity(node, declaredKind),\n genericTypeParameterNames: typeParameterNames(node),\n };\n}\n\nfunction pairDeclaration(\n node: Node,\n owner: AstDeclaredTypeOwner,\n): AstDeclaredDeclaration {\n const key = node.childForFieldName(\"key\");\n const value = node.childForFieldName(\"value\");\n const name = key && SIMPLE_NAME_NODE_TYPES.has(key.type) ? key.text : null;\n if (!name || !value || hasSyntaxError(node)) {\n const reason: AstDeclaredUnsupportedReason = hasSyntaxError(node)\n ? \"syntax-error\"\n : \"computed-name\";\n return {\n kind: \"unknown\",\n name,\n declarationSpan: span(node),\n owner,\n lexicalScopeSpan: span(node),\n visibility: null,\n isStatic: false,\n isAbstract: false,\n isOptional: false,\n arity: null,\n genericTypeParameterNames: [],\n unsupportedReason: reason,\n };\n }\n return {\n kind: \"field\",\n name,\n declarationSpan: span(node),\n owner,\n lexicalScopeSpan: span(ownerNodeFromSpan(node, owner)),\n visibility: \"public\",\n isStatic: false,\n isAbstract: false,\n isOptional: hasOptionalMarker(node),\n arity: isCallableNode(value) ? callableArity(value) : null,\n genericTypeParameterNames: [],\n };\n}\n\nfunction ownerNodeFromSpan(node: Node, owner: AstDeclaredTypeOwner): Node {\n let current: Node | null = node.parent;\n while (current) {\n const candidate = OWNER_NODE_KINDS.get(current.type);\n if (\n candidate === owner.kind &&\n current.startIndex === owner.span.start &&\n current.endIndex === owner.span.end\n )\n return current;\n current = current.parent;\n }\n return node;\n}\n\nfunction ownerBody(node: Node): Node | null {\n if (node.type === \"object\") return node;\n return node.childForFieldName(\"body\");\n}\n\nfunction unknownParameterProperty(\n parameter: Node,\n owner: AstDeclaredTypeOwner,\n body: Node,\n): AstDeclaredDeclaration {\n return {\n kind: \"unknown\",\n name: null,\n declarationSpan: span(parameter),\n owner,\n lexicalScopeSpan: span(body),\n visibility: null,\n isStatic: false,\n isAbstract: false,\n isOptional: false,\n arity: null,\n genericTypeParameterNames: [],\n unsupportedReason: \"computed-name\",\n };\n}\n\nfunction constructorPropertyDeclaration(\n parameter: Node,\n owner: AstDeclaredTypeOwner,\n body: Node,\n): AstDeclaredDeclaration {\n const name = declarationBindingName(parameter);\n if (!name) return unknownParameterProperty(parameter, owner, body);\n return {\n kind: \"field\",\n name,\n declarationSpan: span(parameter),\n owner,\n lexicalScopeSpan: span(body),\n visibility: visibilityOf(parameter, name),\n isStatic: false,\n isAbstract: false,\n isOptional: hasOptionalMarker(parameter),\n arity: null,\n genericTypeParameterNames: [],\n };\n}\n\nfunction constructorPropertyDeclarations(\n method: Node,\n owner: AstDeclaredTypeOwner,\n body: Node,\n): AstDeclaredDeclaration[] {\n const parameters = method.childForFieldName(\"parameters\");\n return (parameters ? namedChildren(parameters) : [])\n .filter((parameter) => isParameterProperty(parameter, \"typescript\"))\n .map((parameter) => constructorPropertyDeclaration(parameter, owner, body));\n}\n\nfunction childDeclarations(\n child: Node,\n ownerNodeType: string,\n owner: AstDeclaredTypeOwner,\n body: Node,\n): AstDeclaredDeclaration[] {\n if (child.type === \"pair\" && ownerNodeType === \"object\")\n return [pairDeclaration(child, owner)];\n const declaration = memberDeclaration(child, owner);\n const properties =\n declaration.kind === \"constructor\"\n ? constructorPropertyDeclarations(child, owner, body)\n : [];\n return [declaration, ...properties];\n}\n\nfunction collectOwnerDeclarations(\n body: Node,\n ownerNodeType: string,\n owner: AstDeclaredTypeOwner,\n): {\n declarations: AstDeclaredDeclaration[];\n reasons: Set<AstDeclaredUnsupportedReason>;\n} {\n const declarations: AstDeclaredDeclaration[] = [];\n const reasons = new Set<AstDeclaredUnsupportedReason>();\n if (body.hasError) reasons.add(\"syntax-error\");\n for (const child of namedChildren(body)) {\n if (SKIPPED_OWNER_CHILDREN.has(child.type)) continue;\n const childItems = childDeclarations(child, ownerNodeType, owner, body);\n declarations.push(...childItems);\n for (const item of childItems) {\n if (item.unsupportedReason) reasons.add(item.unsupportedReason);\n }\n }\n return { declarations, reasons };\n}\n\nfunction collectOwnerInventory(node: Node): {\n inventory: AstDeclaredOwnerInventory;\n declarations: AstDeclaredDeclaration[];\n} {\n const owner = ownerFromNode(node);\n const body = ownerBody(node);\n const collected = body\n ? collectOwnerDeclarations(body, node.type, owner)\n : {\n declarations: [],\n reasons: new Set<AstDeclaredUnsupportedReason>([\"unsupported-member\"]),\n };\n return {\n inventory: {\n owner,\n complete: collected.reasons.size === 0,\n incompleteReasons: [...collected.reasons].sort(),\n },\n declarations: collected.declarations,\n };\n}\n\nfunction freeCallableDeclaration(node: Node): AstDeclaredDeclaration {\n const kind = FREE_CALLABLE_NODE_TYPES.get(node.type) ?? \"function\";\n return {\n kind,\n name: callableName(node),\n declarationSpan: span(node),\n owner: nearestOwner(node.parent),\n lexicalScopeSpan: lexicalScope(node),\n visibility: null,\n isStatic: false,\n isAbstract: false,\n isOptional: false,\n arity: callableArity(node),\n genericTypeParameterNames: typeParameterNames(node),\n };\n}\n\nfunction isFunctionValueMember(node: Node): boolean {\n const parent = node.parent;\n if (!parent) return false;\n const valueMatchesNode = (value: Node | null) =>\n value?.type === node.type &&\n value.startIndex === node.startIndex &&\n value.endIndex === node.endIndex;\n if (\n (parent.type === \"public_field_definition\" ||\n parent.type === \"field_definition\") &&\n valueMatchesNode(parent.childForFieldName(\"value\"))\n )\n return true;\n if (\n parent.type === \"pair\" &&\n valueMatchesNode(parent.childForFieldName(\"value\"))\n )\n return true;\n return false;\n}\n\nfunction isAnonymousDirectDefaultFunction(node: Node): boolean {\n return (\n node.type === \"function_expression\" &&\n node.parent?.type === \"export_statement\" &&\n /^export\\s+default\\s+(?:async\\s+)?function(?:\\s|\\*|\\()/u.test(\n node.parent.text,\n )\n );\n}\n\nfunction compareFacts(a: AstDeclaredTypeFact, b: AstDeclaredTypeFact): number {\n return (\n a.declarationSpan.start - b.declarationSpan.start ||\n a.typeSpan.start - b.typeSpan.start ||\n a.kind.localeCompare(b.kind)\n );\n}\n\nfunction compareDeclarations(\n a: AstDeclaredDeclaration,\n b: AstDeclaredDeclaration,\n): number {\n return (\n a.declarationSpan.start - b.declarationSpan.start ||\n a.declarationSpan.end - b.declarationSpan.end ||\n a.kind.localeCompare(b.kind)\n );\n}\n\ninterface MutableDeclaredFacts {\n readonly facts: AstDeclaredTypeFact[];\n readonly declarations: AstDeclaredDeclaration[];\n readonly ownerInventories: AstDeclaredOwnerInventory[];\n readonly q3Classes: AstQ3ClassDeclarationFact[];\n readonly q3TypeAliases: AstQ3TypeAliasFact[];\n readonly q3NewReceiverBindings: AstQ3NewReceiverBindingFact[];\n readonly visitedOwners: Set<string>;\n}\n\nfunction appendNodeTypeFacts(\n node: Node,\n language: AstDeclaredTypeLanguage,\n writePositionsByName: ReadonlyMap<string, readonly number[]>,\n accumulator: MutableDeclaredFacts,\n): void {\n const annotationFact = typeFactForDeclaration(node, language);\n if (annotationFact) accumulator.facts.push(annotationFact);\n const returnFact = typeFactForReturn(node);\n if (returnFact) accumulator.facts.push(returnFact);\n const initializerFact = typeFactForInitializer(node);\n if (initializerFact) accumulator.facts.push(initializerFact);\n const q3TypeAlias = typeAliasFactForDeclaration(node);\n if (q3TypeAlias) accumulator.q3TypeAliases.push(q3TypeAlias);\n const q3Class = q3ClassDeclarationFact(node);\n if (q3Class) accumulator.q3Classes.push(q3Class);\n const q3NewReceiverBinding = q3NewReceiverBindingFact(\n node,\n writePositionsByName,\n );\n if (q3NewReceiverBinding)\n accumulator.q3NewReceiverBindings.push(q3NewReceiverBinding);\n accumulator.facts.push(...typeFactsForHeritage(node, language));\n}\n\nfunction appendOwnerInventory(\n node: Node,\n accumulator: MutableDeclaredFacts,\n): void {\n if (!INVENTORY_OWNER_NODE_TYPES.has(node.type)) return;\n const key = `${node.startIndex}:${node.endIndex}:${node.type}`;\n if (accumulator.visitedOwners.has(key)) return;\n accumulator.visitedOwners.add(key);\n const collected = collectOwnerInventory(node);\n accumulator.ownerInventories.push(collected.inventory);\n accumulator.declarations.push(...collected.declarations);\n}\n\nfunction appendFreeCallableDeclaration(\n node: Node,\n accumulator: MutableDeclaredFacts,\n): void {\n if (\n !FREE_CALLABLE_NODE_TYPES.has(node.type) ||\n (isFunctionValueMember(node) && !isAnonymousDirectDefaultFunction(node))\n )\n return;\n accumulator.declarations.push(freeCallableDeclaration(node));\n}\n\nfunction isSimpleTopLevelValueNode(node: Node): boolean {\n if (node.type !== \"variable_declarator\" || node.hasError) return false;\n const nameNode = node.childForFieldName(\"name\");\n if (\n !nameNode ||\n !SIMPLE_NAME_NODE_TYPES.has(nameNode.type) ||\n nearestOwner(node.parent).kind !== \"program\"\n )\n return false;\n const value = node.childForFieldName(\"value\");\n return !value || !FREE_CALLABLE_NODE_TYPES.has(value.type);\n}\n\nfunction hasDirectExportAncestor(node: Node): boolean {\n let current: Node | null = node.parent;\n while (current && current.type !== \"program\") {\n if (current.type === \"export_statement\") return true;\n if (OWNER_NODE_KINDS.has(current.type)) return false;\n current = current.parent;\n }\n return false;\n}\n\nfunction directlyExportedTopLevelValue(\n node: Node,\n): AstDeclaredDeclaration | null {\n if (!isSimpleTopLevelValueNode(node) || !hasDirectExportAncestor(node))\n return null;\n const nameNode = node.childForFieldName(\"name\");\n if (!nameNode) return null;\n const owner = nearestOwner(node.parent);\n return {\n kind: \"unknown\",\n name: nameNode.text,\n declarationSpan: span(node),\n owner,\n lexicalScopeSpan: lexicalScope(node),\n visibility: null,\n isStatic: false,\n isAbstract: false,\n isOptional: false,\n arity: null,\n genericTypeParameterNames: [],\n };\n}\n\nfunction collectDeclaredFactsForNode(\n node: Node,\n language: AstDeclaredTypeLanguage,\n writePositionsByName: ReadonlyMap<string, readonly number[]>,\n accumulator: MutableDeclaredFacts,\n): void {\n appendNodeTypeFacts(node, language, writePositionsByName, accumulator);\n appendOwnerInventory(node, accumulator);\n appendFreeCallableDeclaration(node, accumulator);\n const exportedValue = directlyExportedTopLevelValue(node);\n if (exportedValue) accumulator.declarations.push(exportedValue);\n}\n\n/**\n * Extract explicit TS/JS type syntax and a separate declaration/member inventory. The result\n * contains no graph IDs, parser allocation IDs, source hashes, or inferred type relationships.\n */\nexport function extractDeclaredTypeFacts(\n root: Node,\n language: AstDeclaredTypeLanguage,\n): AstDeclaredTypeFacts {\n if (\n language !== \"typescript\" &&\n language !== \"tsx\" &&\n language !== \"javascript\"\n )\n throw new RangeError(\n `Unsupported declared-type grammar: ${String(language)}`,\n );\n\n const facts: AstDeclaredTypeFact[] = [];\n const declarations: AstDeclaredDeclaration[] = [];\n const ownerInventories: AstDeclaredOwnerInventory[] = [];\n const q3Classes: AstQ3ClassDeclarationFact[] = [];\n const q3TypeAliases: AstQ3TypeAliasFact[] = [];\n const q3NewReceiverBindings: AstQ3NewReceiverBindingFact[] = [];\n const writePositionsByName = collectSimpleWritePositions(root);\n const visitedOwners = new Set<string>();\n const accumulator: MutableDeclaredFacts = {\n facts,\n declarations,\n ownerInventories,\n q3Classes,\n q3TypeAliases,\n q3NewReceiverBindings,\n visitedOwners,\n };\n\n walk(root, (node) =>\n collectDeclaredFactsForNode(\n node,\n language,\n writePositionsByName,\n accumulator,\n ),\n );\n\n facts.sort(compareFacts);\n declarations.sort(compareDeclarations);\n ownerInventories.sort(\n (a, b) =>\n a.owner.span.start - b.owner.span.start ||\n a.owner.kind.localeCompare(b.owner.kind),\n );\n q3TypeAliases.sort(\n (a, b) => a.declarationSpan.start - b.declarationSpan.start,\n );\n q3Classes.sort((a, b) => a.declarationSpan.start - b.declarationSpan.start);\n q3NewReceiverBindings.sort(\n (a, b) => a.declarationSpan.start - b.declarationSpan.start,\n );\n\n return {\n schemaVersion: AST_DECLARED_TYPE_FACTS_SCHEMA_VERSION,\n language,\n facts,\n declarations,\n ownerInventories,\n q3ReceiverFacts: {\n schemaVersion: AST_Q3_RECEIVER_FACTS_SCHEMA_VERSION,\n classes: q3Classes,\n typeAliases: q3TypeAliases,\n newReceiverBindings: q3NewReceiverBindings,\n },\n };\n}\n","import type { Node } from \"web-tree-sitter\";\nimport {\n AST_CALL_SITE_SHAPE_SCHEMA_VERSION,\n type AstCallCalleeBinding,\n type AstCallArgumentKind,\n type AstCallReceiverBinding,\n type AstCallSiteShapeFact,\n type AstCallSiteShapeFacts,\n type AstImportDescriptor,\n type AstDeclaredTypeLanguage,\n type AstUtf16Span,\n} from \"@workspace/contracts\";\n\nconst CALLABLE_SCOPE_TYPES = new Set([\n \"arrow_function\",\n \"function_declaration\",\n \"function_expression\",\n \"generator_function\",\n \"generator_function_declaration\",\n \"method_definition\",\n]);\nconst CLASS_TYPES = new Set([\n \"class_declaration\",\n \"abstract_class_declaration\",\n \"class\",\n]);\nconst NAMED_SHADOW_DECLARATION_TYPES = new Set([\n \"class\",\n \"class_declaration\",\n \"abstract_class_declaration\",\n \"function_expression\",\n \"function_declaration\",\n \"generator_function\",\n \"generator_function_declaration\",\n]);\nconst TYPE_SIGNATURE_TYPES = new Set([\n \"function_type\",\n \"constructor_type\",\n \"call_signature\",\n \"construct_signature\",\n \"index_signature\",\n \"object_type\",\n]);\nconst FOR_SCOPE_TYPES = new Set([\n \"for_statement\",\n \"for_in_statement\",\n \"for_of_statement\",\n \"for_await_statement\",\n]);\nconst BINDING_PATTERN_TYPES = new Set([\n \"object_pattern\",\n \"array_pattern\",\n \"pair_pattern\",\n \"assignment_pattern\",\n \"object_assignment_pattern\",\n \"rest_pattern\",\n]);\nconst SIMPLE_IDENTIFIER = /^[$_\\p{ID_Start}][$_\\u200C\\u200D\\p{ID_Continue}]*$/u;\n\ninterface WorkerCallSite {\n readonly startLine: number;\n readonly startColumn: number;\n readonly calleeName?: string;\n readonly receiverText?: string;\n readonly calleeKind?: \"bare\" | \"member\" | \"this\" | \"arg-chain\" | \"computed\";\n}\n\ntype SupportedWorkerCallSite = WorkerCallSite & {\n readonly calleeName: string;\n readonly calleeKind?: \"bare\" | \"member\" | \"this\" | \"arg-chain\";\n};\n\ninterface PendingFact {\n readonly fact: Omit<AstCallSiteShapeFact, \"peerMemberNames\">;\n readonly peerKey: string | null;\n}\n\ninterface IndexedBinding {\n readonly name: string;\n readonly declarationSpan: AstUtf16Span;\n readonly scopeSpan: AstUtf16Span;\n readonly kind:\n | AstCallReceiverBinding[\"kind\"]\n | \"import\"\n | \"type-only-import\"\n | \"unsupported\";\n}\n\ninterface ShapeIndexes {\n readonly callExpressions: ReadonlyMap<string, readonly Node[]>;\n readonly bindingsByScope: ReadonlyMap<\n string,\n ReadonlyMap<string, IndexedBinding>\n >;\n readonly propertiesByClassAndName: ReadonlyMap<\n string,\n AstCallReceiverBinding | null\n >;\n}\n\nfunction span(node: Node): AstUtf16Span {\n return { start: node.startIndex, end: node.endIndex };\n}\n\nfunction namedChildren(node: Node): Node[] {\n const result: Node[] = [];\n for (let index = 0; index < node.namedChildCount; index += 1) {\n const child = node.namedChild(index);\n if (child) result.push(child);\n }\n return result;\n}\n\nfunction allChildren(node: Node): Node[] {\n const result: Node[] = [];\n for (let index = 0; index < node.childCount; index += 1) {\n const child = node.child(index);\n if (child) result.push(child);\n }\n return result;\n}\n\nfunction walk(node: Node, visit: (current: Node) => void): void {\n visit(node);\n for (const child of namedChildren(node)) walk(child, visit);\n}\n\nfunction ancestor(\n node: Node | null,\n accepts: (current: Node) => boolean,\n): Node | null {\n let current = node;\n while (current) {\n if (accepts(current)) return current;\n current = current.parent;\n }\n return null;\n}\n\nfunction bindingName(node: Node): string | null {\n const name =\n node.childForFieldName(\"name\") ??\n node.childForFieldName(\"pattern\") ??\n node.childForFieldName(\"declarator\");\n return name?.type === \"identifier\" ? name.text : null;\n}\n\nfunction nearestScope(\n node: Node,\n accepts: (current: Node) => boolean,\n root: Node,\n): Node {\n return ancestor(node.parent, accepts) ?? root;\n}\n\nfunction declarationKind(node: Node): string | undefined {\n return node.parent?.text.trimStart().match(/^(var|let|const)\\b/)?.[1];\n}\n\nfunction bindingScope(node: Node, root: Node): Node {\n if (node.type === \"required_parameter\" || node.type === \"optional_parameter\")\n return nearestScope(\n node,\n (current) => CALLABLE_SCOPE_TYPES.has(current.type),\n root,\n );\n const kind = declarationKind(node);\n if (kind === \"var\")\n return nearestScope(\n node,\n (current) => CALLABLE_SCOPE_TYPES.has(current.type),\n root,\n );\n const forScope = ancestor(node.parent, (current) =>\n FOR_SCOPE_TYPES.has(current.type),\n );\n if (forScope) return forScope;\n return nearestScope(\n node,\n (current) => current.type === \"statement_block\",\n root,\n );\n}\n\nfunction lexicalScope(node: Node, root: Node): Node {\n return (\n ancestor(node.parent, (current) =>\n CALLABLE_SCOPE_TYPES.has(current.type),\n ) ?? root\n );\n}\n\nfunction classThisOwner(node: Node): Node | null {\n let current = node.parent;\n while (current) {\n if (CLASS_TYPES.has(current.type)) return current;\n if (current.type === \"arrow_function\") {\n current = current.parent;\n continue;\n }\n if (\n CALLABLE_SCOPE_TYPES.has(current.type) &&\n !(\n current.type === \"method_definition\" &&\n current.parent?.type === \"class_body\"\n )\n )\n return null;\n current = current.parent;\n }\n return null;\n}\n\nfunction callerType(node: Node): AstCallSiteShapeFact[\"callerType\"] {\n const owner = classThisOwner(node);\n const name = owner?.childForFieldName(\"name\")?.text;\n return owner && name ? { name, span: span(owner) } : null;\n}\n\nfunction fieldBinding(\n propertyName: string,\n classNode: Node,\n member: Node,\n): AstCallReceiverBinding | null {\n if (\n (member.type !== \"public_field_definition\" &&\n member.type !== \"field_definition\") ||\n member.childForFieldName(\"name\")?.text !== propertyName\n )\n return null;\n return {\n kind: \"field\",\n name: propertyName,\n declarationSpan: span(member),\n scopeSpan: span(classNode),\n };\n}\n\nfunction patternNames(node: Node): string[] {\n if (node.type === \"identifier\") return [node.text];\n if (\n node.type === \"shorthand_property_identifier_pattern\" ||\n node.type === \"shorthand_property_identifier\"\n )\n return [node.text];\n if (!BINDING_PATTERN_TYPES.has(node.type)) return [];\n return namedChildren(node).flatMap(patternNames);\n}\n\nfunction addBinding(\n index: Map<string, Map<string, IndexedBinding>>,\n node: Node,\n scope: Node,\n kind: IndexedBinding[\"kind\"],\n names: readonly string[],\n): void {\n const key = scopeIndexKey(scope);\n const bindings = index.get(key) ?? new Map<string, IndexedBinding>();\n for (const name of names) {\n const existing = bindings.get(name);\n if (existing) {\n if (\n existing.declarationSpan.start !== node.startIndex ||\n existing.declarationSpan.end !== node.endIndex\n )\n bindings.set(name, { ...existing, kind: \"unsupported\" });\n continue;\n }\n bindings.set(name, {\n name,\n declarationSpan: span(node),\n scopeSpan: span(scope),\n kind,\n });\n }\n index.set(key, bindings);\n}\n\nfunction indexCallableBinding(\n node: Node,\n root: Node,\n index: Map<string, Map<string, IndexedBinding>>,\n): void {\n if (\n ancestor(node.parent, (current) => TYPE_SIGNATURE_TYPES.has(current.type))\n )\n return;\n const pattern =\n node.childForFieldName(\"name\") ??\n node.childForFieldName(\"pattern\") ??\n node.childForFieldName(\"declarator\");\n if (!pattern) return;\n const names = patternNames(pattern);\n const simple = pattern.type === \"identifier\";\n const loopBinding = ancestor(node.parent, (current) =>\n FOR_SCOPE_TYPES.has(current.type),\n );\n const kind: IndexedBinding[\"kind\"] =\n simple &&\n (node.type === \"required_parameter\" || node.type === \"optional_parameter\")\n ? \"parameter\"\n : loopBinding\n ? \"unsupported\"\n : simple\n ? \"local\"\n : \"unsupported\";\n addBinding(index, node, bindingScope(node, root), kind, names);\n}\n\nfunction indexDirectCallableParameters(\n node: Node,\n index: Map<string, Map<string, IndexedBinding>>,\n): void {\n if (!CALLABLE_SCOPE_TYPES.has(node.type)) return;\n const parameters = node.childForFieldName(\"parameters\");\n const directParameter = node.childForFieldName(\"parameter\");\n const candidates = parameters\n ? namedChildren(parameters)\n : directParameter\n ? [directParameter]\n : [];\n for (const parameter of candidates) {\n if (\n parameter.type === \"required_parameter\" ||\n parameter.type === \"optional_parameter\"\n )\n continue;\n const names = patternNames(parameter);\n if (names.length === 0) continue;\n const simple = parameter.type === \"identifier\";\n addBinding(\n index,\n parameter,\n node,\n simple ? \"parameter\" : \"unsupported\",\n names,\n );\n }\n}\n\nfunction indexNamedDeclarationShadow(\n node: Node,\n root: Node,\n index: Map<string, Map<string, IndexedBinding>>,\n): void {\n if (!NAMED_SHADOW_DECLARATION_TYPES.has(node.type)) return;\n const name = node.childForFieldName(\"name\");\n if (name?.type !== \"identifier\" && name?.type !== \"type_identifier\") return;\n const ownNameScope =\n node.type === \"class\" ||\n node.type === \"function_expression\" ||\n node.type === \"generator_function\";\n const scope = ownNameScope\n ? node\n : nearestScope(node, (current) => current.type === \"statement_block\", root);\n addBinding(index, name, scope, \"unsupported\", [name.text]);\n}\n\nfunction indexCatchBinding(\n node: Node,\n index: Map<string, Map<string, IndexedBinding>>,\n): void {\n if (node.type !== \"catch_clause\") return;\n const parameter = node.childForFieldName(\"parameter\");\n if (!parameter) return;\n const body = node.childForFieldName(\"body\") ?? node;\n addBinding(index, parameter, body, \"unsupported\", patternNames(parameter));\n}\n\nfunction indexLoopBinding(\n node: Node,\n index: Map<string, Map<string, IndexedBinding>>,\n): void {\n if (!FOR_SCOPE_TYPES.has(node.type)) return;\n const declaration =\n node.childForFieldName(\"left\") ?? node.childForFieldName(\"initializer\");\n if (!declaration) return;\n const declarator =\n declaration.type === \"variable_declaration\"\n ? namedChildren(declaration).find(\n (child) => child.type === \"variable_declarator\",\n )\n : declaration;\n const pattern =\n declarator?.type === \"variable_declarator\"\n ? declarator.childForFieldName(\"name\")\n : declarator;\n if (!pattern) return;\n addBinding(index, pattern, node, \"unsupported\", patternNames(pattern));\n}\n\nfunction indexImportBindings(\n root: Node,\n imports: readonly AstImportDescriptor[],\n index: Map<string, Map<string, IndexedBinding>>,\n): void {\n const bindings = index.get(scopeIndexKey(root)) ?? new Map();\n for (const [name, descriptors] of groupImportBindings(imports))\n setImportBinding(root, bindings, name, descriptors);\n index.set(scopeIndexKey(root), bindings);\n}\n\nfunction groupImportBindings(\n imports: readonly AstImportDescriptor[],\n): Map<string, AstImportDescriptor[]> {\n const importsByName = new Map<string, AstImportDescriptor[]>();\n for (const descriptor of imports) {\n if (descriptor.viaReexport) continue;\n const matches = importsByName.get(descriptor.localName) ?? [];\n matches.push(descriptor);\n importsByName.set(descriptor.localName, matches);\n }\n return importsByName;\n}\n\nfunction setImportBinding(\n root: Node,\n bindings: Map<string, IndexedBinding>,\n name: string,\n descriptors: readonly AstImportDescriptor[],\n): void {\n const existing = bindings.get(name);\n const scopeSpan = span(root);\n if (descriptors.length !== 1 || existing) {\n bindings.set(name, {\n name,\n declarationSpan: existing?.declarationSpan ?? scopeSpan,\n scopeSpan,\n kind: \"unsupported\",\n });\n return;\n }\n bindings.set(name, {\n name,\n declarationSpan: scopeSpan,\n scopeSpan,\n kind: descriptors[0]?.isTypeOnly ? \"type-only-import\" : \"import\",\n });\n}\n\nfunction buildBindingIndex(\n root: Node,\n imports: readonly AstImportDescriptor[],\n): Map<string, Map<string, IndexedBinding>> {\n const index = new Map<string, Map<string, IndexedBinding>>();\n walk(root, (node) => {\n if (\n node.type === \"required_parameter\" ||\n node.type === \"optional_parameter\" ||\n node.type === \"variable_declarator\"\n )\n indexCallableBinding(node, root, index);\n indexDirectCallableParameters(node, index);\n indexNamedDeclarationShadow(node, root, index);\n indexCatchBinding(node, index);\n indexLoopBinding(node, index);\n });\n indexImportBindings(root, imports, index);\n return index;\n}\n\nfunction propertyIndexKey(classNode: Node, name: string): string {\n return `${classNode.startIndex}:${name}`;\n}\n\nfunction scopeIndexKey(node: Node): string {\n return `${node.type}:${node.startIndex}:${node.endIndex}`;\n}\n\nfunction setPropertyBinding(\n index: Map<string, AstCallReceiverBinding | null>,\n key: string,\n binding: AstCallReceiverBinding,\n): void {\n index.set(key, index.has(key) ? null : binding);\n}\n\nfunction hasParameterPropertyModifier(node: Node): boolean {\n return allChildren(node).some(\n (child) =>\n child.type === \"accessibility_modifier\" || child.text === \"readonly\",\n );\n}\n\nfunction indexConstructorProperties(\n classNode: Node,\n member: Node,\n index: Map<string, AstCallReceiverBinding | null>,\n): void {\n if (\n member.type !== \"method_definition\" ||\n member.childForFieldName(\"name\")?.text !== \"constructor\"\n )\n return;\n const parameters = member.childForFieldName(\"parameters\");\n for (const parameter of parameters ? namedChildren(parameters) : []) {\n const property = bindingName(parameter);\n if (!property || !hasParameterPropertyModifier(parameter)) continue;\n setPropertyBinding(index, propertyIndexKey(classNode, property), {\n kind: \"parameter-property\",\n name: property,\n declarationSpan: span(parameter),\n scopeSpan: span(classNode),\n });\n }\n}\n\nfunction indexClassProperties(\n classNode: Node,\n index: Map<string, AstCallReceiverBinding | null>,\n): void {\n const body = classNode.childForFieldName(\"body\");\n for (const member of body ? namedChildren(body) : []) {\n const name = member.childForFieldName(\"name\")?.text;\n const field = name ? fieldBinding(name, classNode, member) : null;\n if (field)\n setPropertyBinding(index, propertyIndexKey(classNode, name!), field);\n indexConstructorProperties(classNode, member, index);\n }\n}\n\nfunction buildPropertyIndex(\n root: Node,\n): Map<string, AstCallReceiverBinding | null> {\n const index = new Map<string, AstCallReceiverBinding | null>();\n walk(root, (node) => {\n if (CLASS_TYPES.has(node.type)) indexClassProperties(node, index);\n });\n return index;\n}\n\nfunction callSiteIndexKey(row: number, column: number, name: string): string {\n return `${row}:${column}:${name}`;\n}\n\nfunction buildShapeIndexes(\n root: Node,\n imports: readonly AstImportDescriptor[],\n): ShapeIndexes {\n const calls = new Map<string, Node[]>();\n walk(root, (node) => {\n if (node.type !== \"call_expression\") return;\n const callee = node.childForFieldName(\"function\");\n if (!callee) return;\n const position =\n callee.childForFieldName(\"property\") ??\n callee.childForFieldName(\"name\") ??\n callee;\n const name = callee.childForFieldName(\"property\")?.text ?? callee.text;\n const key = callSiteIndexKey(\n position.startPosition.row,\n position.startPosition.column,\n name,\n );\n calls.set(key, [...(calls.get(key) ?? []), node]);\n });\n return {\n callExpressions: calls,\n bindingsByScope: buildBindingIndex(root, imports),\n propertiesByClassAndName: buildPropertyIndex(root),\n };\n}\n\nfunction resolveThisReceiverBinding(\n receiverText: string,\n call: Node,\n indexes: ShapeIndexes,\n): AstCallReceiverBinding | null | undefined {\n const owner = classThisOwner(call);\n if (receiverText === \"this\")\n return owner\n ? {\n kind: \"this\",\n name: \"this\",\n declarationSpan: span(owner),\n scopeSpan: span(owner),\n }\n : null;\n const property = receiverText.match(\n /^this\\.([\\p{ID_Start}_$][\\p{ID_Continue}$]*)$/u,\n );\n if (!property) return undefined;\n return owner\n ? (indexes.propertiesByClassAndName.get(\n propertyIndexKey(owner, property[1]),\n ) ?? null)\n : null;\n}\n\nfunction resolveReceiverBinding(\n receiverText: string | undefined,\n call: Node,\n indexes: ShapeIndexes,\n): AstCallReceiverBinding | null {\n if (!receiverText) return null;\n const thisBinding = resolveThisReceiverBinding(receiverText, call, indexes);\n if (thisBinding !== undefined) return thisBinding;\n if (!SIMPLE_IDENTIFIER.test(receiverText)) return null;\n const binding = findLexicalBinding(receiverText, call, indexes);\n return binding ? bindingResult(receiverText, binding) : null;\n}\n\nfunction findLexicalBinding(\n name: string,\n node: Node,\n indexes: ShapeIndexes,\n): IndexedBinding | undefined {\n let current: Node | null = node;\n while (current) {\n const binding = indexes.bindingsByScope\n .get(scopeIndexKey(current))\n ?.get(name);\n if (binding) return binding;\n current = current.parent;\n }\n return undefined;\n}\n\nfunction bindingResult(\n name: string,\n candidate: IndexedBinding | null,\n): AstCallReceiverBinding | null {\n if (\n !candidate ||\n candidate.kind === \"unsupported\" ||\n candidate.kind === \"import\" ||\n candidate.kind === \"type-only-import\"\n )\n return null;\n return {\n kind: candidate.kind,\n name,\n declarationSpan: candidate.declarationSpan,\n scopeSpan: candidate.scopeSpan,\n };\n}\n\nfunction calleeBinding(\n record: SupportedWorkerCallSite,\n call: Node,\n indexes: ShapeIndexes,\n): AstCallCalleeBinding | null {\n const kind = record.calleeKind ?? \"bare\";\n if (kind !== \"bare\") return null;\n const name = record.calleeName;\n const binding = findLexicalBinding(name, call, indexes);\n if (!binding) return { kind: \"unbound\", name };\n const bindingKind =\n binding.kind === \"import\" ||\n binding.kind === \"type-only-import\" ||\n binding.kind === \"local\" ||\n binding.kind === \"parameter\"\n ? binding.kind\n : \"unsupported\";\n return {\n kind: bindingKind,\n name,\n declarationSpan: binding.declarationSpan,\n scopeSpan: binding.scopeSpan,\n };\n}\n\nfunction argumentKind(node: Node): AstCallArgumentKind {\n switch (node.type) {\n case \"string\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"true\":\n case \"false\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"object\":\n return \"object\";\n case \"array\":\n return \"array\";\n case \"arrow_function\":\n case \"function_expression\":\n return \"function\";\n default:\n return \"unknown\";\n }\n}\n\nfunction peerKey(\n scope: AstUtf16Span,\n binding: AstCallReceiverBinding | null,\n): string | null {\n if (!binding) return null;\n return [\n scope.start,\n scope.end,\n binding.kind,\n binding.declarationSpan.start,\n binding.declarationSpan.end,\n binding.scopeSpan.start,\n binding.scopeSpan.end,\n ].join(\":\");\n}\n\nfunction findCall(record: WorkerCallSite, indexes: ShapeIndexes): Node | null {\n if (!record.calleeName || record.calleeKind === \"computed\") return null;\n const calls = indexes.callExpressions.get(\n callSiteIndexKey(record.startLine, record.startColumn, record.calleeName),\n );\n return calls?.length === 1 ? (calls[0] ?? null) : null;\n}\n\nfunction isSupportedCall(\n record: WorkerCallSite,\n): record is SupportedWorkerCallSite {\n return Boolean(record.calleeName) && record.calleeKind !== \"computed\";\n}\n\nfunction pendingForCall(\n record: SupportedWorkerCallSite,\n call: Node,\n root: Node,\n indexes: ShapeIndexes,\n): PendingFact {\n const argsNode = call.childForFieldName(\"arguments\");\n const args = argsNode\n ? namedChildren(argsNode).filter((argument) => argument.type !== \"comment\")\n : [];\n const hasSpreadArgument = args.some(\n (argument) => argument.type === \"spread_element\",\n );\n const scope = lexicalScope(call, root);\n const binding = resolveReceiverBinding(record.receiverText, call, indexes);\n const callBinding = calleeBinding(record, call, indexes);\n const argumentsStart = call.childForFieldName(\"arguments\")?.startIndex;\n const calleeSource = call.text.slice(\n 0,\n argumentsStart === undefined\n ? call.text.length\n : argumentsStart - call.startIndex,\n );\n const fact: Omit<AstCallSiteShapeFact, \"peerMemberNames\"> = {\n startLine: record.startLine,\n startColumn: record.startColumn,\n calleeName: record.calleeName ?? \"\",\n calleeKind: record.calleeKind ?? \"bare\",\n receiverText: record.receiverText ?? null,\n receiverBinding: binding,\n receiverOptional: calleeSource.includes(\"?.\"),\n calleeBinding: callBinding,\n lexicalScopeSpan: span(scope),\n callerType: callerType(call),\n argumentCount: hasSpreadArgument ? null : args.length,\n hasSpreadArgument,\n argumentKinds: args.map(argumentKind),\n };\n return { fact, peerKey: peerKey(fact.lexicalScopeSpan, binding) };\n}\n\nfunction addPeerName(\n namesByPeer: Map<string, Set<string>>,\n fact: Omit<AstCallSiteShapeFact, \"peerMemberNames\">,\n key: string | null,\n): void {\n if (!key || (fact.calleeKind !== \"member\" && fact.calleeKind !== \"this\"))\n return;\n const names = namesByPeer.get(key) ?? new Set<string>();\n names.add(fact.calleeName);\n namesByPeer.set(key, names);\n}\n\n/** Extracts real TS/JS call syntax into additive, binding-scoped facts. */\nexport function extractCallSiteShapeFacts(\n root: Node,\n language: AstDeclaredTypeLanguage,\n calls: readonly WorkerCallSite[],\n imports: readonly AstImportDescriptor[],\n): AstCallSiteShapeFacts {\n const indexes = buildShapeIndexes(root, imports);\n const pending = calls.flatMap((record) => {\n if (!isSupportedCall(record)) return [];\n const call = findCall(record, indexes);\n return call ? [pendingForCall(record, call, root, indexes)] : [];\n });\n const namesByPeer = new Map<string, Set<string>>();\n for (const { fact, peerKey: key } of pending) {\n addPeerName(namesByPeer, fact, key);\n }\n const callSites = pending.map(({ fact, peerKey: key }) => ({\n ...fact,\n peerMemberNames: [...(key ? (namesByPeer.get(key) ?? []) : [])]\n .filter((name) => name !== fact.calleeName)\n .sort(),\n }));\n return {\n schemaVersion: AST_CALL_SITE_SHAPE_SCHEMA_VERSION,\n language,\n callSites,\n };\n}\n","import { createHash } from \"node:crypto\";\nimport type { LanguageProvider } from \"@workspace/ast-core\";\nimport { LanguageNodeTypes } from \"@workspace/ast-core\";\nimport { ENCODING_HEX, HASH_ALGO_SHA256 } from \"@workspace/contracts\";\nimport type { Node, Tree } from \"web-tree-sitter\";\nimport {\n buildQualifiedBaseKey,\n buildUniqueNodeKey,\n} from \"../graph/node-key.js\";\nimport { AstMessages, AstNodeTypes } from \"./ast-constants.js\";\n\nexport interface TierAFunctionSummary {\n readonly name: string;\n readonly startLine: number;\n readonly endLine: number;\n readonly declarationSpan?: { readonly start: number; readonly end: number };\n readonly contentHash?: string;\n readonly containerName?: string;\n}\n\nexport interface TierAClassSummary {\n readonly name: string;\n readonly startLine: number;\n readonly endLine: number;\n readonly methods: string[];\n readonly contentHash?: string;\n}\n\nexport interface TierAVariableSummary {\n readonly name: string;\n readonly startLine: number;\n readonly endLine: number;\n readonly contentHash?: string;\n}\n\nexport interface TierAIndexedDeclaration {\n readonly nodeKey: string;\n readonly name: string;\n readonly containerName?: string;\n readonly nodeType: string;\n readonly startLine: number;\n readonly endLine: number;\n readonly startIndex: number;\n readonly endIndex: number;\n readonly nameStartIndex: number | null;\n readonly sourceText: string;\n readonly signatureText: string;\n}\n\ninterface CallableName {\n readonly name: string;\n readonly nameNode: Node | null | undefined;\n}\n\nconst NAME_BEARING_PARENT_TYPES = new Set<string>([\n AstNodeTypes.VARIABLE_DECLARATOR,\n AstNodeTypes.ASSIGNMENT_EXPRESSION,\n AstNodeTypes.PAIR,\n AstNodeTypes.PUBLIC_FIELD_DEFINITION,\n]);\n\nconst CALLABLE_SCOPE_NODE_TYPES = new Set<string>([\n LanguageNodeTypes.ARROW_FUNCTION,\n LanguageNodeTypes.FUNCTION_EXPRESSION,\n LanguageNodeTypes.FUNCTION_DECLARATION,\n LanguageNodeTypes.GENERATOR_FUNCTION,\n LanguageNodeTypes.GENERATOR_FUNCTION_DECLARATION,\n LanguageNodeTypes.FUNCTION_DEFINITION,\n LanguageNodeTypes.METHOD_DECLARATION,\n LanguageNodeTypes.METHOD_DEFINITION,\n LanguageNodeTypes.LOCAL_FUNCTION_STATEMENT,\n LanguageNodeTypes.CONSTRUCTOR_DECLARATION,\n LanguageNodeTypes.DESTRUCTOR_DECLARATION,\n LanguageNodeTypes.CONVERSION_OPERATOR_DECLARATION,\n LanguageNodeTypes.OPERATOR_DECLARATION,\n LanguageNodeTypes.COMPACT_CONSTRUCTOR_DECLARATION,\n LanguageNodeTypes.METHOD,\n LanguageNodeTypes.SINGLETON_METHOD,\n LanguageNodeTypes.FUNCTION_ITEM,\n]);\n\n/**\n * Symbol-level feature hash (STOR-005): a hash of the AST node's own exact source span\n * (`node.text`), independent of the containing file's blob hash. Lets a single-symbol edit\n * produce a one-line JSONL diff for that symbol without touching its untouched siblings' hashes.\n *\n * The algorithm/digest constants come from `@workspace/contracts` (issue #211) so the worker's\n * hashes can never drift from the main thread's (`ast-worker-pool.ts`, `file-discovery.service.ts`)\n * or `lib/schema`'s. Package-name imports resolve through node_modules and work fine inside a\n * `worker_threads` Worker (as the existing contracts/ast-core imports above prove) — only bare\n * relative `.js`-to-`.ts` sibling imports needed a tsx resolve hook that doesn't propagate into\n * workers, and even that limitation is moot in dist/ where a fully-compiled worker ships.\n */\nfunction symbolContentHash(node: Node): string {\n return createHash(HASH_ALGO_SHA256).update(node.text).digest(ENCODING_HEX);\n}\n\nfunction getNodeName(node: Node): string {\n return (\n node.childForFieldName(\"name\")?.text ||\n node.descendantsOfType(LanguageNodeTypes.IDENTIFIER)[0]?.text ||\n AstMessages.ANONYMOUS_NAME\n );\n}\n\nfunction resolveDeclaratorNestedName(node: Node): Node | null | undefined {\n return node.childForFieldName(\"declarator\")?.childForFieldName(\"declarator\");\n}\n\nfunction callableNameFromDeclaration(node: Node): CallableName | undefined {\n const ownName = node.childForFieldName(\"name\");\n if (ownName) return { name: ownName.text, nameNode: ownName };\n\n const declaratorName = resolveDeclaratorNestedName(node);\n if (!declaratorName) return undefined;\n if (declaratorName.type !== AstNodeTypes.QUALIFIED_IDENTIFIER)\n return { name: declaratorName.text, nameNode: declaratorName };\n const qualifiedName = declaratorName.childForFieldName(\"name\");\n return {\n name: qualifiedName?.text ?? AstMessages.ANONYMOUS_NAME,\n nameNode: qualifiedName,\n };\n}\n\nfunction callableNameFromParent(node: Node): CallableName | undefined {\n let current = node.parent;\n while (current) {\n // An `arguments` ancestor means this callable is itself passed as a call argument\n // (for example, `arr.map(x => x + 1)`). Stop here: climbing further would misattribute\n // the outer binding, such as `results` in `const results = arr.map(...)`, to this callback.\n if (current.type === AstNodeTypes.ARGUMENTS) return undefined;\n // A callable nested in another function belongs to its own scope. Do not climb through that\n // boundary to inherit an outer binding, as with `const factory = () => { return () => {}; }`.\n if (CALLABLE_SCOPE_NODE_TYPES.has(current.type)) return undefined;\n if (NAME_BEARING_PARENT_TYPES.has(current.type)) {\n const nameNode =\n current.childForFieldName(\"name\") ||\n current.childForFieldName(\"key\") ||\n current.childForFieldName(\"left\");\n if (nameNode) return { name: nameNode.text, nameNode };\n }\n current = current.parent;\n }\n return undefined;\n}\n\nfunction callableName(node: Node): CallableName {\n return (\n callableNameFromDeclaration(node) ??\n callableNameFromParent(node) ?? {\n name: AstMessages.ANONYMOUS_NAME,\n nameNode: undefined,\n }\n );\n}\n\nexport function resolveCallableName(node: Node): string {\n return callableName(node).name;\n}\n\n/** Walk to the nearest extracted function/class container, or return the anonymous sentinel. */\nexport function findEnclosingContainerName(\n node: Node,\n containerIds: ReadonlySet<number>,\n): string {\n let current = node.parent;\n while (current) {\n if (containerIds.has(current.id)) return getNodeName(current);\n current = current.parent;\n }\n return AstMessages.ANONYMOUS_NAME;\n}\n\n/** Unwrap Rust generic impl and Go pointer receiver fields to their contained type identifier. */\nfunction firstTypeIdentifierText(node: Node): string | undefined {\n return node.type === AstNodeTypes.TYPE_IDENTIFIER\n ? node.text\n : node.descendantsOfType(AstNodeTypes.TYPE_IDENTIFIER)[0]?.text;\n}\n\n/**\n * GRPH-006 (Rust): `impl_item` is not part of the extracted class nodes, so the lexical ancestor\n * walk returns `anonymous`. The concrete Self type is on the impl's `type` field; for `impl Trait\n * for Type`, use `Type`, not the trait name.\n */\nfunction resolveRustImplContainerName(node: Node): string | undefined {\n let current = node.parent;\n while (current) {\n if (current.type === AstNodeTypes.IMPL_ITEM) {\n const typeField = current.childForFieldName(\"type\");\n return typeField ? firstTypeIdentifierText(typeField) : undefined;\n }\n current = current.parent;\n }\n return undefined;\n}\n\n/**\n * GRPH-006 (Go): a method's receiver type is in its own `receiver` field, not an ancestor; a\n * `type_declaration` does not enclose a `method_declaration`.\n */\nfunction resolveGoReceiverContainerName(node: Node): string | undefined {\n const receiver = node.childForFieldName(\"receiver\");\n const paramType = receiver?.namedChild(0)?.childForFieldName(\"type\");\n return paramType ? firstTypeIdentifierText(paramType) : undefined;\n}\n\n/**\n * GRPH-006 (C++): out-of-line `Ret Class::method(){}` is not lexically inside the class. Its\n * declarator's `qualified_identifier.scope` supplies the immediate container; nested qualifiers\n * use the innermost scope, matching the index's single-level containment rule.\n */\nfunction resolveCppQualifiedContainerName(node: Node): string | undefined {\n const declarator = node.childForFieldName(\"declarator\");\n const inner = declarator?.childForFieldName(\"declarator\");\n if (inner?.type !== AstNodeTypes.QUALIFIED_IDENTIFIER) return undefined;\n const scope = inner.childForFieldName(\"scope\");\n if (!scope) return undefined;\n return scope.type === AstNodeTypes.QUALIFIED_IDENTIFIER\n ? scope.childForFieldName(\"name\")?.text\n : scope.text;\n}\n\n/** Apply the Rust, Go, and C++ non-lexical container rules after the generic ancestor walk misses. */\nfunction resolveDeferredLanguageContainerName(node: Node): string | undefined {\n return (\n resolveRustImplContainerName(node) ??\n resolveGoReceiverContainerName(node) ??\n resolveCppQualifiedContainerName(node)\n );\n}\n\nexport function collectClassNodes(\n tree: Tree,\n provider: LanguageProvider,\n classes: TierAClassSummary[],\n): Node[] {\n const classNodes = provider.extractClasses(tree.rootNode);\n for (const node of classNodes) {\n classes.push({\n name: getNodeName(node),\n startLine: node.startPosition.row,\n endLine: node.endPosition.row,\n methods: [],\n contentHash: symbolContentHash(node),\n });\n }\n return classNodes;\n}\n\nconst FUNCTION_VALUE_NODE_TYPES = new Set<string>([\n LanguageNodeTypes.ARROW_FUNCTION,\n LanguageNodeTypes.FUNCTION_EXPRESSION,\n]);\n\nexport function collectVariableNodes(\n tree: Tree,\n provider: LanguageProvider,\n variables: TierAVariableSummary[],\n): Node[] {\n const variableNodes = provider.extractVariables?.(tree.rootNode) ?? [];\n const indexableNodes: Node[] = [];\n for (const node of variableNodes) {\n const value = node.childForFieldName(\"value\");\n if (value && FUNCTION_VALUE_NODE_TYPES.has(value.type)) continue;\n indexableNodes.push(node);\n variables.push({\n name: getNodeName(node),\n startLine: node.startPosition.row,\n endLine: node.endPosition.row,\n contentHash: symbolContentHash(node),\n });\n }\n return indexableNodes;\n}\n\nexport function collectFunctionNodes(\n tree: Tree,\n provider: LanguageProvider,\n functions: TierAFunctionSummary[],\n classNodes: Node[],\n): Node[] {\n const classIds = new Set(classNodes.map((node) => node.id));\n const functionNodes = provider.extractFunctions(tree.rootNode);\n for (const node of functionNodes) {\n const container = findEnclosingContainerName(node, classIds);\n // The anonymous sentinel means top-level here. Persisting it as a real container would\n // incorrectly qualify every top-level function as `file#anonymous.name`.\n const containerName =\n container === AstMessages.ANONYMOUS_NAME\n ? resolveDeferredLanguageContainerName(node)\n : container;\n functions.push({\n name: callableName(node).name,\n startLine: node.startPosition.row,\n endLine: node.endPosition.row,\n declarationSpan: { start: node.startIndex, end: node.endIndex },\n contentHash: symbolContentHash(node),\n containerName,\n });\n }\n return functionNodes;\n}\n\nexport function extractTierAIndexedDeclarations(\n filePath: string,\n tree: Tree,\n provider: LanguageProvider,\n): TierAIndexedDeclaration[] {\n const classes: TierAClassSummary[] = [];\n const functions: TierAFunctionSummary[] = [];\n const variables: TierAVariableSummary[] = [];\n const classNodes = collectClassNodes(tree, provider, classes);\n const functionNodes = collectFunctionNodes(\n tree,\n provider,\n functions,\n classNodes,\n );\n const variableNodes = collectVariableNodes(tree, provider, variables);\n const usedNodeKeys = new Set<string>([filePath]);\n const declarations: TierAIndexedDeclaration[] = [];\n\n for (let index = 0; index < functionNodes.length; index += 1) {\n const node = functionNodes[index];\n const summary = functions[index];\n if (!node || !summary) continue;\n const nodeKey = buildUniqueNodeKey(\n usedNodeKeys,\n buildQualifiedBaseKey(filePath, summary.name, summary.containerName),\n summary.startLine,\n );\n usedNodeKeys.add(nodeKey);\n declarations.push(\n indexedDeclaration(nodeKey, summary.name, summary.containerName, node),\n );\n }\n\n for (let index = 0; index < classNodes.length; index += 1) {\n const node = classNodes[index];\n const summary = classes[index];\n if (!node || !summary) continue;\n const nodeKey = buildUniqueNodeKey(\n usedNodeKeys,\n buildQualifiedBaseKey(filePath, summary.name),\n summary.startLine,\n );\n usedNodeKeys.add(nodeKey);\n declarations.push(\n indexedDeclaration(nodeKey, summary.name, undefined, node),\n );\n }\n\n for (let index = 0; index < variableNodes.length; index += 1) {\n const node = variableNodes[index];\n const summary = variables[index];\n if (!node || !summary) continue;\n const nodeKey = buildUniqueNodeKey(\n usedNodeKeys,\n buildQualifiedBaseKey(filePath, summary.name),\n summary.startLine,\n );\n usedNodeKeys.add(nodeKey);\n declarations.push(\n indexedDeclaration(nodeKey, summary.name, undefined, node),\n );\n }\n\n return declarations;\n}\n\nfunction indexedDeclaration(\n nodeKey: string,\n name: string,\n containerName: string | undefined,\n node: Node,\n): TierAIndexedDeclaration {\n const nameNode =\n node.childForFieldName(\"name\") ?? callableName(node).nameNode;\n return {\n nodeKey,\n name,\n containerName,\n nodeType: node.type,\n startLine: node.startPosition.row,\n endLine: node.endPosition.row,\n startIndex: node.startIndex,\n endIndex: node.endIndex,\n nameStartIndex: nameNode?.startIndex ?? null,\n sourceText: node.text,\n signatureText: signatureText(node),\n };\n}\n\nfunction signatureText(node: Node): string {\n const body = node.childForFieldName(\"body\");\n if (!body) return node.text.trim();\n return node.text.slice(0, body.startIndex - node.startIndex).trim();\n}\n"],"mappings":"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","names":["parentPort","Parser","Language","path","fs","TYPE_FACT_DECLARATIONS","RETURN_ANNOTATION_NODES","TYPE_SIGNATURE_NODE_TYPES","OWNER_NODE_KINDS","INVENTORY_OWNER_NODE_TYPES","MEMBER_KIND_BY_NODE","FREE_CALLABLE_NODE_TYPES","SKIPPED_OWNER_CHILDREN","SIMPLE_NAME_NODE_TYPES","span","node","namedChildren","result","index","child","children","walk","visit","directName","nameNode","typeParameterNames","parameters","parameter","name","ownerFromNode","kind","nearestOwner","current","nearestAncestor","matches","isClassOwnerNode","isTypeOwnerNode","isCallableNode","isParameterInsideTypeSignature","isInsideObjectType","callableName","ownName","parent","binding","lexicalScope","body","varDeclarationScope","declaration","hasModifier","modifier","nearestConstructor","isParameterProperty","language","isShadowedTypeParameter","typeNode","simpleTypeReference","annotationTypeNode","annotation","types","declarationBindingName","pattern","factOwner","ownerNode","factLexicalScope","varScope","classNode","makeFact","simpleType","owner","typeFactForDeclaration","isRejectedTypeDeclaration","factKind","typeFactForReturn","typeFactForInitializer","constructor","newInitializerConstructor","value","typeAliasFactForDeclaration","q3ClassDeclarationFact","newBindingKind","match","writeTarget","collectSimpleWritePositions","root","positions","target","writes","hasBindingWrite","writesByName","scope","declarationEnd","position","q3NewReceiverBindingFact","bindingKind","scopeSpan","typeFactsForHeritage","javascriptHeritageFact","heritageFactKind","isSupportedHeritageNode","targets","heritageTargets","fact","heritageDeclaration","obstructingType","candidate","hasSyntaxError","visibilityOf","memberName","hasOptionalMarker","parameterNodes","callable","parameterPattern","isRestParameter","isOptionalParameter","isThisParameter","callableArity","params","requiredParameterCount","hasRest","staticMemberName","unknownMemberDeclaration","reason","declaredMemberKind","memberCallableArity","memberDeclaration","declaredKind","pairDeclaration","key","ownerNodeFromSpan","ownerBody","unknownParameterProperty","constructorPropertyDeclaration","constructorPropertyDeclarations","method","childDeclarations","ownerNodeType","properties","collectOwnerDeclarations","declarations","reasons","childItems","item","collectOwnerInventory","collected","freeCallableDeclaration","isFunctionValueMember","valueMatchesNode","isAnonymousDirectDefaultFunction","compareFacts","a","b","compareDeclarations","appendNodeTypeFacts","writePositionsByName","accumulator","annotationFact","returnFact","initializerFact","q3TypeAlias","q3Class","q3NewReceiverBinding","appendOwnerInventory","appendFreeCallableDeclaration","isSimpleTopLevelValueNode","hasDirectExportAncestor","directlyExportedTopLevelValue","collectDeclaredFactsForNode","exportedValue","extractDeclaredTypeFacts","facts","ownerInventories","q3Classes","q3TypeAliases","q3NewReceiverBindings","CALLABLE_SCOPE_TYPES","CLASS_TYPES","NAMED_SHADOW_DECLARATION_TYPES","TYPE_SIGNATURE_TYPES","FOR_SCOPE_TYPES","BINDING_PATTERN_TYPES","SIMPLE_IDENTIFIER","span","node","namedChildren","result","index","child","allChildren","walk","visit","ancestor","accepts","current","bindingName","name","nearestScope","root","declarationKind","bindingScope","forScope","lexicalScope","classThisOwner","callerType","owner","fieldBinding","propertyName","classNode","member","patternNames","addBinding","scope","kind","names","key","scopeIndexKey","bindings","existing","indexCallableBinding","pattern","simple","loopBinding","indexDirectCallableParameters","parameters","directParameter","candidates","parameter","indexNamedDeclarationShadow","indexCatchBinding","body","indexLoopBinding","declaration","declarator","indexImportBindings","imports","descriptors","groupImportBindings","setImportBinding","importsByName","descriptor","matches","scopeSpan","buildBindingIndex","propertyIndexKey","setPropertyBinding","binding","hasParameterPropertyModifier","indexConstructorProperties","property","indexClassProperties","field","buildPropertyIndex","callSiteIndexKey","row","column","buildShapeIndexes","calls","callee","position","resolveThisReceiverBinding","receiverText","call","indexes","resolveReceiverBinding","thisBinding","findLexicalBinding","bindingResult","candidate","calleeBinding","record","argumentKind","peerKey","findCall","isSupportedCall","pendingForCall","argsNode","args","argument","hasSpreadArgument","callBinding","argumentsStart","calleeSource","fact","addPeerName","namesByPeer","extractCallSiteShapeFacts","language","pending","callSites","createHash","NAME_BEARING_PARENT_TYPES","AstNodeTypes","CALLABLE_SCOPE_NODE_TYPES","LanguageNodeTypes","symbolContentHash","node","createHash","HASH_ALGO_SHA256","getNodeName","AstMessages","resolveDeclaratorNestedName","callableNameFromDeclaration","ownName","declaratorName","qualifiedName","callableNameFromParent","current","nameNode","callableName","resolveCallableName","findEnclosingContainerName","containerIds","firstTypeIdentifierText","resolveRustImplContainerName","typeField","resolveGoReceiverContainerName","paramType","resolveCppQualifiedContainerName","inner","scope","resolveDeferredLanguageContainerName","collectClassNodes","tree","provider","classes","classNodes","FUNCTION_VALUE_NODE_TYPES","collectVariableNodes","variables","variableNodes","indexableNodes","value","collectFunctionNodes","functions","classIds","functionNodes","container","containerName","logger","IpcLoggerClient","message","parentPort","err","AstMessages","parserInitialized","registryPromise","getRegistry","loadDefaultRegistry","languageCache","getLanguage","wasmPath","cached","Language","extractFallbackImports","code","fallbackImports","importMatches","match","unwrapToCalleeExpression","node","getCalleeEvidence","callee","children","terminal","receiver","normalizeCallText","CALLEE_IDENTIFIER_NODE_TYPES","calleeName","receiverText","text","getCallSitePosition","collectCallEdges","tree","provider","functionNodes","calls","functionIds","n","callNodes","position","evidence","findEnclosingContainerName","collectImplementsEdges","classNodes","implementsList","classIds","collectExtendsEdges","extendsList","WORKER_SPAWN_LANGUAGES","SUPPORTED_LANGUAGES","WORKER_CONSTRUCTOR_NAME","PATH_MODULE_OBJECT_NAME","PATH_RESOLVE_METHOD_NAME","PATH_JOIN_METHOD_NAME","DIRNAME_IDENTIFIER_NAME","isPathJoinOrResolveCall","fn","object","property","extractDirnameJoinedLiteral","callNode","args","findDirnameJoinedAssignment","argText","assignment","AstNodeTypes","left","right","literal","resolveWorkerArgumentPath","argNode","collectWorkerSpawns","language","workerSpawns","firstArg","targetPath","namedChildren","index","child","directExportDescriptors","root","exports","statement","directExportForStatement","directDefaultExportDescriptor","declaration","directExportForDeclaration","directFunctionSyntax","defaultDeclarationNodes","classExport","directClassExportDescriptor","functionExport","directFunctionExportDescriptor","directVariableExportDescriptors","name","declarator","extractAstData","decisions","imports","reexports","functions","classes","variables","AstMessages","parseReexportDescriptors","collectClassNodes","collectFunctionNodes","importNodes","parseImportDescriptors","collectVariableNodes","e","reportQueryCompileFailures","failure","logger","parseAndExtract","langInstance","filePath","parser","Parser","data","declaredTypeLanguage","getDeclaredTypeLanguage","result","extractDeclaredTypeFacts","extractCallSiteShapeFacts","buildParseResponse","request","parserInitialized","registry","getRegistry","ext","wasmPath","attemptedPaths","resolveWasmPath","getLanguage","parentPort","response","err"]}
1
+ {"version":3,"sources":["../../../lib/core/src/ast/ast-worker.ts","../../../lib/core/src/ast/declared-type-facts.ts","../../../lib/core/src/ast/call-site-shape-facts.ts","../../../lib/core/src/ast/tier-a-declaration-index.ts"],"sourcesContent":["import { parentPort } from \"worker_threads\";\nimport { Parser, Language, type Node, type Tree } from \"web-tree-sitter\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\nimport { resolveWasmPath } from \"./resolve-wasm-path.js\";\nimport type { LanguageProvider, LanguageRegistry } from \"@workspace/ast-core\";\nimport {\n parseReexportDescriptors,\n parseImportDescriptors,\n loadDefaultRegistry,\n} from \"@workspace/ast-core\";\nimport {\n IpcLoggerClient,\n SUPPORTED_LANGUAGES,\n type AstImportDescriptor,\n type AstReexportDescriptor,\n type AstDeclaredTypeLanguage,\n type AstExportDescriptor,\n type AstDeclaredTypeFacts,\n type AstCallSiteShapeFacts,\n type AstUtf16Span,\n type SupportedLanguage,\n} from \"@workspace/contracts\";\nimport { AstMessages, AstNodeTypes } from \"./ast-constants.js\";\nimport { extractDeclaredTypeFacts } from \"./declared-type-facts.js\";\nimport { extractCallSiteShapeFacts } from \"./call-site-shape-facts.js\";\nimport {\n collectClassNodes,\n collectFunctionNodes,\n collectVariableNodes,\n findEnclosingContainerName,\n resolveCallableName,\n} from \"./tier-a-declaration-index.js\";\nexport {\n collectFunctionNodes,\n resolveCallableName,\n} from \"./tier-a-declaration-index.js\";\n\n/**\n * Worker threads share the host process's stdout/stderr by default, so `console.*` here would\n * corrupt MCP's stdio JSON-RPC stream exactly like it would in the main thread (see\n * docs/gitbook/architecture/logging-architecture.md). A live `ILogger` callback can't cross the\n * `postMessage` structured-clone boundary, so unexpected crashes are reported through the\n * standard IPC Logger Protocol instead (see\n * docs/gitbook/guidelines/playbook-ipc-logging.md) — `AstWorkerPool` routes it back to its own\n * injected logger via `IpcLogRouter`.\n */\nconst logger = new IpcLoggerClient((message) =>\n parentPort?.postMessage(message),\n);\n\nprocess.on(\"uncaughtException\", (err) => {\n logger.error(AstMessages.WORKER_UNCAUGHT_EXCEPTION, {\n error: err instanceof Error ? err.message : String(err),\n });\n});\nprocess.on(\"unhandledRejection\", (err) => {\n logger.error(AstMessages.WORKER_UNHANDLED_REJECTION, {\n error: err instanceof Error ? err.message : String(err),\n });\n});\n\nexport interface AstParseRequest {\n taskId: string;\n filePath: string;\n code: string;\n language: SupportedLanguage;\n}\n\nexport type ImportDescriptor = AstImportDescriptor;\n\nexport interface AstParseResponse {\n taskId: string;\n success: boolean;\n error?: string;\n data?: {\n imports: ImportDescriptor[];\n exports: AstExportDescriptor[];\n reexports?: AstReexportDescriptor[];\n functions: Array<{\n name: string;\n startLine: number;\n endLine: number;\n declarationSpan?: AstUtf16Span;\n contentHash?: string;\n containerName?: string; // NEW — the enclosing class/struct name, or undefined for a top-level function\n }>;\n classes: Array<{\n name: string;\n startLine: number;\n endLine: number;\n methods: string[];\n contentHash?: string;\n }>;\n /** Exported variable declarators (`export const X = ...`) — TS/JS only today (issue #192\n * gap 1). Function-valued initializers (arrow functions / function expressions) are\n * excluded: they are already indexed as functions via `functions`. */\n variables?: Array<{\n name: string;\n startLine: number;\n endLine: number;\n contentHash?: string;\n }>;\n calls: Array<{\n sourceFunction: string;\n targetFunction: string;\n /** 0-based source position of the call-site's callee expression start (matches Tier A's own\n * `startLine`/`startPosition` convention). The seed Tier B forward resolution (issue #11\n * plan A, Slice 2) issues `textDocument/definition` at this position per call site to\n * resolve the callee precisely -- see\n * forward-tier-b-edge-resolution-plan.md Slice 1. */\n startLine: number;\n startColumn: number;\n /** Issue #192 decomposition of the callee expression -- see `getCalleeEvidence`. */\n calleeName?: string;\n receiverText?: string;\n calleeKind?: \"bare\" | \"member\" | \"this\" | \"arg-chain\" | \"computed\";\n }>;\n implements?: Array<{ sourceClass: string; targetInterface: string }>;\n extends?: Array<{ sourceClass: string; targetClass: string }>;\n /** Optional explicit TypeScript/JavaScript syntax facts; not a resolution or proof. */\n declaredTypeFacts?: AstDeclaredTypeFacts;\n /** Optional binding-scoped, syntax-only call features; not a resolution or proof. */\n callSiteShapeFacts?: AstCallSiteShapeFacts;\n /**\n * `new Worker(<path>)` spawn sites (TS/JS only — see `WORKER_SPAWN_LANGUAGES`), one per\n * resolved spawn call, attributing it to its enclosing function like `calls` does.\n * `persist-ast-graph.ts` resolves `targetPath` to a real file and inserts a `DEPENDS_ON`\n * edge from it — the fix for the `ast-worker-pool.ts` -> `ast-worker.ts` false-negative\n * blast-radius gap (dynamic `worker_threads` spawns are invisible to the static\n * imports/calls pipeline, since the target script is a runtime path string, not a static\n * `import`).\n */\n workerSpawns?: Array<{ sourceFunction: string; targetPath: string }>;\n decisions?: string[];\n };\n}\n\nlet parserInitialized = false;\nlet registryPromise: Promise<LanguageRegistry> | null = null;\n\nfunction getRegistry(): Promise<LanguageRegistry> {\n registryPromise ??= loadDefaultRegistry();\n return registryPromise;\n}\n\n// Worker-lifetime cache for loaded tree-sitter grammars, keyed by the resolved wasmPath\n// (deterministic per language -- see resolveWasmPath()). Language.load() is a real WASM\n// dynamic-library load (WebAssembly.instantiate + relocation into the shared runtime's\n// Table/Memory), not a cheap call -- reloading the same grammar per file (the pre-existing\n// behavior) is pure waste once a worker has already loaded it once. Mirrors registryPromise's\n// own memoization shape immediately above. web-tree-sitter's Language class has no\n// delete()/dispose method (verified against the installed 0.25.10 type defs), so there is\n// nothing to release even if this cache were bounded -- see\n// docs/ai_plans/implement_wasm-language-load-cache.md §2.1 for the full check.\nconst languageCache = new Map<string, Promise<Language>>();\n\nfunction getLanguage(wasmPath: string): Promise<Language> {\n let cached = languageCache.get(wasmPath);\n if (!cached) {\n cached = Language.load(wasmPath);\n languageCache.set(wasmPath, cached);\n }\n return cached;\n}\n\n/**\n * Re-exported for backward compatibility (existing importer: `ast-worker.fixture.unit.test.ts`)\n * — the real implementation moved to `resolve-wasm-path.ts` so it can also be imported from the\n * main thread (by `SemanticDiffAnalyzerService`) without pulling in this file's\n * `worker_threads`-only side effects (`parentPort?.on(...)`, process-level\n * `uncaughtException`/`unhandledRejection` handlers). See that file's doc comment for why.\n */\nexport { resolveWasmPath };\n\n/** Regex fallback for imports so graph edges still work when WASM fails to load (e.g. in tests). */\nfunction extractFallbackImports(code: string): ImportDescriptor[] {\n const fallbackImports: ImportDescriptor[] = [];\n const importMatches = code.matchAll(\n /import\\s+{([^}]+)}\\s+from\\s+['\"]([^'\"]+)['\"]/g,\n );\n for (const match of importMatches) {\n fallbackImports.push({\n localName: match[1].trim(),\n originalName: match[1].trim(),\n modulePath: match[2],\n });\n }\n return fallbackImports;\n}\n\n/**\n * Normalizes the many capture shapes the per-language `calls` queries produce into \"the\n * callee expression\":\n * - TS/JS/Go/Rust/C++/Python capture the callee expression *directly* (`@call` sits on the\n * bracketed `[identifier | member_expression]` alternation inside `function:`), so the\n * captured node IS the callee -- it carries none of the fields below and falls through to\n * itself.\n * - Ruby (`method:`), Java (`name:`), PHP (`name:`) capture the bare callee identifier field.\n * - C# captures whole call nodes (`invocation_expression` / `object_creation_expression`),\n * which need unwrapping to their `expression:` / `type:` child.\n */\nfunction unwrapToCalleeExpression(node: Node): Node {\n return (\n node.childForFieldName(\"function\") ||\n node.childForFieldName(\"expression\") || // C# invocation_expression\n node.childForFieldName(\"type\") || // C# object_creation_expression (`new Foo()` -> Foo)\n node.childForFieldName(\"name\") ||\n node.childForFieldName(\"method\") ||\n node\n );\n}\n\n/**\n * Issue #192 root-cause fix: decomposes a call site's callee into the evidence name-based\n * resolution actually needs, instead of persisting one opaque raw string. `target_function`\n * keeps carrying the (whitespace-normalized) full expression for Tier B seeding and #217's\n * impact fallback; the decomposition answers:\n *\n * - `calleeName` — terminal callee identifier (`doSomething` of `service.doSomething()`),\n * what ScopeResolver's bare-name model matches against. Before this change the raw string\n * including the receiver was persisted, making every OOP-style call structurally\n * unmatchable -- the single largest cause of the ~12.8% distinct-target resolution rate.\n * - `receiverText` — receiver expression (`service`, `this.logger`), kept as evidence for\n * import-binding receiver resolution (ScopeResolver.resolveMemberCall).\n * - `calleeKind` — shape classifier. `'arg-chain'` (receiver is itself an invocation result,\n * e.g. `expect(x).toEqual`, `vi.fn().mockResolvedValue`) and `'computed'` (`obj[expr]()`)\n * are structurally unresolvable by name matching; classifying them lets the health-rate\n * denominators exclude them instead of counting them as failures (~51% of the unresolved\n * distinct targets in this repo's own graph were arg-chain junk from mock chains).\n *\n * Language-generic by construction: for any `receiver.callee` shape the callee expression's\n * rightmost named child is the callee identifier and the second-to-last is the receiver\n * (TS/JS nested `member_expression`, Go `selector_expression`, Rust/C++ `field_expression`,\n * Python `attribute`). A bare identifier has no usable second child -> `'bare'`.\n */\nexport function getCalleeEvidence(node: Node): {\n targetFunction: string;\n calleeName?: string;\n receiverText?: string;\n calleeKind?: \"bare\" | \"member\" | \"this\" | \"arg-chain\" | \"computed\";\n} {\n const callee = unwrapToCalleeExpression(node);\n\n const children = callee.namedChildren;\n const terminal = children[children.length - 1];\n const receiver =\n children.length >= 2 ? children[children.length - 2] : undefined;\n\n // Bare identifier call (`foo()`), or a grammar whose query already captured the callee\n // identifier directly (Java `name:`, PHP `name:`, Ruby `method:`).\n if (!terminal || !receiver) {\n return {\n targetFunction: normalizeCallText(callee.text),\n calleeName: callee.text,\n calleeKind: \"bare\",\n };\n }\n\n if (!CALLEE_IDENTIFIER_NODE_TYPES.has(terminal.type)) {\n // Computed access (`obj[expr]()`) -- no static callee name to match on.\n return {\n targetFunction: normalizeCallText(callee.text),\n calleeKind: \"computed\",\n };\n }\n\n const calleeName = terminal.text;\n const receiverText = receiver.text;\n\n // Invocation-result receivers (`expect(x).toEqual`, `vi.fn().mockResolvedValue`,\n // `new Date().toISOString`) -- the receiver's runtime type is the call's return value,\n // unknowable by name matching. A '(' anywhere in the receiver text catches both direct\n // call receivers and deeper chains (`vi.fn().mock.calls[0]`) in one conservative test.\n if (receiverText.includes(\"(\")) {\n return {\n targetFunction: normalizeCallText(callee.text),\n calleeName,\n receiverText,\n calleeKind: \"arg-chain\",\n };\n }\n\n return {\n targetFunction: normalizeCallText(callee.text),\n calleeName,\n receiverText,\n calleeKind:\n receiverText === \"this\" || receiverText === \"super\" ? \"this\" : \"member\",\n };\n}\n\n/** Collapses insignificant whitespace so multi-line call expressions\n * (`vi\\n .fn()`) persist as one comparable string instead of newline-laced junk\n * that no exact-match consumer (#217's impact fallback) could ever hit. */\nfunction normalizeCallText(text: string): string {\n return text.replace(/\\s+/g, \"\");\n}\n\nconst CALLEE_IDENTIFIER_NODE_TYPES = new Set([\n \"identifier\",\n \"property_identifier\",\n \"field_identifier\",\n \"shorthand_property_identifier\",\n \"attribute\",\n]);\n\n/** Resolves a call-site's *seed position* for Tier B forward resolution (issue #11 plan A,\n * Finding C): for a bare identifier call (`foo()`), `node` already *is* the identifier and its\n * own `startPosition` is correct. But for a compound callee -- JS/TS `member_expression`\n * (`service.doSomething()`), Go `selector_expression`, C++/Rust `field_expression` -- the\n * `calls` tree-sitter query (see `lib/ast-core/src/languages/*.ts`) captures the *whole*\n * expression, whose own `startPosition` sits on the receiver (`service`), not the callee\n * (`doSomething`). `textDocument/definition` must be issued at the callee's own position, or it\n * resolves the receiver's declaration instead -- an invented edge (IMPT-002). Verified against\n * real tree-sitter-typescript output (`property` is the correct field name for\n * `member_expression`, confirmed via a real parse, not assumed) -- see this plan's own\n * instruction not to copy field names blind.\n *\n * No-op (falls through to `node.startPosition`, i.e. itself) for languages whose query already\n * captures the callee identifier directly (Java `name:`, PHP `name:`, Ruby `method:`) or for a\n * bare identifier call. */\nfunction getCallSitePosition(node: Node): { row: number; column: number } {\n const calleeIdentifier =\n node.childForFieldName(\"property\") || // JS/TS member_expression\n node.childForFieldName(\"field\") || // Go selector_expression / C++/Rust field_expression\n node.childForFieldName(\"attribute\") || // Python attribute\n node.childForFieldName(\"name\") || // defensive; Java/PHP already capture this directly\n node.childForFieldName(\"method\"); // defensive; Ruby already captures this directly\n return (calleeIdentifier ?? node).startPosition;\n}\n\n/** Shape of a fully-populated `AstParseResponse[\"data\"]` (i.e. the non-optional variant produced once parsing has actually run). */\ntype AstExtractionResult = NonNullable<AstParseResponse[\"data\"]>;\n\n/** Extracts call-site edges via the provider, attributing each call to its enclosing function (or \"anonymous\"), up to the 1000-call circuit breaker. */\nfunction collectCallEdges(\n tree: Tree,\n provider: LanguageProvider,\n functionNodes: Node[],\n calls: AstExtractionResult[\"calls\"],\n): void {\n const functionIds = new Set(functionNodes.map((n) => n.id));\n const callNodes = provider.extractCalls(tree.rootNode);\n for (const node of callNodes) {\n if (calls.length >= 1000) break; // Circuit breaker limit\n const position = getCallSitePosition(node);\n const evidence = getCalleeEvidence(node);\n calls.push({\n sourceFunction: findEnclosingContainerName(node, functionIds),\n targetFunction: evidence.targetFunction,\n startLine: position.row,\n startColumn: position.column,\n calleeName: evidence.calleeName,\n receiverText: evidence.receiverText,\n calleeKind: evidence.calleeKind,\n });\n }\n}\n\n/** Extracts `implements` edges via the provider, if it supports them, attributing each to its enclosing class. */\nfunction collectImplementsEdges(\n tree: Tree,\n provider: LanguageProvider,\n classNodes: Node[],\n implementsList: NonNullable<AstExtractionResult[\"implements\"]>,\n): void {\n if (!provider.extractImplements) return;\n const classIds = new Set(classNodes.map((n) => n.id));\n for (const node of provider.extractImplements(tree.rootNode)) {\n implementsList.push({\n sourceClass: findEnclosingContainerName(node, classIds),\n targetInterface: node.text,\n });\n }\n}\n\n/** Extracts `extends` edges via the provider, if it supports them, attributing each to its enclosing class. */\nfunction collectExtendsEdges(\n tree: Tree,\n provider: LanguageProvider,\n classNodes: Node[],\n extendsList: NonNullable<AstExtractionResult[\"extends\"]>,\n): void {\n if (!provider.extractExtends) return;\n const classIds = new Set(classNodes.map((n) => n.id));\n for (const node of provider.extractExtends(tree.rootNode)) {\n extendsList.push({\n sourceClass: findEnclosingContainerName(node, classIds),\n targetClass: node.text,\n });\n }\n}\n\n/** Languages `collectWorkerSpawns` runs against — the reported gap (a `new Worker(...)` spawn\n * invisible to the static imports/calls pipeline) is TS/JS-specific: `new_expression` is also a\n * real C++ grammar node (the `new` operator), so gating by language avoids misinterpreting an\n * unrelated `new Worker(...)` construction in another language as a worker_threads spawn. */\nconst WORKER_SPAWN_LANGUAGES: ReadonlySet<SupportedLanguage> = new Set([\n SUPPORTED_LANGUAGES.TYPESCRIPT,\n SUPPORTED_LANGUAGES.JAVASCRIPT,\n]);\n\nconst WORKER_CONSTRUCTOR_NAME = \"Worker\";\nconst PATH_MODULE_OBJECT_NAME = \"path\";\nconst PATH_RESOLVE_METHOD_NAME = \"resolve\";\nconst PATH_JOIN_METHOD_NAME = \"join\";\nconst DIRNAME_IDENTIFIER_NAME = \"__dirname\";\n\n/** True when `node` is a `path.resolve(...)`/`path.join(...)` call expression — the exact idiom\n * `ast-worker-pool.ts` uses to build a worker script's path from `__dirname`. */\nfunction isPathJoinOrResolveCall(node: Node): boolean {\n if (node.type !== \"call_expression\") return false;\n const fn = node.childForFieldName(\"function\");\n if (!fn || fn.type !== \"member_expression\") return false;\n const object = fn.childForFieldName(\"object\")?.text;\n const property = fn.childForFieldName(\"property\")?.text;\n return (\n object === PATH_MODULE_OBJECT_NAME &&\n (property === PATH_RESOLVE_METHOD_NAME ||\n property === PATH_JOIN_METHOD_NAME)\n );\n}\n\n/** Extracts the string-literal path segment from a `path.resolve(__dirname, \"<literal>\")` /\n * `path.join(__dirname, \"<literal>\")` call, or undefined if it doesn't reference `__dirname` or\n * carries no string-literal argument. */\nfunction extractDirnameJoinedLiteral(callNode: Node): string | undefined {\n const args = callNode.childForFieldName(\"arguments\");\n if (!args) return undefined;\n const hasDirname = args.namedChildren.some(\n (n) => n?.type === \"identifier\" && n.text === DIRNAME_IDENTIFIER_NAME,\n );\n if (!hasDirname) return undefined;\n const literal = args.descendantsOfType(\"string\")[0];\n return literal?.text.replace(/['\"]/g, \"\");\n}\n\n/** Bounded same-file scan for `<argText> = path.resolve/join(__dirname, \"<literal>\")` — the\n * exact idiom `ast-worker-pool.ts` uses for `this.wPath = path.resolve(__dirname, \"./ast-worker.js\")`,\n * needed because the `new Worker(...)` call site references the field/variable, not the literal,\n * directly. Matches by comparing the assignment's own left-hand-side text against `argText`\n * verbatim (e.g. both \"this.wPath\"), so it works uniformly whether the argument is a bare\n * identifier or a member expression. */\nfunction findDirnameJoinedAssignment(\n tree: Tree,\n argText: string,\n): string | undefined {\n for (const assignment of tree.rootNode.descendantsOfType(\n AstNodeTypes.ASSIGNMENT_EXPRESSION,\n )) {\n if (!assignment) continue;\n const left = assignment.childForFieldName(\"left\");\n const right = assignment.childForFieldName(\"right\");\n if (left?.text !== argText || !right || !isPathJoinOrResolveCall(right)) {\n continue;\n }\n const literal = extractDirnameJoinedLiteral(right);\n if (literal) return literal;\n }\n return undefined;\n}\n\n/** Resolves `new Worker(<arg>)`'s first argument to a literal relative path: a direct string\n * literal, or a same-file `path.resolve/join(__dirname, \"<literal>\")`-assigned field/variable\n * (the `ast-worker-pool.ts` idiom, via `findDirnameJoinedAssignment`). Returns undefined —\n * skip silently, no guessing — when neither shape matches. */\nfunction resolveWorkerArgumentPath(\n tree: Tree,\n argNode: Node,\n): string | undefined {\n if (argNode.type === \"string\") {\n return argNode.text.replace(/['\"]/g, \"\");\n }\n if (argNode.type === \"identifier\" || argNode.type === \"member_expression\") {\n return findDirnameJoinedAssignment(tree, argNode.text);\n }\n return undefined;\n}\n\n/** Extracts `new Worker(<arg>)` spawn sites (TS/JS only, see `WORKER_SPAWN_LANGUAGES`) and\n * appends a `{sourceFunction, targetPath}` descriptor for each one whose argument resolves to a\n * literal relative path (`resolveWorkerArgumentPath`), attributing it to its enclosing function\n * like `collectCallEdges` does. `persist-ast-graph.ts` resolves `targetPath` to a real file and\n * inserts the corresponding `DEPENDS_ON` edge. */\nexport function collectWorkerSpawns(\n tree: Tree,\n language: SupportedLanguage,\n functionNodes: Node[],\n workerSpawns: NonNullable<AstExtractionResult[\"workerSpawns\"]>,\n): void {\n if (!WORKER_SPAWN_LANGUAGES.has(language)) return;\n const functionIds = new Set(functionNodes.map((n) => n.id));\n for (const node of tree.rootNode.descendantsOfType(\"new_expression\")) {\n if (!node) continue;\n const ctor = node.childForFieldName(\"constructor\");\n if (ctor?.text !== WORKER_CONSTRUCTOR_NAME) continue;\n const args = node.childForFieldName(\"arguments\");\n const firstArg = args?.namedChildren.find((n): n is Node => n !== null);\n if (!firstArg) continue;\n const targetPath = resolveWorkerArgumentPath(tree, firstArg);\n if (!targetPath) continue;\n workerSpawns.push({\n sourceFunction: findEnclosingContainerName(node, functionIds),\n targetPath,\n });\n }\n}\n\nfunction namedChildren(node: Node): Node[] {\n const children: Node[] = [];\n for (let index = 0; index < node.namedChildCount; index += 1) {\n const child = node.namedChild(index);\n if (child) children.push(child);\n }\n return children;\n}\n\nfunction directExportDescriptors(root: Node): AstExtractionResult[\"exports\"] {\n const exports: AstExtractionResult[\"exports\"] = [];\n for (const statement of namedChildren(root))\n exports.push(...directExportForStatement(statement));\n return exports;\n}\n\nfunction directExportForStatement(\n statement: Node,\n): AstExtractionResult[\"exports\"] {\n if (statement.type !== \"export_statement\") return [];\n if (/^export\\s+default\\b/u.test(statement.text))\n return [directDefaultExportDescriptor(statement)];\n const declaration = statement.childForFieldName(\"declaration\");\n return declaration ? directExportForDeclaration(declaration) : [];\n}\n\nfunction directDefaultExportDescriptor(statement: Node): AstExportDescriptor {\n const directFunctionSyntax =\n /^export\\s+default\\s+(?:async\\s+)?function(?:\\s|\\*|\\()/u.test(\n statement.text,\n );\n const defaultDeclarationNodes = [\n ...statement.descendantsOfType(\"function_declaration\"),\n ...statement.descendantsOfType(\"generator_function_declaration\"),\n ...statement.descendantsOfType(\"function_expression\"),\n ...statement.descendantsOfType(\"generator_function\"),\n ...statement.descendantsOfType(\"class_declaration\"),\n ...statement.descendantsOfType(\"abstract_class_declaration\"),\n ].filter((node): node is Node => node !== null);\n const declaration =\n statement.childForFieldName(\"declaration\") ??\n defaultDeclarationNodes.sort(\n (left, right) => left.startIndex - right.startIndex,\n )[0];\n if (\n declaration &&\n directFunctionSyntax &&\n [\n \"function_declaration\",\n \"generator_function_declaration\",\n \"function_expression\",\n \"generator_function\",\n ].includes(declaration.type)\n )\n return {\n name: \"default\",\n type: \"function\",\n declarationSpan: {\n start: declaration.startIndex,\n end: declaration.endIndex,\n },\n };\n\n const isClass =\n declaration?.type === \"class_declaration\" ||\n declaration?.type === \"abstract_class_declaration\";\n return {\n name: \"default\",\n type: isClass ? \"class\" : \"other\",\n declarationSpan: declaration\n ? { start: declaration.startIndex, end: declaration.endIndex }\n : { start: statement.startIndex, end: statement.endIndex },\n };\n}\n\nfunction directExportForDeclaration(\n declaration: Node,\n): AstExtractionResult[\"exports\"] {\n const classExport = directClassExportDescriptor(declaration);\n if (classExport) return [classExport];\n const functionExport = directFunctionExportDescriptor(declaration);\n if (functionExport) return [functionExport];\n if (\n declaration.type !== \"lexical_declaration\" &&\n declaration.type !== \"variable_declaration\"\n )\n return [];\n return directVariableExportDescriptors(declaration);\n}\n\nfunction directClassExportDescriptor(\n declaration: Node,\n): AstExtractionResult[\"exports\"][number] | undefined {\n if (\n declaration.type !== \"class_declaration\" &&\n declaration.type !== \"abstract_class_declaration\"\n )\n return undefined;\n const name = declaration.childForFieldName(\"name\");\n return name && [\"identifier\", \"type_identifier\"].includes(name.type)\n ? { name: name.text, type: \"class\" }\n : undefined;\n}\n\nfunction directFunctionExportDescriptor(\n declaration: Node,\n): AstExtractionResult[\"exports\"][number] | undefined {\n if (\n declaration.type !== \"function_declaration\" &&\n declaration.type !== \"generator_function_declaration\"\n )\n return undefined;\n const name = declaration.childForFieldName(\"name\");\n return name?.type === \"identifier\"\n ? { name: name.text, type: \"function\" }\n : undefined;\n}\n\nfunction directVariableExportDescriptors(\n declaration: Node,\n): AstExtractionResult[\"exports\"] {\n const exports: AstExtractionResult[\"exports\"] = [];\n for (const declarator of namedChildren(declaration)) {\n if (declarator.type !== \"variable_declarator\") continue;\n const name = declarator.childForFieldName(\"name\");\n if (name?.type === \"identifier\")\n exports.push({ name: name.text, type: \"variable\" });\n }\n return exports;\n}\n\n/**\n * Runs every provider-driven extraction against a parsed tree (or returns empty results plus a\n * decision note if parsing produced no tree). A single try/catch wraps the whole pass, matching\n * the original inline behavior of recording a `providerQueryFailed` decision instead of throwing\n * when any one extractor misbehaves.\n */\nfunction extractAstData(\n tree: Tree | null,\n provider: LanguageProvider,\n language: SupportedLanguage,\n): AstExtractionResult {\n const decisions: string[] = [];\n const imports: ImportDescriptor[] = [];\n const exports: AstExtractionResult[\"exports\"] = [];\n let reexports: AstReexportDescriptor[] | undefined;\n const functions: AstExtractionResult[\"functions\"] = [];\n const classes: AstExtractionResult[\"classes\"] = [];\n const variables: NonNullable<AstExtractionResult[\"variables\"]> = [];\n const calls: AstExtractionResult[\"calls\"] = [];\n const implementsList: NonNullable<AstExtractionResult[\"implements\"]> = [];\n const extendsList: NonNullable<AstExtractionResult[\"extends\"]> = [];\n const workerSpawns: NonNullable<AstExtractionResult[\"workerSpawns\"]> = [];\n\n if (tree) {\n decisions.push(AstMessages.parsedViaTreeSitter(tree.rootNode.childCount));\n\n try {\n exports.push(...directExportDescriptors(tree.rootNode));\n if (\n language === SUPPORTED_LANGUAGES.TYPESCRIPT ||\n language === SUPPORTED_LANGUAGES.JAVASCRIPT\n ) {\n reexports = parseReexportDescriptors(tree.rootNode);\n }\n const classNodes = collectClassNodes(tree, provider, classes);\n const functionNodes = collectFunctionNodes(\n tree,\n provider,\n functions,\n classNodes,\n );\n\n const importNodes = provider.extractImports(tree.rootNode);\n imports.push(...parseImportDescriptors(importNodes));\n\n collectVariableNodes(tree, provider, variables);\n\n collectCallEdges(tree, provider, functionNodes, calls);\n collectImplementsEdges(tree, provider, classNodes, implementsList);\n collectExtendsEdges(tree, provider, classNodes, extendsList);\n collectWorkerSpawns(tree, language, functionNodes, workerSpawns);\n\n decisions.push(AstMessages.QUERIED_VIA_LANGUAGE_PROVIDER);\n } catch (e) {\n decisions.push(\n AstMessages.providerQueryFailed(\n e instanceof Error ? e.message : String(e),\n ),\n );\n }\n }\n\n return {\n imports,\n exports,\n ...(reexports === undefined ? {} : { reexports }),\n functions,\n classes,\n variables,\n calls,\n implements: implementsList,\n extends: extendsList,\n workerSpawns,\n decisions,\n };\n}\n\n/** Logs any query pattern that failed to compile, then clears them so a later file of the same\n * language doesn't re-report the same failure. Drained rather than read because the provider is\n * reused for the worker's whole lifetime.\n *\n * Exported for the wiring test: the module-scoped `logger` posts to `parentPort`, which is\n * null outside a real worker, so this path is otherwise unobservable (same reason\n * `buildParseResponse` is exported). */\nexport function reportQueryCompileFailures(\n provider: LanguageProvider,\n language: SupportedLanguage,\n): void {\n for (const failure of provider.drainQueryCompileFailures?.() ?? []) {\n logger.error(AstMessages.QUERY_COMPILE_FAILED, {\n language,\n kind: failure.kind,\n pattern: failure.pattern,\n message: failure.message,\n });\n }\n}\n\n/** Parses `request.code` with the resolved provider/grammar and runs the full AST extraction pass, releasing the tree-sitter tree/parser handles once done. */\nfunction parseAndExtract(\n code: string,\n provider: LanguageProvider,\n langInstance: Language,\n language: SupportedLanguage,\n filePath: string,\n): AstExtractionResult {\n const parser = new Parser();\n parser.setLanguage(langInstance);\n\n // initQueries() is idempotent (DefaultProvider caches compiledQueries after the first call)\n // and the provider instance is reused for every file of this language for the worker's whole\n // lifetime (see getRegistry() above), so this only actually compiles once. A field whose\n // pattern fails to compile against the installed grammar degrades to that field's\n // descendantsOfType fallback (DefaultProvider.compileQuery) rather than throwing.\n provider.initQueries?.(langInstance);\n reportQueryCompileFailures(provider, language);\n\n const tree = parser.parse(code);\n const data = extractAstData(tree, provider, language);\n const declaredTypeLanguage = getDeclaredTypeLanguage(language, filePath);\n const result =\n tree && declaredTypeLanguage\n ? {\n ...data,\n declaredTypeFacts: extractDeclaredTypeFacts(\n tree.rootNode,\n declaredTypeLanguage,\n ),\n callSiteShapeFacts: extractCallSiteShapeFacts(\n tree.rootNode,\n declaredTypeLanguage,\n data.calls,\n data.imports,\n ),\n }\n : data;\n\n if (tree) tree.delete();\n parser.delete();\n\n return result;\n}\n\nfunction getDeclaredTypeLanguage(\n language: SupportedLanguage,\n filePath: string,\n): AstDeclaredTypeLanguage | undefined {\n if (language === SUPPORTED_LANGUAGES.TYPESCRIPT)\n return path.extname(filePath).toLowerCase() === \".tsx\"\n ? \"tsx\"\n : \"typescript\";\n if (language === SUPPORTED_LANGUAGES.JAVASCRIPT) return \"javascript\";\n return undefined;\n}\n\n/**\n * Resolves a language provider for `request.filePath` and produces the full parse response,\n * short-circuiting with an empty-but-successful result (plus an explanatory decision note) when\n * no provider is registered for the extension or its wasm grammar can't be located on disk.\n */\nexport async function buildParseResponse(\n request: AstParseRequest,\n): Promise<AstParseResponse> {\n if (!parserInitialized) {\n await Parser.init();\n parserInitialized = true;\n }\n\n const registry = await getRegistry();\n const ext = path.extname(request.filePath);\n const provider: LanguageProvider | undefined =\n registry.getProviderForExtension(ext);\n\n if (!provider) {\n return {\n taskId: request.taskId,\n success: true,\n data: {\n imports: [],\n exports: [],\n functions: [],\n classes: [],\n calls: [],\n decisions: [AstMessages.noLanguageProviderForExtension(ext)],\n },\n };\n }\n\n const { wasmPath, attemptedPaths } = resolveWasmPath(provider.wasm_file);\n\n if (!fs.existsSync(wasmPath)) {\n return {\n taskId: request.taskId,\n success: true,\n data: {\n imports: extractFallbackImports(request.code),\n exports: [],\n functions: [],\n classes: [],\n calls: [],\n decisions: [\n AstMessages.wasmNotFound(request.language, attemptedPaths.join(\", \")),\n ],\n },\n };\n }\n\n const langInstance = await getLanguage(wasmPath);\n const data = parseAndExtract(\n request.code,\n provider,\n langInstance,\n request.language,\n request.filePath,\n );\n\n return {\n taskId: request.taskId,\n success: true,\n data,\n };\n}\n\nparentPort?.on(\"message\", async (request: AstParseRequest) => {\n try {\n const response = await buildParseResponse(request);\n parentPort?.postMessage(response);\n } catch (err: any) {\n parentPort?.postMessage({\n taskId: request.taskId,\n success: false,\n error: err.stack || String(err),\n });\n }\n});\n","import type { Node } from \"web-tree-sitter\";\nimport {\n AST_DECLARED_TYPE_FACTS_SCHEMA_VERSION,\n AST_Q3_RECEIVER_FACTS_SCHEMA_VERSION,\n type AstDeclaredCallableArity,\n type AstDeclaredDeclaration,\n type AstDeclaredDeclarationKind,\n type AstDeclaredOwnerInventory,\n type AstDeclaredTypeFact,\n type AstDeclaredTypeFactKind,\n type AstDeclaredTypeFacts,\n type AstDeclaredTypeLanguage,\n type AstDeclaredTypeOwner,\n type AstDeclaredTypeOwnerKind,\n type AstDeclaredUnsupportedReason,\n type AstDeclaredVisibility,\n type AstQ3ClassDeclarationFact,\n type AstQ3NewReceiverBindingFact,\n type AstQ3TypeAliasFact,\n type AstUtf16Span,\n} from \"@workspace/contracts\";\n\nconst TYPE_FACT_DECLARATIONS = new Map<string, AstDeclaredTypeFactKind>([\n [\"public_field_definition\", \"field-annotation\"],\n [\"field_definition\", \"field-annotation\"],\n [\"property_signature\", \"field-annotation\"],\n [\"required_parameter\", \"parameter-annotation\"],\n [\"optional_parameter\", \"parameter-annotation\"],\n [\"variable_declarator\", \"variable-annotation\"],\n]);\n\nconst RETURN_ANNOTATION_NODES = new Set([\n \"function_declaration\",\n \"function_expression\",\n \"generator_function\",\n \"generator_function_declaration\",\n \"arrow_function\",\n \"method_definition\",\n \"method_signature\",\n \"abstract_method_signature\",\n]);\n\nconst TYPE_SIGNATURE_NODE_TYPES = new Set([\n \"function_type\",\n \"constructor_type\",\n \"call_signature\",\n \"construct_signature\",\n \"index_signature\",\n]);\n\nconst OWNER_NODE_KINDS = new Map<string, AstDeclaredTypeOwnerKind>([\n [\"program\", \"program\"],\n [\"class_declaration\", \"class\"],\n [\"abstract_class_declaration\", \"class\"],\n [\"interface_declaration\", \"interface\"],\n [\"object\", \"object\"],\n [\"function_declaration\", \"function\"],\n [\"function_expression\", \"function\"],\n [\"generator_function\", \"function\"],\n [\"generator_function_declaration\", \"function\"],\n [\"arrow_function\", \"function\"],\n [\"method_definition\", \"method\"],\n [\"method_signature\", \"method\"],\n [\"abstract_method_signature\", \"method\"],\n]);\n\nconst INVENTORY_OWNER_NODE_TYPES = new Set([\n \"class_declaration\",\n \"abstract_class_declaration\",\n \"interface_declaration\",\n \"object\",\n]);\n\nconst MEMBER_KIND_BY_NODE = new Map<string, AstDeclaredDeclarationKind>([\n [\"method_definition\", \"method\"],\n [\"method_signature\", \"method\"],\n [\"abstract_method_signature\", \"method\"],\n [\"public_field_definition\", \"field\"],\n [\"field_definition\", \"field\"],\n [\"property_signature\", \"field\"],\n]);\n\nconst FREE_CALLABLE_NODE_TYPES = new Map<string, AstDeclaredDeclarationKind>([\n [\"function_declaration\", \"function\"],\n [\"function_expression\", \"function-expression\"],\n [\"generator_function\", \"function-expression\"],\n [\"generator_function_declaration\", \"function\"],\n [\"arrow_function\", \"arrow\"],\n]);\n\nconst SKIPPED_OWNER_CHILDREN = new Set([\"comment\", \"class_static_block\"]);\nconst SIMPLE_NAME_NODE_TYPES = new Set([\n \"identifier\",\n \"type_identifier\",\n \"property_identifier\",\n \"private_property_identifier\",\n]);\n\nfunction span(node: Node): AstUtf16Span {\n return { start: node.startIndex, end: node.endIndex };\n}\n\nfunction namedChildren(node: Node): Node[] {\n const result: Node[] = [];\n for (let index = 0; index < node.namedChildCount; index += 1) {\n const child = node.namedChild(index);\n if (child) result.push(child);\n }\n return result;\n}\n\nfunction children(node: Node): Node[] {\n const result: Node[] = [];\n for (let index = 0; index < node.childCount; index += 1) {\n const child = node.child(index);\n if (child) result.push(child);\n }\n return result;\n}\n\nfunction walk(node: Node, visit: (current: Node) => void): void {\n visit(node);\n for (const child of namedChildren(node)) walk(child, visit);\n}\n\nfunction directName(node: Node): string | null {\n const nameNode = node.childForFieldName(\"name\");\n if (!nameNode || !SIMPLE_NAME_NODE_TYPES.has(nameNode.type)) return null;\n return nameNode.text;\n}\n\nfunction typeParameterNames(node: Node): readonly string[] {\n const parameters = node.childForFieldName(\"type_parameters\");\n if (!parameters) return [];\n return namedChildren(parameters)\n .filter((parameter) => parameter.type === \"type_parameter\")\n .map((parameter) => parameter.childForFieldName(\"name\")?.text)\n .filter((name): name is string => Boolean(name));\n}\n\nfunction ownerFromNode(node: Node): AstDeclaredTypeOwner {\n const kind = OWNER_NODE_KINDS.get(node.type) ?? \"program\";\n const name = kind === \"program\" ? null : directName(node);\n return {\n kind,\n name,\n span: span(node),\n genericTypeParameterNames: typeParameterNames(node),\n };\n}\n\nfunction nearestOwner(node: Node | null): AstDeclaredTypeOwner {\n let current = node;\n while (current) {\n if (OWNER_NODE_KINDS.has(current.type)) return ownerFromNode(current);\n current = current.parent;\n }\n return {\n kind: \"program\",\n name: null,\n span: { start: 0, end: 0 },\n genericTypeParameterNames: [],\n };\n}\n\nfunction nearestAncestor(\n node: Node | null,\n matches: (candidate: Node) => boolean,\n): Node | null {\n let current = node;\n while (current) {\n if (matches(current)) return current;\n current = current.parent;\n }\n return null;\n}\n\nfunction isClassOwnerNode(node: Node): boolean {\n return (\n node.type === \"class_declaration\" ||\n node.type === \"abstract_class_declaration\"\n );\n}\n\nfunction isTypeOwnerNode(node: Node): boolean {\n return isClassOwnerNode(node) || node.type === \"interface_declaration\";\n}\n\nfunction isCallableNode(node: Node): boolean {\n return RETURN_ANNOTATION_NODES.has(node.type);\n}\n\nfunction isParameterInsideTypeSignature(node: Node): boolean {\n let current = node.parent;\n while (current) {\n if (isCallableNode(current)) return false;\n if (TYPE_SIGNATURE_NODE_TYPES.has(current.type)) return true;\n current = current.parent;\n }\n return false;\n}\n\nfunction isInsideObjectType(node: Node): boolean {\n let current = node.parent;\n while (current) {\n if (current.type === \"object_type\") return true;\n current = current.parent;\n }\n return false;\n}\n\nfunction callableName(node: Node): string | null {\n const ownName = directName(node);\n if (ownName) return ownName;\n if (node.type !== \"arrow_function\" && node.type !== \"function_expression\")\n return null;\n const parent = node.parent;\n if (!parent) return null;\n const binding =\n parent.type === \"variable_declarator\"\n ? parent.childForFieldName(\"name\")\n : parent.type === \"pair\"\n ? parent.childForFieldName(\"key\")\n : null;\n return binding && SIMPLE_NAME_NODE_TYPES.has(binding.type)\n ? binding.text\n : null;\n}\n\nfunction lexicalScope(node: Node): AstUtf16Span {\n let current: Node | null = node;\n while (current) {\n if (\n current.type === \"program\" ||\n current.type === \"class_body\" ||\n current.type === \"interface_body\" ||\n current.type === \"statement_block\" ||\n current.type === \"object\"\n )\n return span(current);\n if (isCallableNode(current)) {\n const body = current.childForFieldName(\"body\");\n return span(body ?? current);\n }\n current = current.parent;\n }\n return span(node);\n}\n\nfunction varDeclarationScope(node: Node): AstUtf16Span | null {\n if (node.type !== \"variable_declarator\") return null;\n const declaration = node.parent;\n if (declaration?.type !== \"variable_declaration\") return null;\n let current = declaration.parent;\n while (current) {\n if (isCallableNode(current)) {\n const body = current.childForFieldName(\"body\");\n return span(body ?? current);\n }\n if (current.type === \"program\") return span(current);\n current = current.parent;\n }\n return null;\n}\n\nfunction hasModifier(node: Node, modifier: string): boolean {\n return children(node).some((child) => child.text === modifier);\n}\n\nfunction nearestConstructor(node: Node): Node | null {\n let current = node.parent;\n while (current) {\n if (\n current.type === \"method_definition\" &&\n directName(current) === \"constructor\"\n )\n return current;\n if (current.type === \"class_body\" || current.type === \"program\")\n return null;\n current = current.parent;\n }\n return null;\n}\n\nfunction isParameterProperty(\n node: Node,\n language: AstDeclaredTypeLanguage,\n): boolean {\n if (language === \"javascript\" || !nearestConstructor(node)) return false;\n return children(node).some(\n (child) =>\n child.type === \"accessibility_modifier\" || child.text === \"readonly\",\n );\n}\n\nfunction isShadowedTypeParameter(typeNode: Node, name: string): boolean {\n let current = typeNode.parent;\n while (current) {\n if (typeParameterNames(current).includes(name)) return true;\n current = current.parent;\n }\n return false;\n}\n\nfunction simpleTypeReference(node: Node | null): Node | null {\n if (!node || !SIMPLE_NAME_NODE_TYPES.has(node.type)) return null;\n return node;\n}\n\nfunction annotationTypeNode(annotation: Node | null): Node | null {\n if (!annotation || annotation.type !== \"type_annotation\") return null;\n const types = namedChildren(annotation).filter(\n (child) => child.type !== \"comment\",\n );\n return types.length === 1 ? simpleTypeReference(types[0]) : null;\n}\n\nfunction declarationBindingName(node: Node): string | null {\n if (\n node.type === \"required_parameter\" ||\n node.type === \"optional_parameter\"\n ) {\n const pattern = node.childForFieldName(\"pattern\");\n return pattern && SIMPLE_NAME_NODE_TYPES.has(pattern.type)\n ? pattern.text\n : null;\n }\n const name =\n node.childForFieldName(\"name\") ?? node.childForFieldName(\"property\");\n return name && SIMPLE_NAME_NODE_TYPES.has(name.type) ? name.text : null;\n}\n\nfunction factOwner(\n node: Node,\n kind: AstDeclaredTypeFactKind,\n): AstDeclaredTypeOwner {\n if (kind === \"return-annotation\") return ownerFromNode(node);\n const ownerNode =\n kind === \"parameter-property\"\n ? nearestAncestor(node.parent, isClassOwnerNode)\n : kind === \"parameter-annotation\"\n ? nearestAncestor(node.parent, isCallableNode)\n : kind === \"field-annotation\" ||\n kind === \"implements\" ||\n kind === \"extends\"\n ? nearestAncestor(node.parent, isTypeOwnerNode)\n : null;\n if (ownerNode) return ownerFromNode(ownerNode);\n return nearestOwner(node.parent);\n}\n\nfunction factLexicalScope(\n node: Node,\n kind: AstDeclaredTypeFactKind,\n): AstUtf16Span {\n if (kind === \"variable-annotation\" || kind === \"new-initializer\") {\n const varScope = varDeclarationScope(node);\n if (varScope) return varScope;\n }\n if (\n kind === \"parameter-property\" ||\n kind === \"implements\" ||\n kind === \"extends\"\n ) {\n const classNode = nearestAncestor(node.parent, isClassOwnerNode);\n if (classNode)\n return span(classNode.childForFieldName(\"body\") ?? classNode);\n }\n return lexicalScope(node);\n}\n\nfunction makeFact(\n kind: AstDeclaredTypeFactKind,\n name: string | null,\n typeNode: Node | null,\n declaration: Node,\n ownerNode: Node,\n): AstDeclaredTypeFact | null {\n const simpleType = simpleTypeReference(typeNode);\n if (!simpleType || isShadowedTypeParameter(simpleType, simpleType.text))\n return null;\n const owner = factOwner(ownerNode, kind);\n return {\n kind,\n name,\n typeName: simpleType.text,\n typeText: simpleType.text,\n declarationSpan: span(declaration),\n typeSpan: span(simpleType),\n owner,\n lexicalScopeSpan: factLexicalScope(declaration, kind),\n };\n}\n\nfunction typeFactForDeclaration(\n node: Node,\n language: AstDeclaredTypeLanguage,\n): AstDeclaredTypeFact | null {\n const kind = TYPE_FACT_DECLARATIONS.get(node.type);\n if (!kind || language === \"javascript\") return null;\n if (isRejectedTypeDeclaration(node, kind)) return null;\n const annotation = node.childForFieldName(\"type\");\n if (node.hasError || annotation?.hasError) return null;\n const typeNode = annotationTypeNode(annotation);\n const factKind =\n kind === \"parameter-annotation\" && isParameterProperty(node, language)\n ? \"parameter-property\"\n : kind;\n return makeFact(factKind, declarationBindingName(node), typeNode, node, node);\n}\n\nfunction isRejectedTypeDeclaration(\n node: Node,\n kind: AstDeclaredTypeFactKind,\n): boolean {\n return (\n isInsideObjectType(node) ||\n (kind === \"parameter-annotation\" && isParameterInsideTypeSignature(node))\n );\n}\n\nfunction typeFactForReturn(node: Node): AstDeclaredTypeFact | null {\n if (isInsideObjectType(node)) return null;\n const annotation = node.childForFieldName(\"return_type\");\n if (node.hasError || annotation?.hasError) return null;\n const typeNode = annotationTypeNode(annotation);\n return makeFact(\n \"return-annotation\",\n callableName(node),\n typeNode,\n node,\n node,\n );\n}\n\nfunction typeFactForInitializer(node: Node): AstDeclaredTypeFact | null {\n const constructor = newInitializerConstructor(node);\n if (!constructor) return null;\n return makeFact(\n \"new-initializer\",\n declarationBindingName(node),\n constructor,\n node,\n node,\n );\n}\n\nfunction newInitializerConstructor(node: Node): Node | null {\n if (\n node.type !== \"variable_declarator\" &&\n node.type !== \"public_field_definition\" &&\n node.type !== \"field_definition\"\n )\n return null;\n const value = node.childForFieldName(\"value\");\n if (\n node.hasError ||\n value?.type !== \"new_expression\" ||\n value.hasError ||\n value.childForFieldName(\"type_arguments\")\n )\n return null;\n return simpleTypeReference(value.childForFieldName(\"constructor\"));\n}\n\nfunction typeAliasFactForDeclaration(node: Node): AstQ3TypeAliasFact | null {\n if (node.type !== \"type_alias_declaration\" || node.hasError) return null;\n const name = node.childForFieldName(\"name\");\n const typeNode = simpleTypeReference(node.childForFieldName(\"value\"));\n if (\n !name ||\n !SIMPLE_NAME_NODE_TYPES.has(name.type) ||\n !typeNode ||\n isShadowedTypeParameter(typeNode, typeNode.text)\n )\n return null;\n return {\n name: name.text,\n typeName: typeNode.text,\n declarationSpan: span(node),\n typeSpan: span(typeNode),\n owner: nearestOwner(node.parent),\n scopeSpan: lexicalScope(node.parent ?? node),\n genericTypeParameterNames: typeParameterNames(node),\n isExported: node.parent?.type === \"export_statement\",\n };\n}\n\nfunction q3ClassDeclarationFact(node: Node): AstQ3ClassDeclarationFact | null {\n const kind =\n node.type === \"interface_declaration\"\n ? \"interface\"\n : node.type === \"class_declaration\" ||\n node.type === \"abstract_class_declaration\"\n ? \"class\"\n : null;\n const name = directName(node);\n if (!kind || !name) return null;\n return {\n kind,\n name,\n declarationSpan: span(node),\n scopeSpan: lexicalScope(node.parent ?? node),\n genericTypeParameterNames: typeParameterNames(node),\n };\n}\n\nfunction newBindingKind(node: Node): \"const\" | \"let\" | \"var\" | null {\n if (node.type !== \"variable_declarator\") return null;\n const declaration = node.parent;\n if (!declaration) return null;\n const match = /^(const|let|var)\\b/u.exec(declaration.text);\n return match?.[1] === \"const\" || match?.[1] === \"let\" || match?.[1] === \"var\"\n ? match[1]\n : null;\n}\n\nfunction writeTarget(node: Node): Node | null {\n if (\n node.type === \"assignment_expression\" ||\n node.type === \"augmented_assignment_expression\"\n )\n return node.childForFieldName(\"left\");\n if (node.type === \"for_in_statement\" || node.type === \"for_of_statement\")\n return node.childForFieldName(\"left\");\n if (node.type === \"update_expression\")\n return (\n namedChildren(node).find((child) =>\n SIMPLE_NAME_NODE_TYPES.has(child.type),\n ) ?? null\n );\n return null;\n}\n\nfunction collectSimpleWritePositions(\n root: Node,\n): ReadonlyMap<string, readonly number[]> {\n const positions = new Map<string, number[]>();\n walk(root, (node) => {\n const target = writeTarget(node);\n if (target && SIMPLE_NAME_NODE_TYPES.has(target.type) && target.text) {\n const writes = positions.get(target.text) ?? [];\n writes.push(node.startIndex);\n positions.set(target.text, writes);\n }\n });\n return positions;\n}\n\nfunction hasBindingWrite(\n writesByName: ReadonlyMap<string, readonly number[]>,\n name: string,\n scope: AstUtf16Span,\n declarationEnd: number,\n): boolean {\n return (writesByName.get(name) ?? []).some(\n (position) => position > declarationEnd && position <= scope.end,\n );\n}\n\nfunction q3NewReceiverBindingFact(\n node: Node,\n writesByName: ReadonlyMap<string, readonly number[]>,\n): AstQ3NewReceiverBindingFact | null {\n const typeNode = newInitializerConstructor(node);\n const nameNode = node.childForFieldName(\"name\");\n const bindingKind = newBindingKind(node);\n if (\n !typeNode ||\n !nameNode ||\n !SIMPLE_NAME_NODE_TYPES.has(nameNode.type) ||\n !bindingKind\n )\n return null;\n const scopeNode = varDeclarationScope(node) ?? lexicalScope(node);\n const scopeSpan = scopeNode;\n return {\n name: nameNode.text,\n typeName: typeNode.text,\n declarationSpan: span(node),\n scopeSpan,\n bindingKind,\n isReassigned: hasBindingWrite(\n writesByName,\n nameNode.text,\n scopeSpan,\n nameNode.endIndex,\n ),\n };\n}\n\nfunction typeFactsForHeritage(\n node: Node,\n language: AstDeclaredTypeLanguage,\n): AstDeclaredTypeFact[] {\n if (node.hasError) return [];\n if (language === \"javascript\" && node.type === \"class_heritage\")\n return javascriptHeritageFact(node);\n const kind = heritageFactKind(node);\n if (!kind || !isSupportedHeritageNode(node)) return [];\n const targets = heritageTargets(node);\n const owner = nearestOwner(node.parent);\n return targets\n .map((target) => makeFact(kind, owner.name, target, node, node))\n .filter((fact): fact is AstDeclaredTypeFact => fact !== null);\n}\n\nfunction javascriptHeritageFact(node: Node): AstDeclaredTypeFact[] {\n const target = simpleTypeReference(namedChildren(node)[0] ?? null);\n const owner = nearestOwner(node.parent);\n const fact = makeFact(\"extends\", owner.name, target, node, node);\n return fact ? [fact] : [];\n}\n\nfunction heritageFactKind(node: Node): \"implements\" | \"extends\" | null {\n if (node.type === \"implements_clause\") return \"implements\";\n if (node.type === \"extends_clause\" || node.type === \"extends_type_clause\")\n return \"extends\";\n return null;\n}\n\nfunction heritageDeclaration(node: Node): Node | null {\n const declaration = nearestAncestor(node.parent, isTypeOwnerNode);\n const obstructingType = nearestAncestor(\n node.parent,\n (candidate) =>\n candidate.type === \"conditional_type\" ||\n candidate.type === \"type_alias_declaration\",\n );\n if (\n obstructingType &&\n (!declaration || obstructingType.startIndex > declaration.startIndex)\n )\n return null;\n return declaration;\n}\n\nfunction isSupportedHeritageNode(node: Node): boolean {\n const declaration = heritageDeclaration(node);\n if (!declaration || node.childForFieldName(\"type_arguments\")) return false;\n if (node.type === \"extends_type_clause\")\n return declaration.type === \"interface_declaration\";\n return isClassOwnerNode(declaration);\n}\n\nfunction heritageTargets(node: Node): Node[] {\n if (node.type !== \"extends_clause\") return namedChildren(node);\n const value = node.childForFieldName(\"value\");\n return value ? [value] : [];\n}\n\nfunction hasSyntaxError(node: Node): boolean {\n return node.type === \"ERROR\" || node.isMissing || node.hasError;\n}\n\nfunction visibilityOf(\n node: Node,\n memberName: string | null,\n): AstDeclaredVisibility {\n if (memberName?.startsWith(\"#\")) return \"private\";\n const modifier = namedChildren(node).find(\n (child) => child.type === \"accessibility_modifier\",\n );\n if (modifier?.text === \"private\" || modifier?.text === \"protected\")\n return modifier.text;\n return \"public\";\n}\n\nfunction hasOptionalMarker(node: Node): boolean {\n return children(node).some((child) => child.text === \"?\");\n}\n\nfunction parameterNodes(callable: Node): Node[] {\n const parameters = callable.childForFieldName(\"parameters\");\n if (parameters)\n return namedChildren(parameters).filter(\n (parameter) => parameter.type !== \"comment\",\n );\n const parameter = callable.childForFieldName(\"parameter\");\n return parameter ? [parameter] : [];\n}\n\nfunction parameterPattern(parameter: Node): Node | null {\n return parameter.childForFieldName(\"pattern\") ?? parameter;\n}\n\nfunction isRestParameter(parameter: Node): boolean {\n return (\n parameter.type === \"rest_pattern\" ||\n parameterPattern(parameter)?.type === \"rest_pattern\"\n );\n}\n\nfunction isOptionalParameter(parameter: Node): boolean {\n if (\n parameter.type === \"optional_parameter\" ||\n parameter.type === \"rest_pattern\" ||\n parameter.type === \"assignment_pattern\"\n )\n return true;\n if (parameter.childForFieldName(\"value\")) return true;\n return children(parameter).some((child) => child.text === \"?\");\n}\n\nfunction isThisParameter(parameter: Node): boolean {\n return parameterPattern(parameter)?.text === \"this\";\n}\n\nfunction callableArity(callable: Node): AstDeclaredCallableArity {\n const params = parameterNodes(callable).filter(\n (parameter) => !isThisParameter(parameter),\n );\n let requiredParameterCount = 0;\n let hasRest = false;\n params.forEach((parameter, index) => {\n if (isRestParameter(parameter)) hasRest = true;\n else if (!isOptionalParameter(parameter))\n requiredParameterCount = index + 1;\n });\n return {\n requiredParameterCount,\n maxParameterCount: hasRest ? null : params.length,\n };\n}\n\nfunction staticMemberName(node: Node): string | null {\n const name =\n node.childForFieldName(\"name\") ?? node.childForFieldName(\"property\");\n if (name && SIMPLE_NAME_NODE_TYPES.has(name.type)) return name.text;\n return null;\n}\n\nfunction unknownMemberDeclaration(\n node: Node,\n owner: AstDeclaredTypeOwner,\n reason: AstDeclaredUnsupportedReason,\n name: string | null,\n): AstDeclaredDeclaration {\n return {\n kind: \"unknown\",\n name,\n declarationSpan: span(node),\n owner,\n lexicalScopeSpan: span(node),\n visibility: null,\n isStatic: false,\n isAbstract: false,\n isOptional: false,\n arity: null,\n genericTypeParameterNames: [],\n unsupportedReason: reason,\n };\n}\n\nfunction declaredMemberKind(\n kind: AstDeclaredDeclarationKind,\n node: Node,\n name: string,\n): AstDeclaredDeclarationKind {\n if (kind !== \"method\") return kind;\n if (name === \"constructor\") return \"constructor\";\n if (hasModifier(node, \"get\")) return \"getter\";\n if (hasModifier(node, \"set\")) return \"setter\";\n return kind;\n}\n\nfunction memberCallableArity(\n node: Node,\n kind: AstDeclaredDeclarationKind,\n): AstDeclaredCallableArity | null {\n const callable =\n kind === \"method\" ||\n kind === \"constructor\" ||\n kind === \"getter\" ||\n kind === \"setter\";\n if (callable) return callableArity(node);\n const value = node.childForFieldName(\"value\");\n return value && RETURN_ANNOTATION_NODES.has(value.type)\n ? callableArity(value)\n : null;\n}\n\nfunction memberDeclaration(\n node: Node,\n owner: AstDeclaredTypeOwner,\n): AstDeclaredDeclaration {\n const kind = MEMBER_KIND_BY_NODE.get(node.type);\n const name = staticMemberName(node);\n if (hasSyntaxError(node))\n return unknownMemberDeclaration(node, owner, \"syntax-error\", name);\n if (!kind || !name) {\n const reason: AstDeclaredUnsupportedReason = name\n ? \"unsupported-member\"\n : \"computed-name\";\n return unknownMemberDeclaration(node, owner, reason, name);\n }\n const declaredKind = declaredMemberKind(kind, node, name);\n return {\n kind: declaredKind,\n name,\n declarationSpan: span(node),\n owner,\n lexicalScopeSpan: lexicalScope(node),\n visibility: visibilityOf(node, name),\n isStatic: hasModifier(node, \"static\"),\n isAbstract:\n node.type === \"abstract_method_signature\" ||\n hasModifier(node, \"abstract\"),\n isOptional: hasOptionalMarker(node),\n arity: memberCallableArity(node, declaredKind),\n genericTypeParameterNames: typeParameterNames(node),\n };\n}\n\nfunction pairDeclaration(\n node: Node,\n owner: AstDeclaredTypeOwner,\n): AstDeclaredDeclaration {\n const key = node.childForFieldName(\"key\");\n const value = node.childForFieldName(\"value\");\n const name = key && SIMPLE_NAME_NODE_TYPES.has(key.type) ? key.text : null;\n if (!name || !value || hasSyntaxError(node)) {\n const reason: AstDeclaredUnsupportedReason = hasSyntaxError(node)\n ? \"syntax-error\"\n : \"computed-name\";\n return {\n kind: \"unknown\",\n name,\n declarationSpan: span(node),\n owner,\n lexicalScopeSpan: span(node),\n visibility: null,\n isStatic: false,\n isAbstract: false,\n isOptional: false,\n arity: null,\n genericTypeParameterNames: [],\n unsupportedReason: reason,\n };\n }\n return {\n kind: \"field\",\n name,\n declarationSpan: span(node),\n owner,\n lexicalScopeSpan: span(ownerNodeFromSpan(node, owner)),\n visibility: \"public\",\n isStatic: false,\n isAbstract: false,\n isOptional: hasOptionalMarker(node),\n arity: isCallableNode(value) ? callableArity(value) : null,\n genericTypeParameterNames: [],\n };\n}\n\nfunction ownerNodeFromSpan(node: Node, owner: AstDeclaredTypeOwner): Node {\n let current: Node | null = node.parent;\n while (current) {\n const candidate = OWNER_NODE_KINDS.get(current.type);\n if (\n candidate === owner.kind &&\n current.startIndex === owner.span.start &&\n current.endIndex === owner.span.end\n )\n return current;\n current = current.parent;\n }\n return node;\n}\n\nfunction ownerBody(node: Node): Node | null {\n if (node.type === \"object\") return node;\n return node.childForFieldName(\"body\");\n}\n\nfunction unknownParameterProperty(\n parameter: Node,\n owner: AstDeclaredTypeOwner,\n body: Node,\n): AstDeclaredDeclaration {\n return {\n kind: \"unknown\",\n name: null,\n declarationSpan: span(parameter),\n owner,\n lexicalScopeSpan: span(body),\n visibility: null,\n isStatic: false,\n isAbstract: false,\n isOptional: false,\n arity: null,\n genericTypeParameterNames: [],\n unsupportedReason: \"computed-name\",\n };\n}\n\nfunction constructorPropertyDeclaration(\n parameter: Node,\n owner: AstDeclaredTypeOwner,\n body: Node,\n): AstDeclaredDeclaration {\n const name = declarationBindingName(parameter);\n if (!name) return unknownParameterProperty(parameter, owner, body);\n return {\n kind: \"field\",\n name,\n declarationSpan: span(parameter),\n owner,\n lexicalScopeSpan: span(body),\n visibility: visibilityOf(parameter, name),\n isStatic: false,\n isAbstract: false,\n isOptional: hasOptionalMarker(parameter),\n arity: null,\n genericTypeParameterNames: [],\n };\n}\n\nfunction constructorPropertyDeclarations(\n method: Node,\n owner: AstDeclaredTypeOwner,\n body: Node,\n): AstDeclaredDeclaration[] {\n const parameters = method.childForFieldName(\"parameters\");\n return (parameters ? namedChildren(parameters) : [])\n .filter((parameter) => isParameterProperty(parameter, \"typescript\"))\n .map((parameter) => constructorPropertyDeclaration(parameter, owner, body));\n}\n\nfunction childDeclarations(\n child: Node,\n ownerNodeType: string,\n owner: AstDeclaredTypeOwner,\n body: Node,\n): AstDeclaredDeclaration[] {\n if (child.type === \"pair\" && ownerNodeType === \"object\")\n return [pairDeclaration(child, owner)];\n const declaration = memberDeclaration(child, owner);\n const properties =\n declaration.kind === \"constructor\"\n ? constructorPropertyDeclarations(child, owner, body)\n : [];\n return [declaration, ...properties];\n}\n\nfunction collectOwnerDeclarations(\n body: Node,\n ownerNodeType: string,\n owner: AstDeclaredTypeOwner,\n): {\n declarations: AstDeclaredDeclaration[];\n reasons: Set<AstDeclaredUnsupportedReason>;\n} {\n const declarations: AstDeclaredDeclaration[] = [];\n const reasons = new Set<AstDeclaredUnsupportedReason>();\n if (body.hasError) reasons.add(\"syntax-error\");\n for (const child of namedChildren(body)) {\n if (SKIPPED_OWNER_CHILDREN.has(child.type)) continue;\n const childItems = childDeclarations(child, ownerNodeType, owner, body);\n declarations.push(...childItems);\n for (const item of childItems) {\n if (item.unsupportedReason) reasons.add(item.unsupportedReason);\n }\n }\n return { declarations, reasons };\n}\n\nfunction collectOwnerInventory(node: Node): {\n inventory: AstDeclaredOwnerInventory;\n declarations: AstDeclaredDeclaration[];\n} {\n const owner = ownerFromNode(node);\n const body = ownerBody(node);\n const collected = body\n ? collectOwnerDeclarations(body, node.type, owner)\n : {\n declarations: [],\n reasons: new Set<AstDeclaredUnsupportedReason>([\"unsupported-member\"]),\n };\n return {\n inventory: {\n owner,\n complete: collected.reasons.size === 0,\n incompleteReasons: [...collected.reasons].sort(),\n },\n declarations: collected.declarations,\n };\n}\n\nfunction freeCallableDeclaration(node: Node): AstDeclaredDeclaration {\n const kind = FREE_CALLABLE_NODE_TYPES.get(node.type) ?? \"function\";\n return {\n kind,\n name: callableName(node),\n declarationSpan: span(node),\n owner: nearestOwner(node.parent),\n lexicalScopeSpan: lexicalScope(node),\n visibility: null,\n isStatic: false,\n isAbstract: false,\n isOptional: false,\n arity: callableArity(node),\n genericTypeParameterNames: typeParameterNames(node),\n };\n}\n\nfunction isFunctionValueMember(node: Node): boolean {\n const parent = node.parent;\n if (!parent) return false;\n const valueMatchesNode = (value: Node | null) =>\n value?.type === node.type &&\n value.startIndex === node.startIndex &&\n value.endIndex === node.endIndex;\n if (\n (parent.type === \"public_field_definition\" ||\n parent.type === \"field_definition\") &&\n valueMatchesNode(parent.childForFieldName(\"value\"))\n )\n return true;\n if (\n parent.type === \"pair\" &&\n valueMatchesNode(parent.childForFieldName(\"value\"))\n )\n return true;\n return false;\n}\n\nfunction isAnonymousDirectDefaultFunction(node: Node): boolean {\n return (\n node.type === \"function_expression\" &&\n node.parent?.type === \"export_statement\" &&\n /^export\\s+default\\s+(?:async\\s+)?function(?:\\s|\\*|\\()/u.test(\n node.parent.text,\n )\n );\n}\n\nfunction compareFacts(a: AstDeclaredTypeFact, b: AstDeclaredTypeFact): number {\n return (\n a.declarationSpan.start - b.declarationSpan.start ||\n a.typeSpan.start - b.typeSpan.start ||\n a.kind.localeCompare(b.kind)\n );\n}\n\nfunction compareDeclarations(\n a: AstDeclaredDeclaration,\n b: AstDeclaredDeclaration,\n): number {\n return (\n a.declarationSpan.start - b.declarationSpan.start ||\n a.declarationSpan.end - b.declarationSpan.end ||\n a.kind.localeCompare(b.kind)\n );\n}\n\ninterface MutableDeclaredFacts {\n readonly facts: AstDeclaredTypeFact[];\n readonly declarations: AstDeclaredDeclaration[];\n readonly ownerInventories: AstDeclaredOwnerInventory[];\n readonly q3Classes: AstQ3ClassDeclarationFact[];\n readonly q3TypeAliases: AstQ3TypeAliasFact[];\n readonly q3NewReceiverBindings: AstQ3NewReceiverBindingFact[];\n readonly visitedOwners: Set<string>;\n}\n\nfunction appendNodeTypeFacts(\n node: Node,\n language: AstDeclaredTypeLanguage,\n writePositionsByName: ReadonlyMap<string, readonly number[]>,\n accumulator: MutableDeclaredFacts,\n): void {\n const annotationFact = typeFactForDeclaration(node, language);\n if (annotationFact) accumulator.facts.push(annotationFact);\n const returnFact = typeFactForReturn(node);\n if (returnFact) accumulator.facts.push(returnFact);\n const initializerFact = typeFactForInitializer(node);\n if (initializerFact) accumulator.facts.push(initializerFact);\n const q3TypeAlias = typeAliasFactForDeclaration(node);\n if (q3TypeAlias) accumulator.q3TypeAliases.push(q3TypeAlias);\n const q3Class = q3ClassDeclarationFact(node);\n if (q3Class) accumulator.q3Classes.push(q3Class);\n const q3NewReceiverBinding = q3NewReceiverBindingFact(\n node,\n writePositionsByName,\n );\n if (q3NewReceiverBinding)\n accumulator.q3NewReceiverBindings.push(q3NewReceiverBinding);\n accumulator.facts.push(...typeFactsForHeritage(node, language));\n}\n\nfunction appendOwnerInventory(\n node: Node,\n accumulator: MutableDeclaredFacts,\n): void {\n if (!INVENTORY_OWNER_NODE_TYPES.has(node.type)) return;\n const key = `${node.startIndex}:${node.endIndex}:${node.type}`;\n if (accumulator.visitedOwners.has(key)) return;\n accumulator.visitedOwners.add(key);\n const collected = collectOwnerInventory(node);\n accumulator.ownerInventories.push(collected.inventory);\n accumulator.declarations.push(...collected.declarations);\n}\n\nfunction appendFreeCallableDeclaration(\n node: Node,\n accumulator: MutableDeclaredFacts,\n): void {\n if (\n !FREE_CALLABLE_NODE_TYPES.has(node.type) ||\n (isFunctionValueMember(node) && !isAnonymousDirectDefaultFunction(node))\n )\n return;\n accumulator.declarations.push(freeCallableDeclaration(node));\n}\n\nfunction isSimpleTopLevelValueNode(node: Node): boolean {\n if (node.type !== \"variable_declarator\" || node.hasError) return false;\n const nameNode = node.childForFieldName(\"name\");\n if (\n !nameNode ||\n !SIMPLE_NAME_NODE_TYPES.has(nameNode.type) ||\n nearestOwner(node.parent).kind !== \"program\"\n )\n return false;\n const value = node.childForFieldName(\"value\");\n return !value || !FREE_CALLABLE_NODE_TYPES.has(value.type);\n}\n\nfunction isVariableDeclarationNode(node: Node | null): node is Node {\n return (\n node?.type === \"lexical_declaration\" ||\n node?.type === \"variable_declaration\"\n );\n}\n\nfunction isRootExportOfDeclaration(\n exportStatement: Node | null,\n declaration: Node,\n): boolean {\n if (\n exportStatement?.type !== \"export_statement\" ||\n exportStatement.parent?.type !== \"program\"\n )\n return false;\n const exportedDeclaration = exportStatement.childForFieldName(\"declaration\");\n return (\n exportedDeclaration?.type === declaration.type &&\n exportedDeclaration.startIndex === declaration.startIndex &&\n exportedDeclaration.endIndex === declaration.endIndex\n );\n}\n\nfunction hasDirectExportAncestor(node: Node): boolean {\n const declaration = node.parent;\n if (!isVariableDeclarationNode(declaration)) return false;\n return isRootExportOfDeclaration(declaration.parent, declaration);\n}\n\nfunction directlyExportedTopLevelValue(\n node: Node,\n): AstDeclaredDeclaration | null {\n if (!isSimpleTopLevelValueNode(node) || !hasDirectExportAncestor(node))\n return null;\n const nameNode = node.childForFieldName(\"name\");\n if (!nameNode) return null;\n const owner = nearestOwner(node.parent);\n return {\n kind: \"unknown\",\n name: nameNode.text,\n declarationSpan: span(node),\n owner,\n lexicalScopeSpan: lexicalScope(node),\n visibility: null,\n isStatic: false,\n isAbstract: false,\n isOptional: false,\n arity: null,\n genericTypeParameterNames: [],\n };\n}\n\nfunction collectDeclaredFactsForNode(\n node: Node,\n language: AstDeclaredTypeLanguage,\n writePositionsByName: ReadonlyMap<string, readonly number[]>,\n accumulator: MutableDeclaredFacts,\n): void {\n appendNodeTypeFacts(node, language, writePositionsByName, accumulator);\n appendOwnerInventory(node, accumulator);\n appendFreeCallableDeclaration(node, accumulator);\n const exportedValue = directlyExportedTopLevelValue(node);\n if (exportedValue) accumulator.declarations.push(exportedValue);\n}\n\n/**\n * Extract explicit TS/JS type syntax and a separate declaration/member inventory. The result\n * contains no graph IDs, parser allocation IDs, source hashes, or inferred type relationships.\n */\nexport function extractDeclaredTypeFacts(\n root: Node,\n language: AstDeclaredTypeLanguage,\n): AstDeclaredTypeFacts {\n if (\n language !== \"typescript\" &&\n language !== \"tsx\" &&\n language !== \"javascript\"\n )\n throw new RangeError(\n `Unsupported declared-type grammar: ${String(language)}`,\n );\n\n const facts: AstDeclaredTypeFact[] = [];\n const declarations: AstDeclaredDeclaration[] = [];\n const ownerInventories: AstDeclaredOwnerInventory[] = [];\n const q3Classes: AstQ3ClassDeclarationFact[] = [];\n const q3TypeAliases: AstQ3TypeAliasFact[] = [];\n const q3NewReceiverBindings: AstQ3NewReceiverBindingFact[] = [];\n const writePositionsByName = collectSimpleWritePositions(root);\n const visitedOwners = new Set<string>();\n const accumulator: MutableDeclaredFacts = {\n facts,\n declarations,\n ownerInventories,\n q3Classes,\n q3TypeAliases,\n q3NewReceiverBindings,\n visitedOwners,\n };\n\n walk(root, (node) =>\n collectDeclaredFactsForNode(\n node,\n language,\n writePositionsByName,\n accumulator,\n ),\n );\n\n facts.sort(compareFacts);\n declarations.sort(compareDeclarations);\n ownerInventories.sort(\n (a, b) =>\n a.owner.span.start - b.owner.span.start ||\n a.owner.kind.localeCompare(b.owner.kind),\n );\n q3TypeAliases.sort(\n (a, b) => a.declarationSpan.start - b.declarationSpan.start,\n );\n q3Classes.sort((a, b) => a.declarationSpan.start - b.declarationSpan.start);\n q3NewReceiverBindings.sort(\n (a, b) => a.declarationSpan.start - b.declarationSpan.start,\n );\n\n return {\n schemaVersion: AST_DECLARED_TYPE_FACTS_SCHEMA_VERSION,\n language,\n facts,\n declarations,\n ownerInventories,\n q3ReceiverFacts: {\n schemaVersion: AST_Q3_RECEIVER_FACTS_SCHEMA_VERSION,\n classes: q3Classes,\n typeAliases: q3TypeAliases,\n newReceiverBindings: q3NewReceiverBindings,\n },\n };\n}\n","import type { Node } from \"web-tree-sitter\";\nimport {\n AST_CALL_SITE_SHAPE_SCHEMA_VERSION,\n type AstCallCalleeBinding,\n type AstCallArgumentKind,\n type AstCallReceiverBinding,\n type AstCallSiteShapeFact,\n type AstCallSiteShapeFacts,\n type AstImportDescriptor,\n type AstDeclaredTypeLanguage,\n type AstUtf16Span,\n} from \"@workspace/contracts\";\n\nconst CALLABLE_SCOPE_TYPES = new Set([\n \"arrow_function\",\n \"function_declaration\",\n \"function_expression\",\n \"generator_function\",\n \"generator_function_declaration\",\n \"method_definition\",\n]);\nconst CLASS_TYPES = new Set([\n \"class_declaration\",\n \"abstract_class_declaration\",\n \"class\",\n]);\nconst NAMED_SHADOW_DECLARATION_TYPES = new Set([\n \"class\",\n \"class_declaration\",\n \"abstract_class_declaration\",\n \"function_expression\",\n \"function_declaration\",\n \"generator_function\",\n \"generator_function_declaration\",\n]);\nconst TYPE_SIGNATURE_TYPES = new Set([\n \"function_type\",\n \"constructor_type\",\n \"call_signature\",\n \"construct_signature\",\n \"index_signature\",\n \"object_type\",\n]);\nconst FOR_SCOPE_TYPES = new Set([\n \"for_statement\",\n \"for_in_statement\",\n \"for_of_statement\",\n \"for_await_statement\",\n]);\nconst BINDING_PATTERN_TYPES = new Set([\n \"object_pattern\",\n \"array_pattern\",\n \"pair_pattern\",\n \"assignment_pattern\",\n \"object_assignment_pattern\",\n \"rest_pattern\",\n]);\nconst SIMPLE_IDENTIFIER = /^[$_\\p{ID_Start}][$_\\u200C\\u200D\\p{ID_Continue}]*$/u;\n\ninterface WorkerCallSite {\n readonly startLine: number;\n readonly startColumn: number;\n readonly calleeName?: string;\n readonly receiverText?: string;\n readonly calleeKind?: \"bare\" | \"member\" | \"this\" | \"arg-chain\" | \"computed\";\n}\n\ntype SupportedWorkerCallSite = WorkerCallSite & {\n readonly calleeName: string;\n readonly calleeKind?: \"bare\" | \"member\" | \"this\" | \"arg-chain\";\n};\n\ninterface PendingFact {\n readonly fact: Omit<AstCallSiteShapeFact, \"peerMemberNames\">;\n readonly peerKey: string | null;\n}\n\ninterface IndexedBinding {\n readonly name: string;\n readonly declarationSpan: AstUtf16Span;\n readonly scopeSpan: AstUtf16Span;\n readonly kind:\n | AstCallReceiverBinding[\"kind\"]\n | \"import\"\n | \"type-only-import\"\n | \"unsupported\";\n}\n\ninterface ShapeIndexes {\n readonly callExpressions: ReadonlyMap<string, readonly Node[]>;\n readonly bindingsByScope: ReadonlyMap<\n string,\n ReadonlyMap<string, IndexedBinding>\n >;\n readonly propertiesByClassAndName: ReadonlyMap<\n string,\n AstCallReceiverBinding | null\n >;\n}\n\nfunction span(node: Node): AstUtf16Span {\n return { start: node.startIndex, end: node.endIndex };\n}\n\nfunction namedChildren(node: Node): Node[] {\n const result: Node[] = [];\n for (let index = 0; index < node.namedChildCount; index += 1) {\n const child = node.namedChild(index);\n if (child) result.push(child);\n }\n return result;\n}\n\nfunction allChildren(node: Node): Node[] {\n const result: Node[] = [];\n for (let index = 0; index < node.childCount; index += 1) {\n const child = node.child(index);\n if (child) result.push(child);\n }\n return result;\n}\n\nfunction walk(node: Node, visit: (current: Node) => void): void {\n visit(node);\n for (const child of namedChildren(node)) walk(child, visit);\n}\n\nfunction ancestor(\n node: Node | null,\n accepts: (current: Node) => boolean,\n): Node | null {\n let current = node;\n while (current) {\n if (accepts(current)) return current;\n current = current.parent;\n }\n return null;\n}\n\nfunction bindingName(node: Node): string | null {\n const name =\n node.childForFieldName(\"name\") ??\n node.childForFieldName(\"pattern\") ??\n node.childForFieldName(\"declarator\");\n return name?.type === \"identifier\" ? name.text : null;\n}\n\nfunction nearestScope(\n node: Node,\n accepts: (current: Node) => boolean,\n root: Node,\n): Node {\n return ancestor(node.parent, accepts) ?? root;\n}\n\nfunction declarationKind(node: Node): string | undefined {\n return node.parent?.text.trimStart().match(/^(var|let|const)\\b/)?.[1];\n}\n\nfunction bindingScope(node: Node, root: Node): Node {\n if (node.type === \"required_parameter\" || node.type === \"optional_parameter\")\n return nearestScope(\n node,\n (current) => CALLABLE_SCOPE_TYPES.has(current.type),\n root,\n );\n const kind = declarationKind(node);\n if (kind === \"var\")\n return nearestScope(\n node,\n (current) => CALLABLE_SCOPE_TYPES.has(current.type),\n root,\n );\n const forScope = ancestor(node.parent, (current) =>\n FOR_SCOPE_TYPES.has(current.type),\n );\n if (forScope) return forScope;\n return nearestScope(\n node,\n (current) => current.type === \"statement_block\",\n root,\n );\n}\n\nfunction lexicalScope(node: Node, root: Node): Node {\n return (\n ancestor(node.parent, (current) =>\n CALLABLE_SCOPE_TYPES.has(current.type),\n ) ?? root\n );\n}\n\nfunction classThisOwner(node: Node): Node | null {\n let current = node.parent;\n while (current) {\n if (CLASS_TYPES.has(current.type)) return current;\n if (current.type === \"arrow_function\") {\n current = current.parent;\n continue;\n }\n if (\n CALLABLE_SCOPE_TYPES.has(current.type) &&\n !(\n current.type === \"method_definition\" &&\n current.parent?.type === \"class_body\"\n )\n )\n return null;\n current = current.parent;\n }\n return null;\n}\n\nfunction callerType(node: Node): AstCallSiteShapeFact[\"callerType\"] {\n const owner = classThisOwner(node);\n const name = owner?.childForFieldName(\"name\")?.text;\n return owner && name ? { name, span: span(owner) } : null;\n}\n\nfunction fieldBinding(\n propertyName: string,\n classNode: Node,\n member: Node,\n): AstCallReceiverBinding | null {\n if (\n (member.type !== \"public_field_definition\" &&\n member.type !== \"field_definition\") ||\n member.childForFieldName(\"name\")?.text !== propertyName\n )\n return null;\n return {\n kind: \"field\",\n name: propertyName,\n declarationSpan: span(member),\n scopeSpan: span(classNode),\n };\n}\n\nfunction patternNames(node: Node): string[] {\n if (node.type === \"identifier\") return [node.text];\n if (\n node.type === \"shorthand_property_identifier_pattern\" ||\n node.type === \"shorthand_property_identifier\"\n )\n return [node.text];\n if (!BINDING_PATTERN_TYPES.has(node.type)) return [];\n return namedChildren(node).flatMap(patternNames);\n}\n\nfunction addBinding(\n index: Map<string, Map<string, IndexedBinding>>,\n node: Node,\n scope: Node,\n kind: IndexedBinding[\"kind\"],\n names: readonly string[],\n): void {\n const key = scopeIndexKey(scope);\n const bindings = index.get(key) ?? new Map<string, IndexedBinding>();\n for (const name of names) {\n const existing = bindings.get(name);\n if (existing) {\n if (\n existing.declarationSpan.start !== node.startIndex ||\n existing.declarationSpan.end !== node.endIndex\n )\n bindings.set(name, { ...existing, kind: \"unsupported\" });\n continue;\n }\n bindings.set(name, {\n name,\n declarationSpan: span(node),\n scopeSpan: span(scope),\n kind,\n });\n }\n index.set(key, bindings);\n}\n\nfunction indexCallableBinding(\n node: Node,\n root: Node,\n index: Map<string, Map<string, IndexedBinding>>,\n): void {\n if (\n ancestor(node.parent, (current) => TYPE_SIGNATURE_TYPES.has(current.type))\n )\n return;\n const pattern =\n node.childForFieldName(\"name\") ??\n node.childForFieldName(\"pattern\") ??\n node.childForFieldName(\"declarator\");\n if (!pattern) return;\n const names = patternNames(pattern);\n const simple = pattern.type === \"identifier\";\n const loopBinding = ancestor(node.parent, (current) =>\n FOR_SCOPE_TYPES.has(current.type),\n );\n const kind: IndexedBinding[\"kind\"] =\n simple &&\n (node.type === \"required_parameter\" || node.type === \"optional_parameter\")\n ? \"parameter\"\n : loopBinding\n ? \"unsupported\"\n : simple\n ? \"local\"\n : \"unsupported\";\n addBinding(index, node, bindingScope(node, root), kind, names);\n}\n\nfunction indexDirectCallableParameters(\n node: Node,\n index: Map<string, Map<string, IndexedBinding>>,\n): void {\n if (!CALLABLE_SCOPE_TYPES.has(node.type)) return;\n const parameters = node.childForFieldName(\"parameters\");\n const directParameter = node.childForFieldName(\"parameter\");\n const candidates = parameters\n ? namedChildren(parameters)\n : directParameter\n ? [directParameter]\n : [];\n for (const parameter of candidates) {\n if (\n parameter.type === \"required_parameter\" ||\n parameter.type === \"optional_parameter\"\n )\n continue;\n const names = patternNames(parameter);\n if (names.length === 0) continue;\n const simple = parameter.type === \"identifier\";\n addBinding(\n index,\n parameter,\n node,\n simple ? \"parameter\" : \"unsupported\",\n names,\n );\n }\n}\n\nfunction indexNamedDeclarationShadow(\n node: Node,\n root: Node,\n index: Map<string, Map<string, IndexedBinding>>,\n): void {\n if (!NAMED_SHADOW_DECLARATION_TYPES.has(node.type)) return;\n const name = node.childForFieldName(\"name\");\n if (name?.type !== \"identifier\" && name?.type !== \"type_identifier\") return;\n const ownNameScope =\n node.type === \"class\" ||\n node.type === \"function_expression\" ||\n node.type === \"generator_function\";\n const scope = ownNameScope\n ? node\n : nearestScope(node, (current) => current.type === \"statement_block\", root);\n addBinding(index, name, scope, \"unsupported\", [name.text]);\n}\n\nfunction indexCatchBinding(\n node: Node,\n index: Map<string, Map<string, IndexedBinding>>,\n): void {\n if (node.type !== \"catch_clause\") return;\n const parameter = node.childForFieldName(\"parameter\");\n if (!parameter) return;\n const body = node.childForFieldName(\"body\") ?? node;\n addBinding(index, parameter, body, \"unsupported\", patternNames(parameter));\n}\n\nfunction indexLoopBinding(\n node: Node,\n index: Map<string, Map<string, IndexedBinding>>,\n): void {\n if (!FOR_SCOPE_TYPES.has(node.type)) return;\n const declaration =\n node.childForFieldName(\"left\") ?? node.childForFieldName(\"initializer\");\n if (!declaration) return;\n const declarator =\n declaration.type === \"variable_declaration\"\n ? namedChildren(declaration).find(\n (child) => child.type === \"variable_declarator\",\n )\n : declaration;\n const pattern =\n declarator?.type === \"variable_declarator\"\n ? declarator.childForFieldName(\"name\")\n : declarator;\n if (!pattern) return;\n addBinding(index, pattern, node, \"unsupported\", patternNames(pattern));\n}\n\nfunction indexImportBindings(\n root: Node,\n imports: readonly AstImportDescriptor[],\n index: Map<string, Map<string, IndexedBinding>>,\n): void {\n const bindings = index.get(scopeIndexKey(root)) ?? new Map();\n for (const [name, descriptors] of groupImportBindings(imports))\n setImportBinding(root, bindings, name, descriptors);\n index.set(scopeIndexKey(root), bindings);\n}\n\nfunction groupImportBindings(\n imports: readonly AstImportDescriptor[],\n): Map<string, AstImportDescriptor[]> {\n const importsByName = new Map<string, AstImportDescriptor[]>();\n for (const descriptor of imports) {\n if (descriptor.viaReexport) continue;\n const matches = importsByName.get(descriptor.localName) ?? [];\n matches.push(descriptor);\n importsByName.set(descriptor.localName, matches);\n }\n return importsByName;\n}\n\nfunction setImportBinding(\n root: Node,\n bindings: Map<string, IndexedBinding>,\n name: string,\n descriptors: readonly AstImportDescriptor[],\n): void {\n const existing = bindings.get(name);\n const scopeSpan = span(root);\n if (descriptors.length !== 1 || existing) {\n bindings.set(name, {\n name,\n declarationSpan: existing?.declarationSpan ?? scopeSpan,\n scopeSpan,\n kind: \"unsupported\",\n });\n return;\n }\n bindings.set(name, {\n name,\n declarationSpan: scopeSpan,\n scopeSpan,\n kind: descriptors[0]?.isTypeOnly ? \"type-only-import\" : \"import\",\n });\n}\n\nfunction buildBindingIndex(\n root: Node,\n imports: readonly AstImportDescriptor[],\n): Map<string, Map<string, IndexedBinding>> {\n const index = new Map<string, Map<string, IndexedBinding>>();\n walk(root, (node) => {\n if (\n node.type === \"required_parameter\" ||\n node.type === \"optional_parameter\" ||\n node.type === \"variable_declarator\"\n )\n indexCallableBinding(node, root, index);\n indexDirectCallableParameters(node, index);\n indexNamedDeclarationShadow(node, root, index);\n indexCatchBinding(node, index);\n indexLoopBinding(node, index);\n });\n indexImportBindings(root, imports, index);\n return index;\n}\n\nfunction propertyIndexKey(classNode: Node, name: string): string {\n return `${classNode.startIndex}:${name}`;\n}\n\nfunction scopeIndexKey(node: Node): string {\n return `${node.type}:${node.startIndex}:${node.endIndex}`;\n}\n\nfunction setPropertyBinding(\n index: Map<string, AstCallReceiverBinding | null>,\n key: string,\n binding: AstCallReceiverBinding,\n): void {\n index.set(key, index.has(key) ? null : binding);\n}\n\nfunction hasParameterPropertyModifier(node: Node): boolean {\n return allChildren(node).some(\n (child) =>\n child.type === \"accessibility_modifier\" || child.text === \"readonly\",\n );\n}\n\nfunction indexConstructorProperties(\n classNode: Node,\n member: Node,\n index: Map<string, AstCallReceiverBinding | null>,\n): void {\n if (\n member.type !== \"method_definition\" ||\n member.childForFieldName(\"name\")?.text !== \"constructor\"\n )\n return;\n const parameters = member.childForFieldName(\"parameters\");\n for (const parameter of parameters ? namedChildren(parameters) : []) {\n const property = bindingName(parameter);\n if (!property || !hasParameterPropertyModifier(parameter)) continue;\n setPropertyBinding(index, propertyIndexKey(classNode, property), {\n kind: \"parameter-property\",\n name: property,\n declarationSpan: span(parameter),\n scopeSpan: span(classNode),\n });\n }\n}\n\nfunction indexClassProperties(\n classNode: Node,\n index: Map<string, AstCallReceiverBinding | null>,\n): void {\n const body = classNode.childForFieldName(\"body\");\n for (const member of body ? namedChildren(body) : []) {\n const name = member.childForFieldName(\"name\")?.text;\n const field = name ? fieldBinding(name, classNode, member) : null;\n if (field)\n setPropertyBinding(index, propertyIndexKey(classNode, name!), field);\n indexConstructorProperties(classNode, member, index);\n }\n}\n\nfunction buildPropertyIndex(\n root: Node,\n): Map<string, AstCallReceiverBinding | null> {\n const index = new Map<string, AstCallReceiverBinding | null>();\n walk(root, (node) => {\n if (CLASS_TYPES.has(node.type)) indexClassProperties(node, index);\n });\n return index;\n}\n\nfunction callSiteIndexKey(row: number, column: number, name: string): string {\n return `${row}:${column}:${name}`;\n}\n\nfunction buildShapeIndexes(\n root: Node,\n imports: readonly AstImportDescriptor[],\n): ShapeIndexes {\n const calls = new Map<string, Node[]>();\n walk(root, (node) => {\n if (node.type !== \"call_expression\") return;\n const callee = node.childForFieldName(\"function\");\n if (!callee) return;\n const position =\n callee.childForFieldName(\"property\") ??\n callee.childForFieldName(\"name\") ??\n callee;\n const name = callee.childForFieldName(\"property\")?.text ?? callee.text;\n const key = callSiteIndexKey(\n position.startPosition.row,\n position.startPosition.column,\n name,\n );\n calls.set(key, [...(calls.get(key) ?? []), node]);\n });\n return {\n callExpressions: calls,\n bindingsByScope: buildBindingIndex(root, imports),\n propertiesByClassAndName: buildPropertyIndex(root),\n };\n}\n\nfunction resolveThisReceiverBinding(\n receiverText: string,\n call: Node,\n indexes: ShapeIndexes,\n): AstCallReceiverBinding | null | undefined {\n const owner = classThisOwner(call);\n if (receiverText === \"this\")\n return owner\n ? {\n kind: \"this\",\n name: \"this\",\n declarationSpan: span(owner),\n scopeSpan: span(owner),\n }\n : null;\n const property = receiverText.match(\n /^this\\.([\\p{ID_Start}_$][\\p{ID_Continue}$]*)$/u,\n );\n if (!property) return undefined;\n return owner\n ? (indexes.propertiesByClassAndName.get(\n propertyIndexKey(owner, property[1]),\n ) ?? null)\n : null;\n}\n\nfunction resolveReceiverBinding(\n receiverText: string | undefined,\n call: Node,\n indexes: ShapeIndexes,\n): AstCallReceiverBinding | null {\n if (!receiverText) return null;\n const thisBinding = resolveThisReceiverBinding(receiverText, call, indexes);\n if (thisBinding !== undefined) return thisBinding;\n if (!SIMPLE_IDENTIFIER.test(receiverText)) return null;\n const binding = findLexicalBinding(receiverText, call, indexes);\n return binding ? bindingResult(receiverText, binding) : null;\n}\n\nfunction findLexicalBinding(\n name: string,\n node: Node,\n indexes: ShapeIndexes,\n): IndexedBinding | undefined {\n let current: Node | null = node;\n while (current) {\n const binding = indexes.bindingsByScope\n .get(scopeIndexKey(current))\n ?.get(name);\n if (binding) return binding;\n current = current.parent;\n }\n return undefined;\n}\n\nfunction bindingResult(\n name: string,\n candidate: IndexedBinding | null,\n): AstCallReceiverBinding | null {\n if (\n !candidate ||\n candidate.kind === \"unsupported\" ||\n candidate.kind === \"import\" ||\n candidate.kind === \"type-only-import\"\n )\n return null;\n return {\n kind: candidate.kind,\n name,\n declarationSpan: candidate.declarationSpan,\n scopeSpan: candidate.scopeSpan,\n };\n}\n\nfunction calleeBinding(\n record: SupportedWorkerCallSite,\n call: Node,\n indexes: ShapeIndexes,\n): AstCallCalleeBinding | null {\n const kind = record.calleeKind ?? \"bare\";\n if (kind !== \"bare\") return null;\n const name = record.calleeName;\n const binding = findLexicalBinding(name, call, indexes);\n if (!binding) return { kind: \"unbound\", name };\n const bindingKind =\n binding.kind === \"import\" ||\n binding.kind === \"type-only-import\" ||\n binding.kind === \"local\" ||\n binding.kind === \"parameter\"\n ? binding.kind\n : \"unsupported\";\n return {\n kind: bindingKind,\n name,\n declarationSpan: binding.declarationSpan,\n scopeSpan: binding.scopeSpan,\n };\n}\n\nfunction argumentKind(node: Node): AstCallArgumentKind {\n switch (node.type) {\n case \"string\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"true\":\n case \"false\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"object\":\n return \"object\";\n case \"array\":\n return \"array\";\n case \"arrow_function\":\n case \"function_expression\":\n return \"function\";\n default:\n return \"unknown\";\n }\n}\n\nfunction peerKey(\n scope: AstUtf16Span,\n binding: AstCallReceiverBinding | null,\n): string | null {\n if (!binding) return null;\n return [\n scope.start,\n scope.end,\n binding.kind,\n binding.declarationSpan.start,\n binding.declarationSpan.end,\n binding.scopeSpan.start,\n binding.scopeSpan.end,\n ].join(\":\");\n}\n\nfunction findCall(record: WorkerCallSite, indexes: ShapeIndexes): Node | null {\n if (!record.calleeName || record.calleeKind === \"computed\") return null;\n const calls = indexes.callExpressions.get(\n callSiteIndexKey(record.startLine, record.startColumn, record.calleeName),\n );\n return calls?.length === 1 ? (calls[0] ?? null) : null;\n}\n\nfunction isSupportedCall(\n record: WorkerCallSite,\n): record is SupportedWorkerCallSite {\n return Boolean(record.calleeName) && record.calleeKind !== \"computed\";\n}\n\nfunction pendingForCall(\n record: SupportedWorkerCallSite,\n call: Node,\n root: Node,\n indexes: ShapeIndexes,\n): PendingFact {\n const argsNode = call.childForFieldName(\"arguments\");\n const args = argsNode\n ? namedChildren(argsNode).filter((argument) => argument.type !== \"comment\")\n : [];\n const hasSpreadArgument = args.some(\n (argument) => argument.type === \"spread_element\",\n );\n const scope = lexicalScope(call, root);\n const binding = resolveReceiverBinding(record.receiverText, call, indexes);\n const callBinding = calleeBinding(record, call, indexes);\n const argumentsStart = call.childForFieldName(\"arguments\")?.startIndex;\n const calleeSource = call.text.slice(\n 0,\n argumentsStart === undefined\n ? call.text.length\n : argumentsStart - call.startIndex,\n );\n const fact: Omit<AstCallSiteShapeFact, \"peerMemberNames\"> = {\n startLine: record.startLine,\n startColumn: record.startColumn,\n calleeName: record.calleeName ?? \"\",\n calleeKind: record.calleeKind ?? \"bare\",\n receiverText: record.receiverText ?? null,\n receiverBinding: binding,\n receiverOptional: calleeSource.includes(\"?.\"),\n calleeBinding: callBinding,\n lexicalScopeSpan: span(scope),\n callerType: callerType(call),\n argumentCount: hasSpreadArgument ? null : args.length,\n hasSpreadArgument,\n argumentKinds: args.map(argumentKind),\n };\n return { fact, peerKey: peerKey(fact.lexicalScopeSpan, binding) };\n}\n\nfunction addPeerName(\n namesByPeer: Map<string, Set<string>>,\n fact: Omit<AstCallSiteShapeFact, \"peerMemberNames\">,\n key: string | null,\n): void {\n if (!key || (fact.calleeKind !== \"member\" && fact.calleeKind !== \"this\"))\n return;\n const names = namesByPeer.get(key) ?? new Set<string>();\n names.add(fact.calleeName);\n namesByPeer.set(key, names);\n}\n\n/** Extracts real TS/JS call syntax into additive, binding-scoped facts. */\nexport function extractCallSiteShapeFacts(\n root: Node,\n language: AstDeclaredTypeLanguage,\n calls: readonly WorkerCallSite[],\n imports: readonly AstImportDescriptor[],\n): AstCallSiteShapeFacts {\n const indexes = buildShapeIndexes(root, imports);\n const pending = calls.flatMap((record) => {\n if (!isSupportedCall(record)) return [];\n const call = findCall(record, indexes);\n return call ? [pendingForCall(record, call, root, indexes)] : [];\n });\n const namesByPeer = new Map<string, Set<string>>();\n for (const { fact, peerKey: key } of pending) {\n addPeerName(namesByPeer, fact, key);\n }\n const callSites = pending.map(({ fact, peerKey: key }) => ({\n ...fact,\n peerMemberNames: [...(key ? (namesByPeer.get(key) ?? []) : [])]\n .filter((name) => name !== fact.calleeName)\n .sort(),\n }));\n return {\n schemaVersion: AST_CALL_SITE_SHAPE_SCHEMA_VERSION,\n language,\n callSites,\n };\n}\n","import { createHash } from \"node:crypto\";\nimport type { LanguageProvider } from \"@workspace/ast-core\";\nimport { LanguageNodeTypes } from \"@workspace/ast-core\";\nimport { ENCODING_HEX, HASH_ALGO_SHA256 } from \"@workspace/contracts\";\nimport type { Node, Tree } from \"web-tree-sitter\";\nimport {\n buildQualifiedBaseKey,\n buildUniqueNodeKey,\n} from \"../graph/node-key.js\";\nimport { AstMessages, AstNodeTypes } from \"./ast-constants.js\";\n\nexport interface TierAFunctionSummary {\n readonly name: string;\n readonly startLine: number;\n readonly endLine: number;\n readonly declarationSpan?: { readonly start: number; readonly end: number };\n readonly contentHash?: string;\n readonly containerName?: string;\n}\n\nexport interface TierAClassSummary {\n readonly name: string;\n readonly startLine: number;\n readonly endLine: number;\n readonly methods: string[];\n readonly contentHash?: string;\n}\n\nexport interface TierAVariableSummary {\n readonly name: string;\n readonly startLine: number;\n readonly endLine: number;\n readonly contentHash?: string;\n}\n\nexport interface TierAIndexedDeclaration {\n readonly nodeKey: string;\n readonly name: string;\n readonly containerName?: string;\n readonly nodeType: string;\n readonly startLine: number;\n readonly endLine: number;\n readonly startIndex: number;\n readonly endIndex: number;\n readonly nameStartIndex: number | null;\n readonly sourceText: string;\n readonly signatureText: string;\n}\n\ninterface CallableName {\n readonly name: string;\n readonly nameNode: Node | null | undefined;\n}\n\nconst NAME_BEARING_PARENT_TYPES = new Set<string>([\n AstNodeTypes.VARIABLE_DECLARATOR,\n AstNodeTypes.ASSIGNMENT_EXPRESSION,\n AstNodeTypes.PAIR,\n AstNodeTypes.PUBLIC_FIELD_DEFINITION,\n]);\n\nconst CALLABLE_SCOPE_NODE_TYPES = new Set<string>([\n LanguageNodeTypes.ARROW_FUNCTION,\n LanguageNodeTypes.FUNCTION_EXPRESSION,\n LanguageNodeTypes.FUNCTION_DECLARATION,\n LanguageNodeTypes.GENERATOR_FUNCTION,\n LanguageNodeTypes.GENERATOR_FUNCTION_DECLARATION,\n LanguageNodeTypes.FUNCTION_DEFINITION,\n LanguageNodeTypes.METHOD_DECLARATION,\n LanguageNodeTypes.METHOD_DEFINITION,\n LanguageNodeTypes.LOCAL_FUNCTION_STATEMENT,\n LanguageNodeTypes.CONSTRUCTOR_DECLARATION,\n LanguageNodeTypes.DESTRUCTOR_DECLARATION,\n LanguageNodeTypes.CONVERSION_OPERATOR_DECLARATION,\n LanguageNodeTypes.OPERATOR_DECLARATION,\n LanguageNodeTypes.COMPACT_CONSTRUCTOR_DECLARATION,\n LanguageNodeTypes.METHOD,\n LanguageNodeTypes.SINGLETON_METHOD,\n LanguageNodeTypes.FUNCTION_ITEM,\n]);\n\n/**\n * Symbol-level feature hash (STOR-005): a hash of the AST node's own exact source span\n * (`node.text`), independent of the containing file's blob hash. Lets a single-symbol edit\n * produce a one-line JSONL diff for that symbol without touching its untouched siblings' hashes.\n *\n * The algorithm/digest constants come from `@workspace/contracts` (issue #211) so the worker's\n * hashes can never drift from the main thread's (`ast-worker-pool.ts`, `file-discovery.service.ts`)\n * or `lib/schema`'s. Package-name imports resolve through node_modules and work fine inside a\n * `worker_threads` Worker (as the existing contracts/ast-core imports above prove) — only bare\n * relative `.js`-to-`.ts` sibling imports needed a tsx resolve hook that doesn't propagate into\n * workers, and even that limitation is moot in dist/ where a fully-compiled worker ships.\n */\nfunction symbolContentHash(node: Node): string {\n return createHash(HASH_ALGO_SHA256).update(node.text).digest(ENCODING_HEX);\n}\n\nfunction getNodeName(node: Node): string {\n return (\n node.childForFieldName(\"name\")?.text ||\n node.descendantsOfType(LanguageNodeTypes.IDENTIFIER)[0]?.text ||\n AstMessages.ANONYMOUS_NAME\n );\n}\n\nfunction resolveDeclaratorNestedName(node: Node): Node | null | undefined {\n return node.childForFieldName(\"declarator\")?.childForFieldName(\"declarator\");\n}\n\nfunction callableNameFromDeclaration(node: Node): CallableName | undefined {\n const ownName = node.childForFieldName(\"name\");\n if (ownName) return { name: ownName.text, nameNode: ownName };\n\n const declaratorName = resolveDeclaratorNestedName(node);\n if (!declaratorName) return undefined;\n if (declaratorName.type !== AstNodeTypes.QUALIFIED_IDENTIFIER)\n return { name: declaratorName.text, nameNode: declaratorName };\n const qualifiedName = declaratorName.childForFieldName(\"name\");\n return {\n name: qualifiedName?.text ?? AstMessages.ANONYMOUS_NAME,\n nameNode: qualifiedName,\n };\n}\n\nfunction callableNameFromParent(node: Node): CallableName | undefined {\n let current = node.parent;\n while (current) {\n // An `arguments` ancestor means this callable is itself passed as a call argument\n // (for example, `arr.map(x => x + 1)`). Stop here: climbing further would misattribute\n // the outer binding, such as `results` in `const results = arr.map(...)`, to this callback.\n if (current.type === AstNodeTypes.ARGUMENTS) return undefined;\n // A callable nested in another function belongs to its own scope. Do not climb through that\n // boundary to inherit an outer binding, as with `const factory = () => { return () => {}; }`.\n if (CALLABLE_SCOPE_NODE_TYPES.has(current.type)) return undefined;\n if (NAME_BEARING_PARENT_TYPES.has(current.type)) {\n const nameNode =\n current.childForFieldName(\"name\") ||\n current.childForFieldName(\"key\") ||\n current.childForFieldName(\"left\");\n if (nameNode) return { name: nameNode.text, nameNode };\n }\n current = current.parent;\n }\n return undefined;\n}\n\nfunction callableName(node: Node): CallableName {\n return (\n callableNameFromDeclaration(node) ??\n callableNameFromParent(node) ?? {\n name: AstMessages.ANONYMOUS_NAME,\n nameNode: undefined,\n }\n );\n}\n\nexport function resolveCallableName(node: Node): string {\n return callableName(node).name;\n}\n\n/** Walk to the nearest extracted function/class container, or return the anonymous sentinel. */\nexport function findEnclosingContainerName(\n node: Node,\n containerIds: ReadonlySet<number>,\n): string {\n let current = node.parent;\n while (current) {\n if (containerIds.has(current.id)) return getNodeName(current);\n current = current.parent;\n }\n return AstMessages.ANONYMOUS_NAME;\n}\n\n/** Unwrap Rust generic impl and Go pointer receiver fields to their contained type identifier. */\nfunction firstTypeIdentifierText(node: Node): string | undefined {\n return node.type === AstNodeTypes.TYPE_IDENTIFIER\n ? node.text\n : node.descendantsOfType(AstNodeTypes.TYPE_IDENTIFIER)[0]?.text;\n}\n\n/**\n * GRPH-006 (Rust): `impl_item` is not part of the extracted class nodes, so the lexical ancestor\n * walk returns `anonymous`. The concrete Self type is on the impl's `type` field; for `impl Trait\n * for Type`, use `Type`, not the trait name.\n */\nfunction resolveRustImplContainerName(node: Node): string | undefined {\n let current = node.parent;\n while (current) {\n if (current.type === AstNodeTypes.IMPL_ITEM) {\n const typeField = current.childForFieldName(\"type\");\n return typeField ? firstTypeIdentifierText(typeField) : undefined;\n }\n current = current.parent;\n }\n return undefined;\n}\n\n/**\n * GRPH-006 (Go): a method's receiver type is in its own `receiver` field, not an ancestor; a\n * `type_declaration` does not enclose a `method_declaration`.\n */\nfunction resolveGoReceiverContainerName(node: Node): string | undefined {\n const receiver = node.childForFieldName(\"receiver\");\n const paramType = receiver?.namedChild(0)?.childForFieldName(\"type\");\n return paramType ? firstTypeIdentifierText(paramType) : undefined;\n}\n\n/**\n * GRPH-006 (C++): out-of-line `Ret Class::method(){}` is not lexically inside the class. Its\n * declarator's `qualified_identifier.scope` supplies the immediate container; nested qualifiers\n * use the innermost scope, matching the index's single-level containment rule.\n */\nfunction resolveCppQualifiedContainerName(node: Node): string | undefined {\n const declarator = node.childForFieldName(\"declarator\");\n const inner = declarator?.childForFieldName(\"declarator\");\n if (inner?.type !== AstNodeTypes.QUALIFIED_IDENTIFIER) return undefined;\n const scope = inner.childForFieldName(\"scope\");\n if (!scope) return undefined;\n return scope.type === AstNodeTypes.QUALIFIED_IDENTIFIER\n ? scope.childForFieldName(\"name\")?.text\n : scope.text;\n}\n\n/** Apply the Rust, Go, and C++ non-lexical container rules after the generic ancestor walk misses. */\nfunction resolveDeferredLanguageContainerName(node: Node): string | undefined {\n return (\n resolveRustImplContainerName(node) ??\n resolveGoReceiverContainerName(node) ??\n resolveCppQualifiedContainerName(node)\n );\n}\n\nexport function collectClassNodes(\n tree: Tree,\n provider: LanguageProvider,\n classes: TierAClassSummary[],\n): Node[] {\n const classNodes = provider.extractClasses(tree.rootNode);\n for (const node of classNodes) {\n classes.push({\n name: getNodeName(node),\n startLine: node.startPosition.row,\n endLine: node.endPosition.row,\n methods: [],\n contentHash: symbolContentHash(node),\n });\n }\n return classNodes;\n}\n\nconst FUNCTION_VALUE_NODE_TYPES = new Set<string>([\n LanguageNodeTypes.ARROW_FUNCTION,\n LanguageNodeTypes.FUNCTION_EXPRESSION,\n]);\n\nexport function collectVariableNodes(\n tree: Tree,\n provider: LanguageProvider,\n variables: TierAVariableSummary[],\n): Node[] {\n const variableNodes = provider.extractVariables?.(tree.rootNode) ?? [];\n const indexableNodes: Node[] = [];\n for (const node of variableNodes) {\n const value = node.childForFieldName(\"value\");\n if (value && FUNCTION_VALUE_NODE_TYPES.has(value.type)) continue;\n indexableNodes.push(node);\n variables.push({\n name: getNodeName(node),\n startLine: node.startPosition.row,\n endLine: node.endPosition.row,\n contentHash: symbolContentHash(node),\n });\n }\n return indexableNodes;\n}\n\nexport function collectFunctionNodes(\n tree: Tree,\n provider: LanguageProvider,\n functions: TierAFunctionSummary[],\n classNodes: Node[],\n): Node[] {\n const classIds = new Set(classNodes.map((node) => node.id));\n const functionNodes = provider.extractFunctions(tree.rootNode);\n for (const node of functionNodes) {\n const container = findEnclosingContainerName(node, classIds);\n // The anonymous sentinel means top-level here. Persisting it as a real container would\n // incorrectly qualify every top-level function as `file#anonymous.name`.\n const containerName =\n container === AstMessages.ANONYMOUS_NAME\n ? resolveDeferredLanguageContainerName(node)\n : container;\n functions.push({\n name: callableName(node).name,\n startLine: node.startPosition.row,\n endLine: node.endPosition.row,\n declarationSpan: { start: node.startIndex, end: node.endIndex },\n contentHash: symbolContentHash(node),\n containerName,\n });\n }\n return functionNodes;\n}\n\nexport function extractTierAIndexedDeclarations(\n filePath: string,\n tree: Tree,\n provider: LanguageProvider,\n): TierAIndexedDeclaration[] {\n const classes: TierAClassSummary[] = [];\n const functions: TierAFunctionSummary[] = [];\n const variables: TierAVariableSummary[] = [];\n const classNodes = collectClassNodes(tree, provider, classes);\n const functionNodes = collectFunctionNodes(\n tree,\n provider,\n functions,\n classNodes,\n );\n const variableNodes = collectVariableNodes(tree, provider, variables);\n const usedNodeKeys = new Set<string>([filePath]);\n const declarations: TierAIndexedDeclaration[] = [];\n\n for (let index = 0; index < functionNodes.length; index += 1) {\n const node = functionNodes[index];\n const summary = functions[index];\n if (!node || !summary) continue;\n const nodeKey = buildUniqueNodeKey(\n usedNodeKeys,\n buildQualifiedBaseKey(filePath, summary.name, summary.containerName),\n summary.startLine,\n );\n usedNodeKeys.add(nodeKey);\n declarations.push(\n indexedDeclaration(nodeKey, summary.name, summary.containerName, node),\n );\n }\n\n for (let index = 0; index < classNodes.length; index += 1) {\n const node = classNodes[index];\n const summary = classes[index];\n if (!node || !summary) continue;\n const nodeKey = buildUniqueNodeKey(\n usedNodeKeys,\n buildQualifiedBaseKey(filePath, summary.name),\n summary.startLine,\n );\n usedNodeKeys.add(nodeKey);\n declarations.push(\n indexedDeclaration(nodeKey, summary.name, undefined, node),\n );\n }\n\n for (let index = 0; index < variableNodes.length; index += 1) {\n const node = variableNodes[index];\n const summary = variables[index];\n if (!node || !summary) continue;\n const nodeKey = buildUniqueNodeKey(\n usedNodeKeys,\n buildQualifiedBaseKey(filePath, summary.name),\n summary.startLine,\n );\n usedNodeKeys.add(nodeKey);\n declarations.push(\n indexedDeclaration(nodeKey, summary.name, undefined, node),\n );\n }\n\n return declarations;\n}\n\nfunction indexedDeclaration(\n nodeKey: string,\n name: string,\n containerName: string | undefined,\n node: Node,\n): TierAIndexedDeclaration {\n const nameNode =\n node.childForFieldName(\"name\") ?? callableName(node).nameNode;\n return {\n nodeKey,\n name,\n containerName,\n nodeType: node.type,\n startLine: node.startPosition.row,\n endLine: node.endPosition.row,\n startIndex: node.startIndex,\n endIndex: node.endIndex,\n nameStartIndex: nameNode?.startIndex ?? null,\n sourceText: node.text,\n signatureText: signatureText(node),\n };\n}\n\nfunction signatureText(node: Node): string {\n const body = node.childForFieldName(\"body\");\n if (!body) return node.text.trim();\n return node.text.slice(0, body.startIndex - node.startIndex).trim();\n}\n"],"mappings":"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","names":["parentPort","Parser","Language","path","fs","TYPE_FACT_DECLARATIONS","RETURN_ANNOTATION_NODES","TYPE_SIGNATURE_NODE_TYPES","OWNER_NODE_KINDS","INVENTORY_OWNER_NODE_TYPES","MEMBER_KIND_BY_NODE","FREE_CALLABLE_NODE_TYPES","SKIPPED_OWNER_CHILDREN","SIMPLE_NAME_NODE_TYPES","span","node","namedChildren","result","index","child","children","walk","visit","directName","nameNode","typeParameterNames","parameters","parameter","name","ownerFromNode","kind","nearestOwner","current","nearestAncestor","matches","isClassOwnerNode","isTypeOwnerNode","isCallableNode","isParameterInsideTypeSignature","isInsideObjectType","callableName","ownName","parent","binding","lexicalScope","body","varDeclarationScope","declaration","hasModifier","modifier","nearestConstructor","isParameterProperty","language","isShadowedTypeParameter","typeNode","simpleTypeReference","annotationTypeNode","annotation","types","declarationBindingName","pattern","factOwner","ownerNode","factLexicalScope","varScope","classNode","makeFact","simpleType","owner","typeFactForDeclaration","isRejectedTypeDeclaration","factKind","typeFactForReturn","typeFactForInitializer","constructor","newInitializerConstructor","value","typeAliasFactForDeclaration","q3ClassDeclarationFact","newBindingKind","match","writeTarget","collectSimpleWritePositions","root","positions","target","writes","hasBindingWrite","writesByName","scope","declarationEnd","position","q3NewReceiverBindingFact","bindingKind","scopeSpan","typeFactsForHeritage","javascriptHeritageFact","heritageFactKind","isSupportedHeritageNode","targets","heritageTargets","fact","heritageDeclaration","obstructingType","candidate","hasSyntaxError","visibilityOf","memberName","hasOptionalMarker","parameterNodes","callable","parameterPattern","isRestParameter","isOptionalParameter","isThisParameter","callableArity","params","requiredParameterCount","hasRest","staticMemberName","unknownMemberDeclaration","reason","declaredMemberKind","memberCallableArity","memberDeclaration","declaredKind","pairDeclaration","key","ownerNodeFromSpan","ownerBody","unknownParameterProperty","constructorPropertyDeclaration","constructorPropertyDeclarations","method","childDeclarations","ownerNodeType","properties","collectOwnerDeclarations","declarations","reasons","childItems","item","collectOwnerInventory","collected","freeCallableDeclaration","isFunctionValueMember","valueMatchesNode","isAnonymousDirectDefaultFunction","compareFacts","a","b","compareDeclarations","appendNodeTypeFacts","writePositionsByName","accumulator","annotationFact","returnFact","initializerFact","q3TypeAlias","q3Class","q3NewReceiverBinding","appendOwnerInventory","appendFreeCallableDeclaration","isSimpleTopLevelValueNode","isVariableDeclarationNode","isRootExportOfDeclaration","exportStatement","exportedDeclaration","hasDirectExportAncestor","directlyExportedTopLevelValue","collectDeclaredFactsForNode","exportedValue","extractDeclaredTypeFacts","facts","ownerInventories","q3Classes","q3TypeAliases","q3NewReceiverBindings","CALLABLE_SCOPE_TYPES","CLASS_TYPES","NAMED_SHADOW_DECLARATION_TYPES","TYPE_SIGNATURE_TYPES","FOR_SCOPE_TYPES","BINDING_PATTERN_TYPES","SIMPLE_IDENTIFIER","span","node","namedChildren","result","index","child","allChildren","walk","visit","ancestor","accepts","current","bindingName","name","nearestScope","root","declarationKind","bindingScope","forScope","lexicalScope","classThisOwner","callerType","owner","fieldBinding","propertyName","classNode","member","patternNames","addBinding","scope","kind","names","key","scopeIndexKey","bindings","existing","indexCallableBinding","pattern","simple","loopBinding","indexDirectCallableParameters","parameters","directParameter","candidates","parameter","indexNamedDeclarationShadow","indexCatchBinding","body","indexLoopBinding","declaration","declarator","indexImportBindings","imports","descriptors","groupImportBindings","setImportBinding","importsByName","descriptor","matches","scopeSpan","buildBindingIndex","propertyIndexKey","setPropertyBinding","binding","hasParameterPropertyModifier","indexConstructorProperties","property","indexClassProperties","field","buildPropertyIndex","callSiteIndexKey","row","column","buildShapeIndexes","calls","callee","position","resolveThisReceiverBinding","receiverText","call","indexes","resolveReceiverBinding","thisBinding","findLexicalBinding","bindingResult","candidate","calleeBinding","record","argumentKind","peerKey","findCall","isSupportedCall","pendingForCall","argsNode","args","argument","hasSpreadArgument","callBinding","argumentsStart","calleeSource","fact","addPeerName","namesByPeer","extractCallSiteShapeFacts","language","pending","callSites","createHash","NAME_BEARING_PARENT_TYPES","AstNodeTypes","CALLABLE_SCOPE_NODE_TYPES","LanguageNodeTypes","symbolContentHash","node","createHash","HASH_ALGO_SHA256","getNodeName","AstMessages","resolveDeclaratorNestedName","callableNameFromDeclaration","ownName","declaratorName","qualifiedName","callableNameFromParent","current","nameNode","callableName","resolveCallableName","findEnclosingContainerName","containerIds","firstTypeIdentifierText","resolveRustImplContainerName","typeField","resolveGoReceiverContainerName","paramType","resolveCppQualifiedContainerName","inner","scope","resolveDeferredLanguageContainerName","collectClassNodes","tree","provider","classes","classNodes","FUNCTION_VALUE_NODE_TYPES","collectVariableNodes","variables","variableNodes","indexableNodes","value","collectFunctionNodes","functions","classIds","functionNodes","container","containerName","logger","IpcLoggerClient","message","parentPort","err","AstMessages","parserInitialized","registryPromise","getRegistry","loadDefaultRegistry","languageCache","getLanguage","wasmPath","cached","Language","extractFallbackImports","code","fallbackImports","importMatches","match","unwrapToCalleeExpression","node","getCalleeEvidence","callee","children","terminal","receiver","normalizeCallText","CALLEE_IDENTIFIER_NODE_TYPES","calleeName","receiverText","text","getCallSitePosition","collectCallEdges","tree","provider","functionNodes","calls","functionIds","n","callNodes","position","evidence","findEnclosingContainerName","collectImplementsEdges","classNodes","implementsList","classIds","collectExtendsEdges","extendsList","WORKER_SPAWN_LANGUAGES","SUPPORTED_LANGUAGES","WORKER_CONSTRUCTOR_NAME","PATH_MODULE_OBJECT_NAME","PATH_RESOLVE_METHOD_NAME","PATH_JOIN_METHOD_NAME","DIRNAME_IDENTIFIER_NAME","isPathJoinOrResolveCall","fn","object","property","extractDirnameJoinedLiteral","callNode","args","findDirnameJoinedAssignment","argText","assignment","AstNodeTypes","left","right","literal","resolveWorkerArgumentPath","argNode","collectWorkerSpawns","language","workerSpawns","firstArg","targetPath","namedChildren","index","child","directExportDescriptors","root","exports","statement","directExportForStatement","directDefaultExportDescriptor","declaration","directExportForDeclaration","directFunctionSyntax","defaultDeclarationNodes","classExport","directClassExportDescriptor","functionExport","directFunctionExportDescriptor","directVariableExportDescriptors","name","declarator","extractAstData","decisions","imports","reexports","functions","classes","variables","AstMessages","parseReexportDescriptors","collectClassNodes","collectFunctionNodes","importNodes","parseImportDescriptors","collectVariableNodes","e","reportQueryCompileFailures","failure","logger","parseAndExtract","langInstance","filePath","parser","Parser","data","declaredTypeLanguage","getDeclaredTypeLanguage","result","extractDeclaredTypeFacts","extractCallSiteShapeFacts","buildParseResponse","request","parserInitialized","registry","getRegistry","ext","wasmPath","attemptedPaths","resolveWasmPath","getLanguage","parentPort","response","err"]}