@aroman22/codegraph-vba-darwin-arm64 1.9.0 → 1.11.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 (117) hide show
  1. package/lib/dist/db/queries.d.ts +39 -0
  2. package/lib/dist/db/queries.d.ts.map +1 -1
  3. package/lib/dist/db/queries.js +45 -0
  4. package/lib/dist/db/queries.js.map +1 -1
  5. package/lib/dist/extraction/frameworks/dysflow-export.d.ts +37 -0
  6. package/lib/dist/extraction/frameworks/dysflow-export.d.ts.map +1 -0
  7. package/lib/dist/extraction/frameworks/dysflow-export.js +121 -0
  8. package/lib/dist/extraction/frameworks/dysflow-export.js.map +1 -0
  9. package/lib/dist/extraction/frameworks/index.d.ts +20 -0
  10. package/lib/dist/extraction/frameworks/index.d.ts.map +1 -0
  11. package/lib/dist/extraction/frameworks/index.js +24 -0
  12. package/lib/dist/extraction/frameworks/index.js.map +1 -0
  13. package/lib/dist/extraction/index.d.ts.map +1 -1
  14. package/lib/dist/extraction/index.js +25 -5
  15. package/lib/dist/extraction/index.js.map +1 -1
  16. package/lib/dist/extraction/parse-pool.d.ts +10 -0
  17. package/lib/dist/extraction/parse-pool.d.ts.map +1 -1
  18. package/lib/dist/extraction/parse-pool.js +2 -0
  19. package/lib/dist/extraction/parse-pool.js.map +1 -1
  20. package/lib/dist/extraction/parse-worker.js +6 -2
  21. package/lib/dist/extraction/parse-worker.js.map +1 -1
  22. package/lib/dist/extraction/tree-sitter.d.ts +9 -1
  23. package/lib/dist/extraction/tree-sitter.d.ts.map +1 -1
  24. package/lib/dist/extraction/tree-sitter.js +58 -5
  25. package/lib/dist/extraction/tree-sitter.js.map +1 -1
  26. package/lib/dist/extraction/vba/call-sweep.d.ts +43 -0
  27. package/lib/dist/extraction/vba/call-sweep.d.ts.map +1 -1
  28. package/lib/dist/extraction/vba/call-sweep.js +155 -66
  29. package/lib/dist/extraction/vba/call-sweep.js.map +1 -1
  30. package/lib/dist/extraction/vba/calls.d.ts.map +1 -1
  31. package/lib/dist/extraction/vba/calls.js +6 -0
  32. package/lib/dist/extraction/vba/calls.js.map +1 -1
  33. package/lib/dist/extraction/vba/context.d.ts +109 -1
  34. package/lib/dist/extraction/vba/context.d.ts.map +1 -1
  35. package/lib/dist/extraction/vba/context.js +155 -2
  36. package/lib/dist/extraction/vba/context.js.map +1 -1
  37. package/lib/dist/extraction/vba/controls.d.ts.map +1 -1
  38. package/lib/dist/extraction/vba/controls.js +77 -0
  39. package/lib/dist/extraction/vba/controls.js.map +1 -1
  40. package/lib/dist/extraction/vba/declarations.d.ts +38 -2
  41. package/lib/dist/extraction/vba/declarations.d.ts.map +1 -1
  42. package/lib/dist/extraction/vba/declarations.js +217 -129
  43. package/lib/dist/extraction/vba/declarations.js.map +1 -1
  44. package/lib/dist/extraction/vba/dims.d.ts +35 -1
  45. package/lib/dist/extraction/vba/dims.d.ts.map +1 -1
  46. package/lib/dist/extraction/vba/dims.js +185 -109
  47. package/lib/dist/extraction/vba/dims.js.map +1 -1
  48. package/lib/dist/extraction/vba/enums-consts.d.ts +47 -7
  49. package/lib/dist/extraction/vba/enums-consts.d.ts.map +1 -1
  50. package/lib/dist/extraction/vba/enums-consts.js +212 -139
  51. package/lib/dist/extraction/vba/enums-consts.js.map +1 -1
  52. package/lib/dist/extraction/vba/event-synth.d.ts +3 -0
  53. package/lib/dist/extraction/vba/event-synth.d.ts.map +1 -0
  54. package/lib/dist/extraction/vba/event-synth.js +176 -0
  55. package/lib/dist/extraction/vba/event-synth.js.map +1 -0
  56. package/lib/dist/extraction/vba/events.d.ts +16 -0
  57. package/lib/dist/extraction/vba/events.d.ts.map +1 -0
  58. package/lib/dist/extraction/vba/events.js +90 -0
  59. package/lib/dist/extraction/vba/events.js.map +1 -0
  60. package/lib/dist/extraction/vba/implements.d.ts +16 -0
  61. package/lib/dist/extraction/vba/implements.d.ts.map +1 -1
  62. package/lib/dist/extraction/vba/implements.js +43 -12
  63. package/lib/dist/extraction/vba/implements.js.map +1 -1
  64. package/lib/dist/extraction/vba/procedures.d.ts +20 -0
  65. package/lib/dist/extraction/vba/procedures.d.ts.map +1 -1
  66. package/lib/dist/extraction/vba/procedures.js +48 -13
  67. package/lib/dist/extraction/vba/procedures.js.map +1 -1
  68. package/lib/dist/extraction/vba/rules.d.ts +125 -0
  69. package/lib/dist/extraction/vba/rules.d.ts.map +1 -0
  70. package/lib/dist/extraction/vba/rules.js +49 -0
  71. package/lib/dist/extraction/vba/rules.js.map +1 -0
  72. package/lib/dist/extraction/vba/text-utils.d.ts +0 -6
  73. package/lib/dist/extraction/vba/text-utils.d.ts.map +1 -1
  74. package/lib/dist/extraction/vba/text-utils.js +9 -6
  75. package/lib/dist/extraction/vba/text-utils.js.map +1 -1
  76. package/lib/dist/extraction/vba-extractor.d.ts +77 -1
  77. package/lib/dist/extraction/vba-extractor.d.ts.map +1 -1
  78. package/lib/dist/extraction/vba-extractor.js +177 -15
  79. package/lib/dist/extraction/vba-extractor.js.map +1 -1
  80. package/lib/dist/extraction/vba-form-extractor.d.ts +26 -114
  81. package/lib/dist/extraction/vba-form-extractor.d.ts.map +1 -1
  82. package/lib/dist/extraction/vba-form-extractor.js +293 -297
  83. package/lib/dist/extraction/vba-form-extractor.js.map +1 -1
  84. package/lib/dist/extraction/vba-preprocess.d.ts +11 -1
  85. package/lib/dist/extraction/vba-preprocess.d.ts.map +1 -1
  86. package/lib/dist/extraction/vba-preprocess.js +45 -16
  87. package/lib/dist/extraction/vba-preprocess.js.map +1 -1
  88. package/lib/dist/extraction/vba-timing.d.ts +38 -0
  89. package/lib/dist/extraction/vba-timing.d.ts.map +1 -0
  90. package/lib/dist/extraction/vba-timing.js +203 -0
  91. package/lib/dist/extraction/vba-timing.js.map +1 -0
  92. package/lib/dist/index.d.ts.map +1 -1
  93. package/lib/dist/index.js +26 -0
  94. package/lib/dist/index.js.map +1 -1
  95. package/lib/dist/project-config.d.ts +31 -0
  96. package/lib/dist/project-config.d.ts.map +1 -1
  97. package/lib/dist/project-config.js +75 -22
  98. package/lib/dist/project-config.js.map +1 -1
  99. package/lib/dist/resolution/frameworks/index.d.ts.map +1 -1
  100. package/lib/dist/resolution/frameworks/index.js +7 -0
  101. package/lib/dist/resolution/frameworks/index.js.map +1 -1
  102. package/lib/dist/resolution/index.d.ts +7 -0
  103. package/lib/dist/resolution/index.d.ts.map +1 -1
  104. package/lib/dist/resolution/index.js +155 -11
  105. package/lib/dist/resolution/index.js.map +1 -1
  106. package/lib/dist/resolution/name-matcher.d.ts +6 -0
  107. package/lib/dist/resolution/name-matcher.d.ts.map +1 -1
  108. package/lib/dist/resolution/name-matcher.js +81 -0
  109. package/lib/dist/resolution/name-matcher.js.map +1 -1
  110. package/lib/dist/resolution/vba-access-object-name.d.ts +7 -0
  111. package/lib/dist/resolution/vba-access-object-name.d.ts.map +1 -0
  112. package/lib/dist/resolution/vba-access-object-name.js +15 -0
  113. package/lib/dist/resolution/vba-access-object-name.js.map +1 -0
  114. package/lib/node_modules/.modules.yaml +1 -1
  115. package/lib/node_modules/.pnpm-workspace-state-v1.json +1 -1
  116. package/lib/package.json +2 -1
  117. package/package.json +1 -1
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Access event properties shared by form-layout expression extraction and
3
+ * code-behind naming-convention validation. Keep this as the single source of
4
+ * truth when adding events. Reference: Microsoft Access object event docs:
5
+ * https://learn.microsoft.com/en-us/office/vba/api/overview/access/object-model
6
+ */
7
+ export declare const ACCESS_EVENT_PROPERTIES: Map<string, string>;
8
+ /**
9
+ * Closed set of Access event procedure suffixes. Values from form/report
10
+ * event properties above are combined with control-specific events whose
11
+ * property is not necessarily present in an exported layout. VBA matching is
12
+ * case-insensitive; consumers should compare lower-cased names.
13
+ */
14
+ export declare const ACCESS_EVENT_NAMES: ReadonlySet<string>;
15
+ export declare function isAccessEventName(name: string): boolean;
16
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/extraction/vba/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,qBAuClC,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CA4BjD,CAAC;AAMH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ACCESS_EVENT_NAMES = exports.ACCESS_EVENT_PROPERTIES = void 0;
4
+ exports.isAccessEventName = isAccessEventName;
5
+ /**
6
+ * Access event properties shared by form-layout expression extraction and
7
+ * code-behind naming-convention validation. Keep this as the single source of
8
+ * truth when adding events. Reference: Microsoft Access object event docs:
9
+ * https://learn.microsoft.com/en-us/office/vba/api/overview/access/object-model
10
+ */
11
+ exports.ACCESS_EVENT_PROPERTIES = new Map([
12
+ ['onclick', 'Click'],
13
+ ['ondblclick', 'DblClick'],
14
+ ['oncurrent', 'Current'],
15
+ ['onload', 'Load'],
16
+ ['onopen', 'Open'],
17
+ ['onclose', 'Close'],
18
+ ['onactivate', 'Activate'],
19
+ ['ondeactivate', 'Deactivate'],
20
+ ['onunload', 'Unload'],
21
+ ['afterupdate', 'AfterUpdate'],
22
+ ['beforeupdate', 'BeforeUpdate'],
23
+ ['onchange', 'Change'],
24
+ ['onenter', 'Enter'],
25
+ ['onexit', 'Exit'],
26
+ ['ongotfocus', 'GotFocus'],
27
+ ['onlostfocus', 'LostFocus'],
28
+ ['onmousedown', 'MouseDown'],
29
+ ['onmousemove', 'MouseMove'],
30
+ ['onmouseup', 'MouseUp'],
31
+ ['onkeydown', 'KeyDown'],
32
+ ['onkeypress', 'KeyPress'],
33
+ ['onkeyup', 'KeyUp'],
34
+ ['ontimer', 'Timer'],
35
+ ['onnotinlist', 'NotInList'],
36
+ ['ondirty', 'Dirty'],
37
+ ['onundo', 'Undo'],
38
+ ['ondelete', 'Delete'],
39
+ ['beforeinsert', 'BeforeInsert'],
40
+ ['afterinsert', 'AfterInsert'],
41
+ ['onerror', 'Error'],
42
+ ['onfilter', 'Filter'],
43
+ ['onapplyfilter', 'ApplyFilter'],
44
+ ['onresize', 'Resize'],
45
+ ['onnodata', 'NoData'],
46
+ ['onformat', 'Format'],
47
+ ['onprint', 'Print'],
48
+ ['onpage', 'Page'],
49
+ ['onretreat', 'Retreat'],
50
+ ]);
51
+ /**
52
+ * Closed set of Access event procedure suffixes. Values from form/report
53
+ * event properties above are combined with control-specific events whose
54
+ * property is not necessarily present in an exported layout. VBA matching is
55
+ * case-insensitive; consumers should compare lower-cased names.
56
+ */
57
+ exports.ACCESS_EVENT_NAMES = new Set([
58
+ ...exports.ACCESS_EVENT_PROPERTIES.values(),
59
+ 'Updated',
60
+ 'DropButtonClick',
61
+ 'BeforeDelConfirm',
62
+ 'AfterDelConfirm',
63
+ 'MouseWheel',
64
+ 'BeforeDragOver',
65
+ 'BeforeDropOrPaste',
66
+ 'BeforePrint',
67
+ 'BeforeRender',
68
+ 'AfterRender',
69
+ 'AfterLayout',
70
+ 'AfterFinalRender',
71
+ 'BeforeQuery',
72
+ 'BeforeScreenTip',
73
+ 'CommandBeforeExecute',
74
+ 'CommandChecked',
75
+ 'CommandEnabled',
76
+ 'CommandExecute',
77
+ 'DataChange',
78
+ 'DataSetChange',
79
+ 'OnConnect',
80
+ 'OnDisconnect',
81
+ 'PivotTableChange',
82
+ 'Query',
83
+ 'SelectionChange',
84
+ 'ViewChange',
85
+ ]);
86
+ const ACCESS_EVENT_NAMES_CASE_INSENSITIVE = new Set([...exports.ACCESS_EVENT_NAMES].map((name) => name.toLowerCase()));
87
+ function isAccessEventName(name) {
88
+ return ACCESS_EVENT_NAMES_CASE_INSENSITIVE.has(name.toLowerCase());
89
+ }
90
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/extraction/vba/events.ts"],"names":[],"mappings":";;;AAuFA,8CAEC;AAzFD;;;;;GAKG;AACU,QAAA,uBAAuB,GAAG,IAAI,GAAG,CAAiB;IAC7D,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,YAAY,EAAE,UAAU,CAAC;IAC1B,CAAC,WAAW,EAAE,SAAS,CAAC;IACxB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,YAAY,EAAE,UAAU,CAAC;IAC1B,CAAC,cAAc,EAAE,YAAY,CAAC;IAC9B,CAAC,UAAU,EAAE,QAAQ,CAAC;IACtB,CAAC,aAAa,EAAE,aAAa,CAAC;IAC9B,CAAC,cAAc,EAAE,cAAc,CAAC;IAChC,CAAC,UAAU,EAAE,QAAQ,CAAC;IACtB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,YAAY,EAAE,UAAU,CAAC;IAC1B,CAAC,aAAa,EAAE,WAAW,CAAC;IAC5B,CAAC,aAAa,EAAE,WAAW,CAAC;IAC5B,CAAC,aAAa,EAAE,WAAW,CAAC;IAC5B,CAAC,WAAW,EAAE,SAAS,CAAC;IACxB,CAAC,WAAW,EAAE,SAAS,CAAC;IACxB,CAAC,YAAY,EAAE,UAAU,CAAC;IAC1B,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,aAAa,EAAE,WAAW,CAAC;IAC5B,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,UAAU,EAAE,QAAQ,CAAC;IACtB,CAAC,cAAc,EAAE,cAAc,CAAC;IAChC,CAAC,aAAa,EAAE,aAAa,CAAC;IAC9B,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,UAAU,EAAE,QAAQ,CAAC;IACtB,CAAC,eAAe,EAAE,aAAa,CAAC;IAChC,CAAC,UAAU,EAAE,QAAQ,CAAC;IACtB,CAAC,UAAU,EAAE,QAAQ,CAAC;IACtB,CAAC,UAAU,EAAE,QAAQ,CAAC;IACtB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,WAAW,EAAE,SAAS,CAAC;CACzB,CAAC,CAAC;AAEH;;;;;GAKG;AACU,QAAA,kBAAkB,GAAwB,IAAI,GAAG,CAAC;IAC7D,GAAG,+BAAuB,CAAC,MAAM,EAAE;IACnC,SAAS;IACT,iBAAiB;IACjB,kBAAkB;IAClB,iBAAiB;IACjB,YAAY;IACZ,gBAAgB;IAChB,mBAAmB;IACnB,aAAa;IACb,cAAc;IACd,aAAa;IACb,aAAa;IACb,kBAAkB;IAClB,aAAa;IACb,iBAAiB;IACjB,sBAAsB;IACtB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,YAAY;IACZ,eAAe;IACf,WAAW;IACX,cAAc;IACd,kBAAkB;IAClB,OAAO;IACP,iBAAiB;IACjB,YAAY;CACb,CAAC,CAAC;AAEH,MAAM,mCAAmC,GAAG,IAAI,GAAG,CACjD,CAAC,GAAG,0BAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAC1D,CAAC;AAEF,SAAgB,iBAAiB,CAAC,IAAY;IAC5C,OAAO,mCAAmC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AACrE,CAAC"}
@@ -1,6 +1,22 @@
1
1
  import { VbaExtractorContext, VbaClassifier } from './context';
2
+ import { VbaExtractionRule } from './rules';
3
+ /**
4
+ * Issue #153: the declarative rule table for the implements concern.
5
+ * One rule — `implements` — matching a leading `Implements <Name>`
6
+ * declaration. The body has no inter-line state to track, so the
7
+ * orchestrator walks the table and bumps `this.count` on every
8
+ * non-null emit. Keeps the inline `classifyLine` below honest: any
9
+ * branch not represented in this table is dead code.
10
+ */
11
+ export declare const RULES: readonly VbaExtractionRule<unknown>[];
2
12
  /**
3
13
  * Issue #83: factory for the `Implements` classifier. Stateless per-line.
14
+ *
15
+ * The body walks the declarative `RULES` table — the inline regex
16
+ * match that lived here before #153 is now a single entry in
17
+ * `RULES`. This is the canonical pattern every classifier will
18
+ * converge on as part of the refactor; the legacy "one giant
19
+ * if/else cascade" is gone.
4
20
  */
5
21
  export declare function createImplementsClassifier(): VbaClassifier;
6
22
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"implements.d.ts","sourceRoot":"","sources":["../../../src/extraction/vba/implements.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAK/D;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,aAAa,CA+C1D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAO7E"}
1
+ {"version":3,"file":"implements.d.ts","sourceRoot":"","sources":["../../../src/extraction/vba/implements.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAyB,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAKnE;;;;;;;GAOG;AACH,eAAO,MAAM,KAAK,EAAE,SAAS,iBAAiB,CAAC,OAAO,CAAC,EAyCtD,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,IAAI,aAAa,CAgB1D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAO7E"}
@@ -1,25 +1,29 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RULES = void 0;
3
4
  exports.createImplementsClassifier = createImplementsClassifier;
4
5
  exports.sweepImplements = sweepImplements;
5
6
  const tree_sitter_helpers_1 = require("../tree-sitter-helpers");
7
+ const rules_1 = require("./rules");
6
8
  /** Implements regex. */
7
9
  const IMPLEMENTS_RE = /^\s*Implements\s+(\p{L}[\p{L}\p{N}_]*)/iu;
8
10
  /**
9
- * Issue #83: factory for the `Implements` classifier. Stateless per-line.
11
+ * Issue #153: the declarative rule table for the implements concern.
12
+ * One rule — `implements` — matching a leading `Implements <Name>`
13
+ * declaration. The body has no inter-line state to track, so the
14
+ * orchestrator walks the table and bumps `this.count` on every
15
+ * non-null emit. Keeps the inline `classifyLine` below honest: any
16
+ * branch not represented in this table is dead code.
10
17
  */
11
- function createImplementsClassifier() {
12
- return {
13
- name: 'implements',
14
- count: 0,
15
- classifyLine(line, i, ctx) {
16
- const m = IMPLEMENTS_RE.exec(line);
17
- if (!m)
18
- return;
18
+ exports.RULES = [
19
+ (0, rules_1.defineRule)({
20
+ id: 'implements',
21
+ description: 'Match a leading `Implements <Name>` declaration; emit an `interface` node + a pending `implements` edge.',
22
+ pattern: IMPLEMENTS_RE,
23
+ emit: (m, ctx, line, lineNum) => {
19
24
  const name = m[1] ?? '';
20
25
  if (!name)
21
- return;
22
- const lineNum = i + 1;
26
+ return null;
23
27
  const targetId = (0, tree_sitter_helpers_1.generateNodeId)(ctx.filePath, 'interface', name, lineNum);
24
28
  ctx.nodes.push({
25
29
  id: targetId,
@@ -49,7 +53,34 @@ function createImplementsClassifier() {
49
53
  };
50
54
  ctx.edges.push(edge);
51
55
  ctx.pendingModuleOrClassSource.push(edge);
52
- this.count++;
56
+ return { name };
57
+ },
58
+ }),
59
+ ];
60
+ /**
61
+ * Issue #83: factory for the `Implements` classifier. Stateless per-line.
62
+ *
63
+ * The body walks the declarative `RULES` table — the inline regex
64
+ * match that lived here before #153 is now a single entry in
65
+ * `RULES`. This is the canonical pattern every classifier will
66
+ * converge on as part of the refactor; the legacy "one giant
67
+ * if/else cascade" is gone.
68
+ */
69
+ function createImplementsClassifier() {
70
+ return {
71
+ name: 'implements',
72
+ count: 0,
73
+ classifyLine(line, i, ctx) {
74
+ const lineNum = i + 1;
75
+ for (const rule of exports.RULES) {
76
+ const m = (0, rules_1.matchRule)(rule.pattern, line);
77
+ if (!m)
78
+ continue;
79
+ const result = rule.emit(m, ctx, line, lineNum);
80
+ if (result !== null && result !== undefined) {
81
+ this.count += rule.count ? rule.count(result) : 1;
82
+ }
83
+ }
53
84
  },
54
85
  };
55
86
  }
@@ -1 +1 @@
1
- {"version":3,"file":"implements.js","sourceRoot":"","sources":["../../../src/extraction/vba/implements.ts"],"names":[],"mappings":";;AAeA,gEA+CC;AAMD,0CAOC;AArED,gEAAwD;AAGxD,wBAAwB;AACxB,MAAM,aAAa,GAAG,0CAA0C,CAAC;AAEjE;;GAEG;AACH,SAAgB,0BAA0B;IACxC,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,CAAC;QACR,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG;YACvB,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,CAAC;gBAAE,OAAO;YACf,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI;gBAAE,OAAO;YAClB,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;YACtB,MAAM,QAAQ,GAAG,IAAA,oCAAc,EAC7B,GAAG,CAAC,QAAQ,EACZ,WAAW,EACX,IAAI,EACJ,OAAO,CACR,CAAC;YACF,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBACb,EAAE,EAAE,QAAQ;gBACZ,IAAI,EAAE,WAAW;gBACjB,IAAI;gBACJ,aAAa,EAAE,IAAI;gBACnB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,QAAQ,EAAE,KAAK;gBACf,SAAS,EAAE,OAAO;gBAClB,OAAO,EAAE,OAAO;gBAChB,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,IAAI,CAAC,MAAM;gBACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAC;YACH,MAAM,IAAI,GAAS;gBACjB,MAAM,EAAE,EAAE,EAAE,kDAAkD;gBAC9D,MAAM,EAAE,QAAQ;gBAChB,IAAI,EAAE,YAAY;gBAClB,gEAAgE;gBAChE,wDAAwD;gBACxD,8DAA8D;gBAC9D,0DAA0D;gBAC1D,0BAA0B;gBAC1B,UAAU,EAAE,QAAQ;gBACpB,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,CAAC;aACV,CAAC;YACF,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,GAAG,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,GAAwB,EAAE,GAAW;IACnE,MAAM,GAAG,GAAG,0BAA0B,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"implements.js","sourceRoot":"","sources":["../../../src/extraction/vba/implements.ts"],"names":[],"mappings":";;;AAyEA,gEAgBC;AAMD,0CAOC;AAhGD,gEAAwD;AAExD,mCAAmE;AAEnE,wBAAwB;AACxB,MAAM,aAAa,GAAG,0CAA0C,CAAC;AAEjE;;;;;;;GAOG;AACU,QAAA,KAAK,GAA0C;IAC1D,IAAA,kBAAU,EAAC;QACT,EAAE,EAAE,YAAY;QAChB,WAAW,EACT,0GAA0G;QAC5G,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAA,oCAAc,EAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1E,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBACb,EAAE,EAAE,QAAQ;gBACZ,IAAI,EAAE,WAAW;gBACjB,IAAI;gBACJ,aAAa,EAAE,IAAI;gBACnB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,QAAQ,EAAE,KAAK;gBACf,SAAS,EAAE,OAAO;gBAClB,OAAO,EAAE,OAAO;gBAChB,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,IAAI,CAAC,MAAM;gBACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAC;YACH,MAAM,IAAI,GAAS;gBACjB,MAAM,EAAE,EAAE,EAAE,kDAAkD;gBAC9D,MAAM,EAAE,QAAQ;gBAChB,IAAI,EAAE,YAAY;gBAClB,gEAAgE;gBAChE,wDAAwD;gBACxD,8DAA8D;gBAC9D,0DAA0D;gBAC1D,0BAA0B;gBAC1B,UAAU,EAAE,QAAQ;gBACpB,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,CAAC;aACV,CAAC;YACF,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,GAAG,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;KACF,CAAC;CACH,CAAC;AAEF;;;;;;;;GAQG;AACH,SAAgB,0BAA0B;IACxC,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,CAAC;QACR,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG;YACvB,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;YACtB,KAAK,MAAM,IAAI,IAAI,aAAK,EAAE,CAAC;gBACzB,MAAM,CAAC,GAAG,IAAA,iBAAS,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBACxC,IAAI,CAAC,CAAC;oBAAE,SAAS;gBACjB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;gBAChD,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC5C,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,GAAwB,EAAE,GAAW;IACnE,MAAM,GAAG,GAAG,0BAA0B,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,CAAC;AACnB,CAAC"}
@@ -1,7 +1,27 @@
1
1
  import { VbaExtractorContext, ProcInfo, VbaClassifier } from './context';
2
+ import { VbaExtractionRule } from './rules';
3
+ /**
4
+ * Issue #153: the declarative rule table for the procedures concern.
5
+ * One rule — `procedure` — matches a `Sub` / `Function` /
6
+ * `Property Get|Let|Set` declaration and emits the function node,
7
+ * the `localProcs` / `functionNodeByName` / `functionNodeByStartLine`
8
+ * / `functionReturnTypes` registration, and (for form code-behind)
9
+ * the synthesized `event-handler` edge.
10
+ *
11
+ * The emit body is intentionally not split across multiple rules —
12
+ * these are 5+ small operations that all fire on the same declaration
13
+ * line. Splitting them would force the orchestrator to know they
14
+ * always co-occur, which is more coupling than the original cascade
15
+ * had. The pattern is the discriminating surface; everything past
16
+ * `match` is one emit.
17
+ */
18
+ export declare const RULES: readonly VbaExtractionRule<unknown>[];
2
19
  /**
3
20
  * Issue #83: factory for the procedures classifier. Closure state: none
4
21
  * beyond `count` (the per-concern accumulators live on `ctx`).
22
+ *
23
+ * The body walks the declarative `RULES` table (Issue #153). The
24
+ * inline cascade that used to live here is now one entry in `RULES`.
5
25
  */
6
26
  export declare function createProceduresClassifier(): VbaClassifier;
7
27
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"procedures.d.ts","sourceRoot":"","sources":["../../../src/extraction/vba/procedures.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAmBzE;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,aAAa,CAqN1D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,EAAE,CAOjF"}
1
+ {"version":3,"file":"procedures.d.ts","sourceRoot":"","sources":["../../../src/extraction/vba/procedures.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAyB,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAmBnE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,KAAK,EAAE,SAAS,iBAAiB,CAAC,OAAO,CAAC,EAoNtD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,0BAA0B,IAAI,aAAa,CAgB1D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,EAAE,CAOjF"}
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.RULES = void 0;
36
37
  exports.createProceduresClassifier = createProceduresClassifier;
37
38
  exports.sweepProcedures = sweepProcedures;
38
39
  /**
@@ -45,6 +46,7 @@ const path = __importStar(require("path"));
45
46
  const tree_sitter_helpers_1 = require("../tree-sitter-helpers");
46
47
  const constants_1 = require("./constants");
47
48
  const text_utils_1 = require("./text-utils");
49
+ const rules_1 = require("./rules");
48
50
  /**
49
51
  * Parse a `Function`/`Property Get` declaration's return type — the `As
50
52
  * <Type>` that follows the parameter list (or the name, for a paren-less
@@ -63,23 +65,31 @@ function parseReturnType(line) {
63
65
  return m[1] ?? m[2] ?? null;
64
66
  }
65
67
  /**
66
- * Issue #83: factory for the procedures classifier. Closure state: none
67
- * beyond `count` (the per-concern accumulators live on `ctx`).
68
+ * Issue #153: the declarative rule table for the procedures concern.
69
+ * One rule — `procedure` matches a `Sub` / `Function` /
70
+ * `Property Get|Let|Set` declaration and emits the function node,
71
+ * the `localProcs` / `functionNodeByName` / `functionNodeByStartLine`
72
+ * / `functionReturnTypes` registration, and (for form code-behind)
73
+ * the synthesized `event-handler` edge.
74
+ *
75
+ * The emit body is intentionally not split across multiple rules —
76
+ * these are 5+ small operations that all fire on the same declaration
77
+ * line. Splitting them would force the orchestrator to know they
78
+ * always co-occur, which is more coupling than the original cascade
79
+ * had. The pattern is the discriminating surface; everything past
80
+ * `match` is one emit.
68
81
  */
69
- function createProceduresClassifier() {
70
- return {
71
- name: 'procedures',
72
- count: 0,
73
- classifyLine(line, i, ctx) {
74
- const m = constants_1.PROC_RE.exec(line);
75
- if (!m)
76
- return;
82
+ exports.RULES = [
83
+ (0, rules_1.defineRule)({
84
+ id: 'procedure',
85
+ description: 'Match a `Sub` / `Function` / `Property Get|Let|Set <Name>(...) [As <Type>]` declaration; emit a function node, register the proc in `localProcs` / `functionNodeByName` / `functionNodeByStartLine` / `functionReturnTypes`, and (for `Form_*.cls` / `Report_*.cls`) synthesize a `form-instance-control` stub + `event-handler` edge.',
86
+ pattern: constants_1.PROC_RE,
87
+ emit: (m, ctx, line, lineNum) => {
77
88
  const visibilityRaw = (m[1] ?? '').trim();
78
89
  const kindRaw = (m[2] ?? '').trim().toLowerCase();
79
90
  const name = m[3] ?? '';
80
91
  if (!name)
81
- return;
82
- const lineNum = i + 1;
92
+ return null;
83
93
  // Normalize the visibility. VBA's "Static" keyword is a storage
84
94
  // specifier, not visibility, so we treat bare-static declarations as
85
95
  // 'Public' (the default) per spec R1. "Friend" is not in the Node
@@ -269,7 +279,32 @@ function createProceduresClassifier() {
269
279
  ctx.edges.push(edge);
270
280
  ctx.pendingModuleOrClassSource.push(edge);
271
281
  }
272
- this.count++;
282
+ return { name };
283
+ },
284
+ }),
285
+ ];
286
+ /**
287
+ * Issue #83: factory for the procedures classifier. Closure state: none
288
+ * beyond `count` (the per-concern accumulators live on `ctx`).
289
+ *
290
+ * The body walks the declarative `RULES` table (Issue #153). The
291
+ * inline cascade that used to live here is now one entry in `RULES`.
292
+ */
293
+ function createProceduresClassifier() {
294
+ return {
295
+ name: 'procedures',
296
+ count: 0,
297
+ classifyLine(line, i, ctx) {
298
+ const lineNum = i + 1;
299
+ for (const rule of exports.RULES) {
300
+ const m = (0, rules_1.matchRule)(rule.pattern, line);
301
+ if (!m)
302
+ continue;
303
+ const result = rule.emit(m, ctx, line, lineNum);
304
+ if (result !== null && result !== undefined) {
305
+ this.count += rule.count ? rule.count(result) : 1;
306
+ }
307
+ }
273
308
  },
274
309
  };
275
310
  }
@@ -1 +1 @@
1
- {"version":3,"file":"procedures.js","sourceRoot":"","sources":["../../../src/extraction/vba/procedures.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"procedures.js","sourceRoot":"","sources":["../../../src/extraction/vba/procedures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * VbaExtractionRule — the declarative rule shape every VBA classifier
3
+ * exports as a `RULES: VbaExtractionRule[]` constant. Issue #153.
4
+ *
5
+ * Before this refactor the per-concern sweepers under `src/extraction/vba/`
6
+ * encoded their rules as inline `if (RE.test(line)) { ... }` branches
7
+ * inside `classifyLine`. Each branch was hard to enumerate, impossible
8
+ * to unit-test in isolation, and easy to silently drop when refactoring
9
+ * the body of a sweep. The rule table here promotes the pattern →
10
+ * emit-mapping to a typed object so:
11
+ *
12
+ * 1. Every rule has a stable `id` (used in error messages, logs, and
13
+ * as a stable handle for tools that consume the rule table).
14
+ * 2. The pattern is explicit (single RegExp or RegExp[]) — the
15
+ * dispatcher knows exactly what to test, no "branched control flow
16
+ * around the regex".
17
+ * 3. The emit function is the ONLY side effect for the rule — pure
18
+ * given (match, ctx, line, lineNum) → T | null. That makes the
19
+ * rule trivially testable in isolation.
20
+ * 4. The `count?` hook lets a rule report "N symbols emitted" without
21
+ * sharing an accumulator with the orchestrator (each rule owns
22
+ * its own count semantics).
23
+ *
24
+ * Inter-line state (procedure stack, With stack, SQL variables) STILL
25
+ * lives on `VbaExtractorContext` — the rule table is per-line. The
26
+ * `classifyLine` orchestrator inside each classifier is the "shell"
27
+ * that maintains the state machine and walks the rule table.
28
+ */
29
+ import type { VbaExtractorContext } from './context';
30
+ /**
31
+ * A single per-line rule the orchestrator dispatches.
32
+ *
33
+ * @typeParam T - The shape `emit` returns. Most rules return
34
+ * `void | null` because they push directly onto `ctx.nodes` /
35
+ * `ctx.edges` (the canonical VBA sweep idiom). Rules that
36
+ * synthesize a specific symbol can narrow `T` to the symbol's
37
+ * shape so `count?` and downstream consumers get a typed handle.
38
+ *
39
+ * Fields:
40
+ *
41
+ * - `id` Stable, human-readable identifier (e.g. `'implements'`,
42
+ * `'procedure'`, `'dim'`, `'sql-in-strings'`). The rule
43
+ * table's primary key — every id within one file must be
44
+ * unique. Used in error messages and in the test suite
45
+ * that pins the table's shape.
46
+ * - `description` One-line plain-English summary. Surfaced in tooling
47
+ * that introspects the table.
48
+ * - `pattern` The regex (or regex alternatives) the dispatcher tests
49
+ * against the per-line source. Either a single `RegExp`
50
+ * or a non-empty `RegExp[]` (a rule is matched when ANY
51
+ * of the alternatives matches). The dispatcher runs
52
+ * `.exec()` for single regexes and iterates for arrays.
53
+ * - `requires?` Optional structural gate. `'class'` means the rule
54
+ * only fires inside a `.cls` file; `'module'` only in
55
+ * `.bas`/`.frm`/`.dsr`; `'inside-procedure'` only when
56
+ * `ctx.procStack.length > 0`. The orchestrator is
57
+ * expected to honour this — keeping the gate declarative
58
+ * lets the rule own its own preconditions instead of
59
+ * scattering `if` checks into the rule body.
60
+ * - `scan?` `'masked'` = run on the string-literal-masked line
61
+ * (so call patterns inside `"..."` are ignored), the
62
+ * default. `'unmasked'` = run on the original line (so
63
+ * SQL patterns inside `"..."` are caught). `'both'` =
64
+ * dispatcher calls the rule twice, once with each line.
65
+ * - `emit` The per-match side effect. Receives the
66
+ * `RegExpExecArray` from the pattern, the shared
67
+ * `VbaExtractorContext`, the original (or masked) line,
68
+ * and the 1-based line number. Returns the symbol it
69
+ * emitted (used by `count?`) or `null` when the match
70
+ * didn't apply (the caller is expected to skip
71
+ * `count?` in that case).
72
+ * - `count?` Optional counter. When the rule emits exactly one
73
+ * symbol per successful match the orchestrator can
74
+ * treat `1` as the implicit count; the hook is for
75
+ * rules whose emit can fan out (e.g. a multi-variable
76
+ * `Dim a As Foo, b As Bar` line that produces two
77
+ * `references` edges from one match).
78
+ *
79
+ * The `count` parameter is typed as `unknown` to keep the
80
+ * `VbaExtractionRule<T>` shape covariant in `T` — narrowing `T`
81
+ * (e.g. to `{ edges: number }` for the dim-decl fan-out rule) does
82
+ * NOT then force `count` to take that narrower type, which would
83
+ * break the `VbaExtractionRule<unknown>[]` aggregate. Rule
84
+ * authors cast inside their `count` body.
85
+ */
86
+ export interface VbaExtractionRule<T = unknown> {
87
+ readonly id: string;
88
+ readonly description: string;
89
+ readonly pattern: RegExp | RegExp[];
90
+ readonly requires?: 'class' | 'module' | 'inside-procedure' | string;
91
+ readonly scan?: 'masked' | 'unmasked' | 'both';
92
+ readonly emit: (match: RegExpMatchArray, ctx: VbaExtractorContext, line: string, lineNum: number) => T | null;
93
+ readonly count?: (result: unknown) => number;
94
+ }
95
+ /**
96
+ * Helper to build a `VbaExtractionRule<T>` with a single RegExp.
97
+ * Most rules are 1-line declarations; this collapses the boilerplate
98
+ * to one place.
99
+ */
100
+ export declare function defineRule<T = unknown>(spec: Omit<VbaExtractionRule<T>, 'pattern'> & {
101
+ pattern: RegExp;
102
+ }): VbaExtractionRule<T>;
103
+ /**
104
+ * Helper to build a `VbaExtractionRule<T>` whose `pattern` is an array
105
+ * of alternative regexes. The dispatcher treats the rule as matched
106
+ * when ANY alternative matches; it runs the alternatives in order and
107
+ * uses the first match's `RegExpExecArray` for `emit`.
108
+ */
109
+ export declare function defineRuleAlternatives<T = unknown>(spec: Omit<VbaExtractionRule<T>, 'pattern'> & {
110
+ pattern: RegExp[];
111
+ }): VbaExtractionRule<T>;
112
+ /**
113
+ * Run a single rule's `pattern` against `line` and return the first
114
+ * match's `RegExpMatchArray`, or `null` when no alternative matches.
115
+ * `pattern` is `RegExp | RegExp[]` (an array means "match any of
116
+ * these alternatives"); this helper normalizes both into the same
117
+ * `RegExpMatchArray | null` shape the dispatcher's `emit` expects.
118
+ *
119
+ * Every classifier's `classifyLine` walks the declarative `RULES`
120
+ * table via this helper. Centralizing the RegExp/RegExp[] branching
121
+ * here keeps the per-classifier dispatcher loops trivial and avoids
122
+ * each classifier re-implementing the same boilerplate.
123
+ */
124
+ export declare function matchRule(pattern: RegExp | RegExp[], line: string): RegExpMatchArray | null;
125
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/extraction/vba/rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO;IAC5C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,kBAAkB,GAAG,MAAM,CAAC;IACrE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;IAC/C,QAAQ,CAAC,IAAI,EAAE,CACb,KAAK,EAAE,gBAAgB,EACvB,GAAG,EAAE,mBAAmB,EACxB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,KACZ,CAAC,GAAG,IAAI,CAAC;IACd,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC;CAC9C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,GAAG,OAAO,EACpC,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAChE,iBAAiB,CAAC,CAAC,CAAC,CAEtB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,GAAG,OAAO,EAChD,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAClE,iBAAiB,CAAC,CAAC,CAAC,CAOtB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,IAAI,EAAE,MAAM,GACX,gBAAgB,GAAG,IAAI,CASzB"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineRule = defineRule;
4
+ exports.defineRuleAlternatives = defineRuleAlternatives;
5
+ exports.matchRule = matchRule;
6
+ /**
7
+ * Helper to build a `VbaExtractionRule<T>` with a single RegExp.
8
+ * Most rules are 1-line declarations; this collapses the boilerplate
9
+ * to one place.
10
+ */
11
+ function defineRule(spec) {
12
+ return spec;
13
+ }
14
+ /**
15
+ * Helper to build a `VbaExtractionRule<T>` whose `pattern` is an array
16
+ * of alternative regexes. The dispatcher treats the rule as matched
17
+ * when ANY alternative matches; it runs the alternatives in order and
18
+ * uses the first match's `RegExpExecArray` for `emit`.
19
+ */
20
+ function defineRuleAlternatives(spec) {
21
+ if (spec.pattern.length === 0) {
22
+ throw new Error(`defineRuleAlternatives: rule "${spec.id}" has an empty pattern[]`);
23
+ }
24
+ return spec;
25
+ }
26
+ /**
27
+ * Run a single rule's `pattern` against `line` and return the first
28
+ * match's `RegExpMatchArray`, or `null` when no alternative matches.
29
+ * `pattern` is `RegExp | RegExp[]` (an array means "match any of
30
+ * these alternatives"); this helper normalizes both into the same
31
+ * `RegExpMatchArray | null` shape the dispatcher's `emit` expects.
32
+ *
33
+ * Every classifier's `classifyLine` walks the declarative `RULES`
34
+ * table via this helper. Centralizing the RegExp/RegExp[] branching
35
+ * here keeps the per-classifier dispatcher loops trivial and avoids
36
+ * each classifier re-implementing the same boilerplate.
37
+ */
38
+ function matchRule(pattern, line) {
39
+ if (Array.isArray(pattern)) {
40
+ for (const re of pattern) {
41
+ const m = re.exec(line);
42
+ if (m)
43
+ return m;
44
+ }
45
+ return null;
46
+ }
47
+ return pattern.exec(line);
48
+ }
49
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../src/extraction/vba/rules.ts"],"names":[],"mappings":";;AA0GA,gCAIC;AAQD,wDASC;AAcD,8BAYC;AApDD;;;;GAIG;AACH,SAAgB,UAAU,CACxB,IAAiE;IAEjE,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAgB,sBAAsB,CACpC,IAAmE;IAEnE,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,iCAAiC,IAAI,CAAC,EAAE,0BAA0B,CACnE,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,SAAS,CACvB,OAA0B,EAC1B,IAAY;IAEZ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC"}
@@ -1,9 +1,3 @@
1
- /**
2
- * Pure text helpers shared across the VBA extraction passes. None of these
3
- * touch extractor state — they are deterministic string transforms lifted
4
- * out of `VbaExtractor` verbatim so each pass module can import what it needs
5
- * without pulling in the orchestrator.
6
- */
7
1
  /**
8
2
  * Fold a VBA visibility keyword to the canonical lowercase enum, matching
9
3
  * the procedure convention: `Private` → 'private'; `Public`, `Global`,
@@ -1 +1 @@
1
- {"version":3,"file":"text-utils.d.ts","sourceRoot":"","sources":["../../../src/extraction/vba/text-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA4BtD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,GACX,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAc/C;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BjF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAW/E;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgB1D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,GACX;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAUnD"}
1
+ {"version":3,"file":"text-utils.d.ts","sourceRoot":"","sources":["../../../src/extraction/vba/text-utils.ts"],"names":[],"mappings":"AAQA;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA4BtD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,GACX,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAc/C;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BjF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAW/E;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgB1D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,GACX;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAWnD"}
@@ -1,10 +1,4 @@
1
1
  "use strict";
2
- /**
3
- * Pure text helpers shared across the VBA extraction passes. None of these
4
- * touch extractor state — they are deterministic string transforms lifted
5
- * out of `VbaExtractor` verbatim so each pass module can import what it needs
6
- * without pulling in the orchestrator.
7
- */
8
2
  Object.defineProperty(exports, "__esModule", { value: true });
9
3
  exports.foldVisibility = foldVisibility;
10
4
  exports.maskStringContent = maskStringContent;
@@ -14,6 +8,13 @@ exports.splitOutsideVbaStrings = splitOutsideVbaStrings;
14
8
  exports.detectAssignmentSuffix = detectAssignmentSuffix;
15
9
  exports.unwrapVbaStringLiteral = unwrapVbaStringLiteral;
16
10
  exports.parseEventHandlerName = parseEventHandlerName;
11
+ /**
12
+ * Pure text helpers shared across the VBA extraction passes. None of these
13
+ * touch extractor state — they are deterministic string transforms lifted
14
+ * out of `VbaExtractor` verbatim so each pass module can import what it needs
15
+ * without pulling in the orchestrator.
16
+ */
17
+ const events_1 = require("./events");
17
18
  /**
18
19
  * Fold a VBA visibility keyword to the canonical lowercase enum, matching
19
20
  * the procedure convention: `Private` → 'private'; `Public`, `Global`,
@@ -190,6 +191,8 @@ function parseEventHandlerName(name) {
190
191
  // Form-level events live on the form, not on a control.
191
192
  if (controlName.toLowerCase() === 'form')
192
193
  return null;
194
+ if (!(0, events_1.isAccessEventName)(eventName))
195
+ return null;
193
196
  return { controlName, eventName };
194
197
  }
195
198
  //# sourceMappingURL=text-utils.js.map