@aroman22/codegraph-vba 1.3.3

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.
Files changed (153) hide show
  1. package/README.md +855 -0
  2. package/dist/bin/codegraph.d.ts +26 -0
  3. package/dist/bin/command-supervision.d.ts +12 -0
  4. package/dist/bin/fatal-handler.d.ts +20 -0
  5. package/dist/bin/node-version-check.d.ts +37 -0
  6. package/dist/bin/uninstall.d.ts +14 -0
  7. package/dist/context/formatter.d.ts +30 -0
  8. package/dist/context/index.d.ts +119 -0
  9. package/dist/context/markers.d.ts +19 -0
  10. package/dist/db/index.d.ts +122 -0
  11. package/dist/db/migrations.d.ts +44 -0
  12. package/dist/db/queries.d.ts +402 -0
  13. package/dist/db/sqlite-adapter.d.ts +53 -0
  14. package/dist/directory.d.ts +179 -0
  15. package/dist/errors.d.ts +136 -0
  16. package/dist/extraction/astro-extractor.d.ts +79 -0
  17. package/dist/extraction/dfm-extractor.d.ts +31 -0
  18. package/dist/extraction/extraction-version.d.ts +25 -0
  19. package/dist/extraction/function-ref.d.ts +118 -0
  20. package/dist/extraction/generated-detection.d.ts +30 -0
  21. package/dist/extraction/grammars.d.ts +128 -0
  22. package/dist/extraction/index.d.ts +187 -0
  23. package/dist/extraction/languages/c-cpp.d.ts +12 -0
  24. package/dist/extraction/languages/csharp.d.ts +25 -0
  25. package/dist/extraction/languages/dart.d.ts +3 -0
  26. package/dist/extraction/languages/go.d.ts +3 -0
  27. package/dist/extraction/languages/index.d.ts +10 -0
  28. package/dist/extraction/languages/java.d.ts +3 -0
  29. package/dist/extraction/languages/javascript.d.ts +3 -0
  30. package/dist/extraction/languages/kotlin.d.ts +3 -0
  31. package/dist/extraction/languages/lua.d.ts +3 -0
  32. package/dist/extraction/languages/luau.d.ts +3 -0
  33. package/dist/extraction/languages/objc.d.ts +3 -0
  34. package/dist/extraction/languages/pascal.d.ts +3 -0
  35. package/dist/extraction/languages/php.d.ts +3 -0
  36. package/dist/extraction/languages/python.d.ts +3 -0
  37. package/dist/extraction/languages/r.d.ts +3 -0
  38. package/dist/extraction/languages/ruby.d.ts +3 -0
  39. package/dist/extraction/languages/rust.d.ts +3 -0
  40. package/dist/extraction/languages/scala.d.ts +3 -0
  41. package/dist/extraction/languages/swift.d.ts +3 -0
  42. package/dist/extraction/languages/typescript.d.ts +16 -0
  43. package/dist/extraction/liquid-extractor.d.ts +59 -0
  44. package/dist/extraction/mybatis-extractor.d.ts +48 -0
  45. package/dist/extraction/parse-pool.d.ts +126 -0
  46. package/dist/extraction/parse-worker.d.ts +8 -0
  47. package/dist/extraction/razor-extractor.d.ts +42 -0
  48. package/dist/extraction/sql-query-extractor.d.ts +25 -0
  49. package/dist/extraction/svelte-extractor.d.ts +56 -0
  50. package/dist/extraction/tree-sitter-helpers.d.ts +28 -0
  51. package/dist/extraction/tree-sitter-types.d.ts +239 -0
  52. package/dist/extraction/tree-sitter.d.ts +647 -0
  53. package/dist/extraction/vba-extractor.d.ts +394 -0
  54. package/dist/extraction/vba-form-extractor.d.ts +89 -0
  55. package/dist/extraction/vba-preprocess.d.ts +81 -0
  56. package/dist/extraction/vue-extractor.d.ts +51 -0
  57. package/dist/extraction/wasm-runtime-flags.d.ts +38 -0
  58. package/dist/graph/index.d.ts +8 -0
  59. package/dist/graph/queries.d.ts +106 -0
  60. package/dist/graph/traversal.d.ts +127 -0
  61. package/dist/index.d.ts +563 -0
  62. package/dist/installer/config-writer.d.ts +28 -0
  63. package/dist/installer/index.d.ts +100 -0
  64. package/dist/installer/instructions-template.d.ts +41 -0
  65. package/dist/installer/targets/antigravity.d.ts +57 -0
  66. package/dist/installer/targets/claude.d.ts +62 -0
  67. package/dist/installer/targets/codex.d.ts +18 -0
  68. package/dist/installer/targets/cursor.d.ts +35 -0
  69. package/dist/installer/targets/gemini.d.ts +26 -0
  70. package/dist/installer/targets/hermes.d.ts +18 -0
  71. package/dist/installer/targets/kiro.d.ts +27 -0
  72. package/dist/installer/targets/opencode.d.ts +38 -0
  73. package/dist/installer/targets/registry.d.ts +35 -0
  74. package/dist/installer/targets/shared.d.ts +101 -0
  75. package/dist/installer/targets/toml.d.ts +52 -0
  76. package/dist/installer/targets/types.d.ts +108 -0
  77. package/dist/mcp/daemon-manager.d.ts +42 -0
  78. package/dist/mcp/daemon-paths.d.ts +73 -0
  79. package/dist/mcp/daemon-registry.d.ts +47 -0
  80. package/dist/mcp/daemon.d.ts +258 -0
  81. package/dist/mcp/dynamic-boundaries.d.ts +41 -0
  82. package/dist/mcp/engine.d.ts +122 -0
  83. package/dist/mcp/index.d.ts +113 -0
  84. package/dist/mcp/liveness-watchdog.d.ts +18 -0
  85. package/dist/mcp/ppid-watchdog.d.ts +62 -0
  86. package/dist/mcp/proxy.d.ts +87 -0
  87. package/dist/mcp/query-pool.d.ts +94 -0
  88. package/dist/mcp/query-worker.d.ts +24 -0
  89. package/dist/mcp/server-instructions.d.ts +34 -0
  90. package/dist/mcp/session.d.ts +79 -0
  91. package/dist/mcp/stdin-teardown.d.ts +27 -0
  92. package/dist/mcp/tools.d.ts +591 -0
  93. package/dist/mcp/transport.d.ts +188 -0
  94. package/dist/mcp/version.d.ts +19 -0
  95. package/dist/project-config.d.ts +56 -0
  96. package/dist/reasoning/config.d.ts +45 -0
  97. package/dist/reasoning/credentials.d.ts +5 -0
  98. package/dist/reasoning/login.d.ts +21 -0
  99. package/dist/reasoning/reasoner.d.ts +43 -0
  100. package/dist/resolution/c-fnptr-synthesizer.d.ts +5 -0
  101. package/dist/resolution/callback-synthesizer.d.ts +15 -0
  102. package/dist/resolution/frameworks/astro.d.ts +9 -0
  103. package/dist/resolution/frameworks/cargo-workspace.d.ts +18 -0
  104. package/dist/resolution/frameworks/csharp.d.ts +8 -0
  105. package/dist/resolution/frameworks/drupal.d.ts +51 -0
  106. package/dist/resolution/frameworks/expo-modules.d.ts +3 -0
  107. package/dist/resolution/frameworks/express.d.ts +8 -0
  108. package/dist/resolution/frameworks/fabric.d.ts +3 -0
  109. package/dist/resolution/frameworks/go.d.ts +8 -0
  110. package/dist/resolution/frameworks/goframe.d.ts +41 -0
  111. package/dist/resolution/frameworks/index.d.ts +50 -0
  112. package/dist/resolution/frameworks/java.d.ts +8 -0
  113. package/dist/resolution/frameworks/laravel.d.ts +13 -0
  114. package/dist/resolution/frameworks/nestjs.d.ts +26 -0
  115. package/dist/resolution/frameworks/play.d.ts +19 -0
  116. package/dist/resolution/frameworks/python.d.ts +10 -0
  117. package/dist/resolution/frameworks/react-native.d.ts +3 -0
  118. package/dist/resolution/frameworks/react.d.ts +8 -0
  119. package/dist/resolution/frameworks/ruby.d.ts +8 -0
  120. package/dist/resolution/frameworks/rust.d.ts +8 -0
  121. package/dist/resolution/frameworks/svelte.d.ts +9 -0
  122. package/dist/resolution/frameworks/swift-objc.d.ts +37 -0
  123. package/dist/resolution/frameworks/swift.d.ts +10 -0
  124. package/dist/resolution/frameworks/vue.d.ts +9 -0
  125. package/dist/resolution/go-module.d.ts +26 -0
  126. package/dist/resolution/goframe-synthesizer.d.ts +28 -0
  127. package/dist/resolution/import-resolver.d.ts +78 -0
  128. package/dist/resolution/index.d.ts +196 -0
  129. package/dist/resolution/lru-cache.d.ts +24 -0
  130. package/dist/resolution/name-matcher.d.ts +93 -0
  131. package/dist/resolution/path-aliases.d.ts +68 -0
  132. package/dist/resolution/strip-comments.d.ts +27 -0
  133. package/dist/resolution/swift-objc-bridge.d.ts +134 -0
  134. package/dist/resolution/types.d.ts +233 -0
  135. package/dist/resolution/workspace-packages.d.ts +48 -0
  136. package/dist/search/query-parser.d.ts +57 -0
  137. package/dist/search/query-utils.d.ts +87 -0
  138. package/dist/sync/git-hooks.d.ts +45 -0
  139. package/dist/sync/index.d.ts +19 -0
  140. package/dist/sync/watch-policy.d.ts +48 -0
  141. package/dist/sync/watcher.d.ts +358 -0
  142. package/dist/sync/worktree.d.ts +54 -0
  143. package/dist/telemetry/index.d.ts +143 -0
  144. package/dist/types.d.ts +409 -0
  145. package/dist/ui/glyphs.d.ts +42 -0
  146. package/dist/ui/shimmer-progress.d.ts +11 -0
  147. package/dist/ui/shimmer-worker.d.ts +2 -0
  148. package/dist/ui/types.d.ts +17 -0
  149. package/dist/upgrade/index.d.ts +132 -0
  150. package/dist/utils.d.ts +224 -0
  151. package/npm-sdk.js +75 -0
  152. package/npm-shim.js +246 -0
  153. package/package.json +32 -0
@@ -0,0 +1,394 @@
1
+ import { ExtractionResult } from '../types';
2
+ export declare class VbaExtractor {
3
+ private filePath;
4
+ private source;
5
+ private nodes;
6
+ private edges;
7
+ private errors;
8
+ private unresolvedReferences;
9
+ private moduleOrClassNode;
10
+ /**
11
+ * Class-name prefix for `qualifiedName` composition.
12
+ *
13
+ * B3 (hueco 5): for `.cls` files every function node's `qualifiedName`
14
+ * is composed as `${className}.${procName}` (e.g. `Form_TestForm.Form_Load`)
15
+ * so cross-class callers can disambiguate which form each `Form_Load`
16
+ * belongs to. For `.bas` files this is `null` — module-scoped procs
17
+ * keep their bare-name `qualifiedName` (e.g. `DoThing`), preserving
18
+ * the pre-hueco-5 behavior and every existing qualifiedName-based
19
+ * assertion in `extraction-vba.test.ts`.
20
+ *
21
+ * Resolved once per `extract()` from `isCls` + `vbName` (both already
22
+ * computed for `createModuleOrClassNode`); `sweepProcedures` reads it
23
+ * to set `ProcInfo.qualifiedName` and the function node's qualifiedName.
24
+ */
25
+ private classNamePrefix;
26
+ /**
27
+ * Map of procedure name (within this file) → list of ProcInfo. The list
28
+ * (rather than a single value) is needed because VBA allows multiple
29
+ * Property accessors with the same name: `Property Get Foo`, `Property
30
+ * Let Foo`, and `Property Set Foo` all share the name `Foo`. Audit W6
31
+ * (June 2026): the previous Map<string, ProcInfo> kept only the last
32
+ * accessor, breaking same-file call resolution and emitting the wrong
33
+ * `findFunctionNodeByName` match.
34
+ */
35
+ private localProcs;
36
+ /**
37
+ * Cache: procedure name → first matching function node emitted for that
38
+ * name. Audit S2 (June 2026): the previous implementation did an O(n)
39
+ * linear scan of all nodes for every call site; with W6's multimap
40
+ * the same-name collision can return multiple matches but bare-name
41
+ * call resolution only needs the first.
42
+ */
43
+ private functionNodeByName;
44
+ /**
45
+ * Cache: startLine → function node emitted for that line. Used by Fix 1
46
+ * (June 2026): when Property Get/Let/Set share a name, we need to find
47
+ * the SPECIFIC accessor's node by its declaration line rather than relying
48
+ * on `functionNodeByName` which only stores the first accessor.
49
+ */
50
+ private functionNodeByStartLine;
51
+ constructor(filePath: string, source: string);
52
+ extract(): ExtractionResult;
53
+ private result;
54
+ private isFormOrReportFile;
55
+ private createFileNode;
56
+ private detectVbName;
57
+ private createModuleOrClassNode;
58
+ /** Sub/Function/Property regex — captures visibility prefix, kind, and name. */
59
+ private static readonly PROC_RE;
60
+ /**
61
+ * Walk the (uncommented, line-joined) source and emit one `function` node
62
+ * per `Sub` / `Function` / `Property` declaration. Also records the proc
63
+ * in `localProcs` so call-site resolution can distinguish same-file from
64
+ * cross-module calls.
65
+ */
66
+ private sweepProcedures;
67
+ /** Implements regex. */
68
+ private static readonly IMPLEMENTS_RE;
69
+ /** Edges whose source needs to be set to the module/class id once it exists. */
70
+ private pendingModuleOrClassSource;
71
+ private sweepImplements;
72
+ /**
73
+ * Check that a line is a variable declaration and NOT a Sub/Function/
74
+ * Property/Const/WithEvents header (those have their own sweeps).
75
+ * Fix 1+3 (Issues #1,#3): replaced the old single-match DIM_QUAL_RE /
76
+ * DIM_UNQUAL_RE pair with a prefix-check + global scan that handles
77
+ * `As New <Type>`, multi-variable `Dim a As Foo, b As Bar`, and all
78
+ * visibility keywords in one pass.
79
+ */
80
+ private static readonly DIM_DECL_PREFIX_RE;
81
+ /**
82
+ * Globally scan all `identifier As [New] TypePart1[.TypePart2]` on a
83
+ * variable declaration line. Run with /g after confirming DIM_DECL_PREFIX_RE.
84
+ *
85
+ * Groups: (1) variable name, (2) type outer part, (3) type inner part (if qualified).
86
+ * `(?:New\s+)?` consumes the VBA auto-instantiation keyword so it is
87
+ * never captured as the type name (Fix 1).
88
+ */
89
+ private static readonly DIM_ALL_VARS_RE;
90
+ /**
91
+ * VBA primitive type names — skipped when emitted as Dim targets so
92
+ * we don't pollute the graph with `As Long` / `As String` references.
93
+ * Fix 4: all entries are LOWERCASE and the lookup lowercases the
94
+ * captured type name so `As long`, `As LONG`, `As Long` all match.
95
+ * Fix 1 (Issue #1): added `'new'` as a backstop so that if the `As New`
96
+ * pattern is ever captured as a type name it is silently skipped.
97
+ */
98
+ private static readonly PRIMITIVE_TYPES;
99
+ /** `WithEvents m_X As Form_Foo` — Dim/Private/Public prefix is optional. */
100
+ private static readonly WITHEVENTS_RE;
101
+ private sweepDimsAndWithEvents;
102
+ /** `[visibility] Enum <Name>` — opens an enum block. */
103
+ private static readonly ENUM_START_RE;
104
+ /** `End Enum` — closes the current enum block. */
105
+ private static readonly ENUM_END_RE;
106
+ /**
107
+ * An enum member line: a leading identifier optionally followed by `=
108
+ * <value>`. Runs only inside an open Enum block, on the (already
109
+ * comment-stripped) source, so a trailing `'comment` never reaches here.
110
+ * `\p{L}` covers accented member names (e.g. `Sí`).
111
+ */
112
+ private static readonly ENUM_MEMBER_RE;
113
+ /** `[visibility] Const <decls>` — captures visibility (1) and the rest (2). */
114
+ private static readonly CONST_DECL_RE;
115
+ /**
116
+ * One declared name inside a `Const` body. A name sits at a declaration
117
+ * boundary (start-of-body or after a comma), optionally followed by
118
+ * `As <Type>`, then `=`. Run with /g over the CONST_DECL_RE group 2 so
119
+ * multi-name lines (`Const A = 1, B = 2`) emit one node per name.
120
+ */
121
+ private static readonly CONST_NAME_RE;
122
+ /**
123
+ * Fold a VBA visibility keyword to the canonical lowercase enum, matching
124
+ * the procedure convention: `Private` → 'private'; `Public`, `Global`,
125
+ * `Friend`, or none → 'public' (VBA's default module-level `Const`/`Enum`
126
+ * is Private, but we follow the same broader-than-private fold the proc
127
+ * sweep uses so visibility is consistent across symbol kinds).
128
+ */
129
+ private static foldVisibility;
130
+ /**
131
+ * Walk the (uncommented, line-joined) source and emit:
132
+ * - one `enum` node per `Enum <Name>` block, with one `enum_member` node
133
+ * per member and a `contains` edge enum→member;
134
+ * - one `constant` node per name declared on a `Const` line (multi-name
135
+ * lines emit one node per name);
136
+ * - a `contains` edge from the module/class node to each enum and constant
137
+ * (held in `pendingModuleOrClassSource` until the module node exists).
138
+ *
139
+ * Returns the number of top-level symbols (enums + constants) emitted so
140
+ * the caller can flip `hasAnySymbols`.
141
+ */
142
+ private sweepEnumsAndConsts;
143
+ /**
144
+ * Emit a `contains` edge from the (lazily-created) module/class node to
145
+ * `targetId`. Mirrors the pending-source pattern the procedure and
146
+ * implements sweeps use: the module node doesn't exist yet, so the edge's
147
+ * source is rewritten once `extract()` creates it.
148
+ */
149
+ private pushContainsFromModule;
150
+ /**
151
+ * Walk the (uncommented) source per line. For each line:
152
+ * - If it starts a `Sub`/`Function`/`Property`, push the proc onto a stack.
153
+ * - If it ends one (`End Sub` / `End Function` / `End Property`), pop.
154
+ * - While inside a procedure, scan the line for call-site patterns and
155
+ * SQL-wrapper patterns.
156
+ *
157
+ * Call-site regex: `(?<!\w)([A-Za-z_]\w*)(?:\.([A-Za-z_]\w*))?\s*\(` —
158
+ * captures either `Name(...)` (same-file candidate) or `Receiver.Member(...)`
159
+ * (qualified — emit a synthetic node + heuristic edge).
160
+ */
161
+ private static readonly CALL_RE;
162
+ /** SQL wrapper helpers — order matters because `db.Execute` is a suffix of others. */
163
+ private static readonly SQL_WRAPPERS;
164
+ /**
165
+ * `DoCmd.OpenForm "<FormName>"` modelling regex — B4 (hueco 6).
166
+ *
167
+ * Real VBA idiom (matches both forms):
168
+ * `DoCmd.OpenForm "MyForm"`
169
+ * `DoCmd.OpenForm "MyForm", acNormal, , , acFormEdit`
170
+ *
171
+ * Captures the form NAME (group 1) so the extractor can synthesize an
172
+ * `opens-form` heuristic edge from the calling Sub to a stub for the
173
+ * target form. The trailing positional args (`acNormal`, `acFormEdit`,
174
+ * etc.) are intentionally NOT captured — the orchestrator's scope decision
175
+ * was to cover ONLY `OpenForm` for this commit; `OpenReport`, `OpenQuery`,
176
+ * `OpenTable`, … are flagged in the commit body as follow-up work.
177
+ *
178
+ * Why a separate dispatch: `DoCmd` is in `RUNTIME_RECEIVER_BLACKLIST`
179
+ * (R4 invariant), so `DoCmd.OpenForm` is intentionally SKIPPED by the
180
+ * generic `CALL_RE` path that would otherwise emit a junk `calls` edge
181
+ * to a synthetic `function` node for `DoCmd.OpenForm`. This regex
182
+ * matches BEFORE the call-site scan and uses its own dispatch to emit
183
+ * the `opens-form` edge instead — sharing no logic with CALL_RE.
184
+ */
185
+ private static readonly OPEN_FORM_RE;
186
+ /** SQL assigned to a local variable, e.g. `m_SQL = "SELECT ..." & ...`. */
187
+ private static readonly SQL_VAR_ASSIGN_RE;
188
+ /** SQL wrapper called with a variable, e.g. `getdb().Execute m_SQL`. */
189
+ private static readonly SQL_VAR_EXEC_RE;
190
+ /** SQL table-name regex scoped to FROM / INTO / UPDATE. */
191
+ private static readonly SQL_TABLE_RE;
192
+ /**
193
+ * `Me.<ControlName>` reference capture — hole 1 of VBA control-modeling.
194
+ *
195
+ * Real VBA idiom:
196
+ * `Me.lblTitulo.Caption = "Hello"` ← property assignment
197
+ * `Me.txtDescripcion.Value = "World"` ← property assignment
198
+ * `Me.ComandoGrabar.Enabled = True` ← property assignment
199
+ * `If Nz(Me.MotivoBorrado, "") = "" Then` ← read in expression
200
+ *
201
+ * The existing call-site scanner (CALL_RE) only fires on `Name(`
202
+ * (paren form) and `Me` is in its keyword blacklist anyway, so
203
+ * `Me.<Control>` references are silently invisible. This regex matches
204
+ * the FIRST identifier after `Me.` regardless of what follows (a
205
+ * property, an index, an assignment, a call argument, etc.) so the
206
+ * form → control binding is surfaced as an UnresolvedReference for the
207
+ * resolver to pick up later. Subsequent segments (`.Caption`, `.Value`,
208
+ * `.Enabled`) are intentionally NOT captured — they are properties of
209
+ * the control, not new symbols.
210
+ *
211
+ * Provenance: `metadata.synthesizedBy = 'vba-me-control'`. Mirrors the
212
+ * `vba-form-binding` (form→sibling-`.cls`) and `vba-name-resolution`
213
+ * (qualified Dim) patterns already documented on `UnresolvedReference.metadata`
214
+ * in `src/types.ts`.
215
+ */
216
+ private static readonly ME_CONTROL_RE;
217
+ /** Keywords we never want to match as call receivers. */
218
+ private static readonly CALL_KEYWORD_BLACKLIST;
219
+ /**
220
+ * Access runtime objects and singletons. Calls on these receivers are
221
+ * real VBA calls but the targets are NOT user-defined modules or
222
+ * classes — they're Access/DAO/ADO runtime types. Synthesizing a
223
+ * `function` node for each would pollute the graph with ~20+ junk
224
+ * nodes per real-world file (audit W4, June 2026). Skip synthesis
225
+ * for any receiver or member in this set.
226
+ *
227
+ * Note: `DoCmd.RunSQL`, `DoCmd.OpenForm`, etc. still get SQL/edge
228
+ * tracking via the dedicated `SQL_WRAPPERS` regex path (REQ-CODE-8),
229
+ * which fires BEFORE this scan and uses its own dispatch — so
230
+ * blacklisting DoCmd here doesn't lose the SQL-flow edges.
231
+ */
232
+ private static readonly RUNTIME_RECEIVER_BLACKLIST;
233
+ /**
234
+ * Fix 2 (Issue #2): replace string-literal content with spaces so that
235
+ * call-site patterns inside `"..."` spans are invisible to CALL_RE and
236
+ * the statement-form detectors. Column positions are preserved (each
237
+ * character is replaced 1-for-1) so any col-based metadata stays correct.
238
+ */
239
+ private static maskStringContent;
240
+ /**
241
+ * Fix 2 (Issue #2): return true iff `receiverName` is a file-local variable
242
+ * (appears in `localVarTypeMap`) whose declared type is a SIMPLE (non-
243
+ * qualified, non-primitive) identifier — a candidate project-defined class.
244
+ * Qualified types (e.g. `DAO.Recordset`) and primitives (`String`, `Long`)
245
+ * return false so runtime/DAO calls are suppressed.
246
+ */
247
+ private isLocalProjectClassVar;
248
+ private sweepCallsAndSql;
249
+ private scanCallSites;
250
+ /** Cache so we don't re-emit the same proc function node per call site. */
251
+ private procNodeIdCache;
252
+ private callDedupe;
253
+ private synthFunctionNodeIds;
254
+ /**
255
+ * B4 (hueco 6): cache of stub `form-layout` node ids we've already emitted
256
+ * for a given target form name in this file. Avoids emitting duplicate
257
+ * stubs when `DoCmd.OpenForm "FormTest"` shows up N times across N calls.
258
+ * Keyed by the lowercased form name so `FormTest` / `formtest` collapse.
259
+ */
260
+ private opensFormStubIdsByName;
261
+ /**
262
+ * Hueco 1: scan a line for `Me.<ControlName>` patterns and emit one
263
+ * UnresolvedReference per occurrence, tagged
264
+ * `metadata.synthesizedBy: 'vba-me-control'`.
265
+ *
266
+ * Operates on the masked `callScanLine` (string-literal content already
267
+ * replaced with spaces) so `Me.X` inside a string literal is not falsely
268
+ * captured. Per-site emission — every `Me.lblTitulo` reference site
269
+ * produces its own UnresolvedReference carrying the line/column; the
270
+ * resolver fans them out into multiple `references` edges at index time
271
+ * once the matching `form-instance-control` node exists.
272
+ *
273
+ * `fromNodeId` is the current procedure's function node — that's the
274
+ * "owner" of the reference (the Sub body that wrote `Me.lblTitulo = …`).
275
+ */
276
+ private scanMeControlReferences;
277
+ private findOrCreateFunctionNodeId;
278
+ private findFunctionNodeByName;
279
+ /**
280
+ * H1: detect a statement-form Sub call.
281
+ *
282
+ * Real VBA idioms:
283
+ * `MySub` — bare no-argument statement call
284
+ * `MySub arg1, Nz(x, 0)` — bare statement call
285
+ * `Call MySub arg1, Nz(x, 0)` — Call keyword, no parens around call
286
+ * `MySub(arg1, arg2)` — parens call (handled by CALL_RE)
287
+ * `Call MySub(arg1, arg2)` — Call keyword + parens (also CALL_RE)
288
+ *
289
+ * Returns the called proc name if the line matches the statement form
290
+ * AND the proc name is in localProcs (same-file resolution). Returns
291
+ * null for declarations, assignments, comments, keyword lines, etc.
292
+ *
293
+ * The `Call` keyword form is handled by stripping `Call ` and
294
+ * running the same logic on the remainder — they're structurally the
295
+ * same call after the keyword.
296
+ */
297
+ private detectStatementCall;
298
+ /**
299
+ * H1: emit a same-file `calls` edge for a statement-form Sub call.
300
+ * `caller` is the current procedure (from the stack); `procName` is
301
+ * the called procedure name. Emits a plain `calls` edge to the
302
+ * already-emitted function node.
303
+ */
304
+ private emitStatementCallEdge;
305
+ /**
306
+ * Fix 7: detect a qualified statement-form call — `Receiver.Member <args>`
307
+ * where `Receiver.Member` is NOT followed by `(`.
308
+ *
309
+ * Real VBA idioms this covers:
310
+ * `m_NCOp.Registrar m_ARAlInicio, p_Error`
311
+ * `m_Obj.Init`
312
+ *
313
+ * These are distinct from the paren form (`m_NCOp.Registrar(...)`) which is
314
+ * already handled by `CALL_RE`. Returns `{receiver, member}` or `null`.
315
+ *
316
+ * Property assignments (`Receiver.Prop = value`) are excluded via the `=`
317
+ * guard — consistent with `detectStatementCall`'s same-file assignment skip.
318
+ * Blacklisted receivers (runtime objects, keywords) are excluded too.
319
+ */
320
+ private detectQualifiedStatementCall;
321
+ /**
322
+ * Fix 7: emit a heuristic `calls` edge for a qualified statement-form call.
323
+ * Same shape as the qualified-paren path in `scanCallSites` — reuses the
324
+ * same `callDedupe` / `synthFunctionNodeIds` sets for de-duplication so a
325
+ * paren and non-paren form on the same line don't create duplicate edges.
326
+ */
327
+ private emitQualifiedStatementCallEdge;
328
+ /**
329
+ * B4 (hueco 6): scan one line of VBA source for `DoCmd.OpenForm "X"`
330
+ * calls. For each match, emit:
331
+ * - a stub `form-layout` node for the target form (cached by name so
332
+ * the same form referenced from N sites emits exactly ONE stub),
333
+ * - an `opens-form` heuristic edge from the calling Sub to that stub.
334
+ *
335
+ * Both endpoints are pushed into `this.nodes` / `this.edges`, so the
336
+ * per-file edge filter at `index.ts:insertedIds.has(source) &&
337
+ * insertedIds.has(target)` passes the edge naturally without any
338
+ * exemption to the filter.
339
+ *
340
+ * Why a stub and not a direct lookup: the target form lives in a
341
+ * DIFFERENT file (its own `.form.txt`), and the extractor doesn't have
342
+ * DB access at parse time. The stub's synthetic file path
343
+ * (`synthetic:opensFormStub/<FormName>.form.txt`) guarantees a
344
+ * deterministic node id so re-indexes collapse to the same stub.
345
+ * When the consumer's `.form.txt` is later indexed, the real
346
+ * `form-layout` node carries a different id (it uses the real file
347
+ * path); the stub and the real coexist harmlessly. The orchestrator
348
+ * flagged this as acceptable for B4 — only `OpenForm` is in scope.
349
+ * `OpenReport`, `OpenQuery`, `OpenTable`, … are follow-up work.
350
+ *
351
+ * Scope note: this regex matches ONLY the literal-string form
352
+ * `DoCmd.OpenForm "X"`. Variable-form calls like
353
+ * `DoCmd.OpenForm m_FormName` are intentionally NOT captured here
354
+ * because resolving the variable to a concrete form name would
355
+ * require data-flow analysis that is out of scope.
356
+ */
357
+ private scanOpenFormCalls;
358
+ /**
359
+ * B4 (hueco 6): emit a stub `form-layout` node for `targetFormName`
360
+ * (cached so duplicates collapse) and an `opens-form` heuristic edge
361
+ * from `caller` to that stub.
362
+ *
363
+ * The edge carries:
364
+ * - `kind: 'opens-form'` — new cross-file edge kind
365
+ * - `provenance: 'heuristic'` — synthesized, not parsed
366
+ * - `metadata.targetFormName` — the captured literal
367
+ * - `metadata.synthesizedBy: 'vba-opens-form'` — distinguishes this
368
+ * synthesis from the dim/sql/event-handler families
369
+ *
370
+ * The stub's `metadata.stub: true` flag lets downstream UI render
371
+ * unresolved references distinctly (e.g. with a dashed border) and
372
+ * gives later re-resolution pass a hook for collapse. The stub is
373
+ * line-independent (`line = 0`) so re-indexes produce identical ids.
374
+ */
375
+ private emitOpensFormEdge;
376
+ private scanSqlInLine;
377
+ private trackSqlVariableAssignment;
378
+ private collectStringLiteralText;
379
+ private emitSqlTableReferences;
380
+ /**
381
+ * Emit a `references` edge from the file's module/class node to a synthetic
382
+ * node named `targetName`. Used by Dim, WithEvents, Implements, and SQL.
383
+ */
384
+ private emitReference;
385
+ private synthClassNodeIds;
386
+ /**
387
+ * Fix 2 (Issue #2): maps `variableName.toLowerCase()` → declared type info.
388
+ * Built by `sweepDimsAndWithEvents`; consulted by `sweepCallsAndSql` to gate
389
+ * qualified statement-form calls — only receivers that are file-local variables
390
+ * typed as a SIMPLE (non-qualified, non-primitive) identifier emit edges.
391
+ */
392
+ private localVarTypeMap;
393
+ }
394
+ //# sourceMappingURL=vba-extractor.d.ts.map
@@ -0,0 +1,89 @@
1
+ import { ExtractionResult } from '../types';
2
+ export declare class VbaFormExtractor {
3
+ private filePath;
4
+ private source;
5
+ private nodes;
6
+ private edges;
7
+ private errors;
8
+ private unresolvedReferences;
9
+ constructor(filePath: string, source: string);
10
+ extract(): ExtractionResult;
11
+ private createFileNode;
12
+ /**
13
+ * Strip the two-segment extension (`.form.txt`, `.report.txt`) or the
14
+ * fallback single-segment extension. Returns the file basename without
15
+ * its extension — used as the sibling `.cls` name when `VB_Name` is
16
+ * absent and as the default module name.
17
+ */
18
+ private basenameWithoutExtension;
19
+ private detectVbName;
20
+ /**
21
+ * Build the per-file node for a `.form.txt` / `.report.txt` source.
22
+ * Emits `kind: 'form-layout'` (B2 hueco 4), replacing the historical
23
+ * `kind: 'module'` so consumers can dispatch on a UI-specific kind.
24
+ *
25
+ * The deterministic id formula `generateNodeId(filePath, 'form-layout',
26
+ * name, 1)` is preserved so cross-extractor stubs (e.g. event-handler
27
+ * synthesis on the `.cls` side) can produce a matching id when needed
28
+ * — though the immediate use case is the `module` → `form-layout`
29
+ * rename. `metadata.containerKind` keeps the historical `'module'`
30
+ * label as a back-compat marker; consumers should prefer `node.kind`.
31
+ */
32
+ private createFormLayoutNode;
33
+ /**
34
+ * Match each `Begin <ControlType>` declaration line and emit one `property`
35
+ * node per match. The control type is the second token after `Begin`.
36
+ *
37
+ * The Dysflow SaveAsText format uses:
38
+ * Begin TextBox
39
+ * Name = "txtFoo"
40
+ * End
41
+ *
42
+ * We do not try to balance `Begin`/`End` blocks — each `Begin <Type>` on
43
+ * its own line is a control. Form/report files are shallow enough that
44
+ * the extra `Begin`/`End` for the form's root block are matched but
45
+ * filtered by the control-type blacklist (see below).
46
+ */
47
+ private static readonly BEGIN_RE;
48
+ /**
49
+ * `Name = "..."` attribute line — emits the Access control instance name
50
+ * (e.g. `lblTitulo`, `ComandoAltaPM`). Capture group 1 is the name.
51
+ * The Dysflow SaveAsText format always wraps the value in double quotes
52
+ * — even when the name is a simple identifier — so we anchor on `"…"`
53
+ * without trying to handle unquoted forms.
54
+ */
55
+ private static readonly NAME_RE;
56
+ /**
57
+ * Control type tokens that are NOT user-visible Access controls and must be
58
+ * filtered out so they don't appear as `property` nodes.
59
+ *
60
+ * - `Form` — the form's own root `Begin Form` / `End` container.
61
+ * - `Section` — Access section containers (Header / Detail / Footer).
62
+ *
63
+ * `Rectangle` and `Image` are real Access controls and must NOT appear here.
64
+ */
65
+ private static readonly NON_CONTROL_TYPES;
66
+ /**
67
+ * Maximum scan window for the `Name = "..."` attribute after a
68
+ * `Begin <Type>` line. Real Dysflow exports have at most a handful of
69
+ * whitespace-only lines and the `Name` line within the first 3–6 lines
70
+ * of the block. 16 is a generous bound; if `Name` is missing within
71
+ * that window, the control is treated as a nameless container and only
72
+ * the legacy `property` node is emitted (preserves REQ-FORM-2 for
73
+ * pre-Name `.form.txt` files exported by older Dysflow versions).
74
+ */
75
+ private static readonly NAME_SCAN_WINDOW;
76
+ private sweepControls;
77
+ /**
78
+ * Scan ahead from a `Begin <Type>` line for the first `Name = "…"`
79
+ * attribute. Returns the captured name and the line number where it
80
+ * was found, or `{ name: '', nameLine: 0 }` when no Name is present
81
+ * within the scan window (e.g. the `Begin Form` root block which has
82
+ * `Caption = "..."` but no `Name`, or pre-Name legacy exports).
83
+ *
84
+ * Stops at the next `Begin` or `End` boundary so a misaligned scan
85
+ * never crosses into a sibling control's attribute block.
86
+ */
87
+ private findControlName;
88
+ }
89
+ //# sourceMappingURL=vba-form-extractor.d.ts.map
@@ -0,0 +1,81 @@
1
+ /**
2
+ * VBA pre-processing pipeline.
3
+ *
4
+ * Pure helpers used by `VbaExtractor` before and during regex extraction:
5
+ *
6
+ * 1. joinLineContinuations(src)
7
+ * VBA uses a trailing ` _` (space + underscore) at the end of a line to
8
+ * mark line continuation. We collapse these into single logical lines so
9
+ * the regex sweeps downstream see one statement per regex match.
10
+ *
11
+ * 2. stripVbaComments(src)
12
+ * VBA has two comment forms:
13
+ * - apostrophe `'` — anything from the apostrophe to end-of-line
14
+ * - `Rem ` (case-insensitive keyword, with trailing space) — the legacy
15
+ * alternative to `'`
16
+ * Both are STRIPPED only when outside double-quoted strings. We walk
17
+ * character-by-character so a `'` inside `"..."` is preserved.
18
+ *
19
+ * 3. extractStringLiterals(src)
20
+ * Used by SQL-variable tracking to read literal fragments from assignments
21
+ * such as `m_SQL = "SELECT ..." & ...`. It returns every `"..."` span
22
+ * with its 1-based line and 0-based column. VBA doubles `"` inside literals
23
+ * (`""`) as the escape for a single `"` — the escape is consumed, the
24
+ * literal is returned without the doubling.
25
+ *
26
+ * Each helper is < 50 LOC, pure, and tested in isolation in
27
+ * `__tests__/extraction-vba-preprocess.test.ts`.
28
+ *
29
+ * Source unchanged guarantee: every helper treats `src` as read-only.
30
+ */
31
+ /**
32
+ * Collapse VBA line continuations: any line whose last non-newline character is
33
+ * `_` (preceded by exactly one space, per VBA convention) is joined to the
34
+ * next line. A single space replaces the joined boundary.
35
+ *
36
+ * - Input : multi-line source
37
+ * - Output : source with continuation lines merged into the previous line
38
+ *
39
+ * Does NOT inspect string literals — VBA's continuation convention is line-
40
+ * physical (the underscore must be the last non-space char on the line), so a
41
+ * `"` followed by `_` inside a string is still a line continuation. In real
42
+ * Dysflow-exported code this never happens (continuations are syntactic, not
43
+ * inside string content), so we skip the cost of tracking string state.
44
+ */
45
+ export declare function joinLineContinuations(src: string): string;
46
+ /**
47
+ * Strip VBA comments from source. Walks character-by-character:
48
+ * - inside a double-quoted string: skip until the closing `"` (handling the
49
+ * `""` doubled-quote escape so it doesn't terminate the string early)
50
+ * - outside a string:
51
+ * * `'` to EOL → drop the rest of the line
52
+ * * line-start `Rem ` (case-insensitive) → drop the whole line
53
+ * * mid-line ` Rem ` (case-insensitive, with surrounding whitespace) →
54
+ * drop the rest of the line
55
+ * * `Option <word>` directive lines → drop the whole line
56
+ * * newline → end-of-line marker for the apostrophe rule
57
+ *
58
+ * The trailing whitespace of each stripped line is trimmed so a `code ' comment`
59
+ * becomes `code` (not `code `), keeping downstream regex anchored patterns
60
+ * from drifting on whitespace artifacts.
61
+ *
62
+ * Source is treated as read-only.
63
+ */
64
+ export declare function stripVbaComments(src: string): string;
65
+ export interface StringLiteralSpan {
66
+ /** The literal content (no surrounding quotes; `""` collapsed to `"`). */
67
+ text: string;
68
+ /** 1-based line number where the opening quote sits. */
69
+ line: number;
70
+ /** 0-based column where the opening quote sits. */
71
+ column: number;
72
+ }
73
+ /**
74
+ * Walk source and record every double-quoted string literal with its 1-based
75
+ * line and 0-based column. VBA's `""` escape is collapsed to a single `"` in
76
+ * the recorded `text`.
77
+ *
78
+ * The source is NOT mutated.
79
+ */
80
+ export declare function extractStringLiterals(src: string): StringLiteralSpan[];
81
+ //# sourceMappingURL=vba-preprocess.d.ts.map
@@ -0,0 +1,51 @@
1
+ import { ExtractionResult } from '../types';
2
+ /**
3
+ * VueExtractor - Extracts code relationships from Vue Single-File Component files
4
+ *
5
+ * Vue SFCs are multi-language (script + template + style). Rather than
6
+ * parsing the full Vue grammar, we extract the <script> block content
7
+ * and delegate it to the TypeScript/JavaScript TreeSitterExtractor.
8
+ *
9
+ * Every .vue file produces a component node (Vue components are always importable).
10
+ */
11
+ export declare class VueExtractor {
12
+ private filePath;
13
+ private source;
14
+ private nodes;
15
+ private edges;
16
+ private unresolvedReferences;
17
+ private errors;
18
+ constructor(filePath: string, source: string);
19
+ /**
20
+ * Extract from Vue source
21
+ */
22
+ extract(): ExtractionResult;
23
+ /**
24
+ * Create a component node for the .vue file
25
+ */
26
+ private createComponentNode;
27
+ /**
28
+ * Extract <script> and <script setup> blocks from the Vue source
29
+ */
30
+ private extractScriptBlocks;
31
+ /**
32
+ * Process a script block by delegating to TreeSitterExtractor
33
+ */
34
+ private processScriptBlock;
35
+ /**
36
+ * Extract component usages from the Vue `<template>`.
37
+ *
38
+ * PascalCase tags (`<Modal>`, `<Button />`) and kebab-case tags
39
+ * (`<my-button>`) both represent component instantiations — analogous to
40
+ * function calls in imperative code. Capturing them creates parent→child
41
+ * component edges and lets `callers` / `impact` see a component that is
42
+ * only ever used in markup. Vue's extractor previously parsed only the
43
+ * `<script>` block, so these usages produced no edge at all (#629).
44
+ *
45
+ * HTML elements (lowercase, no hyphen) and Vue built-ins are skipped.
46
+ * Unmatched names create no edge during resolution, so converting
47
+ * kebab-case is safe even for native custom elements.
48
+ */
49
+ private extractTemplateComponents;
50
+ }
51
+ //# sourceMappingURL=vue-extractor.d.ts.map
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The V8 flag(s) that keep tree-sitter grammar compilation off the turboshaft
3
+ * optimizing tier. Single source of truth: the relaunch guard and the test
4
+ * suite both read this (a test asserts each is a real flag on the running
5
+ * runtime, so a rename can't silently regress the fix).
6
+ */
7
+ export declare const WASM_RUNTIME_FLAGS: readonly string[];
8
+ /**
9
+ * Env var carrying the *host* PID (the relauncher's own parent) across the
10
+ * re-exec. Without `--liftoff-only` the CLI re-execs itself once, inserting an
11
+ * intermediate process between the MCP host and the server. That intermediate
12
+ * stays alive (blocked in spawnSync) even after the host is killed, so the
13
+ * server's PPID watchdog can't detect the host's death by watching its own
14
+ * `process.ppid`. Passing the host PID through lets the watchdog poll it
15
+ * directly. Unset on the no-re-exec path (bundled launcher / flag already
16
+ * present), where the server is already a direct child of the host. See
17
+ * src/mcp/index.ts (#277).
18
+ */
19
+ export declare const HOST_PPID_ENV = "CODEGRAPH_HOST_PPID";
20
+ /** True when every required WASM runtime flag is already present in `execArgv`. */
21
+ export declare function processHasWasmRuntimeFlags(execArgv?: readonly string[]): boolean;
22
+ /**
23
+ * Build the argv for re-execing node with the WASM runtime flags: our flags
24
+ * first, then any node flags already in `execArgv` (deduped), then the script
25
+ * and its args. Pure — exported for unit testing.
26
+ */
27
+ export declare function buildRelaunchArgv(scriptPath: string, scriptArgs: readonly string[], execArgv?: readonly string[]): string[];
28
+ /**
29
+ * If the current process is missing the WASM runtime flags, re-exec it once
30
+ * with them and exit with the child's status. No-op when the flags are already
31
+ * present (the normal bundled-launcher path), when already relaunched, or when
32
+ * disabled via CODEGRAPH_NO_RELAUNCH.
33
+ *
34
+ * On spawn failure, returns so the caller runs in-process anyway — risking the
35
+ * OOM is still better than refusing to start.
36
+ */
37
+ export declare function relaunchWithWasmRuntimeFlagsIfNeeded(scriptPath: string): void;
38
+ //# sourceMappingURL=wasm-runtime-flags.d.ts.map
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Graph Module
3
+ *
4
+ * Provides graph traversal and query functionality for the code knowledge graph.
5
+ */
6
+ export { GraphTraverser } from './traversal';
7
+ export { GraphQueryManager } from './queries';
8
+ //# sourceMappingURL=index.d.ts.map