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.
- package/dist/combinators/attempt.d.ts.map +1 -1
- package/dist/combinators/choice.d.ts.map +1 -1
- package/dist/combinators/grammar.d.ts +7 -0
- package/dist/combinators/grammar.d.ts.map +1 -1
- package/dist/combinators/map.d.ts +11 -0
- package/dist/combinators/map.d.ts.map +1 -1
- package/dist/combinators/node.d.ts +21 -7
- package/dist/combinators/node.d.ts.map +1 -1
- package/dist/combinators/parser.d.ts +17 -2
- package/dist/combinators/parser.d.ts.map +1 -1
- package/dist/combinators/token.d.ts +3 -2
- package/dist/combinators/token.d.ts.map +1 -1
- package/dist/combinators/trivia-skip.d.ts +1 -0
- package/dist/combinators/trivia-skip.d.ts.map +1 -1
- package/dist/compiler/codegen.d.ts +4 -0
- package/dist/compiler/codegen.d.ts.map +1 -1
- package/dist/compiler/ir-serialize.d.ts.map +1 -1
- package/dist/compiler/linker.d.ts +6 -1
- package/dist/compiler/linker.d.ts.map +1 -1
- package/dist/compiler/scannable-run.d.ts +1 -1
- package/dist/compiler/scannable-run.d.ts.map +1 -1
- package/dist/compiler/trivia-fast-path.d.ts +4 -3
- package/dist/compiler/trivia-fast-path.d.ts.map +1 -1
- package/dist/cst/reflection.d.ts +24 -0
- package/dist/cst/reflection.d.ts.map +1 -0
- package/dist/cst/trivia-entries.d.ts +15 -9
- package/dist/cst/trivia-entries.d.ts.map +1 -1
- package/dist/cst/trivia-kinds.d.ts +15 -11
- package/dist/cst/trivia-kinds.d.ts.map +1 -1
- package/dist/cst/types.d.ts +2 -0
- package/dist/cst/types.d.ts.map +1 -1
- package/dist/cst/walk.d.ts +27 -62
- package/dist/cst/walk.d.ts.map +1 -1
- package/dist/functional/run.d.ts +22 -16
- package/dist/functional/run.d.ts.map +1 -1
- package/dist/index.cjs +1651 -1207
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1651 -1207
- package/dist/index.js.map +4 -4
- package/dist/language-service/index.cjs +186 -135
- package/dist/language-service/index.cjs.map +4 -4
- package/dist/language-service/index.d.ts +1 -1
- package/dist/language-service/index.d.ts.map +1 -1
- package/dist/language-service/index.js +186 -135
- package/dist/language-service/index.js.map +4 -4
- package/dist/plugin/evaluator.d.ts +1 -0
- package/dist/plugin/evaluator.d.ts.map +1 -1
- package/dist/plugin/index.cjs +1525 -1048
- package/dist/plugin/index.cjs.map +4 -4
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +1525 -1048
- package/dist/plugin/index.js.map +4 -4
- package/dist/run/index.cjs +152 -102
- package/dist/run/index.cjs.map +3 -3
- package/dist/run/index.d.ts +1 -1
- package/dist/run/index.d.ts.map +1 -1
- package/dist/run/index.js +152 -102
- package/dist/run/index.js.map +3 -3
- package/dist/spec/index.cjs +1381 -1152
- package/dist/spec/index.cjs.map +4 -4
- package/dist/spec/index.js +1381 -1152
- package/dist/spec/index.js.map +4 -4
- package/dist/types.d.ts +27 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- 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 {
|
|
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":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAI1F,OAAO,
|
|
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
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
const
|
|
167
|
-
const
|
|
168
|
-
const
|
|
169
|
-
|
|
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
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
188
|
-
return ki !== void 0 ? labels[ki] : void 0;
|
|
183
|
+
return labels[markerKind(i)];
|
|
189
184
|
},
|
|
190
185
|
text(i, input) {
|
|
191
|
-
|
|
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
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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
|
|
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
|
-
|
|
268
|
+
const rows = gapRowsAt(offset, "before");
|
|
269
|
+
return rows ? indices(rows[0], rows[1]) : EMPTY_INDICES;
|
|
274
270
|
},
|
|
275
271
|
entryIndicesAfter(offset) {
|
|
276
|
-
|
|
272
|
+
const rows = gapRowsAt(offset, "after");
|
|
273
|
+
return rows ? indices(rows[0], rows[1]) : EMPTY_INDICES;
|
|
277
274
|
},
|
|
278
275
|
gapBefore(offset) {
|
|
279
|
-
|
|
276
|
+
const rows = gapRowsAt(offset, "before");
|
|
277
|
+
return rows ? makeGap(rows[0], rows[1]) : void 0;
|
|
280
278
|
},
|
|
281
279
|
gapAfter(offset) {
|
|
282
|
-
|
|
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 (
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
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
|
|
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
|
|
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 } : {
|
|
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
|
-
|
|
375
|
-
|
|
376
|
-
|
|
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
|
|
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
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
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
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
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
|
}
|