@openrewrite/rewrite 8.66.0-SNAPSHOT → 8.66.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/javascript/comparator.d.ts +91 -5
  2. package/dist/javascript/comparator.d.ts.map +1 -1
  3. package/dist/javascript/comparator.js +679 -3091
  4. package/dist/javascript/comparator.js.map +1 -1
  5. package/dist/javascript/format.d.ts.map +1 -1
  6. package/dist/javascript/format.js +4 -3
  7. package/dist/javascript/format.js.map +1 -1
  8. package/dist/javascript/index.d.ts +1 -1
  9. package/dist/javascript/index.d.ts.map +1 -1
  10. package/dist/javascript/index.js +1 -1
  11. package/dist/javascript/index.js.map +1 -1
  12. package/dist/javascript/parser.d.ts.map +1 -1
  13. package/dist/javascript/parser.js +22 -21
  14. package/dist/javascript/parser.js.map +1 -1
  15. package/dist/javascript/print.d.ts +2 -2
  16. package/dist/javascript/print.d.ts.map +1 -1
  17. package/dist/javascript/print.js +4 -4
  18. package/dist/javascript/print.js.map +1 -1
  19. package/dist/javascript/templating/capture.d.ts +226 -0
  20. package/dist/javascript/templating/capture.d.ts.map +1 -0
  21. package/dist/javascript/templating/capture.js +371 -0
  22. package/dist/javascript/templating/capture.js.map +1 -0
  23. package/dist/javascript/templating/comparator.d.ts +61 -0
  24. package/dist/javascript/templating/comparator.d.ts.map +1 -0
  25. package/dist/javascript/templating/comparator.js +393 -0
  26. package/dist/javascript/templating/comparator.js.map +1 -0
  27. package/dist/javascript/templating/engine.d.ts +75 -0
  28. package/dist/javascript/templating/engine.d.ts.map +1 -0
  29. package/dist/javascript/templating/engine.js +228 -0
  30. package/dist/javascript/templating/engine.js.map +1 -0
  31. package/dist/javascript/templating/index.d.ts +6 -0
  32. package/dist/javascript/templating/index.d.ts.map +1 -0
  33. package/dist/javascript/templating/index.js +42 -0
  34. package/dist/javascript/templating/index.js.map +1 -0
  35. package/dist/javascript/templating/pattern.d.ts +171 -0
  36. package/dist/javascript/templating/pattern.d.ts.map +1 -0
  37. package/dist/javascript/templating/pattern.js +681 -0
  38. package/dist/javascript/templating/pattern.js.map +1 -0
  39. package/dist/javascript/templating/placeholder-replacement.d.ts +58 -0
  40. package/dist/javascript/templating/placeholder-replacement.d.ts.map +1 -0
  41. package/dist/javascript/templating/placeholder-replacement.js +365 -0
  42. package/dist/javascript/templating/placeholder-replacement.js.map +1 -0
  43. package/dist/javascript/templating/rewrite.d.ts +39 -0
  44. package/dist/javascript/templating/rewrite.d.ts.map +1 -0
  45. package/dist/javascript/templating/rewrite.js +81 -0
  46. package/dist/javascript/templating/rewrite.js.map +1 -0
  47. package/dist/javascript/templating/template.d.ts +204 -0
  48. package/dist/javascript/templating/template.d.ts.map +1 -0
  49. package/dist/javascript/templating/template.js +293 -0
  50. package/dist/javascript/templating/template.js.map +1 -0
  51. package/dist/javascript/templating/types.d.ts +263 -0
  52. package/dist/javascript/templating/types.d.ts.map +1 -0
  53. package/dist/javascript/templating/types.js +3 -0
  54. package/dist/javascript/templating/types.js.map +1 -0
  55. package/dist/javascript/templating/utils.d.ts +118 -0
  56. package/dist/javascript/templating/utils.d.ts.map +1 -0
  57. package/dist/javascript/templating/utils.js +253 -0
  58. package/dist/javascript/templating/utils.js.map +1 -0
  59. package/dist/test/rewrite-test.d.ts.map +1 -1
  60. package/dist/test/rewrite-test.js +65 -9
  61. package/dist/test/rewrite-test.js.map +1 -1
  62. package/dist/version.txt +1 -1
  63. package/package.json +2 -2
  64. package/src/javascript/comparator.ts +721 -3607
  65. package/src/javascript/format.ts +3 -2
  66. package/src/javascript/index.ts +1 -1
  67. package/src/javascript/parser.ts +23 -22
  68. package/src/javascript/print.ts +6 -6
  69. package/src/javascript/templating/capture.ts +503 -0
  70. package/src/javascript/templating/comparator.ts +430 -0
  71. package/src/javascript/templating/engine.ts +252 -0
  72. package/src/javascript/templating/index.ts +60 -0
  73. package/src/javascript/templating/pattern.ts +727 -0
  74. package/src/javascript/templating/placeholder-replacement.ts +372 -0
  75. package/src/javascript/templating/rewrite.ts +95 -0
  76. package/src/javascript/templating/template.ts +326 -0
  77. package/src/javascript/templating/types.ts +300 -0
  78. package/src/javascript/templating/utils.ts +284 -0
  79. package/src/test/rewrite-test.ts +65 -1
  80. package/dist/javascript/templating.d.ts +0 -265
  81. package/dist/javascript/templating.d.ts.map +0 -1
  82. package/dist/javascript/templating.js +0 -1069
  83. package/dist/javascript/templating.js.map +0 -1
  84. package/src/javascript/templating.ts +0 -1277
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparator.d.ts","sourceRoot":"","sources":["../../../src/javascript/templating/comparator.ts"],"names":[],"mappings":"AAeA,OAAO,EAAC,MAAM,EAAE,IAAI,EAAC,MAAM,OAAO,CAAC;AACnC,OAAO,EAAC,CAAC,EAAC,MAAM,YAAY,CAAC;AAC7B,OAAO,EAAC,EAAE,EAAC,MAAM,UAAU,CAAC;AAC5B,OAAO,EAAC,mCAAmC,EAAC,MAAM,eAAe,CAAC;AAClE,OAAO,EAAmB,mBAAmB,EAAC,MAAM,SAAS,CAAC;AAE9D;;;;GAIG;AACH,qBAAa,yBAA0B,SAAQ,mCAAmC;IAE1E,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE;QACtB,aAAa,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC;QAC9E,qBAAqB,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC;QAC5F,SAAS,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QAClD,YAAY,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,KAAK,IAAI,CAAC;KACnE,EACD,mBAAmB,GAAE,OAAc;IAMvC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAYb,KAAK,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAkBzF,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO;IAK/B,eAAe,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAS3E,qBAAqB,CAAC,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IA2D7F,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IA2B5D,sBAAsB,CAAC,eAAe,EAAE,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IA2B5G;;;OAGG;YACW,cAAc;IAI5B;;;;;;;;;;;OAWG;YACW,aAAa;IAI3B;;;;;;;;;;;OAWG;YACW,sBAAsB;CAiMvC"}
@@ -0,0 +1,393 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.PatternMatchingComparator = void 0;
13
+ /*
14
+ * Copyright 2025 the original author or authors.
15
+ * <p>
16
+ * Licensed under the Moderne Source Available License (the "License");
17
+ * you may not use this file except in compliance with the License.
18
+ * You may obtain a copy of the License at
19
+ * <p>
20
+ * https://docs.moderne.io/licensing/moderne-source-available-license
21
+ * <p>
22
+ * Unless required by applicable law or agreed to in writing, software
23
+ * distributed under the License is distributed on an "AS IS" BASIS,
24
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
25
+ * See the License for the specific language governing permissions and
26
+ * limitations under the License.
27
+ */
28
+ const __1 = require("../..");
29
+ const java_1 = require("../../java");
30
+ const index_1 = require("../index");
31
+ const comparator_1 = require("../comparator");
32
+ const utils_1 = require("./utils");
33
+ /**
34
+ * A comparator for pattern matching that is lenient about optional properties.
35
+ * Allows patterns without type annotations to match actual code with type annotations.
36
+ * Uses semantic comparison to match semantically equivalent code (e.g., isDate() and util.isDate()).
37
+ */
38
+ class PatternMatchingComparator extends comparator_1.JavaScriptSemanticComparatorVisitor {
39
+ constructor(matcher, lenientTypeMatching = true) {
40
+ // Enable lenient type matching based on pattern configuration (default: true for backward compatibility)
41
+ super(lenientTypeMatching);
42
+ this.matcher = matcher;
43
+ }
44
+ /**
45
+ * Extracts the wrapper from the cursor if the parent is a RightPadded.
46
+ */
47
+ getWrapperFromCursor(cursor) {
48
+ if (!cursor.parent) {
49
+ return undefined;
50
+ }
51
+ const parent = cursor.parent.value;
52
+ // Check if parent is a RightPadded by checking its kind
53
+ if (parent.kind === java_1.J.Kind.RightPadded) {
54
+ return parent;
55
+ }
56
+ return undefined;
57
+ }
58
+ visit(j, p, parent) {
59
+ const _super = Object.create(null, {
60
+ visit: { get: () => super.visit }
61
+ });
62
+ return __awaiter(this, void 0, void 0, function* () {
63
+ // Check if the pattern node is a capture - this handles captures anywhere in the tree
64
+ if (utils_1.PlaceholderUtils.isCapture(j)) {
65
+ const wrapper = this.getWrapperFromCursor(this.cursor);
66
+ const success = this.matcher.handleCapture(j, p, wrapper);
67
+ if (!success) {
68
+ return this.abort(j);
69
+ }
70
+ return j;
71
+ }
72
+ if (!this.match) {
73
+ return j;
74
+ }
75
+ return _super.visit.call(this, j, p, parent);
76
+ });
77
+ }
78
+ hasSameKind(j, other) {
79
+ return super.hasSameKind(j, other) ||
80
+ (j.kind == java_1.J.Kind.Identifier && utils_1.PlaceholderUtils.isCapture(j));
81
+ }
82
+ visitIdentifier(identifier, other) {
83
+ const _super = Object.create(null, {
84
+ visitIdentifier: { get: () => super.visitIdentifier }
85
+ });
86
+ return __awaiter(this, void 0, void 0, function* () {
87
+ if (utils_1.PlaceholderUtils.isCapture(identifier)) {
88
+ const wrapper = this.getWrapperFromCursor(this.cursor);
89
+ const success = this.matcher.handleCapture(identifier, other, wrapper);
90
+ return success ? identifier : this.abort(identifier);
91
+ }
92
+ return _super.visitIdentifier.call(this, identifier, other);
93
+ });
94
+ }
95
+ visitMethodInvocation(methodInvocation, other) {
96
+ const _super = Object.create(null, {
97
+ visitMethodInvocation: { get: () => super.visitMethodInvocation }
98
+ });
99
+ return __awaiter(this, void 0, void 0, function* () {
100
+ // Check if any arguments are variadic captures
101
+ const hasVariadicCapture = methodInvocation.arguments.elements.some(arg => utils_1.PlaceholderUtils.isVariadicCapture(arg.element));
102
+ // If no variadic captures, use parent implementation (which includes semantic/type-aware matching)
103
+ if (!hasVariadicCapture) {
104
+ return _super.visitMethodInvocation.call(this, methodInvocation, other);
105
+ }
106
+ // Otherwise, handle variadic captures ourselves
107
+ if (!this.match || other.kind !== java_1.J.Kind.MethodInvocation) {
108
+ return this.abort(methodInvocation);
109
+ }
110
+ const otherMethodInvocation = other;
111
+ // Compare select
112
+ if ((methodInvocation.select === undefined) !== (otherMethodInvocation.select === undefined)) {
113
+ return this.abort(methodInvocation);
114
+ }
115
+ // Visit select if present
116
+ if (methodInvocation.select && otherMethodInvocation.select) {
117
+ yield this.visit(methodInvocation.select.element, otherMethodInvocation.select.element);
118
+ if (!this.match)
119
+ return methodInvocation;
120
+ }
121
+ // Compare typeParameters
122
+ if ((methodInvocation.typeParameters === undefined) !== (otherMethodInvocation.typeParameters === undefined)) {
123
+ return this.abort(methodInvocation);
124
+ }
125
+ // Visit typeParameters if present
126
+ if (methodInvocation.typeParameters && otherMethodInvocation.typeParameters) {
127
+ if (methodInvocation.typeParameters.elements.length !== otherMethodInvocation.typeParameters.elements.length) {
128
+ return this.abort(methodInvocation);
129
+ }
130
+ // Visit each type parameter in lock step
131
+ for (let i = 0; i < methodInvocation.typeParameters.elements.length; i++) {
132
+ yield this.visit(methodInvocation.typeParameters.elements[i].element, otherMethodInvocation.typeParameters.elements[i].element);
133
+ if (!this.match)
134
+ return methodInvocation;
135
+ }
136
+ }
137
+ // Visit name
138
+ yield this.visit(methodInvocation.name, otherMethodInvocation.name);
139
+ if (!this.match)
140
+ return methodInvocation;
141
+ // Special handling for variadic captures in arguments
142
+ if (!(yield this.matchArguments(methodInvocation.arguments.elements, otherMethodInvocation.arguments.elements))) {
143
+ return this.abort(methodInvocation);
144
+ }
145
+ return methodInvocation;
146
+ });
147
+ }
148
+ visitBlock(block, other) {
149
+ const _super = Object.create(null, {
150
+ visitBlock: { get: () => super.visitBlock }
151
+ });
152
+ return __awaiter(this, void 0, void 0, function* () {
153
+ // Check if any statements have CaptureMarker indicating they're variadic
154
+ const hasVariadicCapture = block.statements.some(stmt => {
155
+ const captureMarker = utils_1.PlaceholderUtils.getCaptureMarker(stmt.element);
156
+ return (captureMarker === null || captureMarker === void 0 ? void 0 : captureMarker.variadicOptions) !== undefined;
157
+ });
158
+ // If no variadic captures, use parent implementation
159
+ if (!hasVariadicCapture) {
160
+ return _super.visitBlock.call(this, block, other);
161
+ }
162
+ // Otherwise, handle variadic captures ourselves
163
+ if (!this.match || other.kind !== java_1.J.Kind.Block) {
164
+ return this.abort(block);
165
+ }
166
+ const otherBlock = other;
167
+ // Special handling for variadic captures in statements
168
+ if (!(yield this.matchSequence(block.statements, otherBlock.statements, false))) {
169
+ return this.abort(block);
170
+ }
171
+ return block;
172
+ });
173
+ }
174
+ visitJsCompilationUnit(compilationUnit, other) {
175
+ const _super = Object.create(null, {
176
+ visitJsCompilationUnit: { get: () => super.visitJsCompilationUnit }
177
+ });
178
+ return __awaiter(this, void 0, void 0, function* () {
179
+ // Check if any statements are variadic captures (unwrap ExpressionStatement wrappers first)
180
+ const hasVariadicCapture = compilationUnit.statements.some(stmt => {
181
+ const unwrapped = utils_1.PlaceholderUtils.unwrapStatementCapture(stmt.element);
182
+ return utils_1.PlaceholderUtils.isVariadicCapture(unwrapped);
183
+ });
184
+ // If no variadic captures, use parent implementation
185
+ if (!hasVariadicCapture) {
186
+ return _super.visitJsCompilationUnit.call(this, compilationUnit, other);
187
+ }
188
+ // Otherwise, handle variadic captures ourselves
189
+ if (!this.match || other.kind !== index_1.JS.Kind.CompilationUnit) {
190
+ return this.abort(compilationUnit);
191
+ }
192
+ const otherCompilationUnit = other;
193
+ // Special handling for variadic captures in top-level statements
194
+ if (!(yield this.matchSequence(compilationUnit.statements, otherCompilationUnit.statements, false))) {
195
+ return this.abort(compilationUnit);
196
+ }
197
+ return compilationUnit;
198
+ });
199
+ }
200
+ /**
201
+ * Matches argument lists, with special handling for variadic captures.
202
+ * A variadic capture can match zero or more consecutive arguments.
203
+ */
204
+ matchArguments(patternArgs, targetArgs) {
205
+ return __awaiter(this, void 0, void 0, function* () {
206
+ return this.matchSequence(patternArgs, targetArgs, true);
207
+ });
208
+ }
209
+ /**
210
+ * Generic sequence matching with variadic capture support.
211
+ * Works for any sequence of JRightPadded elements (arguments, statements, etc.).
212
+ * A variadic capture can match zero or more consecutive elements.
213
+ *
214
+ * Uses pivot detection to optimize matching, with backtracking as fallback.
215
+ *
216
+ * @param patternElements The pattern elements (JRightPadded)
217
+ * @param targetElements The target elements to match against (JRightPadded)
218
+ * @param filterEmpty Whether to filter out J.Empty elements when capturing (true for arguments, false for statements)
219
+ * @returns true if the sequence matches, false otherwise
220
+ */
221
+ matchSequence(patternElements, targetElements, filterEmpty) {
222
+ return __awaiter(this, void 0, void 0, function* () {
223
+ return yield this.matchSequenceOptimized(patternElements, targetElements, 0, 0, filterEmpty);
224
+ });
225
+ }
226
+ /**
227
+ * Optimized sequence matcher with pivot detection and backtracking.
228
+ * For variadic patterns, tries to detect pivots (where next pattern matches) to avoid
229
+ * unnecessary backtracking. Falls back to full backtracking when pivots are ambiguous.
230
+ *
231
+ * @param patternElements The pattern elements (JRightPadded)
232
+ * @param targetElements The target elements to match against (JRightPadded)
233
+ * @param patternIdx Current position in pattern
234
+ * @param targetIdx Current position in target
235
+ * @param filterEmpty Whether to filter out J.Empty elements when capturing
236
+ * @returns true if the remaining sequence matches, false otherwise
237
+ */
238
+ matchSequenceOptimized(patternElements, targetElements, patternIdx, targetIdx, filterEmpty) {
239
+ return __awaiter(this, void 0, void 0, function* () {
240
+ var _a, _b;
241
+ // Base case: all patterns matched
242
+ if (patternIdx >= patternElements.length) {
243
+ return targetIdx >= targetElements.length; // Success if all targets consumed
244
+ }
245
+ const patternElement = patternElements[patternIdx].element;
246
+ const captureMarker = utils_1.PlaceholderUtils.getCaptureMarker(patternElement);
247
+ const isVariadic = (captureMarker === null || captureMarker === void 0 ? void 0 : captureMarker.variadicOptions) !== undefined;
248
+ if (isVariadic) {
249
+ // Variadic pattern: try different consumption amounts with backtracking
250
+ const variadicOptions = captureMarker.variadicOptions;
251
+ const min = (_a = variadicOptions === null || variadicOptions === void 0 ? void 0 : variadicOptions.min) !== null && _a !== void 0 ? _a : 0;
252
+ const max = (_b = variadicOptions === null || variadicOptions === void 0 ? void 0 : variadicOptions.max) !== null && _b !== void 0 ? _b : Infinity;
253
+ // Calculate maximum possible consumption
254
+ let nonVariadicRemainingPatterns = 0;
255
+ for (let i = patternIdx + 1; i < patternElements.length; i++) {
256
+ const nextPatternElement = patternElements[i].element;
257
+ const nextCaptureMarker = utils_1.PlaceholderUtils.getCaptureMarker(nextPatternElement);
258
+ const nextIsVariadic = (nextCaptureMarker === null || nextCaptureMarker === void 0 ? void 0 : nextCaptureMarker.variadicOptions) !== undefined;
259
+ if (!nextIsVariadic) {
260
+ nonVariadicRemainingPatterns++;
261
+ }
262
+ }
263
+ const remainingTargetElements = targetElements.length - targetIdx;
264
+ const maxPossible = Math.min(remainingTargetElements - nonVariadicRemainingPatterns, max);
265
+ // Pivot detection optimization: try to find where next pattern matches
266
+ // This avoids unnecessary backtracking when constraints make the split point obvious
267
+ let pivotDetected = false;
268
+ let pivotAt = -1;
269
+ if (patternIdx + 1 < patternElements.length && min <= maxPossible) {
270
+ const nextPattern = patternElements[patternIdx + 1].element;
271
+ // Scan through possible consumption amounts starting from min
272
+ for (let tryConsume = min; tryConsume <= maxPossible; tryConsume++) {
273
+ // Check if element after our consumption would match next pattern
274
+ if (targetIdx + tryConsume < targetElements.length) {
275
+ const candidateElement = targetElements[targetIdx + tryConsume].element;
276
+ // Skip J.Empty for arguments
277
+ if (filterEmpty && candidateElement.kind === java_1.J.Kind.Empty) {
278
+ continue;
279
+ }
280
+ // Test if next pattern matches this element
281
+ const savedMatch = this.match;
282
+ const savedState = this.matcher.saveState();
283
+ yield this.visit(nextPattern, candidateElement);
284
+ const matchesNext = this.match;
285
+ this.match = savedMatch;
286
+ this.matcher.restoreState(savedState);
287
+ if (matchesNext) {
288
+ // Found pivot! Try this consumption amount first
289
+ pivotDetected = true;
290
+ pivotAt = tryConsume;
291
+ break;
292
+ }
293
+ }
294
+ }
295
+ }
296
+ // Try different consumption amounts
297
+ // If pivot detected, try that first; otherwise use greedy approach (max to min)
298
+ const consumptionOrder = [];
299
+ if (pivotDetected && pivotAt >= 0) {
300
+ // Try pivot first, then others as fallback
301
+ consumptionOrder.push(pivotAt);
302
+ for (let c = maxPossible; c >= min; c--) {
303
+ if (c !== pivotAt) {
304
+ consumptionOrder.push(c);
305
+ }
306
+ }
307
+ }
308
+ else {
309
+ // Greedy approach: max to min
310
+ for (let c = maxPossible; c >= min; c--) {
311
+ consumptionOrder.push(c);
312
+ }
313
+ }
314
+ for (const consume of consumptionOrder) {
315
+ // Capture elements for this consumption amount
316
+ const capturedWrappers = [];
317
+ for (let i = 0; i < consume; i++) {
318
+ const wrapped = targetElements[targetIdx + i];
319
+ const element = wrapped.element;
320
+ // For arguments, filter out J.Empty as it represents an empty argument list
321
+ // For statements, include all elements
322
+ if (!filterEmpty || element.kind !== java_1.J.Kind.Empty) {
323
+ capturedWrappers.push(wrapped);
324
+ }
325
+ }
326
+ // Extract just the elements for the constraint check
327
+ const capturedElements = capturedWrappers.map(w => w.element);
328
+ // Re-check min/max constraints against actual captured elements (after filtering if applicable)
329
+ if (capturedElements.length < min || capturedElements.length > max) {
330
+ continue; // Try next consumption amount
331
+ }
332
+ // Save current state for backtracking
333
+ const savedState = this.matcher.saveState();
334
+ // Handle the variadic capture
335
+ const success = this.matcher.handleVariadicCapture(patternElement, capturedElements, capturedWrappers);
336
+ if (!success) {
337
+ // Restore state and try next amount
338
+ this.matcher.restoreState(savedState);
339
+ continue;
340
+ }
341
+ // Try to match the rest of the pattern
342
+ const restMatches = yield this.matchSequenceOptimized(patternElements, targetElements, patternIdx + 1, targetIdx + consume, filterEmpty);
343
+ if (restMatches) {
344
+ return true; // Found a valid matching
345
+ }
346
+ // Backtrack: restore state and try next amount
347
+ this.matcher.restoreState(savedState);
348
+ }
349
+ return false; // No consumption amount worked
350
+ }
351
+ else {
352
+ // Regular non-variadic element - must match exactly one target element
353
+ if (targetIdx >= targetElements.length) {
354
+ return false; // Pattern has more elements than target
355
+ }
356
+ const targetWrapper = targetElements[targetIdx];
357
+ const targetElement = targetWrapper.element;
358
+ // For arguments, J.Empty represents no argument, so regular captures should not match it
359
+ if (filterEmpty && targetElement.kind === java_1.J.Kind.Empty) {
360
+ return false;
361
+ }
362
+ // Save current state for backtracking (both match state and capture bindings)
363
+ const savedMatch = this.match;
364
+ const savedState = this.matcher.saveState();
365
+ // Push wrapper onto cursor so captures can access it
366
+ const savedCursor = this.cursor;
367
+ this.cursor = new __1.Cursor(targetWrapper, this.cursor);
368
+ try {
369
+ yield this.visit(patternElement, targetElement);
370
+ }
371
+ finally {
372
+ this.cursor = savedCursor;
373
+ }
374
+ if (!this.match) {
375
+ // Restore state on match failure
376
+ this.match = savedMatch;
377
+ this.matcher.restoreState(savedState);
378
+ return false;
379
+ }
380
+ // Continue matching the rest
381
+ const restMatches = yield this.matchSequenceOptimized(patternElements, targetElements, patternIdx + 1, targetIdx + 1, filterEmpty);
382
+ if (!restMatches) {
383
+ // Restore full state on backtracking failure
384
+ this.match = savedMatch;
385
+ this.matcher.restoreState(savedState);
386
+ }
387
+ return restMatches;
388
+ }
389
+ });
390
+ }
391
+ }
392
+ exports.PatternMatchingComparator = PatternMatchingComparator;
393
+ //# sourceMappingURL=comparator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparator.js","sourceRoot":"","sources":["../../../src/javascript/templating/comparator.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;;;;;;;;;;;;;GAcG;AACH,6BAAmC;AACnC,qCAA6B;AAC7B,oCAA4B;AAC5B,8CAAkE;AAClE,mCAA8D;AAE9D;;;;GAIG;AACH,MAAa,yBAA0B,SAAQ,gDAAmC;IAC9E,YACqB,OAKhB,EACD,sBAA+B,IAAI;QAEnC,yGAAyG;QACzG,KAAK,CAAC,mBAAmB,CAAC,CAAC;QATV,YAAO,GAAP,OAAO,CAKvB;IAKL,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,MAAc;QACvC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QACnC,wDAAwD;QACxD,IAAK,MAAc,CAAC,IAAI,KAAK,QAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC9C,OAAO,MAA0B,CAAC;QACtC,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAEc,KAAK,CAAc,CAAO,EAAE,CAAI,EAAE,MAAe;;;;;YAC5D,sFAAsF;YACtF,IAAI,wBAAgB,CAAC,SAAS,CAAC,CAAM,CAAC,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAM,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC/D,IAAI,CAAC,OAAO,EAAE,CAAC;oBACX,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAM,CAAC;gBAC9B,CAAC;gBACD,OAAO,CAAM,CAAC;YAClB,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACd,OAAO,CAAM,CAAC;YAClB,CAAC;YAED,OAAO,OAAM,KAAK,YAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE;QACrC,CAAC;KAAA;IAES,WAAW,CAAC,CAAI,EAAE,KAAQ;QAChC,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC;YAC3B,CAAC,CAAC,CAAC,IAAI,IAAI,QAAC,CAAC,IAAI,CAAC,UAAU,IAAI,wBAAgB,CAAC,SAAS,CAAC,CAAiB,CAAC,CAAC,CAAC;IAC1F,CAAC;IAEc,eAAe,CAAC,UAAwB,EAAE,KAAQ;;;;;YAC7D,IAAI,wBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzC,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;gBACvE,OAAO,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,OAAM,eAAe,YAAC,UAAU,EAAE,KAAK,EAAE;QACpD,CAAC;KAAA;IAEc,qBAAqB,CAAC,gBAAoC,EAAE,KAAQ;;;;;YAC/E,+CAA+C;YAC/C,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CACtE,wBAAgB,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAClD,CAAC;YAEF,mGAAmG;YACnG,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACtB,OAAO,OAAM,qBAAqB,YAAC,gBAAgB,EAAE,KAAK,EAAE;YAChE,CAAC;YAED,gDAAgD;YAChD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxD,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACxC,CAAC;YAED,MAAM,qBAAqB,GAAG,KAA2B,CAAC;YAE1D,iBAAiB;YACjB,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,SAAS,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC;gBAC3F,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACxC,CAAC;YAED,0BAA0B;YAC1B,IAAI,gBAAgB,CAAC,MAAM,IAAI,qBAAqB,CAAC,MAAM,EAAE,CAAC;gBAC1D,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,EAAE,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACxF,IAAI,CAAC,IAAI,CAAC,KAAK;oBAAE,OAAO,gBAAgB,CAAC;YAC7C,CAAC;YAED,yBAAyB;YACzB,IAAI,CAAC,gBAAgB,CAAC,cAAc,KAAK,SAAS,CAAC,KAAK,CAAC,qBAAqB,CAAC,cAAc,KAAK,SAAS,CAAC,EAAE,CAAC;gBAC3G,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACxC,CAAC;YAED,kCAAkC;YAClC,IAAI,gBAAgB,CAAC,cAAc,IAAI,qBAAqB,CAAC,cAAc,EAAE,CAAC;gBAC1E,IAAI,gBAAgB,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,KAAK,qBAAqB,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;oBAC3G,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBACxC,CAAC;gBAED,yCAAyC;gBACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACvE,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,qBAAqB,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;oBAChI,IAAI,CAAC,IAAI,CAAC,KAAK;wBAAE,OAAO,gBAAgB,CAAC;gBAC7C,CAAC;YACL,CAAC;YAED,aAAa;YACb,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACpE,IAAI,CAAC,IAAI,CAAC,KAAK;gBAAE,OAAO,gBAAgB,CAAC;YAEzC,sDAAsD;YACtD,IAAI,CAAC,CAAA,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,EAAE,qBAAqB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA,EAAE,CAAC;gBAC5G,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACxC,CAAC;YAED,OAAO,gBAAgB,CAAC;QAC5B,CAAC;KAAA;IAEc,UAAU,CAAC,KAAc,EAAE,KAAQ;;;;;YAC9C,yEAAyE;YACzE,MAAM,kBAAkB,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACpD,MAAM,aAAa,GAAG,wBAAgB,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtE,OAAO,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,eAAe,MAAK,SAAS,CAAC;YACxD,CAAC,CAAC,CAAC;YAEH,qDAAqD;YACrD,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACtB,OAAO,OAAM,UAAU,YAAC,KAAK,EAAE,KAAK,EAAE;YAC1C,CAAC;YAED,gDAAgD;YAChD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;YAED,MAAM,UAAU,GAAG,KAAgB,CAAC;YAEpC,uDAAuD;YACvD,IAAI,CAAC,CAAA,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA,EAAE,CAAC;gBAC5E,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;YAED,OAAO,KAAK,CAAC;QACjB,CAAC;KAAA;IAEc,sBAAsB,CAAC,eAAmC,EAAE,KAAQ;;;;;YAC/E,4FAA4F;YAC5F,MAAM,kBAAkB,GAAG,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC9D,MAAM,SAAS,GAAG,wBAAgB,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxE,OAAO,wBAAgB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC;YAEH,qDAAqD;YACrD,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACtB,OAAO,OAAM,sBAAsB,YAAC,eAAe,EAAE,KAAK,EAAE;YAChE,CAAC;YAED,gDAAgD;YAChD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,UAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACxD,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YACvC,CAAC;YAED,MAAM,oBAAoB,GAAG,KAA2B,CAAC;YAEzD,iEAAiE;YACjE,IAAI,CAAC,CAAA,MAAM,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,UAAU,EAAE,oBAAoB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA,EAAE,CAAC;gBAChG,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YACvC,CAAC;YAED,OAAO,eAAe,CAAC;QAC3B,CAAC;KAAA;IAED;;;OAGG;IACW,cAAc,CAAC,WAA+B,EAAE,UAA8B;;YACxF,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAC7D,CAAC;KAAA;IAED;;;;;;;;;;;OAWG;IACW,aAAa,CAAC,eAAmC,EAAE,cAAkC,EAAE,WAAoB;;YACrH,OAAO,MAAM,IAAI,CAAC,sBAAsB,CAAC,eAAe,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;QACjG,CAAC;KAAA;IAED;;;;;;;;;;;OAWG;IACW,sBAAsB,CAChC,eAAmC,EACnC,cAAkC,EAClC,UAAkB,EAClB,SAAiB,EACjB,WAAoB;;;YAEpB,kCAAkC;YAClC,IAAI,UAAU,IAAI,eAAe,CAAC,MAAM,EAAE,CAAC;gBACvC,OAAO,SAAS,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC,kCAAkC;YACjF,CAAC;YAED,MAAM,cAAc,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC;YAC3D,MAAM,aAAa,GAAG,wBAAgB,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;YACxE,MAAM,UAAU,GAAG,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,eAAe,MAAK,SAAS,CAAC;YAEhE,IAAI,UAAU,EAAE,CAAC;gBACb,wEAAwE;gBACxE,MAAM,eAAe,GAAG,aAAc,CAAC,eAAe,CAAC;gBACvD,MAAM,GAAG,GAAG,MAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,GAAG,mCAAI,CAAC,CAAC;gBACtC,MAAM,GAAG,GAAG,MAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,GAAG,mCAAI,QAAQ,CAAC;gBAE7C,yCAAyC;gBACzC,IAAI,4BAA4B,GAAG,CAAC,CAAC;gBACrC,KAAK,IAAI,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3D,MAAM,kBAAkB,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;oBACtD,MAAM,iBAAiB,GAAG,wBAAgB,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;oBAChF,MAAM,cAAc,GAAG,CAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,eAAe,MAAK,SAAS,CAAC;oBACxE,IAAI,CAAC,cAAc,EAAE,CAAC;wBAClB,4BAA4B,EAAE,CAAC;oBACnC,CAAC;gBACL,CAAC;gBACD,MAAM,uBAAuB,GAAG,cAAc,CAAC,MAAM,GAAG,SAAS,CAAC;gBAClE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,uBAAuB,GAAG,4BAA4B,EAAE,GAAG,CAAC,CAAC;gBAE1F,uEAAuE;gBACvE,qFAAqF;gBACrF,IAAI,aAAa,GAAG,KAAK,CAAC;gBAC1B,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;gBAEjB,IAAI,UAAU,GAAG,CAAC,GAAG,eAAe,CAAC,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;oBAChE,MAAM,WAAW,GAAG,eAAe,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;oBAE5D,8DAA8D;oBAC9D,KAAK,IAAI,UAAU,GAAG,GAAG,EAAE,UAAU,IAAI,WAAW,EAAE,UAAU,EAAE,EAAE,CAAC;wBACjE,kEAAkE;wBAClE,IAAI,SAAS,GAAG,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC;4BACjD,MAAM,gBAAgB,GAAG,cAAc,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,OAAO,CAAC;4BAExE,6BAA6B;4BAC7B,IAAI,WAAW,IAAI,gBAAgB,CAAC,IAAI,KAAK,QAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gCACxD,SAAS;4BACb,CAAC;4BAED,4CAA4C;4BAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;4BAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;4BAE5C,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;4BAChD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;4BAE/B,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;4BACxB,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;4BAEtC,IAAI,WAAW,EAAE,CAAC;gCACd,iDAAiD;gCACjD,aAAa,GAAG,IAAI,CAAC;gCACrB,OAAO,GAAG,UAAU,CAAC;gCACrB,MAAM;4BACV,CAAC;wBACL,CAAC;oBACL,CAAC;gBACL,CAAC;gBAED,oCAAoC;gBACpC,gFAAgF;gBAChF,MAAM,gBAAgB,GAAa,EAAE,CAAC;gBACtC,IAAI,aAAa,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;oBAChC,2CAA2C;oBAC3C,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC/B,KAAK,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;wBACtC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;4BAChB,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAC7B,CAAC;oBACL,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,8BAA8B;oBAC9B,KAAK,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;wBACtC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAC7B,CAAC;gBACL,CAAC;gBAED,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;oBACrC,+CAA+C;oBAC/C,MAAM,gBAAgB,GAAuB,EAAE,CAAC;oBAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC/B,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;wBAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;wBAChC,4EAA4E;wBAC5E,uCAAuC;wBACvC,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,IAAI,KAAK,QAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;4BAChD,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBACnC,CAAC;oBACL,CAAC;oBAED,qDAAqD;oBACrD,MAAM,gBAAgB,GAAQ,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;oBAEnE,gGAAgG;oBAChG,IAAI,gBAAgB,CAAC,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;wBACjE,SAAS,CAAC,8BAA8B;oBAC5C,CAAC;oBAED,sCAAsC;oBACtC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;oBAE5C,8BAA8B;oBAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;oBACvG,IAAI,CAAC,OAAO,EAAE,CAAC;wBACX,oCAAoC;wBACpC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;wBACtC,SAAS;oBACb,CAAC;oBAED,uCAAuC;oBACvC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,sBAAsB,CACjD,eAAe,EACf,cAAc,EACd,UAAU,GAAG,CAAC,EACd,SAAS,GAAG,OAAO,EACnB,WAAW,CACd,CAAC;oBAEF,IAAI,WAAW,EAAE,CAAC;wBACd,OAAO,IAAI,CAAC,CAAC,yBAAyB;oBAC1C,CAAC;oBAED,+CAA+C;oBAC/C,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;gBAC1C,CAAC;gBAED,OAAO,KAAK,CAAC,CAAC,+BAA+B;YACjD,CAAC;iBAAM,CAAC;gBACJ,uEAAuE;gBACvE,IAAI,SAAS,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;oBACrC,OAAO,KAAK,CAAC,CAAC,wCAAwC;gBAC1D,CAAC;gBAED,MAAM,aAAa,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;gBAChD,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC;gBAE5C,yFAAyF;gBACzF,IAAI,WAAW,IAAI,aAAa,CAAC,IAAI,KAAK,QAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACrD,OAAO,KAAK,CAAC;gBACjB,CAAC;gBAED,8EAA8E;gBAC9E,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;gBAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBAE5C,qDAAqD;gBACrD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;gBAChC,IAAI,CAAC,MAAM,GAAG,IAAI,UAAM,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrD,IAAI,CAAC;oBACD,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;gBACpD,CAAC;wBAAS,CAAC;oBACP,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;gBAC9B,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACd,iCAAiC;oBACjC,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;oBACxB,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;oBACtC,OAAO,KAAK,CAAC;gBACjB,CAAC;gBAED,6BAA6B;gBAC7B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,sBAAsB,CACjD,eAAe,EACf,cAAc,EACd,UAAU,GAAG,CAAC,EACd,SAAS,GAAG,CAAC,EACb,WAAW,CACd,CAAC;gBAEF,IAAI,CAAC,WAAW,EAAE,CAAC;oBACf,6CAA6C;oBAC7C,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;oBACxB,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;gBAC1C,CAAC;gBAED,OAAO,WAAW,CAAC;YACvB,CAAC;QACL,CAAC;KAAA;CACJ;AAnZD,8DAmZC"}
@@ -0,0 +1,75 @@
1
+ import { Cursor } from '../..';
2
+ import { J } from '../../java';
3
+ import { JavaCoordinates } from './template';
4
+ /**
5
+ * Parameter specification for template generation.
6
+ * Represents a placeholder in a template that will be replaced with a parameter value.
7
+ */
8
+ export interface Parameter {
9
+ /**
10
+ * The value to substitute into the template.
11
+ */
12
+ value: any;
13
+ }
14
+ /**
15
+ * Internal template engine - handles the core templating logic.
16
+ * Not exported from index, so only visible within the templating module.
17
+ */
18
+ export declare class TemplateEngine {
19
+ /**
20
+ * Applies a template with optional match results from pattern matching.
21
+ *
22
+ * @param templateParts The string parts of the template
23
+ * @param parameters The parameters between the string parts
24
+ * @param cursor The cursor pointing to the current location in the AST
25
+ * @param coordinates The coordinates specifying where and how to insert the generated AST
26
+ * @param values Map of capture names to values to replace the parameters with
27
+ * @param wrappersMap Map of capture names to J.RightPadded wrappers (for preserving markers)
28
+ * @param contextStatements Context declarations (imports, types, etc.) to prepend for type attribution
29
+ * @param dependencies NPM dependencies for type attribution
30
+ * @returns A Promise resolving to the generated AST node
31
+ */
32
+ static applyTemplate(templateParts: TemplateStringsArray, parameters: Parameter[], cursor: Cursor, coordinates: JavaCoordinates, values?: Pick<Map<string, J>, 'get'>, wrappersMap?: Pick<Map<string, J.RightPadded<J> | J.RightPadded<J>[]>, 'get'>, contextStatements?: string[], dependencies?: Record<string, string>): Promise<J | undefined>;
33
+ /**
34
+ * Builds a template string with parameter placeholders.
35
+ *
36
+ * @param templateParts The string parts of the template
37
+ * @param parameters The parameters between the string parts
38
+ * @returns The template string
39
+ */
40
+ private static buildTemplateString;
41
+ }
42
+ /**
43
+ * Helper class for applying a template to an AST.
44
+ */
45
+ export declare class TemplateApplier {
46
+ private readonly cursor;
47
+ private readonly coordinates;
48
+ private readonly ast;
49
+ constructor(cursor: Cursor, coordinates: JavaCoordinates, ast: J);
50
+ /**
51
+ * Applies the template to the current AST.
52
+ *
53
+ * @returns A Promise resolving to the modified AST
54
+ */
55
+ apply(): Promise<J | undefined>;
56
+ /**
57
+ * Applies the template to an expression.
58
+ *
59
+ * @returns A Promise resolving to the modified AST
60
+ */
61
+ private applyToExpression;
62
+ /**
63
+ * Applies the template to a statement.
64
+ *
65
+ * @returns A Promise resolving to the modified AST
66
+ */
67
+ private applyToStatement;
68
+ /**
69
+ * Applies the template to a block.
70
+ *
71
+ * @returns A Promise resolving to the modified AST
72
+ */
73
+ private applyToBlock;
74
+ }
75
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/javascript/templating/engine.ts"],"names":[],"mappings":"AAeA,OAAO,EAAC,MAAM,EAAS,MAAM,OAAO,CAAC;AACrC,OAAO,EAAC,CAAC,EAAC,MAAM,YAAY,CAAC;AAM7B,OAAO,EAAC,eAAe,EAAC,MAAM,YAAY,CAAC;AAO3C;;;GAGG;AACH,MAAM,WAAW,SAAS;IACtB;;OAEG;IACH,KAAK,EAAE,GAAG,CAAC;CACd;AAED;;;GAGG;AACH,qBAAa,cAAc;IACvB;;;;;;;;;;;;OAYG;WACU,aAAa,CACtB,aAAa,EAAE,oBAAoB,EACnC,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,eAAe,EAC5B,MAAM,GAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,CAAa,EAC/C,WAAW,GAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAa,EACxF,iBAAiB,GAAE,MAAM,EAAO,EAChC,YAAY,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAC1C,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAoEzB;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;CAkCrC;AAED;;GAEG;AACH,qBAAa,eAAe;IAEpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAFH,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,eAAe,EAC5B,GAAG,EAAE,CAAC;IAI3B;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAgBrC;;;;OAIG;YACW,iBAAiB;IAS/B;;;;OAIG;YACW,gBAAgB;IAS9B;;;;OAIG;YACW,YAAY;CAQ7B"}