parseman 0.42.1 → 0.44.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 (68) hide show
  1. package/dist/combinators/attempt.d.ts.map +1 -1
  2. package/dist/combinators/choice.d.ts.map +1 -1
  3. package/dist/combinators/grammar.d.ts +7 -0
  4. package/dist/combinators/grammar.d.ts.map +1 -1
  5. package/dist/combinators/map.d.ts +11 -0
  6. package/dist/combinators/map.d.ts.map +1 -1
  7. package/dist/combinators/node.d.ts +21 -7
  8. package/dist/combinators/node.d.ts.map +1 -1
  9. package/dist/combinators/parser.d.ts +17 -2
  10. package/dist/combinators/parser.d.ts.map +1 -1
  11. package/dist/combinators/token.d.ts +3 -2
  12. package/dist/combinators/token.d.ts.map +1 -1
  13. package/dist/combinators/trivia-skip.d.ts +1 -0
  14. package/dist/combinators/trivia-skip.d.ts.map +1 -1
  15. package/dist/compiler/codegen.d.ts +4 -0
  16. package/dist/compiler/codegen.d.ts.map +1 -1
  17. package/dist/compiler/ir-serialize.d.ts.map +1 -1
  18. package/dist/compiler/linker.d.ts +6 -1
  19. package/dist/compiler/linker.d.ts.map +1 -1
  20. package/dist/compiler/scannable-run.d.ts +1 -1
  21. package/dist/compiler/scannable-run.d.ts.map +1 -1
  22. package/dist/compiler/trivia-fast-path.d.ts +4 -3
  23. package/dist/compiler/trivia-fast-path.d.ts.map +1 -1
  24. package/dist/cst/reflection.d.ts +24 -0
  25. package/dist/cst/reflection.d.ts.map +1 -0
  26. package/dist/cst/trivia-entries.d.ts +15 -9
  27. package/dist/cst/trivia-entries.d.ts.map +1 -1
  28. package/dist/cst/trivia-kinds.d.ts +15 -11
  29. package/dist/cst/trivia-kinds.d.ts.map +1 -1
  30. package/dist/cst/types.d.ts +2 -0
  31. package/dist/cst/types.d.ts.map +1 -1
  32. package/dist/cst/walk.d.ts +27 -62
  33. package/dist/cst/walk.d.ts.map +1 -1
  34. package/dist/functional/run.d.ts +22 -16
  35. package/dist/functional/run.d.ts.map +1 -1
  36. package/dist/index.cjs +1651 -1207
  37. package/dist/index.cjs.map +4 -4
  38. package/dist/index.d.ts +6 -5
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +1651 -1207
  41. package/dist/index.js.map +4 -4
  42. package/dist/language-service/index.cjs +186 -135
  43. package/dist/language-service/index.cjs.map +4 -4
  44. package/dist/language-service/index.d.ts +1 -1
  45. package/dist/language-service/index.d.ts.map +1 -1
  46. package/dist/language-service/index.js +186 -135
  47. package/dist/language-service/index.js.map +4 -4
  48. package/dist/plugin/evaluator.d.ts +1 -0
  49. package/dist/plugin/evaluator.d.ts.map +1 -1
  50. package/dist/plugin/index.cjs +1525 -1048
  51. package/dist/plugin/index.cjs.map +4 -4
  52. package/dist/plugin/index.d.ts.map +1 -1
  53. package/dist/plugin/index.js +1525 -1048
  54. package/dist/plugin/index.js.map +4 -4
  55. package/dist/run/index.cjs +152 -102
  56. package/dist/run/index.cjs.map +3 -3
  57. package/dist/run/index.d.ts +1 -1
  58. package/dist/run/index.d.ts.map +1 -1
  59. package/dist/run/index.js +152 -102
  60. package/dist/run/index.js.map +3 -3
  61. package/dist/spec/index.cjs +1381 -1152
  62. package/dist/spec/index.cjs.map +4 -4
  63. package/dist/spec/index.js +1381 -1152
  64. package/dist/spec/index.js.map +4 -4
  65. package/dist/types.d.ts +27 -1
  66. package/dist/types.d.ts.map +1 -1
  67. package/dist/version.d.ts +1 -1
  68. package/package.json +1 -1
@@ -16,7 +16,7 @@
16
16
  * consumer's config, never in the grammar.
17
17
  */
18
18
  import type { Combinator, ParseContext, ParseResult, Span, ParseError } from '../types.ts';
19
- import { type Walkable } from '../cst/walk.ts';
19
+ import type { Walkable } from '../cst/walk.ts';
20
20
  import { type Registry } from '../functional/doc.ts';
21
21
  import type { NodeLike } from '../cst/types.ts';
22
22
  export type Severity = 'error' | 'warning' | 'info';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/language-service/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/language-service/index.ts"],"names":[],"mappings":"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"}
@@ -76,6 +76,7 @@ function probeAt(sentinel, input, pos, ctx) {
76
76
  _cstRawChildren: ctx._cstRawChildren,
77
77
  _cstTriviaLog: ctx._cstTriviaLog,
78
78
  _triviaLog: ctx._triviaLog,
79
+ _rootTriviaLog: ctx._rootTriviaLog,
79
80
  _fields: ctx._fields,
80
81
  _cstBuf: ctx._cstBuf,
81
82
  _tolerant: ctx._tolerant,
@@ -88,6 +89,7 @@ function probeAt(sentinel, input, pos, ctx) {
88
89
  ctx._cstRawChildren = void 0;
89
90
  ctx._cstTriviaLog = void 0;
90
91
  ctx._triviaLog = void 0;
92
+ ctx._rootTriviaLog = void 0;
91
93
  ctx._fields = void 0;
92
94
  ctx._cstBuf = void 0;
93
95
  ctx._tolerant = void 0;
@@ -102,6 +104,7 @@ function probeAt(sentinel, input, pos, ctx) {
102
104
  ctx._cstRawChildren = s._cstRawChildren;
103
105
  ctx._cstTriviaLog = s._cstTriviaLog;
104
106
  ctx._triviaLog = s._triviaLog;
107
+ ctx._rootTriviaLog = s._rootTriviaLog;
105
108
  ctx._fields = s._fields;
106
109
  ctx._cstBuf = s._cstBuf;
107
110
  ctx._tolerant = s._tolerant;
@@ -159,105 +162,97 @@ var REC = { scan: recoverScan, at: matchesAt, or: orSentinel, sentinel: firstSet
159
162
  // src/cst/trivia-entries.ts
160
163
  var EMPTY_INDICES = Object.freeze([]);
161
164
  var EMPTY_GAPS = Object.freeze([]);
162
- function entryOffset(i, stride) {
163
- return i * stride;
164
- }
165
- function triviaEntries(log, labels, opts) {
166
- const baseStride = opts?.nodeLog ? 3 : 2;
167
- const stride = labels ? baseStride + 1 : baseStride;
168
- const length = Math.floor(log.length / stride);
169
- return {
165
+ var SELECTED_ROOT_STRIDE = 5;
166
+ function buildRootTriviaIndex(log, labels) {
167
+ const length = Math.floor(log.length / SELECTED_ROOT_STRIDE);
168
+ const markerOffset = (i) => i * SELECTED_ROOT_STRIDE;
169
+ const ownedRangeStart = (i) => log[markerOffset(i)];
170
+ const ownedRangeEnd = (i) => log[markerOffset(i) + 1];
171
+ const markerStart = (i) => log[markerOffset(i) + 2];
172
+ const markerEnd = (i) => log[markerOffset(i) + 3];
173
+ const markerKind = (i) => log[markerOffset(i) + 4];
174
+ const entries = {
170
175
  length,
171
176
  labels,
172
- stride,
173
- start(i) {
174
- return log[entryOffset(i, stride)];
175
- },
176
- end(i) {
177
- return log[entryOffset(i, stride) + 1];
178
- },
179
- insertIndex(i) {
180
- return opts?.nodeLog ? log[entryOffset(i, stride) + 2] : void 0;
181
- },
182
- kindIndex(i) {
183
- if (!labels) return void 0;
184
- return log[entryOffset(i, stride) + baseStride];
185
- },
177
+ stride: SELECTED_ROOT_STRIDE,
178
+ start: markerStart,
179
+ end: markerEnd,
180
+ insertIndex: () => void 0,
181
+ kindIndex: markerKind,
186
182
  kind(i) {
187
- const ki = labels ? log[entryOffset(i, stride) + baseStride] : void 0;
188
- return ki !== void 0 ? labels[ki] : void 0;
183
+ return labels[markerKind(i)];
189
184
  },
190
185
  text(i, input) {
191
- const s = log[entryOffset(i, stride)];
192
- const e = log[entryOffset(i, stride) + 1];
193
- return input.slice(s, e);
186
+ return input.slice(markerStart(i), markerEnd(i));
194
187
  }
195
188
  };
196
- }
197
- function appendEntryRange(map, key, first, last) {
198
- let indices = map.get(key);
199
- if (!indices) {
200
- indices = [];
201
- map.set(key, indices);
202
- }
203
- for (let i = first; i <= last; i++) indices.push(i);
204
- }
205
- function buildGap(entries, start, end, first, last) {
206
- const entryIndices = [];
207
- for (let i = first; i <= last; i++) entryIndices.push(i);
208
- return {
209
- start,
210
- end,
211
- entryIndices,
212
- hasKind(kind) {
213
- for (const i of entryIndices) {
214
- if (entries.kind(i) === kind) return true;
215
- }
216
- return false;
217
- },
218
- text(input) {
219
- return input.slice(start, end);
189
+ const lowerBound = (offset, by) => {
190
+ let lo = 0;
191
+ let hi = length;
192
+ while (lo < hi) {
193
+ const mid = lo + hi >>> 1;
194
+ if (by(mid) < offset) lo = mid + 1;
195
+ else hi = mid;
220
196
  }
197
+ return lo;
221
198
  };
222
- }
223
- function buildRootMaps(entries) {
224
- const before = /* @__PURE__ */ new Map();
225
- const after = /* @__PURE__ */ new Map();
226
- const beforeGaps = /* @__PURE__ */ new Map();
227
- const afterGaps = /* @__PURE__ */ new Map();
228
- const gaps = [];
229
- if (entries.length === 0) return { before, after, beforeGaps, afterGaps, gaps };
230
- const appendGap = (first2, last, start2, end2) => {
231
- const gap = buildGap(entries, start2, end2, first2, last);
232
- gaps.push(gap);
233
- afterGaps.set(start2, gap);
234
- beforeGaps.set(end2, gap);
235
- appendEntryRange(after, start2, first2, last);
236
- appendEntryRange(before, end2, first2, last);
199
+ const gapRowsAt = (offset, direction) => {
200
+ const edge = direction === "before" ? ownedRangeEnd : ownedRangeStart;
201
+ let first = lowerBound(offset, edge);
202
+ if (first === length || edge(first) !== offset) return void 0;
203
+ const start = ownedRangeStart(first);
204
+ const end = ownedRangeEnd(first);
205
+ while (first > 0 && ownedRangeStart(first - 1) === start && ownedRangeEnd(first - 1) === end) first--;
206
+ let last = first + 1;
207
+ while (last < length && ownedRangeStart(last) === start && ownedRangeEnd(last) === end) last++;
208
+ return [first, last];
209
+ };
210
+ const indices = (first, last) => {
211
+ const out = [];
212
+ for (let i = first; i < last; i++) out.push(i);
213
+ return out;
214
+ };
215
+ const makeGap = (first, last) => {
216
+ const start = ownedRangeStart(first);
217
+ const end = ownedRangeEnd(first);
218
+ let entryIndices;
219
+ return {
220
+ start,
221
+ end,
222
+ get entryIndices() {
223
+ return entryIndices ??= indices(first, last);
224
+ },
225
+ hasKind(kind) {
226
+ for (let i = first; i < last; i++) {
227
+ if (labels[markerKind(i)] === kind) return true;
228
+ }
229
+ return false;
230
+ },
231
+ text(input) {
232
+ return input.slice(start, end);
233
+ }
234
+ };
237
235
  };
238
- let first = 0;
239
- let start = entries.start(0);
240
- let end = entries.end(0);
241
- for (let i = 1; i < entries.length; i++) {
242
- const nextStart = entries.start(i);
243
- const nextEnd = entries.end(i);
244
- if (nextStart === end) {
245
- end = nextEnd;
246
- continue;
247
- }
248
- appendGap(first, i - 1, start, end);
249
- first = i;
250
- start = nextStart;
251
- end = nextEnd;
252
- }
253
- appendGap(first, entries.length - 1, start, end);
254
- return { before, after, beforeGaps, afterGaps, gaps };
255
- }
256
- function buildRootTriviaIndex(log, labels) {
257
- const entries = triviaEntries(log, labels);
258
236
  let maps;
259
237
  const getMaps = () => {
260
- maps ??= buildRootMaps(entries);
238
+ if (maps !== void 0) return maps;
239
+ const before = /* @__PURE__ */ new Map();
240
+ const after = /* @__PURE__ */ new Map();
241
+ const beforeGaps = /* @__PURE__ */ new Map();
242
+ const afterGaps = /* @__PURE__ */ new Map();
243
+ const gaps = [];
244
+ for (let first = 0; first < length; ) {
245
+ let last = first + 1;
246
+ while (last < length && ownedRangeStart(last) === ownedRangeStart(first) && ownedRangeEnd(last) === ownedRangeEnd(first)) last++;
247
+ const gap = makeGap(first, last);
248
+ gaps.push(gap);
249
+ afterGaps.set(gap.start, gap);
250
+ beforeGaps.set(gap.end, gap);
251
+ after.set(gap.start, [...gap.entryIndices]);
252
+ before.set(gap.end, [...gap.entryIndices]);
253
+ first = last;
254
+ }
255
+ maps = { before, after, beforeGaps, afterGaps, gaps };
261
256
  return maps;
262
257
  };
263
258
  return {
@@ -270,16 +265,20 @@ function buildRootTriviaIndex(log, labels) {
270
265
  return getMaps().after;
271
266
  },
272
267
  entryIndicesBefore(offset) {
273
- return getMaps().before.get(offset) ?? EMPTY_INDICES;
268
+ const rows = gapRowsAt(offset, "before");
269
+ return rows ? indices(rows[0], rows[1]) : EMPTY_INDICES;
274
270
  },
275
271
  entryIndicesAfter(offset) {
276
- return getMaps().after.get(offset) ?? EMPTY_INDICES;
272
+ const rows = gapRowsAt(offset, "after");
273
+ return rows ? indices(rows[0], rows[1]) : EMPTY_INDICES;
277
274
  },
278
275
  gapBefore(offset) {
279
- return getMaps().beforeGaps.get(offset);
276
+ const rows = gapRowsAt(offset, "before");
277
+ return rows ? makeGap(rows[0], rows[1]) : void 0;
280
278
  },
281
279
  gapAfter(offset) {
282
- return getMaps().afterGaps.get(offset);
280
+ const rows = gapRowsAt(offset, "after");
281
+ return rows ? makeGap(rows[0], rows[1]) : void 0;
283
282
  },
284
283
  gaps() {
285
284
  return getMaps().gaps;
@@ -287,13 +286,21 @@ function buildRootTriviaIndex(log, labels) {
287
286
  gapsWithKind(kind) {
288
287
  const kinds = typeof kind === "string" ? [kind] : kind;
289
288
  const matches2 = [];
290
- for (const gap of getMaps().gaps) {
291
- for (const k of kinds) {
292
- if (gap.hasKind(k)) {
293
- matches2.push(gap);
294
- break;
289
+ for (let first = 0; first < length; ) {
290
+ let last = first + 1;
291
+ while (last < length && ownedRangeStart(last) === ownedRangeStart(first) && ownedRangeEnd(last) === ownedRangeEnd(first)) last++;
292
+ let matched = false;
293
+ for (let i = first; i < last && !matched; i++) {
294
+ const label2 = labels[markerKind(i)];
295
+ for (const kind2 of kinds) {
296
+ if (label2 === kind2) {
297
+ matched = true;
298
+ break;
299
+ }
295
300
  }
296
301
  }
302
+ if (matched) matches2.push(makeGap(first, last));
303
+ first = last;
297
304
  }
298
305
  return matches2.length === 0 ? EMPTY_GAPS : matches2;
299
306
  }
@@ -323,7 +330,20 @@ function triviaKindLabelsFromRunnable(r) {
323
330
  if (!r) return void 0;
324
331
  if (typeof r === "function") return r._meta?.triviaKindLabels;
325
332
  const grammarTrivia = r._meta.grammarTrivia;
326
- return r._meta.triviaKindLabels ?? grammarTrivia?._meta.triviaKindLabels ?? (r._def.tag === "grammar" ? r._def.triviaParser?._meta.triviaKindLabels : void 0);
333
+ return grammarTrivia?._meta.triviaKindLabels ?? r._meta.triviaKindLabels ?? (r._def.tag === "grammar" ? r._def.triviaParser?._meta.triviaKindLabels : void 0);
334
+ }
335
+ function rootTriviaClassifiedFromRunnable(r) {
336
+ if (!r) return false;
337
+ if (typeof r === "function") return r._meta?.rootTriviaClassified === true;
338
+ const grammarTrivia = r._meta.grammarTrivia;
339
+ return grammarTrivia?._meta.rootTriviaClassified === true || r._meta.rootTriviaClassified === true;
340
+ }
341
+ function makeSelectedRootLabelIndex(labels) {
342
+ const index = /* @__PURE__ */ Object.create(null);
343
+ for (let i = 0; i < labels.length; i++) {
344
+ if (index[labels[i]] === void 0) index[labels[i]] = i;
345
+ }
346
+ return index;
327
347
  }
328
348
  function runOnce(entry, input, options, phase, profileState) {
329
349
  if (typeof entry !== "function" && typeof entry?.parse !== "function") {
@@ -331,13 +351,31 @@ function runOnce(entry, input, options, phase, profileState) {
331
351
  `run(): start production is ${entry === null ? "null" : typeof entry}, not a rule \u2014 the requested grammar rule does not exist (check the rule name).`
332
352
  );
333
353
  }
334
- const triviaLog = [];
354
+ const rootTriviaSelection = options.rootTrivia?.select;
355
+ const captureRootTrivia = rootTriviaSelection !== void 0 && rootTriviaSelection.length > 0;
356
+ const selectedRootLog = captureRootTrivia ? [] : void 0;
357
+ const selectedRootLabelIndex = captureRootTrivia ? makeSelectedRootLabelIndex(rootTriviaSelection) : void 0;
335
358
  const errors = [];
336
359
  const profile = profileState ?? (phase === void 0 ? void 0 : { phase, nodes: 0, childSlots: 0, rawSlots: 0, triviaSlots: 0, fieldSlots: 0, hostCalls: 0 });
337
360
  const skipGlobalSinks = phase === "recognizer" || phase === "capture";
338
361
  const grammarTrivia = typeof entry !== "function" ? entry._meta.grammarTrivia : void 0;
339
362
  const grammarScanSkip = typeof entry !== "function" ? entry._meta.grammarScanSkip : void 0;
340
363
  const triviaKindLabels = triviaKindLabelsFromRunnable(entry) ?? triviaKindLabelsFromRunnable(options.trivia);
364
+ if (captureRootTrivia && triviaKindLabels === void 0) {
365
+ throw new TypeError("run(): rootTrivia.select requires labeled grammar trivia.");
366
+ }
367
+ if (captureRootTrivia) {
368
+ for (const label2 of rootTriviaSelection) {
369
+ if (!triviaKindLabels.includes(label2)) {
370
+ throw new TypeError(`run(): rootTrivia.select contains unknown trivia label ${JSON.stringify(label2)}.`);
371
+ }
372
+ }
373
+ }
374
+ if (captureRootTrivia && !rootTriviaClassifiedFromRunnable(entry) && !rootTriviaClassifiedFromRunnable(options.trivia)) {
375
+ throw new TypeError(
376
+ "run(): rootTrivia.select requires classifiedTrivia() at the root."
377
+ );
378
+ }
341
379
  const stamped = entry;
342
380
  assertHostModeCompatible(
343
381
  typeof entry === "function" ? stamped[FUSED_HOST_MODE] ?? "ast" : entry._meta.grammarHostMode ?? "ast",
@@ -346,7 +384,15 @@ function runOnce(entry, input, options, phase, profileState) {
346
384
  );
347
385
  const ctx = {
348
386
  trackLines: false,
349
- ...skipGlobalSinks ? { _pmProfile: profile } : { _triviaLog: triviaLog, _errors: errors, ...profile === void 0 ? {} : { _pmProfile: profile } },
387
+ ...skipGlobalSinks ? { _pmProfile: profile } : {
388
+ ...captureRootTrivia ? {
389
+ _rootTriviaLog: selectedRootLog,
390
+ _rootTriviaKindIndex: selectedRootLabelIndex,
391
+ _rootTriviaStrictScopes: true
392
+ } : {},
393
+ _errors: errors,
394
+ ...profile === void 0 ? {} : { _pmProfile: profile }
395
+ },
350
396
  build: options.build,
351
397
  state: options.state,
352
398
  ...grammarTrivia !== void 0 ? { trivia: grammarTrivia, ...triviaKindLabels ? { triviaKindLabels } : {} } : triviaKindLabels ? { triviaKindLabels } : {},
@@ -371,9 +417,13 @@ function runOnce(entry, input, options, phase, profileState) {
371
417
  span: r.span ?? { start: 0, end: 0 },
372
418
  expected: r.ok ? [] : r.expected ?? [],
373
419
  errors,
374
- triviaLog,
375
- ...triviaKindLabels === void 0 ? {} : { triviaKindLabels },
376
- triviaMap: buildRootTriviaIndex(triviaLog, triviaKindLabels),
420
+ ...selectedRootLog !== void 0 && selectedRootLog.length > 0 ? {
421
+ rootTrivia: {
422
+ rows: selectedRootLog,
423
+ select: rootTriviaSelection,
424
+ index: buildRootTriviaIndex(selectedRootLog, rootTriviaSelection)
425
+ }
426
+ } : {},
377
427
  unconsumedFrom
378
428
  };
379
429
  }
@@ -432,6 +482,10 @@ var WORDS_RE = new RegExp(`^${WORD_RE_SRC}(?:\\|${WORD_RE_SRC})*$`);
432
482
 
433
483
  // src/compiler/scannable-run.ts
434
484
  var META = new Set("()[]{}*+?|^$.".split(""));
485
+ var SELECTED_ROOT_OWNED_RANGE_PLACEHOLDER = Array.from(
486
+ { length: SELECTED_ROOT_STRIDE - 3 },
487
+ () => "0"
488
+ ).join(", ");
435
489
 
436
490
  // src/compiler/trivia-fast-path.ts
437
491
  var CAP_RECORD = [
@@ -440,6 +494,11 @@ var CAP_RECORD = [
440
494
  ` if (_cap === 1 && _ctx._cstTriviaLog !== undefined && _ctx.captureTrivia) _ctx._cstTriviaLog.push(_pos, _e, _ctx._cstRawChildren ? _ctx._cstRawChildren.length : 0)`,
441
495
  ` }`
442
496
  ].join("\n");
497
+ var SELECTED_ROOT_FINISH = [
498
+ ` if (_cap && _ctx._rootTriviaCapture !== false && _ctx._rootTriviaLog !== undefined && _ctx._rootTriviaLog.length !== _rootMark) {`,
499
+ ` for (let _ri = _rootMark; _ri < _ctx._rootTriviaLog.length; _ri += ${SELECTED_ROOT_STRIDE}) { _ctx._rootTriviaLog[_ri] = _pos; _ctx._rootTriviaLog[_ri + 1] = _e }`,
500
+ ` }`
501
+ ].join("\n");
443
502
 
444
503
  // src/compiler/linker.ts
445
504
  function normalizeCstCollapse(collapse) {
@@ -450,15 +509,16 @@ function normalizeCstCollapse(collapse) {
450
509
  }
451
510
  return typeof collapse === "function" ? collapse : void 0;
452
511
  }
453
- function buildCstNode(type, children, _fields, span, _rawChildren, _triviaLog, state) {
454
- return { _tag: "node", type, span: { ...span }, state: state ?? null, children: [...children] };
512
+ function buildCstNode(type, children, _fields, span, _rawChildren, _triviaLog, state, tags) {
513
+ return tags !== void 0 && tags.length > 0 ? { _tag: "node", type, tags, span: { ...span }, state: state ?? null, children: [...children] } : { _tag: "node", type, span: { ...span }, state: state ?? null, children: [...children] };
455
514
  }
456
- function cstBuildHost(typeOrOptions, children, _fields, span, rawChildren, triviaLog, state) {
515
+ function cstBuildHost(typeOrOptions, children, _fields, span, rawChildren, triviaLog, state, _tags) {
457
516
  if (typeof typeOrOptions === "string") {
458
517
  return buildCstNode(typeOrOptions, children ?? [], _fields, span ?? { start: 0, end: 0 }, rawChildren, triviaLog, state);
459
518
  }
460
519
  const collapse = normalizeCstCollapse(typeOrOptions?.collapse);
461
- const host = (type, children2, fields, span2, rawChildren2, triviaLog2, state2) => buildCstNode(type, children2 ?? [], fields, span2, rawChildren2, triviaLog2, state2);
520
+ const materializeTags = typeOrOptions?.tags === true;
521
+ const host = (type, children2, fields, span2, rawChildren2, triviaLog2, state2, tags) => buildCstNode(type, children2 ?? [], fields, span2, rawChildren2, triviaLog2, state2, materializeTags ? tags : void 0);
462
522
  host._parsemanCstOutput = true;
463
523
  if (collapse) host._parsemanCstCollapse = collapse;
464
524
  return host;
@@ -472,19 +532,6 @@ function fusedHostElidedOf(registry) {
472
532
  return registry[FUSED_HOST_ELIDED] === true;
473
533
  }
474
534
 
475
- // src/cst/walk.ts
476
- function walk(root, visitor, ctx = void 0) {
477
- const go = (node2, parent) => {
478
- const descend = visitor.enter ? visitor.enter(node2, parent, ctx) : void 0;
479
- const children = node2.children;
480
- if (descend !== false && Array.isArray(children)) {
481
- for (const child of children) go(child, node2);
482
- }
483
- visitor.leave?.(node2, parent, ctx);
484
- };
485
- go(root, null);
486
- }
487
-
488
535
  // src/cst/relative-spans.ts
489
536
  function relativizeCST(node2, parentBase = 0) {
490
537
  const span = { start: node2.span.start - parentBase, end: node2.span.end - parentBase };
@@ -927,6 +974,14 @@ function parseDoc(registry, rootRule, input, opts = {}) {
927
974
 
928
975
  // src/language-service/index.ts
929
976
  var errorMessage = (expected) => expected.length ? `Unexpected input; expected ${expected.join(" or ")}` : "Unexpected input";
977
+ function visitTree(root, enter) {
978
+ const go = (node2) => {
979
+ enter(node2);
980
+ const children = node2.children;
981
+ if (Array.isArray(children)) for (const child of children) go(child);
982
+ };
983
+ go(root);
984
+ }
930
985
  function mergeDiagnostics(tree, flat, unconsumedFrom, inputLength, config) {
931
986
  const out = [];
932
987
  const seen = /* @__PURE__ */ new Set();
@@ -946,17 +1001,15 @@ function mergeDiagnostics(tree, flat, unconsumedFrom, inputLength, config) {
946
1001
  function diagnoseTree(root, config) {
947
1002
  const out = [];
948
1003
  const rules2 = config.diagnostics;
949
- walk(root, {
950
- enter(node2) {
951
- if (node2._tag === "parseError") {
952
- out.push({ severity: "error", message: errorMessage(node2.expected ?? []), span: node2.span });
953
- return;
954
- }
955
- const h = rules2 && node2.type !== void 0 ? rules2[node2.type] : void 0;
956
- if (h) {
957
- const d = h(node2);
958
- if (d) out.push(...Array.isArray(d) ? d : [d]);
959
- }
1004
+ visitTree(root, (node2) => {
1005
+ if (node2._tag === "parseError") {
1006
+ out.push({ severity: "error", message: errorMessage(node2.expected ?? []), span: node2.span });
1007
+ return;
1008
+ }
1009
+ const h = rules2 && node2.type !== void 0 ? rules2[node2.type] : void 0;
1010
+ if (h) {
1011
+ const d = h(node2);
1012
+ if (d) out.push(...Array.isArray(d) ? d : [d]);
960
1013
  }
961
1014
  });
962
1015
  return out;
@@ -1014,11 +1067,9 @@ function languageService(grammar, config = {}) {
1014
1067
  function ruleAtCursor(root, offset) {
1015
1068
  if (!root || typeof root !== "object") return null;
1016
1069
  let best = null;
1017
- walk(root, {
1018
- enter(node2) {
1019
- const s = node2.span;
1020
- if (s && s.start <= offset && offset <= s.end && node2.type !== void 0) best = node2.type;
1021
- }
1070
+ visitTree(root, (node2) => {
1071
+ const s = node2.span;
1072
+ if (s && s.start <= offset && offset <= s.end && node2.type !== void 0) best = node2.type;
1022
1073
  });
1023
1074
  return best;
1024
1075
  }