@aroman22/codegraph-vba-darwin-arm64 1.15.0 → 1.16.0

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 (213) hide show
  1. package/lib/dist/bin/codegraph.js +13 -7
  2. package/lib/dist/bin/codegraph.js.map +1 -1
  3. package/lib/dist/bin/daemon-release.d.ts +7 -0
  4. package/lib/dist/bin/daemon-release.d.ts.map +1 -0
  5. package/lib/dist/bin/daemon-release.js +18 -0
  6. package/lib/dist/bin/daemon-release.js.map +1 -0
  7. package/lib/dist/db/queries.d.ts +30 -0
  8. package/lib/dist/db/queries.d.ts.map +1 -1
  9. package/lib/dist/db/queries.js +51 -1
  10. package/lib/dist/db/queries.js.map +1 -1
  11. package/lib/dist/extraction/access-erd-extractor.d.ts +57 -0
  12. package/lib/dist/extraction/access-erd-extractor.d.ts.map +1 -0
  13. package/lib/dist/extraction/access-erd-extractor.js +389 -0
  14. package/lib/dist/extraction/access-erd-extractor.js.map +1 -0
  15. package/lib/dist/extraction/extraction-version.d.ts +1 -1
  16. package/lib/dist/extraction/extraction-version.js +1 -1
  17. package/lib/dist/extraction/grammars.d.ts +20 -0
  18. package/lib/dist/extraction/grammars.d.ts.map +1 -1
  19. package/lib/dist/extraction/grammars.js +34 -0
  20. package/lib/dist/extraction/grammars.js.map +1 -1
  21. package/lib/dist/extraction/index.d.ts +1 -0
  22. package/lib/dist/extraction/index.d.ts.map +1 -1
  23. package/lib/dist/extraction/index.js +371 -351
  24. package/lib/dist/extraction/index.js.map +1 -1
  25. package/lib/dist/extraction/parse-pool.d.ts +8 -3
  26. package/lib/dist/extraction/parse-pool.d.ts.map +1 -1
  27. package/lib/dist/extraction/parse-pool.js +1 -2
  28. package/lib/dist/extraction/parse-pool.js.map +1 -1
  29. package/lib/dist/extraction/parse-worker.js +7 -6
  30. package/lib/dist/extraction/parse-worker.js.map +1 -1
  31. package/lib/dist/extraction/sql-query-extractor.d.ts +16 -14
  32. package/lib/dist/extraction/sql-query-extractor.d.ts.map +1 -1
  33. package/lib/dist/extraction/sql-query-extractor.js +43 -31
  34. package/lib/dist/extraction/sql-query-extractor.js.map +1 -1
  35. package/lib/dist/extraction/sql-table-scan.d.ts +184 -0
  36. package/lib/dist/extraction/sql-table-scan.d.ts.map +1 -0
  37. package/lib/dist/extraction/sql-table-scan.js +288 -0
  38. package/lib/dist/extraction/sql-table-scan.js.map +1 -0
  39. package/lib/dist/extraction/tree-sitter.d.ts +10 -1
  40. package/lib/dist/extraction/tree-sitter.d.ts.map +1 -1
  41. package/lib/dist/extraction/tree-sitter.js +34 -3
  42. package/lib/dist/extraction/tree-sitter.js.map +1 -1
  43. package/lib/dist/extraction/vba/call-sweep.d.ts +2 -7
  44. package/lib/dist/extraction/vba/call-sweep.d.ts.map +1 -1
  45. package/lib/dist/extraction/vba/call-sweep.js +144 -90
  46. package/lib/dist/extraction/vba/call-sweep.js.map +1 -1
  47. package/lib/dist/extraction/vba/calls.d.ts +24 -4
  48. package/lib/dist/extraction/vba/calls.d.ts.map +1 -1
  49. package/lib/dist/extraction/vba/calls.js +42 -12
  50. package/lib/dist/extraction/vba/calls.js.map +1 -1
  51. package/lib/dist/extraction/vba/constants.d.ts +7 -14
  52. package/lib/dist/extraction/vba/constants.d.ts.map +1 -1
  53. package/lib/dist/extraction/vba/constants.js +8 -36
  54. package/lib/dist/extraction/vba/constants.js.map +1 -1
  55. package/lib/dist/extraction/vba/context.d.ts +443 -7
  56. package/lib/dist/extraction/vba/context.d.ts.map +1 -1
  57. package/lib/dist/extraction/vba/context.js +325 -29
  58. package/lib/dist/extraction/vba/context.js.map +1 -1
  59. package/lib/dist/extraction/vba/controls.d.ts +18 -1
  60. package/lib/dist/extraction/vba/controls.d.ts.map +1 -1
  61. package/lib/dist/extraction/vba/controls.js +99 -27
  62. package/lib/dist/extraction/vba/controls.js.map +1 -1
  63. package/lib/dist/extraction/vba/declarations.d.ts +1 -6
  64. package/lib/dist/extraction/vba/declarations.d.ts.map +1 -1
  65. package/lib/dist/extraction/vba/declarations.js +5 -39
  66. package/lib/dist/extraction/vba/declarations.js.map +1 -1
  67. package/lib/dist/extraction/vba/dims.d.ts +11 -7
  68. package/lib/dist/extraction/vba/dims.d.ts.map +1 -1
  69. package/lib/dist/extraction/vba/dims.js +265 -29
  70. package/lib/dist/extraction/vba/dims.js.map +1 -1
  71. package/lib/dist/extraction/vba/docmd.d.ts +29 -2
  72. package/lib/dist/extraction/vba/docmd.d.ts.map +1 -1
  73. package/lib/dist/extraction/vba/docmd.js +297 -18
  74. package/lib/dist/extraction/vba/docmd.js.map +1 -1
  75. package/lib/dist/extraction/vba/enums-consts.d.ts +7 -14
  76. package/lib/dist/extraction/vba/enums-consts.d.ts.map +1 -1
  77. package/lib/dist/extraction/vba/enums-consts.js +11 -45
  78. package/lib/dist/extraction/vba/enums-consts.js.map +1 -1
  79. package/lib/dist/extraction/vba/error-channel.d.ts +57 -0
  80. package/lib/dist/extraction/vba/error-channel.d.ts.map +1 -0
  81. package/lib/dist/extraction/vba/error-channel.js +128 -0
  82. package/lib/dist/extraction/vba/error-channel.js.map +1 -0
  83. package/lib/dist/extraction/vba/errors.d.ts +64 -0
  84. package/lib/dist/extraction/vba/errors.d.ts.map +1 -0
  85. package/lib/dist/extraction/vba/errors.js +775 -0
  86. package/lib/dist/extraction/vba/errors.js.map +1 -0
  87. package/lib/dist/extraction/vba/filesystem-statements.d.ts +23 -0
  88. package/lib/dist/extraction/vba/filesystem-statements.d.ts.map +1 -0
  89. package/lib/dist/extraction/vba/filesystem-statements.js +70 -0
  90. package/lib/dist/extraction/vba/filesystem-statements.js.map +1 -0
  91. package/lib/dist/extraction/vba/implements.d.ts +1 -6
  92. package/lib/dist/extraction/vba/implements.d.ts.map +1 -1
  93. package/lib/dist/extraction/vba/implements.js +1 -22
  94. package/lib/dist/extraction/vba/implements.js.map +1 -1
  95. package/lib/dist/extraction/vba/labels.d.ts +26 -0
  96. package/lib/dist/extraction/vba/labels.d.ts.map +1 -0
  97. package/lib/dist/extraction/vba/labels.js +180 -0
  98. package/lib/dist/extraction/vba/labels.js.map +1 -0
  99. package/lib/dist/extraction/vba/module-vars.d.ts +36 -0
  100. package/lib/dist/extraction/vba/module-vars.d.ts.map +1 -0
  101. package/lib/dist/extraction/vba/module-vars.js +145 -0
  102. package/lib/dist/extraction/vba/module-vars.js.map +1 -0
  103. package/lib/dist/extraction/vba/options.d.ts +88 -0
  104. package/lib/dist/extraction/vba/options.d.ts.map +1 -0
  105. package/lib/dist/extraction/vba/options.js +39 -0
  106. package/lib/dist/extraction/vba/options.js.map +1 -0
  107. package/lib/dist/extraction/vba/parameters.d.ts +35 -0
  108. package/lib/dist/extraction/vba/parameters.d.ts.map +1 -0
  109. package/lib/dist/extraction/vba/parameters.js +110 -0
  110. package/lib/dist/extraction/vba/parameters.js.map +1 -0
  111. package/lib/dist/extraction/vba/procedures.d.ts +1 -9
  112. package/lib/dist/extraction/vba/procedures.d.ts.map +1 -1
  113. package/lib/dist/extraction/vba/procedures.js +174 -112
  114. package/lib/dist/extraction/vba/procedures.js.map +1 -1
  115. package/lib/dist/extraction/vba/rules.d.ts +10 -5
  116. package/lib/dist/extraction/vba/rules.d.ts.map +1 -1
  117. package/lib/dist/extraction/vba/rules.js +19 -0
  118. package/lib/dist/extraction/vba/rules.js.map +1 -1
  119. package/lib/dist/extraction/vba/runtime-objects.d.ts +59 -0
  120. package/lib/dist/extraction/vba/runtime-objects.d.ts.map +1 -0
  121. package/lib/dist/extraction/vba/runtime-objects.js +106 -0
  122. package/lib/dist/extraction/vba/runtime-objects.js.map +1 -0
  123. package/lib/dist/extraction/vba/signature.d.ts +57 -0
  124. package/lib/dist/extraction/vba/signature.d.ts.map +1 -0
  125. package/lib/dist/extraction/vba/signature.js +164 -0
  126. package/lib/dist/extraction/vba/signature.js.map +1 -0
  127. package/lib/dist/extraction/vba/sql-wrapper.d.ts +76 -3
  128. package/lib/dist/extraction/vba/sql-wrapper.d.ts.map +1 -1
  129. package/lib/dist/extraction/vba/sql-wrapper.js +725 -151
  130. package/lib/dist/extraction/vba/sql-wrapper.js.map +1 -1
  131. package/lib/dist/extraction/vba/tempvars.d.ts.map +1 -1
  132. package/lib/dist/extraction/vba/tempvars.js +4 -0
  133. package/lib/dist/extraction/vba/tempvars.js.map +1 -1
  134. package/lib/dist/extraction/vba/text-utils.d.ts +62 -2
  135. package/lib/dist/extraction/vba/text-utils.d.ts.map +1 -1
  136. package/lib/dist/extraction/vba/text-utils.js +84 -6
  137. package/lib/dist/extraction/vba/text-utils.js.map +1 -1
  138. package/lib/dist/extraction/vba-extractor.d.ts +18 -1
  139. package/lib/dist/extraction/vba-extractor.d.ts.map +1 -1
  140. package/lib/dist/extraction/vba-extractor.js +111 -16
  141. package/lib/dist/extraction/vba-extractor.js.map +1 -1
  142. package/lib/dist/extraction/vba-form-extractor.d.ts +28 -14
  143. package/lib/dist/extraction/vba-form-extractor.d.ts.map +1 -1
  144. package/lib/dist/extraction/vba-form-extractor.js +56 -21
  145. package/lib/dist/extraction/vba-form-extractor.js.map +1 -1
  146. package/lib/dist/extraction/vba-preprocess.d.ts +89 -3
  147. package/lib/dist/extraction/vba-preprocess.d.ts.map +1 -1
  148. package/lib/dist/extraction/vba-preprocess.js +221 -57
  149. package/lib/dist/extraction/vba-preprocess.js.map +1 -1
  150. package/lib/dist/extraction/vba-source.d.ts +0 -10
  151. package/lib/dist/extraction/vba-source.d.ts.map +1 -1
  152. package/lib/dist/extraction/vba-source.js +0 -13
  153. package/lib/dist/extraction/vba-source.js.map +1 -1
  154. package/lib/dist/extraction/vba-test-manifest-extractor.d.ts +0 -6
  155. package/lib/dist/extraction/vba-test-manifest-extractor.d.ts.map +1 -1
  156. package/lib/dist/extraction/vba-test-manifest-extractor.js +0 -1
  157. package/lib/dist/extraction/vba-test-manifest-extractor.js.map +1 -1
  158. package/lib/dist/index.d.ts.map +1 -1
  159. package/lib/dist/index.js +9 -0
  160. package/lib/dist/index.js.map +1 -1
  161. package/lib/dist/mcp/daemon-manager.d.ts.map +1 -1
  162. package/lib/dist/mcp/daemon-manager.js +7 -3
  163. package/lib/dist/mcp/daemon-manager.js.map +1 -1
  164. package/lib/dist/mcp/daemon-paths.d.ts +6 -0
  165. package/lib/dist/mcp/daemon-paths.d.ts.map +1 -1
  166. package/lib/dist/mcp/daemon-paths.js +15 -0
  167. package/lib/dist/mcp/daemon-paths.js.map +1 -1
  168. package/lib/dist/mcp/daemon-registry.d.ts +82 -7
  169. package/lib/dist/mcp/daemon-registry.d.ts.map +1 -1
  170. package/lib/dist/mcp/daemon-registry.js +557 -45
  171. package/lib/dist/mcp/daemon-registry.js.map +1 -1
  172. package/lib/dist/mcp/daemon-watchdog.d.ts +12 -0
  173. package/lib/dist/mcp/daemon-watchdog.d.ts.map +1 -1
  174. package/lib/dist/mcp/daemon-watchdog.js +37 -7
  175. package/lib/dist/mcp/daemon-watchdog.js.map +1 -1
  176. package/lib/dist/mcp/daemon.d.ts +20 -1
  177. package/lib/dist/mcp/daemon.d.ts.map +1 -1
  178. package/lib/dist/mcp/daemon.js +123 -30
  179. package/lib/dist/mcp/daemon.js.map +1 -1
  180. package/lib/dist/mcp/index.d.ts.map +1 -1
  181. package/lib/dist/mcp/index.js +13 -2
  182. package/lib/dist/mcp/index.js.map +1 -1
  183. package/lib/dist/mcp/proxy.d.ts +32 -0
  184. package/lib/dist/mcp/proxy.d.ts.map +1 -1
  185. package/lib/dist/mcp/proxy.js +163 -31
  186. package/lib/dist/mcp/proxy.js.map +1 -1
  187. package/lib/dist/mcp/tools.d.ts.map +1 -1
  188. package/lib/dist/mcp/tools.js +29 -1
  189. package/lib/dist/mcp/tools.js.map +1 -1
  190. package/lib/dist/project-config.d.ts +43 -2
  191. package/lib/dist/project-config.d.ts.map +1 -1
  192. package/lib/dist/project-config.js +86 -2
  193. package/lib/dist/project-config.js.map +1 -1
  194. package/lib/dist/resolution/index.d.ts +47 -2
  195. package/lib/dist/resolution/index.d.ts.map +1 -1
  196. package/lib/dist/resolution/index.js +160 -5
  197. package/lib/dist/resolution/index.js.map +1 -1
  198. package/lib/dist/resolution/name-matcher.d.ts +25 -0
  199. package/lib/dist/resolution/name-matcher.d.ts.map +1 -1
  200. package/lib/dist/resolution/name-matcher.js +59 -0
  201. package/lib/dist/resolution/name-matcher.js.map +1 -1
  202. package/lib/dist/resolution/vba-runtime-objects.d.ts +11 -11
  203. package/lib/dist/resolution/vba-runtime-objects.d.ts.map +1 -1
  204. package/lib/dist/resolution/vba-runtime-objects.js +18 -38
  205. package/lib/dist/resolution/vba-runtime-objects.js.map +1 -1
  206. package/lib/dist/types.d.ts +13 -5
  207. package/lib/dist/types.d.ts.map +1 -1
  208. package/lib/dist/types.js +17 -0
  209. package/lib/dist/types.js.map +1 -1
  210. package/lib/node_modules/.modules.yaml +1 -1
  211. package/lib/node_modules/.pnpm-workspace-state-v1.json +1 -1
  212. package/lib/package.json +2 -1
  213. package/package.json +1 -1
@@ -2,11 +2,23 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.scanDoCmdOpenCalls = scanDoCmdOpenCalls;
4
4
  exports.scanDoCmdOpenQuery = scanDoCmdOpenQuery;
5
+ exports.scanDoCmdCloseCalls = scanDoCmdCloseCalls;
6
+ exports.scanDoCmdObjectCalls = scanDoCmdObjectCalls;
5
7
  /**
6
- * `DoCmd.OpenForm` / `DoCmd.OpenReport` / `DoCmd.OpenQuery` modelling
7
- * (hueco 6 / issues #48, #52). OpenForm/OpenReport emit a synthetic
8
- * form-layout/report-layout stub + `opens-form`/`opens-report` edge; OpenQuery
9
- * emits an `UnresolvedReference` the resolver binds to the real `query` node.
8
+ * `DoCmd.<Verb>` modelling (hueco 6 / issues #48, #52, #254).
9
+ *
10
+ * Four shapes live here:
11
+ * 1. `OpenForm` / `OpenReport` a synthetic form-layout/report-layout stub
12
+ * plus an `opens-form` / `opens-report` edge.
13
+ * 2. `OpenQuery` — an `UnresolvedReference` the resolver binds to the real
14
+ * `query` node emitted for `queries/<Name>.sql`.
15
+ * 3. Issue #254: every OTHER `DoCmd` verb that names an Access object in a
16
+ * positional argument (`RunMacro`, `TransferSpreadsheet`, `OutputTo`, …).
17
+ * These emit an `UnresolvedReference` and NEVER a node — see
18
+ * `DOCMD_OBJECT_DISPATCH`.
19
+ * 4. Issue #246: `DoCmd.Close acForm|acReport, "<Name>"` — a `references`
20
+ * edge to the SAME stub shape (1) creates, so the form's open/close
21
+ * lifecycle converges on one node. See `scanDoCmdCloseCalls`.
10
22
  *
11
23
  * `DoCmd` is in `RUNTIME_RECEIVER_BLACKLIST`, so these methods are skipped by
12
24
  * the generic call-site scan and handled here with their own emission path.
@@ -31,6 +43,29 @@ const OPEN_REPORT_ARG_RE = /\bDoCmd\.OpenReport\s+("(?:(?:[^"]|"")*)"|\p{L}[\p{L
31
43
  * REAL `query` node `SqlQueryExtractor` emits for `queries/<Name>.sql`.
32
44
  */
33
45
  const OPEN_QUERY_ARG_RE = /\bDoCmd\.OpenQuery\s+("(?:(?:[^"]|"")*)"|\p{L}[\p{L}\p{N}_]*)/gu;
46
+ /**
47
+ * Issue #246: `DoCmd.Close acForm|acReport, "<Name>"` modelling regex.
48
+ *
49
+ * Group 1 is the object-type constant, group 2 the STRING LITERAL naming the
50
+ * object. Both the bare (`DoCmd.Close acForm, "X"`) and the parenthesised
51
+ * (`DoCmd.Close(acForm, "X")`) call forms match; trailing positional
52
+ * arguments (`acSaveNo`, ...) are not captured.
53
+ *
54
+ * A string literal is the ONLY accepted second-argument shape, deliberately:
55
+ * - a bare `DoCmd.Close` closes "the active object", which is a runtime
56
+ * value and not a name;
57
+ * - `Me.Name`, or any other variable, holds a name only known at runtime.
58
+ * Both are skipped SILENTLY -- a guessed close target is worse than none.
59
+ * Object types other than `acForm` / `acReport` (`acTable`, `acQuery`, ...)
60
+ * have no stub shape to converge on, so they are skipped too.
61
+ *
62
+ * The trailing lookahead requires the literal to be the WHOLE argument: a
63
+ * concatenation such as `"Form" & strSufijo` names a form only known at
64
+ * runtime, and taking its literal prefix would emit a target that does not
65
+ * exist. The argument therefore has to end at the next comma, the closing
66
+ * paren, a VBA statement separator, or the end of the line.
67
+ */
68
+ const CLOSE_ARG_RE = /\bDoCmd\.Close[ \t]*\(?[ \t]*(acForm|acReport)\b[ \t]*,[ \t]*("(?:(?:[^"]|"")*)")(?=[ \t]*(?:$|[,):]))/giu;
34
69
  /**
35
70
  * Issue #48 dispatch table — shared literal-or-Const argument resolution
36
71
  * for `DoCmd.OpenForm` and `DoCmd.OpenReport`. Each entry carries everything
@@ -72,7 +107,7 @@ const DOCMD_OPEN_DISPATCH = [
72
107
  * a cached stub node (form-layout / report-layout) and an
73
108
  * `opens-form` / `opens-report` heuristic edge from the calling Sub.
74
109
  */
75
- function scanDoCmdOpenCalls(ctx, line, caller, lineNum) {
110
+ function scanDoCmdOpenCalls(ctx, line, maskedLine, caller, lineNum) {
76
111
  for (const dispatch of DOCMD_OPEN_DISPATCH) {
77
112
  // Each regex has /g so we MUST reset `lastIndex` before use; cloning
78
113
  // the regex is the simplest way to avoid leaking state across lines
@@ -80,6 +115,8 @@ function scanDoCmdOpenCalls(ctx, line, caller, lineNum) {
80
115
  const localRe = new RegExp(dispatch.re.source, dispatch.re.flags);
81
116
  let m;
82
117
  while ((m = localRe.exec(line)) !== null) {
118
+ if (maskedLine.slice(m.index, m.index + 5).toLowerCase() !== 'docmd')
119
+ continue;
83
120
  const rawArg = (m[1] ?? '').trim();
84
121
  // Issue #52: const lookup is now per-proc-bucket with module
85
122
  // fallback (see `resolveLocalConst`). Two procs declaring the
@@ -102,6 +139,30 @@ function scanDoCmdOpenCalls(ctx, line, caller, lineNum) {
102
139
  * from `caller` to that stub.
103
140
  */
104
141
  function emitOpensStubEdge(ctx, dispatch, caller, targetName, lineNum, column) {
142
+ const stubId = resolveOpensStubId(ctx, dispatch, targetName, lineNum);
143
+ ctx.edges.push({
144
+ source: ctx.findOrCreateFunctionNodeId(caller),
145
+ target: stubId,
146
+ kind: dispatch.edgeKind,
147
+ provenance: 'heuristic',
148
+ metadata: {
149
+ synthesizedBy: dispatch.synthesizedBy,
150
+ [dispatch.metadataTargetKey]: targetName,
151
+ },
152
+ line: lineNum,
153
+ column,
154
+ });
155
+ }
156
+ /**
157
+ * Issue #246: the stub half of `emitOpensStubEdge`, lifted out so
158
+ * `scanDoCmdCloseCalls` can point at the SAME node instead of minting a
159
+ * second stub shape for the same form. The cache key is unchanged
160
+ * (`<OpenForm|OpenReport>:<lowercased name>`), which is precisely what makes
161
+ * an `OpenForm "X"` and a `DoCmd.Close acForm, "X"` converge on one node.
162
+ *
163
+ * Returns the id of the cached (or freshly created) stub node.
164
+ */
165
+ function resolveOpensStubId(ctx, dispatch, targetName, lineNum) {
105
166
  const key = `${dispatch.cacheKey}:${targetName.toLowerCase()}`;
106
167
  let stubId = ctx.opensStubIdsByKey.get(key);
107
168
  if (!stubId) {
@@ -133,18 +194,7 @@ function emitOpensStubEdge(ctx, dispatch, caller, targetName, lineNum, column) {
133
194
  updatedAt: Date.now(),
134
195
  });
135
196
  }
136
- ctx.edges.push({
137
- source: ctx.findOrCreateFunctionNodeId(caller),
138
- target: stubId,
139
- kind: dispatch.edgeKind,
140
- provenance: 'heuristic',
141
- metadata: {
142
- synthesizedBy: dispatch.synthesizedBy,
143
- [dispatch.metadataTargetKey]: targetName,
144
- },
145
- line: lineNum,
146
- column,
147
- });
197
+ return stubId;
148
198
  }
149
199
  /**
150
200
  * Issue #48: scan one line of VBA source for `DoCmd.OpenQuery "X"` calls.
@@ -152,10 +202,12 @@ function emitOpensStubEdge(ctx, dispatch, caller, targetName, lineNum, column) {
152
202
  * resolver binds to the REAL `query` node that `SqlQueryExtractor`
153
203
  * produces for `queries/<Name>.sql`, tagged `synthesizedBy: 'vba-opens-query'`.
154
204
  */
155
- function scanDoCmdOpenQuery(ctx, line, caller, lineNum) {
205
+ function scanDoCmdOpenQuery(ctx, line, maskedLine, caller, lineNum) {
156
206
  const localRe = new RegExp(OPEN_QUERY_ARG_RE.source, OPEN_QUERY_ARG_RE.flags);
157
207
  let m;
158
208
  while ((m = localRe.exec(line)) !== null) {
209
+ if (maskedLine.slice(m.index, m.index + 5).toLowerCase() !== 'docmd')
210
+ continue;
159
211
  const rawArg = (m[1] ?? '').trim();
160
212
  // Issue #52: same per-proc-with-module-fallback lookup as
161
213
  // `scanDoCmdOpenCalls`.
@@ -176,4 +228,231 @@ function scanDoCmdOpenQuery(ctx, line, caller, lineNum) {
176
228
  });
177
229
  }
178
230
  }
231
+ /**
232
+ * Issue #246 (task T4): scan one line of VBA source for
233
+ * `DoCmd.Close acForm|acReport, "<Name>"`.
234
+ *
235
+ * Each match emits ONE `references` edge -- not a new edge kind -- from the
236
+ * calling procedure to the very same `form-layout` / `report-layout` stub
237
+ * that `opens-form` / `opens-report` already point at, by reusing
238
+ * `resolveOpensStubId`'s cache. A form that is both opened and closed
239
+ * therefore ends up with ONE node carrying two distinct edges.
240
+ *
241
+ * The edge carries `synthesizedBy: 'vba-closes-form'` for both object types
242
+ * (one tag for the whole verb keeps every close edge queryable as a set) and
243
+ * `targetFormName` as its single name key, for the same reason. If a
244
+ * first-class `closes-form` edge kind is ever wanted, that tag is the seam.
245
+ */
246
+ function scanDoCmdCloseCalls(ctx, line, maskedLine, caller, lineNum) {
247
+ // The shared regex carries /g, so clone it before use to keep `lastIndex`
248
+ // from leaking across lines.
249
+ const localRe = new RegExp(CLOSE_ARG_RE.source, CLOSE_ARG_RE.flags);
250
+ let m;
251
+ while ((m = localRe.exec(line)) !== null) {
252
+ // `maskedLine` has string CONTENT blanked out, so this rejects a
253
+ // `DoCmd.Close ...` that only appears inside a string literal. The target
254
+ // name itself lives inside a literal, which is why the match runs on the
255
+ // original `line`.
256
+ if (maskedLine.slice(m.index, m.index + 5).toLowerCase() !== 'docmd')
257
+ continue;
258
+ const cacheKey = (m[1] ?? '').toLowerCase() === 'acreport' ? 'OpenReport' : 'OpenForm';
259
+ const dispatch = DOCMD_OPEN_DISPATCH.find((d) => d.cacheKey === cacheKey);
260
+ if (!dispatch)
261
+ continue;
262
+ const targetName = (0, text_utils_1.unwrapVbaStringLiteral)((m[2] ?? '').trim());
263
+ if (!targetName)
264
+ continue;
265
+ ctx.edges.push({
266
+ source: ctx.findOrCreateFunctionNodeId(caller),
267
+ // Same cache, same key shape, same node as `opens-form` -- never a
268
+ // second stub for the same form.
269
+ target: resolveOpensStubId(ctx, dispatch, targetName, lineNum),
270
+ kind: 'references',
271
+ provenance: 'heuristic',
272
+ metadata: {
273
+ synthesizedBy: 'vba-closes-form',
274
+ targetFormName: targetName,
275
+ },
276
+ line: lineNum,
277
+ column: m.index,
278
+ });
279
+ }
280
+ }
281
+ /**
282
+ * Issue #254 dispatch table — verb, argument position, provenance tag.
283
+ *
284
+ * Argument positions follow the documented Access `DoCmd` signatures:
285
+ * RunMacro MacroName, RepeatCount, RepeatExpression
286
+ * OpenTable TableName, View, DataMode
287
+ * ApplyFilter FilterName, WhereCondition, ControlName
288
+ * CopyObject DestinationDatabase, NewName, SourceObjectType, SourceObjectName
289
+ * DeleteObject ObjectType, ObjectName
290
+ * Rename NewName, ObjectType, OldName
291
+ * SelectObject ObjectType, ObjectName, InDatabaseWindow
292
+ * BrowseTo ObjectType, ObjectName, PathToSubformControl, …
293
+ * OutputTo ObjectType, ObjectName, OutputFormat, OutputFile, …
294
+ * SendObject ObjectType, ObjectName, OutputFormat, To, …
295
+ * TransferSpreadsheet TransferType, SpreadsheetType, TableName, FileName, …
296
+ * TransferText TransferType, SpecificationName, TableName, FileName, …
297
+ * TransferDatabase TransferType, DatabaseType, DatabaseName, ObjectType, Source, Destination, …
298
+ */
299
+ const DOCMD_OBJECT_DISPATCH = [
300
+ { method: 'RunMacro', argIndex: 0, synthesizedBy: 'vba-runs-macro' },
301
+ { method: 'OpenTable', argIndex: 0, synthesizedBy: 'vba-opens-table' },
302
+ { method: 'ApplyFilter', argIndex: 0, synthesizedBy: 'vba-applies-filter' },
303
+ { method: 'CopyObject', argIndex: 3, synthesizedBy: 'vba-copies-object' },
304
+ { method: 'DeleteObject', argIndex: 1, synthesizedBy: 'vba-deletes-object' },
305
+ { method: 'Rename', argIndex: 2, synthesizedBy: 'vba-renames-object' },
306
+ { method: 'SelectObject', argIndex: 1, synthesizedBy: 'vba-selects-object' },
307
+ { method: 'BrowseTo', argIndex: 1, synthesizedBy: 'vba-browses-to' },
308
+ { method: 'OutputTo', argIndex: 1, synthesizedBy: 'vba-outputs-to' },
309
+ { method: 'SendObject', argIndex: 1, synthesizedBy: 'vba-sends-object' },
310
+ {
311
+ method: 'TransferSpreadsheet',
312
+ argIndex: 2,
313
+ synthesizedBy: 'vba-transfers-spreadsheet',
314
+ },
315
+ { method: 'TransferText', argIndex: 2, synthesizedBy: 'vba-transfers-text' },
316
+ {
317
+ method: 'TransferDatabase',
318
+ argIndex: 4,
319
+ synthesizedBy: 'vba-transfers-database',
320
+ },
321
+ ];
322
+ /**
323
+ * One regex per dispatch row, built once at module load. It matches only the
324
+ * `DoCmd.<Verb>` head plus the optional opening paren — the argument list is
325
+ * split by `splitDoCmdArguments`, because a positional lookup through a list
326
+ * that mixes literals, intrinsic constants and omitted arguments is not
327
+ * something a regex should be asked to do.
328
+ */
329
+ const DOCMD_OBJECT_HEAD_RES = DOCMD_OBJECT_DISPATCH.map((d) => new RegExp(`\\bDoCmd\\.${d.method}\\b[ \\t]*\\(?[ \\t]*`, 'giu'));
330
+ /**
331
+ * Split a `DoCmd` argument list into its top-level arguments, in source order.
332
+ *
333
+ * `text` is the remainder of the line AFTER the `DoCmd.<Verb>` head. Commas
334
+ * inside a string literal or inside a nested paren/bracket group do not split;
335
+ * an omitted argument (`DoCmd.CopyObject , "X", …`) yields an empty string so
336
+ * the positions of the arguments that ARE present stay correct.
337
+ *
338
+ * The scan stops at the first top-level `)` (closing the parenthesised call
339
+ * form), `:` (VBA statement separator) or a comment quote — comments are
340
+ * already stripped upstream, so that last one is defence in depth.
341
+ */
342
+ function splitDoCmdArguments(text) {
343
+ const args = [];
344
+ let current = '';
345
+ let depth = 0;
346
+ let inString = false;
347
+ for (let i = 0; i < text.length; i++) {
348
+ const ch = text[i] ?? '';
349
+ if (inString) {
350
+ current += ch;
351
+ if (ch === '"') {
352
+ if (text[i + 1] === '"') {
353
+ current += '"';
354
+ i++;
355
+ }
356
+ else {
357
+ inString = false;
358
+ }
359
+ }
360
+ continue;
361
+ }
362
+ if (ch === '"') {
363
+ inString = true;
364
+ current += ch;
365
+ continue;
366
+ }
367
+ if (ch === '(' || ch === '[') {
368
+ depth++;
369
+ current += ch;
370
+ continue;
371
+ }
372
+ if (ch === ')' || ch === ']') {
373
+ if (depth === 0)
374
+ break;
375
+ depth--;
376
+ current += ch;
377
+ continue;
378
+ }
379
+ if (depth === 0 && (ch === "'" || ch === ':'))
380
+ break;
381
+ if (depth === 0 && ch === ',') {
382
+ args.push(current.trim());
383
+ current = '';
384
+ continue;
385
+ }
386
+ current += ch;
387
+ }
388
+ args.push(current.trim());
389
+ return args;
390
+ }
391
+ /**
392
+ * Resolve one `DoCmd` object argument to the name it denotes, or `null` when
393
+ * it denotes nothing we can know statically.
394
+ *
395
+ * A `"literal"` is taken verbatim. A bare identifier is resolved through the
396
+ * per-proc-then-module `Const` lookup (Issue #52) — a `Const` holding a string
397
+ * literal IS a static name. Anything else (an undeclared variable, a
398
+ * concatenation, a function call) resolves to `null` and the call site stays
399
+ * SILENT. This is deliberately stricter than the `OpenForm`/`OpenReport`
400
+ * bare-identifier fallback: a guessed target on a verb nobody in the corpus
401
+ * uses would be noise nobody can act on.
402
+ */
403
+ function resolveDoCmdObjectArgument(ctx, rawArg) {
404
+ const arg = rawArg.trim();
405
+ if (!arg)
406
+ return null;
407
+ if (arg.startsWith('"'))
408
+ return (0, text_utils_1.unwrapVbaStringLiteral)(arg) || null;
409
+ if (!/^\p{L}[\p{L}\p{N}_]*$/u.test(arg))
410
+ return null;
411
+ return ctx.resolveLocalConst(arg) ?? null;
412
+ }
413
+ /**
414
+ * Issue #254: scan one line of VBA source for every `DoCmd` verb in
415
+ * `DOCMD_OBJECT_DISPATCH`. Each match whose object argument resolves to a
416
+ * static name emits ONE `UnresolvedReference` — no node, ever.
417
+ *
418
+ * `maskedLine` has string CONTENT blanked out, so the `docmd` prefix check
419
+ * rejects a verb name that only appears inside a string literal. The object
420
+ * name itself lives inside a literal, which is why the split runs on the
421
+ * original `line`.
422
+ */
423
+ function scanDoCmdObjectCalls(ctx, line, maskedLine, caller, lineNum) {
424
+ for (let d = 0; d < DOCMD_OBJECT_DISPATCH.length; d++) {
425
+ const dispatch = DOCMD_OBJECT_DISPATCH[d];
426
+ // The shared regexes carry /g, so clone before use to keep `lastIndex`
427
+ // from leaking across lines and across dispatch rows.
428
+ const head = DOCMD_OBJECT_HEAD_RES[d];
429
+ const localRe = new RegExp(head.source, head.flags);
430
+ let m;
431
+ while ((m = localRe.exec(line)) !== null) {
432
+ if (maskedLine.slice(m.index, m.index + 5).toLowerCase() !== 'docmd')
433
+ continue;
434
+ const args = splitDoCmdArguments(line.slice(m.index + m[0].length));
435
+ const targetName = resolveDoCmdObjectArgument(ctx, args[dispatch.argIndex] ?? '');
436
+ if (!targetName)
437
+ continue;
438
+ ctx.unresolvedReferences.push({
439
+ fromNodeId: ctx.findOrCreateFunctionNodeId(caller),
440
+ referenceName: targetName,
441
+ // `references` is an EdgeKind literal, so if the named artifact ever
442
+ // IS indexed the reference becomes a plain `references` edge with no
443
+ // extractor change.
444
+ referenceKind: 'references',
445
+ line: lineNum,
446
+ column: m.index,
447
+ filePath: ctx.filePath,
448
+ language: 'vba',
449
+ metadata: {
450
+ synthesizedBy: dispatch.synthesizedBy,
451
+ docmdVerb: dispatch.method,
452
+ targetName,
453
+ },
454
+ });
455
+ }
456
+ }
457
+ }
179
458
  //# sourceMappingURL=docmd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"docmd.js","sourceRoot":"","sources":["../../../src/extraction/vba/docmd.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"docmd.js","sourceRoot":"","sources":["../../../src/extraction/vba/docmd.ts"],"names":[],"mappings":";;AA+HA,gDA2BC;AA4FD,gDA6BC;AAiBD,kDAsCC;AA0LD,oDAyCC;AA7iBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,gEAAwD;AACxD,6CAAsD;AAGtD;;;;GAIG;AACH,MAAM,gBAAgB,GACpB,gEAAgE,CAAC;AAEnE;;;;GAIG;AACH,MAAM,kBAAkB,GACtB,kEAAkE,CAAC;AAErE;;;;GAIG;AACH,MAAM,iBAAiB,GACrB,iEAAiE,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,YAAY,GAChB,2GAA2G,CAAC;AAe9G;;;;;;;;GAQG;AACH,MAAM,mBAAmB,GAAqC;IAC5D;QACE,MAAM,EAAE,UAAU;QAClB,EAAE,EAAE,gBAAgB;QACpB,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,aAAa;QACvB,eAAe,EAAE,yBAAyB;QAC1C,kBAAkB,EAAE,WAAW;QAC/B,gBAAgB,EAAE,OAAO;QACzB,QAAQ,EAAE,UAAU;QACpB,iBAAiB,EAAE,gBAAgB;QACnC,aAAa,EAAE,gBAAgB;KAChC;IACD;QACE,MAAM,EAAE,YAAY;QACpB,EAAE,EAAE,kBAAkB;QACtB,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,eAAe;QACzB,eAAe,EAAE,2BAA2B;QAC5C,kBAAkB,EAAE,aAAa;QACjC,gBAAgB,EAAE,SAAS;QAC3B,QAAQ,EAAE,YAAY;QACtB,iBAAiB,EAAE,kBAAkB;QACrC,aAAa,EAAE,kBAAkB;KAClC;CACF,CAAC;AAEF;;;;;GAKG;AACH,SAAgB,kBAAkB,CAChC,GAAwB,EACxB,IAAY,EACZ,UAAkB,EAClB,MAAgB,EAChB,OAAe;IAEf,KAAK,MAAM,QAAQ,IAAI,mBAAmB,EAAE,CAAC;QAC3C,qEAAqE;QACrE,oEAAoE;QACpE,kCAAkC;QAClC,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAClE,IAAI,CAAyB,CAAC;QAC9B,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACzC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO;gBAAE,SAAS;YAC/E,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACnC,6DAA6D;YAC7D,8DAA8D;YAC9D,4DAA4D;YAC5D,0DAA0D;YAC1D,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;gBACvC,CAAC,CAAC,IAAA,mCAAsB,EAAC,MAAM,CAAC;gBAChC,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC;YAC9C,IAAI,CAAC,UAAU;gBAAE,SAAS;YAC1B,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB,CACxB,GAAwB,EACxB,QAA2B,EAC3B,MAAgB,EAChB,UAAkB,EAClB,OAAe,EACf,MAAc;IAEd,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACtE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;QACb,MAAM,EAAE,GAAG,CAAC,0BAA0B,CAAC,MAAM,CAAC;QAC9C,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ,CAAC,QAAQ;QACvB,UAAU,EAAE,WAAW;QACvB,QAAQ,EAAE;YACR,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,UAAU;SACzC;QACD,IAAI,EAAE,OAAO;QACb,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,kBAAkB,CACzB,GAAwB,EACxB,QAA2B,EAC3B,UAAkB,EAClB,OAAe;IAEf,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,QAAQ,IAAI,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;IAC/D,IAAI,MAAM,GAAG,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,4DAA4D;QAC5D,6DAA6D;QAC7D,kEAAkE;QAClE,8DAA8D;QAC9D,iEAAiE;QACjE,uEAAuE;QACvE,MAAM,iBAAiB,GAAG,GAAG,QAAQ,CAAC,eAAe,IAAI,UAAU,GAAG,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QACpG,MAAM,GAAG,IAAA,oCAAc,EACrB,iBAAiB,EACjB,QAAQ,CAAC,QAAQ,EACjB,UAAU,EACV,CAAC,CACF,CAAC;QACF,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACvC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YACb,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,QAAQ,CAAC,QAAQ;YACvB,IAAI,EAAE,UAAU;YAChB,gEAAgE;YAChE,8DAA8D;YAC9D,iEAAiE;YACjE,oCAAoC;YACpC,aAAa,EAAE,GAAG,QAAQ,CAAC,gBAAgB,GAAG,UAAU,EAAE;YAC1D,QAAQ,EAAE,iBAAiB;YAC3B,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,OAAO;YAClB,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,CAAC;YACd,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;YACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,kBAAkB,CAChC,GAAwB,EACxB,IAAY,EACZ,UAAkB,EAClB,MAAgB,EAChB,OAAe;IAEf,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,CAAyB,CAAC;IAC9B,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACzC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO;YAAE,SAAS;QAC/E,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,0DAA0D;QAC1D,wBAAwB;QACxB,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;YACvC,CAAC,CAAC,IAAA,mCAAsB,EAAC,MAAM,CAAC;YAChC,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,UAAU;YAAE,SAAS;QAC1B,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC;YAC5B,UAAU,EAAE,GAAG,CAAC,0BAA0B,CAAC,MAAM,CAAC;YAClD,aAAa,EAAE,UAAU;YACzB,aAAa,EAAE,WAAW;YAC1B,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,CAAC,CAAC,KAAK;YACf,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,EAAE,aAAa,EAAE,iBAAiB,EAAE;SAC/C,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,mBAAmB,CACjC,GAAwB,EACxB,IAAY,EACZ,UAAkB,EAClB,MAAgB,EAChB,OAAe;IAEf,0EAA0E;IAC1E,6BAA6B;IAC7B,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACpE,IAAI,CAAyB,CAAC;IAC9B,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACzC,iEAAiE;QACjE,0EAA0E;QAC1E,yEAAyE;QACzE,mBAAmB;QACnB,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO;YAAE,SAAS;QAC/E,MAAM,QAAQ,GACZ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC;QACxE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QAC1E,IAAI,CAAC,QAAQ;YAAE,SAAS;QACxB,MAAM,UAAU,GAAG,IAAA,mCAAsB,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,UAAU;YAAE,SAAS;QAC1B,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YACb,MAAM,EAAE,GAAG,CAAC,0BAA0B,CAAC,MAAM,CAAC;YAC9C,mEAAmE;YACnE,iCAAiC;YACjC,MAAM,EAAE,kBAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC;YAC9D,IAAI,EAAE,YAAY;YAClB,UAAU,EAAE,WAAW;YACvB,QAAQ,EAAE;gBACR,aAAa,EAAE,iBAAiB;gBAChC,cAAc,EAAE,UAAU;aAC3B;YACD,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,CAAC,CAAC,KAAK;SAChB,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAyCD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,qBAAqB,GAAuC;IAChE,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,gBAAgB,EAAE;IACpE,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,iBAAiB,EAAE;IACtE,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,oBAAoB,EAAE;IAC3E,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,mBAAmB,EAAE;IACzE,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,oBAAoB,EAAE;IAC5E,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,oBAAoB,EAAE;IACtE,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,oBAAoB,EAAE;IAC5E,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,gBAAgB,EAAE;IACpE,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,gBAAgB,EAAE;IACpE,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,kBAAkB,EAAE;IACxE;QACE,MAAM,EAAE,qBAAqB;QAC7B,QAAQ,EAAE,CAAC;QACX,aAAa,EAAE,2BAA2B;KAC3C;IACD,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,oBAAoB,EAAE;IAC5E;QACE,MAAM,EAAE,kBAAkB;QAC1B,QAAQ,EAAE,CAAC;QACX,aAAa,EAAE,wBAAwB;KACxC;CACF,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,qBAAqB,GAA0B,qBAAqB,CAAC,GAAG,CAC5E,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,MAAM,uBAAuB,EAAE,KAAK,CAAC,CACxE,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,IAAI,EAAE,CAAC;YACd,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACf,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACxB,OAAO,IAAI,GAAG,CAAC;oBACf,CAAC,EAAE,CAAC;gBACN,CAAC;qBAAM,CAAC;oBACN,QAAQ,GAAG,KAAK,CAAC;gBACnB,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,QAAQ,GAAG,IAAI,CAAC;YAChB,OAAO,IAAI,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC7B,KAAK,EAAE,CAAC;YACR,OAAO,IAAI,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC7B,IAAI,KAAK,KAAK,CAAC;gBAAE,MAAM;YACvB,KAAK,EAAE,CAAC;YACR,OAAO,IAAI,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC;YAAE,MAAM;QACrD,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1B,OAAO,GAAG,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QACD,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,0BAA0B,CACjC,GAAwB,EACxB,MAAc;IAEd,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAA,mCAAsB,EAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACpE,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACrD,OAAO,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;AAC5C,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,oBAAoB,CAClC,GAAwB,EACxB,IAAY,EACZ,UAAkB,EAClB,MAAgB,EAChB,OAAe;IAEf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,qBAAqB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,CAAC,CAAE,CAAC;QAC3C,uEAAuE;QACvE,sDAAsD;QACtD,MAAM,IAAI,GAAG,qBAAqB,CAAC,CAAC,CAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAyB,CAAC;QAC9B,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACzC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO;gBAAE,SAAS;YAC/E,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACpE,MAAM,UAAU,GAAG,0BAA0B,CAC3C,GAAG,EACH,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAC9B,CAAC;YACF,IAAI,CAAC,UAAU;gBAAE,SAAS;YAC1B,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC;gBAC5B,UAAU,EAAE,GAAG,CAAC,0BAA0B,CAAC,MAAM,CAAC;gBAClD,aAAa,EAAE,UAAU;gBACzB,qEAAqE;gBACrE,qEAAqE;gBACrE,oBAAoB;gBACpB,aAAa,EAAE,YAAY;gBAC3B,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,CAAC,CAAC,KAAK;gBACf,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE;oBACR,aAAa,EAAE,QAAQ,CAAC,aAAa;oBACrC,SAAS,EAAE,QAAQ,CAAC,MAAM;oBAC1B,UAAU;iBACX;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,4 +1,4 @@
1
- import { VbaExtractorContext, VbaClassifier } from './context';
1
+ import { VbaClassifier } from './context';
2
2
  import { VbaExtractionRule } from './rules';
3
3
  /**
4
4
  * Issue #153: the declarative rule table for the enum / const concern.
@@ -26,8 +26,9 @@ import { VbaExtractionRule } from './rules';
26
26
  * + `contains` edge ONLY when not inside a proc
27
27
  * (proc-local Consts are not module symbols).
28
28
  *
29
- * The inter-line `ctx.procStack` / `ctx.currentProcKey` state is
30
- * SHARED with the calls/SQL classifier (issue #52 protocol). The
29
+ * This classifier exclusively owns the inter-line `ctx.procStack` /
30
+ * `ctx.currentProcKey` state. The calls/SQL classifier keeps its own
31
+ * `ProcInfo` stack and only reads the shared current-scope key. The
31
32
  * `ctx.vbaEnumBlock` state is local to this concern and lives on
32
33
  * `ctx` for the same RULES-table-friendliness reason as
33
34
  * `vbaDeclTypeBlock`.
@@ -42,17 +43,9 @@ export declare const RULES: readonly VbaExtractionRule<unknown>[];
42
43
  * `ctx.vbaEnumBlock` — lives on `ctx` so the RULES table's `emit`
43
44
  * functions can read/write it without taking a closure reference.
44
45
  *
45
- * Issue #52: the first invocation also resets the shared proc-stack
46
- * + lookup key so leftover state from a previous `extract()` (only
47
- * possible in tests that construct a fresh extractor and run twice)
48
- * never leaks across sweeps. The walk below updates both every
49
- * iteration; `sweepCallsAndSql` resets again at its own start, so
50
- * the protocol stays consistent across both classifiers.
46
+ * A fresh `VbaExtractorContext` owns fresh stack state; classifiers never
47
+ * lazily reset it. This makes the result independent of whether a procedure
48
+ * begins on the first or a later physical line.
51
49
  */
52
50
  export declare function createEnumsConstsClassifier(): VbaClassifier;
53
- /**
54
- * Backward-compat wrapper (see procedures.ts). Returns the classifier's
55
- * `count` so the orchestrator can decide `hasAnySymbols`.
56
- */
57
- export declare function sweepEnumsAndConsts(ctx: VbaExtractorContext, src: string): number;
58
51
  //# sourceMappingURL=enums-consts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"enums-consts.d.ts","sourceRoot":"","sources":["../../../src/extraction/vba/enums-consts.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAyB,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAqBnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,KAAK,EAAE,SAAS,iBAAiB,CAAC,OAAO,CAAC,EAmKtD,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,2BAA2B,IAAI,aAAa,CA6B3D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAOjF"}
1
+ {"version":3,"file":"enums-consts.d.ts","sourceRoot":"","sources":["../../../src/extraction/vba/enums-consts.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAwB,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAqBlE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,KAAK,EAAE,SAAS,iBAAiB,CAAC,OAAO,CAAC,EAoKtD,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,IAAI,aAAa,CAa3D"}
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RULES = void 0;
4
4
  exports.createEnumsConstsClassifier = createEnumsConstsClassifier;
5
- exports.sweepEnumsAndConsts = sweepEnumsAndConsts;
6
5
  /**
7
6
  * Enum / Const sweep (REQ-CODE-12, REQ-CODE-13). Emits `enum` + `enum_member`
8
7
  * nodes and module-level `constant` nodes, while tracking proc scope so
@@ -52,8 +51,9 @@ const CONST_DECL_RE = /^\s*(?:(Public|Private|Friend|Global)\s+)?Const\s+(.+)$/i
52
51
  * + `contains` edge ONLY when not inside a proc
53
52
  * (proc-local Consts are not module symbols).
54
53
  *
55
- * The inter-line `ctx.procStack` / `ctx.currentProcKey` state is
56
- * SHARED with the calls/SQL classifier (issue #52 protocol). The
54
+ * This classifier exclusively owns the inter-line `ctx.procStack` /
55
+ * `ctx.currentProcKey` state. The calls/SQL classifier keeps its own
56
+ * `ProcInfo` stack and only reads the shared current-scope key. The
57
57
  * `ctx.vbaEnumBlock` state is local to this concern and lives on
58
58
  * `ctx` for the same RULES-table-friendliness reason as
59
59
  * `vbaDeclTypeBlock`.
@@ -120,6 +120,7 @@ exports.RULES = [
120
120
  description: 'Match `End Enum` while inside an enum block; emit nothing and clear `ctx.vbaEnumBlock` so subsequent lines route back to the outside-enum-block rules.',
121
121
  pattern: ENUM_END_RE,
122
122
  requires: 'inside-enum-block',
123
+ terminal: true,
123
124
  emit: (_m, ctx) => {
124
125
  ctx.vbaEnumBlock = null;
125
126
  return { kind: 'end-enum-block' };
@@ -220,57 +221,22 @@ exports.RULES = [
220
221
  * `ctx.vbaEnumBlock` — lives on `ctx` so the RULES table's `emit`
221
222
  * functions can read/write it without taking a closure reference.
222
223
  *
223
- * Issue #52: the first invocation also resets the shared proc-stack
224
- * + lookup key so leftover state from a previous `extract()` (only
225
- * possible in tests that construct a fresh extractor and run twice)
226
- * never leaks across sweeps. The walk below updates both every
227
- * iteration; `sweepCallsAndSql` resets again at its own start, so
228
- * the protocol stays consistent across both classifiers.
224
+ * A fresh `VbaExtractorContext` owns fresh stack state; classifiers never
225
+ * lazily reset it. This makes the result independent of whether a procedure
226
+ * begins on the first or a later physical line.
229
227
  */
230
228
  function createEnumsConstsClassifier() {
231
- let initialized = false;
232
229
  const cls = {
233
230
  name: 'enumsConsts',
234
231
  count: 0,
235
232
  classifyLine(line, i, ctx) {
236
- if (!initialized) {
237
- ctx.procStack.length = 0;
238
- ctx.currentProcKey = 'module';
239
- initialized = true;
240
- }
241
233
  const lineNum = i + 1;
242
- for (const rule of exports.RULES) {
243
- if (rule.requires === 'inside-enum-block' && !ctx.vbaEnumBlock)
244
- continue;
245
- if (rule.requires === 'outside-enum-block' && ctx.vbaEnumBlock)
246
- continue;
247
- const m = (0, rules_1.matchRule)(rule.pattern, line);
248
- if (!m)
249
- continue;
250
- const result = rule.emit(m, ctx, line, lineNum);
251
- if (result !== null && result !== undefined) {
252
- this.count += rule.count ? rule.count(result) : 1;
253
- }
254
- // `enum-end` cleared the enum block — nothing else on this
255
- // line can apply. The legacy cascade did the same short-circuit
256
- // via `return`.
257
- if (rule.id === 'enum-end')
258
- break;
259
- }
234
+ this.count += (0, rules_1.runRules)(exports.RULES, ctx, line, line, lineNum, {
235
+ 'inside-enum-block': ctx.vbaEnumBlock !== null,
236
+ 'outside-enum-block': ctx.vbaEnumBlock === null,
237
+ });
260
238
  },
261
239
  };
262
240
  return cls;
263
241
  }
264
- /**
265
- * Backward-compat wrapper (see procedures.ts). Returns the classifier's
266
- * `count` so the orchestrator can decide `hasAnySymbols`.
267
- */
268
- function sweepEnumsAndConsts(ctx, src) {
269
- const cls = createEnumsConstsClassifier();
270
- const lines = src.split('\n');
271
- for (let i = 0; i < lines.length; i++) {
272
- cls.classifyLine(lines[i] ?? '', i, ctx);
273
- }
274
- return cls.count;
275
- }
276
242
  //# sourceMappingURL=enums-consts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"enums-consts.js","sourceRoot":"","sources":["../../../src/extraction/vba/enums-consts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"enums-consts.js","sourceRoot":"","sources":["../../../src/extraction/vba/enums-consts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * The channel names used when `codegraph.json` → `vba.errorChannel` is absent.
3
+ *
4
+ * `m_Error` / `p_Error` are the private module-variable spellings, `g_Error`
5
+ * the global one, and `Error` the public field a caller reads off the object
6
+ * (`m_ObjRiesgoActivo.Error`). Identical to the probe's
7
+ * `DEFAULT_ERROR_CHANNEL_NAMES` — `scripts/vba-coverage-probe.mjs` measured
8
+ * the census this task is accepted against, so the two lists must agree.
9
+ */
10
+ export declare const DEFAULT_ERROR_CHANNEL_NAMES: readonly string[];
11
+ /** A channel entry is a bare VBA identifier — nothing qualified, no regex. */
12
+ export declare const ERROR_CHANNEL_ENTRY_RE: RegExp;
13
+ /**
14
+ * The per-extractor compiled channel. Built ONCE per `VbaExtractor` and parked
15
+ * on `VbaExtractorContext`, for the same reason `CompiledSqlWrappers` is: the
16
+ * name lookup runs per identifier per line, and the write matcher per statement
17
+ * per line, so neither may be rebuilt inside the line loop.
18
+ *
19
+ * NOT structured-cloneable (it holds a `Set` and `RegExp`s) — which is exactly
20
+ * why `VbaExtractionOptions.errorChannel` carries plain strings across the
21
+ * worker boundary and the compilation happens on the far side.
22
+ */
23
+ export interface CompiledErrorChannel {
24
+ /** The channel names, defaults first, project entries appended. Display form. */
25
+ readonly names: readonly string[];
26
+ /** Lowercased `names`, for the per-identifier membership test. VBA is case-insensitive. */
27
+ readonly lookup: ReadonlySet<string>;
28
+ /**
29
+ * One anchored regex per name: the channel in the assignment-TARGET position
30
+ * of a statement — bare (`p_Error = …`), `Me.`-qualified (`Me.Error = …`) or
31
+ * object-qualified (`obj.Error = …`).
32
+ *
33
+ * Anchoring at the start of the statement is the whole precision of this
34
+ * matcher: it is what separates a WRITE from a READ, so the house guard
35
+ * `If m_Error <> "" Then` and the copy `x = m_Error` both correctly miss.
36
+ * Kept identical to the probe's `buildChannelWriteMatcher`.
37
+ */
38
+ readonly writeRes: readonly RegExp[];
39
+ }
40
+ /**
41
+ * Compile the channel from the plain-string config entries.
42
+ *
43
+ * `configured` entries are APPENDED to {@link DEFAULT_ERROR_CHANNEL_NAMES},
44
+ * never substituted for them — same contract as `vba.sqlWrappers`: a project
45
+ * that names its own `lastFailure` field must not lose `m_Error` in the trade,
46
+ * because in a codebase this size the two conventions coexist. Blank, dotted
47
+ * and otherwise non-identifier entries are dropped here; `project-config.ts`
48
+ * has already warned about them at load time.
49
+ */
50
+ export declare function compileErrorChannel(configured?: readonly string[]): CompiledErrorChannel;
51
+ export declare function defaultErrorChannel(): CompiledErrorChannel;
52
+ /**
53
+ * Is `name` the error channel? A WHOLE-name, case-insensitive test — the
54
+ * single reason `ErrorCount` does not match `Error`, pinned by a test.
55
+ */
56
+ export declare function isErrorChannelName(channel: CompiledErrorChannel, name: string): boolean;
57
+ //# sourceMappingURL=error-channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-channel.d.ts","sourceRoot":"","sources":["../../../src/extraction/vba/error-channel.ts"],"names":[],"mappings":"AA2DA;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,EAAE,SAAS,MAAM,EAKxD,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,sBAAsB,QAA2B,CAAC;AAE/D;;;;;;;;;GASG;AACH,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,2FAA2F;IAC3F,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC;;;;;;;;;OASG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,GAC7B,oBAAoB,CAmBtB;AAUD,wBAAgB,mBAAmB,IAAI,oBAAoB,CAG1D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,oBAAoB,EAC7B,IAAI,EAAE,MAAM,GACX,OAAO,CAET"}