parseman 0.43.0 → 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/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.map +1 -1
- package/dist/compiler/ir-serialize.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/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/functional/run.d.ts +22 -16
- package/dist/functional/run.d.ts.map +1 -1
- package/dist/index.cjs +1416 -1115
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1416 -1115
- package/dist/index.js.map +4 -4
- package/dist/language-service/index.cjs +161 -102
- package/dist/language-service/index.cjs.map +3 -3
- package/dist/language-service/index.js +161 -102
- package/dist/language-service/index.js.map +3 -3
- package/dist/plugin/evaluator.d.ts.map +1 -1
- package/dist/plugin/index.cjs +1217 -985
- package/dist/plugin/index.cjs.map +4 -4
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +1217 -985
- 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 +1414 -1286
- package/dist/spec/index.cjs.map +4 -4
- package/dist/spec/index.js +1414 -1286
- package/dist/spec/index.js.map +4 -4
- package/dist/types.d.ts +25 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/package.json +1 -1
package/dist/run/index.cjs
CHANGED
|
@@ -28,105 +28,97 @@ module.exports = __toCommonJS(run_exports);
|
|
|
28
28
|
// src/cst/trivia-entries.ts
|
|
29
29
|
var EMPTY_INDICES = Object.freeze([]);
|
|
30
30
|
var EMPTY_GAPS = Object.freeze([]);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
|
|
31
|
+
var SELECTED_ROOT_STRIDE = 5;
|
|
32
|
+
function buildRootTriviaIndex(log, labels) {
|
|
33
|
+
const length = Math.floor(log.length / SELECTED_ROOT_STRIDE);
|
|
34
|
+
const markerOffset = (i) => i * SELECTED_ROOT_STRIDE;
|
|
35
|
+
const ownedRangeStart = (i) => log[markerOffset(i)];
|
|
36
|
+
const ownedRangeEnd = (i) => log[markerOffset(i) + 1];
|
|
37
|
+
const markerStart = (i) => log[markerOffset(i) + 2];
|
|
38
|
+
const markerEnd = (i) => log[markerOffset(i) + 3];
|
|
39
|
+
const markerKind = (i) => log[markerOffset(i) + 4];
|
|
40
|
+
const entries = {
|
|
39
41
|
length,
|
|
40
42
|
labels,
|
|
41
|
-
stride,
|
|
42
|
-
start
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return log[entryOffset(i, stride) + 1];
|
|
47
|
-
},
|
|
48
|
-
insertIndex(i) {
|
|
49
|
-
return opts?.nodeLog ? log[entryOffset(i, stride) + 2] : void 0;
|
|
50
|
-
},
|
|
51
|
-
kindIndex(i) {
|
|
52
|
-
if (!labels) return void 0;
|
|
53
|
-
return log[entryOffset(i, stride) + baseStride];
|
|
54
|
-
},
|
|
43
|
+
stride: SELECTED_ROOT_STRIDE,
|
|
44
|
+
start: markerStart,
|
|
45
|
+
end: markerEnd,
|
|
46
|
+
insertIndex: () => void 0,
|
|
47
|
+
kindIndex: markerKind,
|
|
55
48
|
kind(i) {
|
|
56
|
-
|
|
57
|
-
return ki !== void 0 ? labels[ki] : void 0;
|
|
49
|
+
return labels[markerKind(i)];
|
|
58
50
|
},
|
|
59
51
|
text(i, input) {
|
|
60
|
-
|
|
61
|
-
const e = log[entryOffset(i, stride) + 1];
|
|
62
|
-
return input.slice(s, e);
|
|
52
|
+
return input.slice(markerStart(i), markerEnd(i));
|
|
63
53
|
}
|
|
64
54
|
};
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
for (let i = first; i <= last; i++) indices.push(i);
|
|
73
|
-
}
|
|
74
|
-
function buildGap(entries, start, end, first, last) {
|
|
75
|
-
const entryIndices = [];
|
|
76
|
-
for (let i = first; i <= last; i++) entryIndices.push(i);
|
|
77
|
-
return {
|
|
78
|
-
start,
|
|
79
|
-
end,
|
|
80
|
-
entryIndices,
|
|
81
|
-
hasKind(kind) {
|
|
82
|
-
for (const i of entryIndices) {
|
|
83
|
-
if (entries.kind(i) === kind) return true;
|
|
84
|
-
}
|
|
85
|
-
return false;
|
|
86
|
-
},
|
|
87
|
-
text(input) {
|
|
88
|
-
return input.slice(start, end);
|
|
55
|
+
const lowerBound = (offset, by) => {
|
|
56
|
+
let lo = 0;
|
|
57
|
+
let hi = length;
|
|
58
|
+
while (lo < hi) {
|
|
59
|
+
const mid = lo + hi >>> 1;
|
|
60
|
+
if (by(mid) < offset) lo = mid + 1;
|
|
61
|
+
else hi = mid;
|
|
89
62
|
}
|
|
63
|
+
return lo;
|
|
90
64
|
};
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
65
|
+
const gapRowsAt = (offset, direction) => {
|
|
66
|
+
const edge = direction === "before" ? ownedRangeEnd : ownedRangeStart;
|
|
67
|
+
let first = lowerBound(offset, edge);
|
|
68
|
+
if (first === length || edge(first) !== offset) return void 0;
|
|
69
|
+
const start = ownedRangeStart(first);
|
|
70
|
+
const end = ownedRangeEnd(first);
|
|
71
|
+
while (first > 0 && ownedRangeStart(first - 1) === start && ownedRangeEnd(first - 1) === end) first--;
|
|
72
|
+
let last = first + 1;
|
|
73
|
+
while (last < length && ownedRangeStart(last) === start && ownedRangeEnd(last) === end) last++;
|
|
74
|
+
return [first, last];
|
|
75
|
+
};
|
|
76
|
+
const indices = (first, last) => {
|
|
77
|
+
const out = [];
|
|
78
|
+
for (let i = first; i < last; i++) out.push(i);
|
|
79
|
+
return out;
|
|
80
|
+
};
|
|
81
|
+
const makeGap = (first, last) => {
|
|
82
|
+
const start = ownedRangeStart(first);
|
|
83
|
+
const end = ownedRangeEnd(first);
|
|
84
|
+
let entryIndices;
|
|
85
|
+
return {
|
|
86
|
+
start,
|
|
87
|
+
end,
|
|
88
|
+
get entryIndices() {
|
|
89
|
+
return entryIndices ??= indices(first, last);
|
|
90
|
+
},
|
|
91
|
+
hasKind(kind) {
|
|
92
|
+
for (let i = first; i < last; i++) {
|
|
93
|
+
if (labels[markerKind(i)] === kind) return true;
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
},
|
|
97
|
+
text(input) {
|
|
98
|
+
return input.slice(start, end);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
106
101
|
};
|
|
107
|
-
let first = 0;
|
|
108
|
-
let start = entries.start(0);
|
|
109
|
-
let end = entries.end(0);
|
|
110
|
-
for (let i = 1; i < entries.length; i++) {
|
|
111
|
-
const nextStart = entries.start(i);
|
|
112
|
-
const nextEnd = entries.end(i);
|
|
113
|
-
if (nextStart === end) {
|
|
114
|
-
end = nextEnd;
|
|
115
|
-
continue;
|
|
116
|
-
}
|
|
117
|
-
appendGap(first, i - 1, start, end);
|
|
118
|
-
first = i;
|
|
119
|
-
start = nextStart;
|
|
120
|
-
end = nextEnd;
|
|
121
|
-
}
|
|
122
|
-
appendGap(first, entries.length - 1, start, end);
|
|
123
|
-
return { before, after, beforeGaps, afterGaps, gaps };
|
|
124
|
-
}
|
|
125
|
-
function buildRootTriviaIndex(log, labels) {
|
|
126
|
-
const entries = triviaEntries(log, labels);
|
|
127
102
|
let maps;
|
|
128
103
|
const getMaps = () => {
|
|
129
|
-
maps
|
|
104
|
+
if (maps !== void 0) return maps;
|
|
105
|
+
const before = /* @__PURE__ */ new Map();
|
|
106
|
+
const after = /* @__PURE__ */ new Map();
|
|
107
|
+
const beforeGaps = /* @__PURE__ */ new Map();
|
|
108
|
+
const afterGaps = /* @__PURE__ */ new Map();
|
|
109
|
+
const gaps = [];
|
|
110
|
+
for (let first = 0; first < length; ) {
|
|
111
|
+
let last = first + 1;
|
|
112
|
+
while (last < length && ownedRangeStart(last) === ownedRangeStart(first) && ownedRangeEnd(last) === ownedRangeEnd(first)) last++;
|
|
113
|
+
const gap = makeGap(first, last);
|
|
114
|
+
gaps.push(gap);
|
|
115
|
+
afterGaps.set(gap.start, gap);
|
|
116
|
+
beforeGaps.set(gap.end, gap);
|
|
117
|
+
after.set(gap.start, [...gap.entryIndices]);
|
|
118
|
+
before.set(gap.end, [...gap.entryIndices]);
|
|
119
|
+
first = last;
|
|
120
|
+
}
|
|
121
|
+
maps = { before, after, beforeGaps, afterGaps, gaps };
|
|
130
122
|
return maps;
|
|
131
123
|
};
|
|
132
124
|
return {
|
|
@@ -139,16 +131,20 @@ function buildRootTriviaIndex(log, labels) {
|
|
|
139
131
|
return getMaps().after;
|
|
140
132
|
},
|
|
141
133
|
entryIndicesBefore(offset) {
|
|
142
|
-
|
|
134
|
+
const rows = gapRowsAt(offset, "before");
|
|
135
|
+
return rows ? indices(rows[0], rows[1]) : EMPTY_INDICES;
|
|
143
136
|
},
|
|
144
137
|
entryIndicesAfter(offset) {
|
|
145
|
-
|
|
138
|
+
const rows = gapRowsAt(offset, "after");
|
|
139
|
+
return rows ? indices(rows[0], rows[1]) : EMPTY_INDICES;
|
|
146
140
|
},
|
|
147
141
|
gapBefore(offset) {
|
|
148
|
-
|
|
142
|
+
const rows = gapRowsAt(offset, "before");
|
|
143
|
+
return rows ? makeGap(rows[0], rows[1]) : void 0;
|
|
149
144
|
},
|
|
150
145
|
gapAfter(offset) {
|
|
151
|
-
|
|
146
|
+
const rows = gapRowsAt(offset, "after");
|
|
147
|
+
return rows ? makeGap(rows[0], rows[1]) : void 0;
|
|
152
148
|
},
|
|
153
149
|
gaps() {
|
|
154
150
|
return getMaps().gaps;
|
|
@@ -156,13 +152,21 @@ function buildRootTriviaIndex(log, labels) {
|
|
|
156
152
|
gapsWithKind(kind) {
|
|
157
153
|
const kinds = typeof kind === "string" ? [kind] : kind;
|
|
158
154
|
const matches = [];
|
|
159
|
-
for (
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
155
|
+
for (let first = 0; first < length; ) {
|
|
156
|
+
let last = first + 1;
|
|
157
|
+
while (last < length && ownedRangeStart(last) === ownedRangeStart(first) && ownedRangeEnd(last) === ownedRangeEnd(first)) last++;
|
|
158
|
+
let matched = false;
|
|
159
|
+
for (let i = first; i < last && !matched; i++) {
|
|
160
|
+
const label = labels[markerKind(i)];
|
|
161
|
+
for (const kind2 of kinds) {
|
|
162
|
+
if (label === kind2) {
|
|
163
|
+
matched = true;
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
164
166
|
}
|
|
165
167
|
}
|
|
168
|
+
if (matched) matches.push(makeGap(first, last));
|
|
169
|
+
first = last;
|
|
166
170
|
}
|
|
167
171
|
return matches.length === 0 ? EMPTY_GAPS : matches;
|
|
168
172
|
}
|
|
@@ -247,6 +251,7 @@ function probeAt(sentinel, input, pos, ctx) {
|
|
|
247
251
|
_cstRawChildren: ctx._cstRawChildren,
|
|
248
252
|
_cstTriviaLog: ctx._cstTriviaLog,
|
|
249
253
|
_triviaLog: ctx._triviaLog,
|
|
254
|
+
_rootTriviaLog: ctx._rootTriviaLog,
|
|
250
255
|
_fields: ctx._fields,
|
|
251
256
|
_cstBuf: ctx._cstBuf,
|
|
252
257
|
_tolerant: ctx._tolerant,
|
|
@@ -259,6 +264,7 @@ function probeAt(sentinel, input, pos, ctx) {
|
|
|
259
264
|
ctx._cstRawChildren = void 0;
|
|
260
265
|
ctx._cstTriviaLog = void 0;
|
|
261
266
|
ctx._triviaLog = void 0;
|
|
267
|
+
ctx._rootTriviaLog = void 0;
|
|
262
268
|
ctx._fields = void 0;
|
|
263
269
|
ctx._cstBuf = void 0;
|
|
264
270
|
ctx._tolerant = void 0;
|
|
@@ -273,6 +279,7 @@ function probeAt(sentinel, input, pos, ctx) {
|
|
|
273
279
|
ctx._cstRawChildren = s._cstRawChildren;
|
|
274
280
|
ctx._cstTriviaLog = s._cstTriviaLog;
|
|
275
281
|
ctx._triviaLog = s._triviaLog;
|
|
282
|
+
ctx._rootTriviaLog = s._rootTriviaLog;
|
|
276
283
|
ctx._fields = s._fields;
|
|
277
284
|
ctx._cstBuf = s._cstBuf;
|
|
278
285
|
ctx._tolerant = s._tolerant;
|
|
@@ -350,7 +357,20 @@ function triviaKindLabelsFromRunnable(r) {
|
|
|
350
357
|
if (!r) return void 0;
|
|
351
358
|
if (typeof r === "function") return r._meta?.triviaKindLabels;
|
|
352
359
|
const grammarTrivia = r._meta.grammarTrivia;
|
|
353
|
-
return
|
|
360
|
+
return grammarTrivia?._meta.triviaKindLabels ?? r._meta.triviaKindLabels ?? (r._def.tag === "grammar" ? r._def.triviaParser?._meta.triviaKindLabels : void 0);
|
|
361
|
+
}
|
|
362
|
+
function rootTriviaClassifiedFromRunnable(r) {
|
|
363
|
+
if (!r) return false;
|
|
364
|
+
if (typeof r === "function") return r._meta?.rootTriviaClassified === true;
|
|
365
|
+
const grammarTrivia = r._meta.grammarTrivia;
|
|
366
|
+
return grammarTrivia?._meta.rootTriviaClassified === true || r._meta.rootTriviaClassified === true;
|
|
367
|
+
}
|
|
368
|
+
function makeSelectedRootLabelIndex(labels) {
|
|
369
|
+
const index = /* @__PURE__ */ Object.create(null);
|
|
370
|
+
for (let i = 0; i < labels.length; i++) {
|
|
371
|
+
if (index[labels[i]] === void 0) index[labels[i]] = i;
|
|
372
|
+
}
|
|
373
|
+
return index;
|
|
354
374
|
}
|
|
355
375
|
function runOnce(entry, input, options, phase, profileState) {
|
|
356
376
|
if (typeof entry !== "function" && typeof entry?.parse !== "function") {
|
|
@@ -358,13 +378,31 @@ function runOnce(entry, input, options, phase, profileState) {
|
|
|
358
378
|
`run(): start production is ${entry === null ? "null" : typeof entry}, not a rule \u2014 the requested grammar rule does not exist (check the rule name).`
|
|
359
379
|
);
|
|
360
380
|
}
|
|
361
|
-
const
|
|
381
|
+
const rootTriviaSelection = options.rootTrivia?.select;
|
|
382
|
+
const captureRootTrivia = rootTriviaSelection !== void 0 && rootTriviaSelection.length > 0;
|
|
383
|
+
const selectedRootLog = captureRootTrivia ? [] : void 0;
|
|
384
|
+
const selectedRootLabelIndex = captureRootTrivia ? makeSelectedRootLabelIndex(rootTriviaSelection) : void 0;
|
|
362
385
|
const errors = [];
|
|
363
386
|
const profile = profileState ?? (phase === void 0 ? void 0 : { phase, nodes: 0, childSlots: 0, rawSlots: 0, triviaSlots: 0, fieldSlots: 0, hostCalls: 0 });
|
|
364
387
|
const skipGlobalSinks = phase === "recognizer" || phase === "capture";
|
|
365
388
|
const grammarTrivia = typeof entry !== "function" ? entry._meta.grammarTrivia : void 0;
|
|
366
389
|
const grammarScanSkip = typeof entry !== "function" ? entry._meta.grammarScanSkip : void 0;
|
|
367
390
|
const triviaKindLabels = triviaKindLabelsFromRunnable(entry) ?? triviaKindLabelsFromRunnable(options.trivia);
|
|
391
|
+
if (captureRootTrivia && triviaKindLabels === void 0) {
|
|
392
|
+
throw new TypeError("run(): rootTrivia.select requires labeled grammar trivia.");
|
|
393
|
+
}
|
|
394
|
+
if (captureRootTrivia) {
|
|
395
|
+
for (const label of rootTriviaSelection) {
|
|
396
|
+
if (!triviaKindLabels.includes(label)) {
|
|
397
|
+
throw new TypeError(`run(): rootTrivia.select contains unknown trivia label ${JSON.stringify(label)}.`);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
if (captureRootTrivia && !rootTriviaClassifiedFromRunnable(entry) && !rootTriviaClassifiedFromRunnable(options.trivia)) {
|
|
402
|
+
throw new TypeError(
|
|
403
|
+
"run(): rootTrivia.select requires classifiedTrivia() at the root."
|
|
404
|
+
);
|
|
405
|
+
}
|
|
368
406
|
const stamped = entry;
|
|
369
407
|
assertHostModeCompatible(
|
|
370
408
|
typeof entry === "function" ? stamped[FUSED_HOST_MODE] ?? "ast" : entry._meta.grammarHostMode ?? "ast",
|
|
@@ -373,7 +411,15 @@ function runOnce(entry, input, options, phase, profileState) {
|
|
|
373
411
|
);
|
|
374
412
|
const ctx = {
|
|
375
413
|
trackLines: false,
|
|
376
|
-
...skipGlobalSinks ? { _pmProfile: profile } : {
|
|
414
|
+
...skipGlobalSinks ? { _pmProfile: profile } : {
|
|
415
|
+
...captureRootTrivia ? {
|
|
416
|
+
_rootTriviaLog: selectedRootLog,
|
|
417
|
+
_rootTriviaKindIndex: selectedRootLabelIndex,
|
|
418
|
+
_rootTriviaStrictScopes: true
|
|
419
|
+
} : {},
|
|
420
|
+
_errors: errors,
|
|
421
|
+
...profile === void 0 ? {} : { _pmProfile: profile }
|
|
422
|
+
},
|
|
377
423
|
build: options.build,
|
|
378
424
|
state: options.state,
|
|
379
425
|
...grammarTrivia !== void 0 ? { trivia: grammarTrivia, ...triviaKindLabels ? { triviaKindLabels } : {} } : triviaKindLabels ? { triviaKindLabels } : {},
|
|
@@ -398,9 +444,13 @@ function runOnce(entry, input, options, phase, profileState) {
|
|
|
398
444
|
span: r.span ?? { start: 0, end: 0 },
|
|
399
445
|
expected: r.ok ? [] : r.expected ?? [],
|
|
400
446
|
errors,
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
447
|
+
...selectedRootLog !== void 0 && selectedRootLog.length > 0 ? {
|
|
448
|
+
rootTrivia: {
|
|
449
|
+
rows: selectedRootLog,
|
|
450
|
+
select: rootTriviaSelection,
|
|
451
|
+
index: buildRootTriviaIndex(selectedRootLog, rootTriviaSelection)
|
|
452
|
+
}
|
|
453
|
+
} : {},
|
|
404
454
|
unconsumedFrom
|
|
405
455
|
};
|
|
406
456
|
}
|