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.
@@ -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,CAynB7B"}
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"}
@@ -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(factory) {
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]) => ({ key, rule, r: emit(rule, ctx, "_pos") }));
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
- ...[...new Set(contributingPieces.flatMap((p) => p.prelude))],
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 factoryArg = args[0];
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 compiled = compileRuleMap([...ruleMap]);
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 localComposedPieces = /* @__PURE__ */ new Map();
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.map(materializePiece);
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 localArg = (rm, label2) => {
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
- return ir ? { pieces: [p], ir: { ns, ir } } : { pieces: [p] };
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 factory = arg.arguments[0];
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 ? localArg(rm, label2) : null;
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 localArg(rm, label2);
6929
- const composed = localComposedPieces.get(name);
6930
- if (composed) return { pieces: composed };
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) ? { pieces, spreadLocal: name } : { pieces };
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 pieces = [];
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
- pieces.push(...r.pieces);
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), pieces, carried };
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
- localComposedPieces.set(varName, fused.pieces);
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;