@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.
- package/README.md +855 -0
- package/dist/bin/codegraph.d.ts +26 -0
- package/dist/bin/command-supervision.d.ts +12 -0
- package/dist/bin/fatal-handler.d.ts +20 -0
- package/dist/bin/node-version-check.d.ts +37 -0
- package/dist/bin/uninstall.d.ts +14 -0
- package/dist/context/formatter.d.ts +30 -0
- package/dist/context/index.d.ts +119 -0
- package/dist/context/markers.d.ts +19 -0
- package/dist/db/index.d.ts +122 -0
- package/dist/db/migrations.d.ts +44 -0
- package/dist/db/queries.d.ts +402 -0
- package/dist/db/sqlite-adapter.d.ts +53 -0
- package/dist/directory.d.ts +179 -0
- package/dist/errors.d.ts +136 -0
- package/dist/extraction/astro-extractor.d.ts +79 -0
- package/dist/extraction/dfm-extractor.d.ts +31 -0
- package/dist/extraction/extraction-version.d.ts +25 -0
- package/dist/extraction/function-ref.d.ts +118 -0
- package/dist/extraction/generated-detection.d.ts +30 -0
- package/dist/extraction/grammars.d.ts +128 -0
- package/dist/extraction/index.d.ts +187 -0
- package/dist/extraction/languages/c-cpp.d.ts +12 -0
- package/dist/extraction/languages/csharp.d.ts +25 -0
- package/dist/extraction/languages/dart.d.ts +3 -0
- package/dist/extraction/languages/go.d.ts +3 -0
- package/dist/extraction/languages/index.d.ts +10 -0
- package/dist/extraction/languages/java.d.ts +3 -0
- package/dist/extraction/languages/javascript.d.ts +3 -0
- package/dist/extraction/languages/kotlin.d.ts +3 -0
- package/dist/extraction/languages/lua.d.ts +3 -0
- package/dist/extraction/languages/luau.d.ts +3 -0
- package/dist/extraction/languages/objc.d.ts +3 -0
- package/dist/extraction/languages/pascal.d.ts +3 -0
- package/dist/extraction/languages/php.d.ts +3 -0
- package/dist/extraction/languages/python.d.ts +3 -0
- package/dist/extraction/languages/r.d.ts +3 -0
- package/dist/extraction/languages/ruby.d.ts +3 -0
- package/dist/extraction/languages/rust.d.ts +3 -0
- package/dist/extraction/languages/scala.d.ts +3 -0
- package/dist/extraction/languages/swift.d.ts +3 -0
- package/dist/extraction/languages/typescript.d.ts +16 -0
- package/dist/extraction/liquid-extractor.d.ts +59 -0
- package/dist/extraction/mybatis-extractor.d.ts +48 -0
- package/dist/extraction/parse-pool.d.ts +126 -0
- package/dist/extraction/parse-worker.d.ts +8 -0
- package/dist/extraction/razor-extractor.d.ts +42 -0
- package/dist/extraction/sql-query-extractor.d.ts +25 -0
- package/dist/extraction/svelte-extractor.d.ts +56 -0
- package/dist/extraction/tree-sitter-helpers.d.ts +28 -0
- package/dist/extraction/tree-sitter-types.d.ts +239 -0
- package/dist/extraction/tree-sitter.d.ts +647 -0
- package/dist/extraction/vba-extractor.d.ts +394 -0
- package/dist/extraction/vba-form-extractor.d.ts +89 -0
- package/dist/extraction/vba-preprocess.d.ts +81 -0
- package/dist/extraction/vue-extractor.d.ts +51 -0
- package/dist/extraction/wasm-runtime-flags.d.ts +38 -0
- package/dist/graph/index.d.ts +8 -0
- package/dist/graph/queries.d.ts +106 -0
- package/dist/graph/traversal.d.ts +127 -0
- package/dist/index.d.ts +563 -0
- package/dist/installer/config-writer.d.ts +28 -0
- package/dist/installer/index.d.ts +100 -0
- package/dist/installer/instructions-template.d.ts +41 -0
- package/dist/installer/targets/antigravity.d.ts +57 -0
- package/dist/installer/targets/claude.d.ts +62 -0
- package/dist/installer/targets/codex.d.ts +18 -0
- package/dist/installer/targets/cursor.d.ts +35 -0
- package/dist/installer/targets/gemini.d.ts +26 -0
- package/dist/installer/targets/hermes.d.ts +18 -0
- package/dist/installer/targets/kiro.d.ts +27 -0
- package/dist/installer/targets/opencode.d.ts +38 -0
- package/dist/installer/targets/registry.d.ts +35 -0
- package/dist/installer/targets/shared.d.ts +101 -0
- package/dist/installer/targets/toml.d.ts +52 -0
- package/dist/installer/targets/types.d.ts +108 -0
- package/dist/mcp/daemon-manager.d.ts +42 -0
- package/dist/mcp/daemon-paths.d.ts +73 -0
- package/dist/mcp/daemon-registry.d.ts +47 -0
- package/dist/mcp/daemon.d.ts +258 -0
- package/dist/mcp/dynamic-boundaries.d.ts +41 -0
- package/dist/mcp/engine.d.ts +122 -0
- package/dist/mcp/index.d.ts +113 -0
- package/dist/mcp/liveness-watchdog.d.ts +18 -0
- package/dist/mcp/ppid-watchdog.d.ts +62 -0
- package/dist/mcp/proxy.d.ts +87 -0
- package/dist/mcp/query-pool.d.ts +94 -0
- package/dist/mcp/query-worker.d.ts +24 -0
- package/dist/mcp/server-instructions.d.ts +34 -0
- package/dist/mcp/session.d.ts +79 -0
- package/dist/mcp/stdin-teardown.d.ts +27 -0
- package/dist/mcp/tools.d.ts +591 -0
- package/dist/mcp/transport.d.ts +188 -0
- package/dist/mcp/version.d.ts +19 -0
- package/dist/project-config.d.ts +56 -0
- package/dist/reasoning/config.d.ts +45 -0
- package/dist/reasoning/credentials.d.ts +5 -0
- package/dist/reasoning/login.d.ts +21 -0
- package/dist/reasoning/reasoner.d.ts +43 -0
- package/dist/resolution/c-fnptr-synthesizer.d.ts +5 -0
- package/dist/resolution/callback-synthesizer.d.ts +15 -0
- package/dist/resolution/frameworks/astro.d.ts +9 -0
- package/dist/resolution/frameworks/cargo-workspace.d.ts +18 -0
- package/dist/resolution/frameworks/csharp.d.ts +8 -0
- package/dist/resolution/frameworks/drupal.d.ts +51 -0
- package/dist/resolution/frameworks/expo-modules.d.ts +3 -0
- package/dist/resolution/frameworks/express.d.ts +8 -0
- package/dist/resolution/frameworks/fabric.d.ts +3 -0
- package/dist/resolution/frameworks/go.d.ts +8 -0
- package/dist/resolution/frameworks/goframe.d.ts +41 -0
- package/dist/resolution/frameworks/index.d.ts +50 -0
- package/dist/resolution/frameworks/java.d.ts +8 -0
- package/dist/resolution/frameworks/laravel.d.ts +13 -0
- package/dist/resolution/frameworks/nestjs.d.ts +26 -0
- package/dist/resolution/frameworks/play.d.ts +19 -0
- package/dist/resolution/frameworks/python.d.ts +10 -0
- package/dist/resolution/frameworks/react-native.d.ts +3 -0
- package/dist/resolution/frameworks/react.d.ts +8 -0
- package/dist/resolution/frameworks/ruby.d.ts +8 -0
- package/dist/resolution/frameworks/rust.d.ts +8 -0
- package/dist/resolution/frameworks/svelte.d.ts +9 -0
- package/dist/resolution/frameworks/swift-objc.d.ts +37 -0
- package/dist/resolution/frameworks/swift.d.ts +10 -0
- package/dist/resolution/frameworks/vue.d.ts +9 -0
- package/dist/resolution/go-module.d.ts +26 -0
- package/dist/resolution/goframe-synthesizer.d.ts +28 -0
- package/dist/resolution/import-resolver.d.ts +78 -0
- package/dist/resolution/index.d.ts +196 -0
- package/dist/resolution/lru-cache.d.ts +24 -0
- package/dist/resolution/name-matcher.d.ts +93 -0
- package/dist/resolution/path-aliases.d.ts +68 -0
- package/dist/resolution/strip-comments.d.ts +27 -0
- package/dist/resolution/swift-objc-bridge.d.ts +134 -0
- package/dist/resolution/types.d.ts +233 -0
- package/dist/resolution/workspace-packages.d.ts +48 -0
- package/dist/search/query-parser.d.ts +57 -0
- package/dist/search/query-utils.d.ts +87 -0
- package/dist/sync/git-hooks.d.ts +45 -0
- package/dist/sync/index.d.ts +19 -0
- package/dist/sync/watch-policy.d.ts +48 -0
- package/dist/sync/watcher.d.ts +358 -0
- package/dist/sync/worktree.d.ts +54 -0
- package/dist/telemetry/index.d.ts +143 -0
- package/dist/types.d.ts +409 -0
- package/dist/ui/glyphs.d.ts +42 -0
- package/dist/ui/shimmer-progress.d.ts +11 -0
- package/dist/ui/shimmer-worker.d.ts +2 -0
- package/dist/ui/types.d.ts +17 -0
- package/dist/upgrade/index.d.ts +132 -0
- package/dist/utils.d.ts +224 -0
- package/npm-sdk.js +75 -0
- package/npm-shim.js +246 -0
- 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
|