parseman 0.21.0 → 0.23.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/grammar.d.ts.map +1 -1
- package/dist/combinators/parser.d.ts +12 -0
- package/dist/combinators/parser.d.ts.map +1 -1
- package/dist/compiler/codegen.d.ts +6 -2
- package/dist/compiler/codegen.d.ts.map +1 -1
- package/dist/compiler/linker.d.ts +7 -2
- package/dist/compiler/linker.d.ts.map +1 -1
- package/dist/functional/run.d.ts.map +1 -1
- package/dist/index.cjs +289 -38
- package/dist/index.cjs.map +3 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +289 -38
- package/dist/index.js.map +3 -3
- package/dist/plugin/index.cjs +161 -34
- package/dist/plugin/index.cjs.map +3 -3
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +161 -34
- package/dist/plugin/index.js.map +3 -3
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"AAuBA,OAAO,WAAW,MAAM,cAAc,CAAA;AAiBtC,MAAM,MAAM,uBAAuB,GAAG;IACpC,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;;;AA4MD,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAA;IAC3C,kFAAkF;IAClF,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,aAAa,cAA6B,EAC1C,kBAAkB,UAAQ,GACzB,oBAAoB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"AAuBA,OAAO,WAAW,MAAM,cAAc,CAAA;AAiBtC,MAAM,MAAM,uBAAuB,GAAG;IACpC,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;;;AA4MD,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAA;IAC3C,kFAAkF;IAClF,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,aAAa,cAA6B,EAC1C,kBAAkB,UAAQ,GACzB,oBAAoB,GAAG,IAAI,CA8wB7B"}
|
package/dist/plugin/index.js
CHANGED
|
@@ -1694,7 +1694,9 @@ function tagRule(r, key) {
|
|
|
1694
1694
|
r._ruleName = key;
|
|
1695
1695
|
if (r._def.tag === "node" && r._def.type === void 0) r._def.type = key;
|
|
1696
1696
|
}
|
|
1697
|
-
function rules(
|
|
1697
|
+
function rules(a, b) {
|
|
1698
|
+
const factory = typeof a === "function" ? a : b;
|
|
1699
|
+
const options = typeof a === "function" ? b : a;
|
|
1698
1700
|
const cache = {};
|
|
1699
1701
|
const proxy = new Proxy(cache, {
|
|
1700
1702
|
get(target, key) {
|
|
@@ -1722,6 +1724,12 @@ function rules(factory) {
|
|
|
1722
1724
|
cache[key] = parser2;
|
|
1723
1725
|
}
|
|
1724
1726
|
}
|
|
1727
|
+
if (options?.trivia !== void 0) {
|
|
1728
|
+
for (const key of Object.keys(definitions)) {
|
|
1729
|
+
const rule = cache[key];
|
|
1730
|
+
if (rule && !rule._meta.isTrivia) rule._meta.grammarTrivia = options.trivia;
|
|
1731
|
+
}
|
|
1732
|
+
}
|
|
1725
1733
|
for (const key of Object.keys(definitions)) {
|
|
1726
1734
|
markUnusedValues(cache[key]);
|
|
1727
1735
|
}
|
|
@@ -5316,6 +5324,7 @@ function ruleDependencies(ruleMap) {
|
|
|
5316
5324
|
}
|
|
5317
5325
|
function compile(combinator, mapFnSources) {
|
|
5318
5326
|
markUnusedValues(combinator);
|
|
5327
|
+
const grammarTrivia = combinator._meta.grammarTrivia;
|
|
5319
5328
|
const ctx = {
|
|
5320
5329
|
vars: 0,
|
|
5321
5330
|
indent: 1,
|
|
@@ -5334,7 +5343,8 @@ function compile(combinator, mapFnSources) {
|
|
|
5334
5343
|
triviaFnNames: /* @__PURE__ */ new Map(),
|
|
5335
5344
|
namedFnDecls: [],
|
|
5336
5345
|
capturing: hasNodeDef(combinator),
|
|
5337
|
-
lazyUsage: analyzeLazyUsage(combinator)
|
|
5346
|
+
lazyUsage: analyzeLazyUsage(combinator),
|
|
5347
|
+
...grammarTrivia ? { activeTrivia: grammarTrivia, triviaKindLabels: grammarTrivia._meta.triviaKindLabels } : {}
|
|
5338
5348
|
};
|
|
5339
5349
|
const r = emit(combinator, ctx, "_pos");
|
|
5340
5350
|
const namedPrelude = ctx.namedFnDecls.length > 0 ? [...namedFnPrelude(), ""] : [];
|
|
@@ -5410,8 +5420,9 @@ function publicRuleWrapperSource(rule, fnSource) {
|
|
|
5410
5420
|
if (labels === void 0) return fnSource;
|
|
5411
5421
|
return `Object.assign(${fnSource}, { _meta: { triviaKindLabels: ${JSON.stringify(labels)} } })`;
|
|
5412
5422
|
}
|
|
5413
|
-
function compileRuleMap(ruleMap) {
|
|
5423
|
+
function compileRuleMap(ruleMap, opts) {
|
|
5414
5424
|
for (const [, rule] of ruleMap) markUnusedValues(rule);
|
|
5425
|
+
const grammarTrivia = opts?.trivia;
|
|
5415
5426
|
const ctx = {
|
|
5416
5427
|
vars: 0,
|
|
5417
5428
|
indent: 1,
|
|
@@ -5430,7 +5441,8 @@ function compileRuleMap(ruleMap) {
|
|
|
5430
5441
|
triviaFnNames: /* @__PURE__ */ new Map(),
|
|
5431
5442
|
namedFnDecls: [],
|
|
5432
5443
|
capturing: ruleMap.some(([, rule]) => hasNodeDef(rule)),
|
|
5433
|
-
lazyUsage: analyzeLazyUsageMulti(ruleMap.map(([, rule]) => rule))
|
|
5444
|
+
lazyUsage: analyzeLazyUsageMulti(ruleMap.map(([, rule]) => rule)),
|
|
5445
|
+
...grammarTrivia ? { activeTrivia: grammarTrivia, triviaKindLabels: grammarTrivia._meta.triviaKindLabels } : {}
|
|
5434
5446
|
};
|
|
5435
5447
|
const seenNames = /* @__PURE__ */ new Map();
|
|
5436
5448
|
const ruleNames = /* @__PURE__ */ new Map();
|
|
@@ -5442,7 +5454,13 @@ function compileRuleMap(ruleMap) {
|
|
|
5442
5454
|
ruleNames.set(rule, n === 0 ? base : `${base}$${n}`);
|
|
5443
5455
|
}
|
|
5444
5456
|
ctx.ruleNames = ruleNames;
|
|
5445
|
-
const perEntry = ruleMap.map(([key, rule]) =>
|
|
5457
|
+
const perEntry = ruleMap.map(([key, rule]) => {
|
|
5458
|
+
const savedTrivia = ctx.activeTrivia;
|
|
5459
|
+
if (rule._meta.isTrivia) ctx.activeTrivia = void 0;
|
|
5460
|
+
const r = emit(rule, ctx, "_pos");
|
|
5461
|
+
ctx.activeTrivia = savedTrivia;
|
|
5462
|
+
return { key, rule, r };
|
|
5463
|
+
});
|
|
5446
5464
|
const derivedSrcs = ctx.mapFnSrcs.length === ctx.mapFns.length && ctx.mapFnSrcs.every((s) => s !== null) ? ctx.mapFnSrcs : void 0;
|
|
5447
5465
|
const buildCovered = ctx.buildFns.length === 0 || ctx.buildSrcs.every((s) => s !== null);
|
|
5448
5466
|
const buildSources = ctx.buildFns.length === 0 ? void 0 : ctx.buildSrcs;
|
|
@@ -5486,9 +5504,10 @@ function compileRuleMap(ruleMap) {
|
|
|
5486
5504
|
].join("\n");
|
|
5487
5505
|
return { keys: perEntry.map((e) => e.key), replacement };
|
|
5488
5506
|
}
|
|
5489
|
-
function compileLinkable(ruleMapArg, ns) {
|
|
5507
|
+
function compileLinkable(ruleMapArg, ns, opts) {
|
|
5490
5508
|
if (!ns) throw new Error("compileLinkable: ns must be a non-empty namespace");
|
|
5491
5509
|
for (const [, rule] of ruleMapArg) markUnusedValues(rule);
|
|
5510
|
+
const grammarTrivia = opts?.trivia ?? ruleMapArg.map(([, r]) => r._meta.grammarTrivia).find(Boolean);
|
|
5492
5511
|
const ruleMap = ruleMapArg.filter(([, val]) => {
|
|
5493
5512
|
const d = val._def;
|
|
5494
5513
|
if (d.tag !== "lazy") return true;
|
|
@@ -5519,7 +5538,8 @@ function compileLinkable(ruleMapArg, ns) {
|
|
|
5519
5538
|
capturing: ruleMap.some(([, rule]) => hasNodeDef(rule)),
|
|
5520
5539
|
lazyUsage: analyzeLazyUsageMulti(ruleMap.map(([, rule]) => rule)),
|
|
5521
5540
|
ns,
|
|
5522
|
-
deferFirstSetRefs: true
|
|
5541
|
+
deferFirstSetRefs: true,
|
|
5542
|
+
...grammarTrivia ? { activeTrivia: grammarTrivia, triviaKindLabels: grammarTrivia._meta.triviaKindLabels } : {}
|
|
5523
5543
|
};
|
|
5524
5544
|
const seen = /* @__PURE__ */ new Map();
|
|
5525
5545
|
const ruleNames = /* @__PURE__ */ new Map();
|
|
@@ -5582,7 +5602,10 @@ function compileLinkable(ruleMapArg, ns) {
|
|
|
5582
5602
|
ctx.indent = 1;
|
|
5583
5603
|
ctx.failLabel = "_pfail";
|
|
5584
5604
|
ctx.recordFail = true;
|
|
5605
|
+
const savedTrivia = ctx.activeTrivia;
|
|
5606
|
+
if (rule._meta.isTrivia) ctx.activeTrivia = void 0;
|
|
5585
5607
|
const body = emit(resolved, ctx, "_pos");
|
|
5608
|
+
ctx.activeTrivia = savedTrivia;
|
|
5586
5609
|
ctx.indent = savedIndent;
|
|
5587
5610
|
ctx.failLabel = savedFail;
|
|
5588
5611
|
ctx.recordFail = savedRec;
|
|
@@ -6076,6 +6099,23 @@ ${body}
|
|
|
6076
6099
|
};
|
|
6077
6100
|
|
|
6078
6101
|
// src/compiler/linker.ts
|
|
6102
|
+
function pickPieces(pieces, names) {
|
|
6103
|
+
const winner = /* @__PURE__ */ new Map();
|
|
6104
|
+
for (const pc of pieces) for (const k of pc.keys) winner.set(k, pc);
|
|
6105
|
+
for (const n of names) {
|
|
6106
|
+
if (!winner.has(n)) throw new Error(`pick: rule "${n}" is not in this grammar (available: ${[...winner.keys()].join(", ")})`);
|
|
6107
|
+
}
|
|
6108
|
+
const keep = /* @__PURE__ */ new Set();
|
|
6109
|
+
const visit = (n) => {
|
|
6110
|
+
const w = winner.get(n);
|
|
6111
|
+
if (keep.has(n) || !w) return;
|
|
6112
|
+
keep.add(n);
|
|
6113
|
+
for (const d of w.deps.get(n) ?? []) visit(d);
|
|
6114
|
+
};
|
|
6115
|
+
for (const n of names) visit(n);
|
|
6116
|
+
const filt = (m, pc) => new Map([...m].filter(([k]) => keep.has(k) && winner.get(k) === pc));
|
|
6117
|
+
return pieces.map((pc) => ({ ...pc, keys: pc.keys.filter((k) => keep.has(k) && winner.get(k) === pc), ruleFns: filt(pc.ruleFns, pc), wrappers: filt(pc.wrappers, pc), deps: filt(pc.deps, pc) })).filter((pc) => pc.keys.length > 0);
|
|
6118
|
+
}
|
|
6079
6119
|
function fusedBody(pieces) {
|
|
6080
6120
|
const winner = /* @__PURE__ */ new Map();
|
|
6081
6121
|
for (const p of pieces) for (const k of p.keys) winner.set(k, p);
|
|
@@ -6095,7 +6135,7 @@ function fusedBody(pieces) {
|
|
|
6095
6135
|
...needsEmptyTl ? ["const _EMPTY_TL = Object.freeze([])"] : [],
|
|
6096
6136
|
...needsHostReads ? [HOST_READS_DECL] : [],
|
|
6097
6137
|
// Each contributing artifact's namespaced private prelude (regexes, _pf, …).
|
|
6098
|
-
...
|
|
6138
|
+
...new Set(contributingPieces.flatMap((p) => p.prelude)),
|
|
6099
6139
|
// The winning `_r_<Name>` function for each rule (one per name → no redeclare).
|
|
6100
6140
|
...[...winner].map(([k, p]) => p.ruleFns.get(k))
|
|
6101
6141
|
];
|
|
@@ -6136,9 +6176,9 @@ ${body}
|
|
|
6136
6176
|
function isIRPiece(p) {
|
|
6137
6177
|
return !!p && typeof p === "object" && typeof p.ir === "string" && typeof p.ns === "string" && !("ruleFns" in p);
|
|
6138
6178
|
}
|
|
6139
|
-
function materializePiece(p) {
|
|
6179
|
+
function materializePiece(p, trivia2) {
|
|
6140
6180
|
if (!isIRPiece(p)) return p;
|
|
6141
|
-
const pieces = compileLinkable(evalRuleMapIR(p.ir), p.ns);
|
|
6181
|
+
const pieces = compileLinkable(evalRuleMapIR(p.ir), p.ns, trivia2 ? { trivia: trivia2 } : void 0);
|
|
6142
6182
|
if (!pieces) throw new Error(`compose: carried IR for ns "${p.ns}" could not be re-lowered`);
|
|
6143
6183
|
return pieces;
|
|
6144
6184
|
}
|
|
@@ -6821,7 +6861,10 @@ function transformMacro(code, id, moduleAliases = /* @__PURE__ */ new Set([PARSE
|
|
|
6821
6861
|
};
|
|
6822
6862
|
const compileRulesFactory = (init, label2) => {
|
|
6823
6863
|
const args = init.arguments;
|
|
6824
|
-
const
|
|
6864
|
+
const arg0 = args[0];
|
|
6865
|
+
const arg1 = args[1];
|
|
6866
|
+
const optionsFirst = arg0?.type === "ObjectExpression";
|
|
6867
|
+
const factoryArg = optionsFirst ? arg1 : arg0;
|
|
6825
6868
|
if (!factoryArg) {
|
|
6826
6869
|
warn(init.start, `${label2}: rules() needs a factory argument`);
|
|
6827
6870
|
return null;
|
|
@@ -6831,16 +6874,23 @@ function transformMacro(code, id, moduleAliases = /* @__PURE__ */ new Set([PARSE
|
|
|
6831
6874
|
warn(init.start, `${label2}: rules(...) factory isn't statically evaluable`);
|
|
6832
6875
|
return null;
|
|
6833
6876
|
}
|
|
6834
|
-
const
|
|
6877
|
+
const optionsArg = optionsFirst ? arg0 : arg1;
|
|
6878
|
+
const triviaValue = optionsArg?.type === "ObjectExpression" ? (optionsArg.properties ?? []).find(
|
|
6879
|
+
(p) => p.key?.name === "trivia"
|
|
6880
|
+
)?.value : void 0;
|
|
6881
|
+
const gTrivia = triviaValue ? evaluateExpr(triviaValue, scope, code, []) : void 0;
|
|
6882
|
+
const compiled = compileRuleMap([...ruleMap], gTrivia ? { trivia: gTrivia } : void 0);
|
|
6835
6883
|
if (!compiled) {
|
|
6836
6884
|
warn(init.start, `${label2}: rule map couldn't be inlined`);
|
|
6837
6885
|
return null;
|
|
6838
6886
|
}
|
|
6839
|
-
return { replacement: compiled.replacement, ruleMap };
|
|
6887
|
+
return { replacement: compiled.replacement, ruleMap, ...gTrivia ? { trivia: gTrivia } : {} };
|
|
6840
6888
|
};
|
|
6841
6889
|
const isRulesCall = (init) => init.type === "CallExpression" && init.callee.type === "Identifier" && init.callee.name === "rules";
|
|
6842
6890
|
const isComposeCall = (init) => init.type === "CallExpression" && init.callee.type === "Identifier" && init.callee.name === "compose";
|
|
6891
|
+
const isPickCall = (init) => init.type === "CallExpression" && init.callee.type === "Identifier" && init.callee.name === "pick";
|
|
6843
6892
|
const localRuleMaps = /* @__PURE__ */ new Map();
|
|
6893
|
+
const localGrammarTrivia = /* @__PURE__ */ new Map();
|
|
6844
6894
|
const nsFor = (label2) => `_${createHash("sha1").update(`${id}#${label2}`).digest("hex").slice(0, 8)}_`;
|
|
6845
6895
|
const stripIndent = (s) => s.replace(/\n[ \t]+/g, "\n");
|
|
6846
6896
|
const serializePieces = (p) => {
|
|
@@ -6854,7 +6904,8 @@ function transformMacro(code, id, moduleAliases = /* @__PURE__ */ new Set([PARSE
|
|
|
6854
6904
|
const serializeItem = (it) => isSpread(it) ? `...(${it.__spreadLocal}[Symbol.for('parseman.composedPieces')] ?? [])` : isIR(it) ? `{ ns: ${JSON.stringify(it.ns)}, ir: ${JSON.stringify(it.ir)} }` : serializePieces(it);
|
|
6855
6905
|
const serializeList = (list) => `[${list.map(serializeItem).join(", ")}]`;
|
|
6856
6906
|
const withCarriedPieces = (grammarExpr, list) => `/* @__PURE__ */ Object.defineProperty(${grammarExpr}, Symbol.for('parseman.composedPieces'), { value: ${serializeList(list)}, enumerable: false })`;
|
|
6857
|
-
const
|
|
6907
|
+
const localComposedCarried = /* @__PURE__ */ new Map();
|
|
6908
|
+
const localComposedTrivia = /* @__PURE__ */ new Map();
|
|
6858
6909
|
const importedPiecesCache = /* @__PURE__ */ new Map();
|
|
6859
6910
|
const resolveModulePieces = (file, exportName, seen) => {
|
|
6860
6911
|
const mod = parseModuleCached(file);
|
|
@@ -6888,7 +6939,7 @@ function transformMacro(code, id, moduleAliases = /* @__PURE__ */ new Set([PARSE
|
|
|
6888
6939
|
}
|
|
6889
6940
|
try {
|
|
6890
6941
|
const list = new Function(...stubNames, `return (${literal2})`)(...stubVals);
|
|
6891
|
-
return list
|
|
6942
|
+
return list;
|
|
6892
6943
|
} catch {
|
|
6893
6944
|
return null;
|
|
6894
6945
|
}
|
|
@@ -6908,32 +6959,108 @@ function transformMacro(code, id, moduleAliases = /* @__PURE__ */ new Set([PARSE
|
|
|
6908
6959
|
importedPiecesCache.set(localName, result2);
|
|
6909
6960
|
return result2;
|
|
6910
6961
|
};
|
|
6911
|
-
const
|
|
6962
|
+
const materializeCarried = (items, composing) => {
|
|
6963
|
+
const out = [];
|
|
6964
|
+
for (const it of items) {
|
|
6965
|
+
if (isSpread(it)) {
|
|
6966
|
+
for (const p of importedPieces(it.__spreadLocal) ?? []) out.push(materializePiece(p, composing));
|
|
6967
|
+
} else if (isIR(it)) {
|
|
6968
|
+
out.push(materializePiece(it, composing));
|
|
6969
|
+
} else {
|
|
6970
|
+
out.push(it);
|
|
6971
|
+
}
|
|
6972
|
+
}
|
|
6973
|
+
return out;
|
|
6974
|
+
};
|
|
6975
|
+
const localCarried = (rm, label2, composing) => {
|
|
6912
6976
|
const entries = [...rm];
|
|
6913
6977
|
const ns = nsFor(label2);
|
|
6914
|
-
const p = compileLinkable(entries, ns);
|
|
6915
|
-
if (!p) return null;
|
|
6916
6978
|
const ir = serializeRuleMap(entries);
|
|
6917
|
-
|
|
6979
|
+
if (ir) return { carried: [{ ns, ir }] };
|
|
6980
|
+
const p = compileLinkable(entries, ns, composing ? { trivia: composing } : void 0);
|
|
6981
|
+
return p ? { carried: [p] } : null;
|
|
6918
6982
|
};
|
|
6919
|
-
const argPieces = (arg, label2) => {
|
|
6983
|
+
const argPieces = (arg, label2, composing) => {
|
|
6984
|
+
if (isPickCall(arg)) {
|
|
6985
|
+
const pargs = arg.arguments;
|
|
6986
|
+
const inner = pargs[0];
|
|
6987
|
+
const namesArg = pargs[1];
|
|
6988
|
+
if (!inner || namesArg?.type !== "ArrayExpression") return null;
|
|
6989
|
+
const names = [];
|
|
6990
|
+
for (const el of namesArg.elements ?? []) {
|
|
6991
|
+
const v2 = el?.value;
|
|
6992
|
+
if ((el?.type === "Literal" || el?.type === "StringLiteral") && typeof v2 === "string") names.push(v2);
|
|
6993
|
+
else return null;
|
|
6994
|
+
}
|
|
6995
|
+
const innerArg = argPieces(inner, `${label2}_pick`);
|
|
6996
|
+
if (!innerArg) return null;
|
|
6997
|
+
try {
|
|
6998
|
+
return { carried: pickPieces(materializeCarried(innerArg.carried, ownTrivia(inner)), names) };
|
|
6999
|
+
} catch (e) {
|
|
7000
|
+
warn(arg.start, `pick(): ${e.message}`);
|
|
7001
|
+
return null;
|
|
7002
|
+
}
|
|
7003
|
+
}
|
|
6920
7004
|
if (isRulesCall(arg)) {
|
|
6921
|
-
const
|
|
7005
|
+
const rulesArgs = arg.arguments;
|
|
7006
|
+
const a0 = rulesArgs[0];
|
|
7007
|
+
const a1 = rulesArgs[1];
|
|
7008
|
+
const optionsFirst = a0?.type === "ObjectExpression";
|
|
7009
|
+
const factory = optionsFirst ? a1 : a0;
|
|
6922
7010
|
const rm = factory ? evaluateParserFactory(factory, scope, code, []) : null;
|
|
6923
|
-
return rm ?
|
|
7011
|
+
return rm ? localCarried(rm, label2, composing) : null;
|
|
6924
7012
|
}
|
|
6925
7013
|
if (arg.type === "Identifier") {
|
|
6926
7014
|
const name = arg.name;
|
|
6927
7015
|
const rm = localRuleMaps.get(name);
|
|
6928
|
-
if (rm) return
|
|
6929
|
-
const composed =
|
|
6930
|
-
if (composed) return {
|
|
7016
|
+
if (rm) return localCarried(rm, label2, composing);
|
|
7017
|
+
const composed = localComposedCarried.get(name);
|
|
7018
|
+
if (composed) return { carried: composed };
|
|
6931
7019
|
const pieces = importedPieces(name);
|
|
6932
7020
|
if (!pieces) return null;
|
|
6933
|
-
return importBindings.has(name) ? {
|
|
7021
|
+
return { carried: importBindings.has(name) ? [{ __spreadLocal: name }] : [...pieces] };
|
|
6934
7022
|
}
|
|
6935
7023
|
return null;
|
|
6936
7024
|
};
|
|
7025
|
+
const rulesCallTrivia = (el) => {
|
|
7026
|
+
const rulesArgs = el.arguments;
|
|
7027
|
+
const a0 = rulesArgs[0];
|
|
7028
|
+
const a1 = rulesArgs[1];
|
|
7029
|
+
const optExpr = a0?.type === "ObjectExpression" ? a0 : a1?.type === "ObjectExpression" ? a1 : void 0;
|
|
7030
|
+
const triviaProp = (optExpr?.properties ?? []).find(
|
|
7031
|
+
(p) => p.key?.name === "trivia"
|
|
7032
|
+
);
|
|
7033
|
+
if (!triviaProp?.value) return void 0;
|
|
7034
|
+
return evaluateExpr(triviaProp.value, scope, code, []) ?? void 0;
|
|
7035
|
+
};
|
|
7036
|
+
const composingTrivia = (elements) => {
|
|
7037
|
+
for (let i = elements.length - 1; i >= 0; i--) {
|
|
7038
|
+
const el = elements[i];
|
|
7039
|
+
if (!el) continue;
|
|
7040
|
+
if (isRulesCall(el)) {
|
|
7041
|
+
const t = rulesCallTrivia(el);
|
|
7042
|
+
if (t) return t;
|
|
7043
|
+
continue;
|
|
7044
|
+
}
|
|
7045
|
+
if (el.type === "Identifier") {
|
|
7046
|
+
const t = localGrammarTrivia.get(el.name);
|
|
7047
|
+
if (t) return t;
|
|
7048
|
+
}
|
|
7049
|
+
}
|
|
7050
|
+
return void 0;
|
|
7051
|
+
};
|
|
7052
|
+
const ownTrivia = (arg) => {
|
|
7053
|
+
if (isRulesCall(arg)) return rulesCallTrivia(arg);
|
|
7054
|
+
if (isPickCall(arg)) {
|
|
7055
|
+
const inner = arg.arguments[0];
|
|
7056
|
+
return inner ? ownTrivia(inner) : void 0;
|
|
7057
|
+
}
|
|
7058
|
+
if (arg.type === "Identifier") {
|
|
7059
|
+
const name = arg.name;
|
|
7060
|
+
return localGrammarTrivia.get(name) ?? localComposedTrivia.get(name);
|
|
7061
|
+
}
|
|
7062
|
+
return void 0;
|
|
7063
|
+
};
|
|
6937
7064
|
const compileComposeCall = (init) => {
|
|
6938
7065
|
const args = init.arguments;
|
|
6939
7066
|
const arr = args[0];
|
|
@@ -6942,21 +7069,19 @@ function transformMacro(code, id, moduleAliases = /* @__PURE__ */ new Set([PARSE
|
|
|
6942
7069
|
return null;
|
|
6943
7070
|
}
|
|
6944
7071
|
const elements = arr.elements;
|
|
6945
|
-
const
|
|
7072
|
+
const composing = composingTrivia(elements);
|
|
6946
7073
|
const carried = [];
|
|
6947
7074
|
for (let i = 0; i < elements.length; i++) {
|
|
6948
|
-
const r = argPieces(elements[i], `compose${init.start}_${i}
|
|
7075
|
+
const r = argPieces(elements[i], `compose${init.start}_${i}`, composing);
|
|
6949
7076
|
if (!r) {
|
|
6950
7077
|
warn(init.start, `compose(): argument ${i} isn't a build-resolvable grammar; falling back to runtime`);
|
|
6951
7078
|
return null;
|
|
6952
7079
|
}
|
|
6953
|
-
|
|
6954
|
-
if (r.spreadLocal) carried.push({ __spreadLocal: r.spreadLocal });
|
|
6955
|
-
else if (r.ir) carried.push(r.ir);
|
|
6956
|
-
else carried.push(...r.pieces);
|
|
7080
|
+
carried.push(...r.carried);
|
|
6957
7081
|
}
|
|
7082
|
+
const pieces = materializeCarried(carried, composing);
|
|
6958
7083
|
try {
|
|
6959
|
-
return { replacement: emitFusedSource(pieces),
|
|
7084
|
+
return { replacement: emitFusedSource(pieces), carried, ...composing ? { trivia: composing } : {} };
|
|
6960
7085
|
} catch (e) {
|
|
6961
7086
|
warn(init.start, `compose(): ${e.message}; falling back to runtime`);
|
|
6962
7087
|
return null;
|
|
@@ -7041,6 +7166,7 @@ function transformMacro(code, id, moduleAliases = /* @__PURE__ */ new Set([PARSE
|
|
|
7041
7166
|
const compiledRules = compileRulesFactory(init, varName);
|
|
7042
7167
|
if (!compiledRules) continue;
|
|
7043
7168
|
localRuleMaps.set(varName, compiledRules.ruleMap);
|
|
7169
|
+
if (compiledRules.trivia) localGrammarTrivia.set(varName, compiledRules.trivia);
|
|
7044
7170
|
let replacement = compiledRules.replacement;
|
|
7045
7171
|
if (exportPrefix) {
|
|
7046
7172
|
const ns = nsFor(varName);
|
|
@@ -7056,7 +7182,8 @@ function transformMacro(code, id, moduleAliases = /* @__PURE__ */ new Set([PARSE
|
|
|
7056
7182
|
if (isComposeCall(init)) {
|
|
7057
7183
|
const fused = compileComposeCall(init);
|
|
7058
7184
|
if (!fused) continue;
|
|
7059
|
-
|
|
7185
|
+
localComposedCarried.set(varName, fused.carried);
|
|
7186
|
+
if (fused.trivia) localComposedTrivia.set(varName, fused.trivia);
|
|
7060
7187
|
const replacement = exportPrefix ? withCarriedPieces(fused.replacement, fused.carried) : fused.replacement;
|
|
7061
7188
|
replacements.push({ start: init.start, end: init.end, replacement });
|
|
7062
7189
|
continue;
|