@traqula/core 0.0.23 → 0.0.25

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 (75) hide show
  1. package/README.md +2 -0
  2. package/dist/cjs/lib/AstCoreFactory.js +181 -149
  3. package/dist/cjs/lib/AstCoreFactory.js.map +1 -0
  4. package/dist/cjs/lib/generator-builder/builderTypes.js +2 -15
  5. package/dist/cjs/lib/generator-builder/builderTypes.js.map +1 -0
  6. package/dist/cjs/lib/generator-builder/dynamicGenerator.js +209 -200
  7. package/dist/cjs/lib/generator-builder/dynamicGenerator.js.map +1 -0
  8. package/dist/cjs/lib/generator-builder/generatorBuilder.js +103 -117
  9. package/dist/cjs/lib/generator-builder/generatorBuilder.js.map +1 -0
  10. package/dist/cjs/lib/generator-builder/generatorTypes.js +2 -15
  11. package/dist/cjs/lib/generator-builder/generatorTypes.js.map +1 -0
  12. package/dist/cjs/lib/index.js +39 -57
  13. package/dist/cjs/lib/index.js.map +1 -0
  14. package/dist/cjs/lib/indirection-builder/IndirBuilder.js +63 -85
  15. package/dist/cjs/lib/indirection-builder/IndirBuilder.js.map +1 -0
  16. package/dist/cjs/lib/indirection-builder/dynamicIndirected.js +28 -50
  17. package/dist/cjs/lib/indirection-builder/dynamicIndirected.js.map +1 -0
  18. package/dist/cjs/lib/indirection-builder/helpers.js +11 -31
  19. package/dist/cjs/lib/indirection-builder/helpers.js.map +1 -0
  20. package/dist/cjs/lib/lexer-builder/LexerBuilder.js +92 -114
  21. package/dist/cjs/lib/lexer-builder/LexerBuilder.js.map +1 -0
  22. package/dist/cjs/lib/parser-builder/builderTypes.js +2 -15
  23. package/dist/cjs/lib/parser-builder/builderTypes.js.map +1 -0
  24. package/dist/cjs/lib/parser-builder/dynamicParser.js +116 -136
  25. package/dist/cjs/lib/parser-builder/dynamicParser.js.map +1 -0
  26. package/dist/cjs/lib/parser-builder/parserBuilder.js +167 -169
  27. package/dist/cjs/lib/parser-builder/parserBuilder.js.map +1 -0
  28. package/dist/cjs/lib/parser-builder/ruleDefTypes.js +2 -15
  29. package/dist/cjs/lib/parser-builder/ruleDefTypes.js.map +1 -0
  30. package/dist/cjs/lib/transformers/TransformerObject.js +196 -198
  31. package/dist/cjs/lib/transformers/TransformerObject.js.map +1 -0
  32. package/dist/cjs/lib/transformers/TransformerSubTyped.js +110 -141
  33. package/dist/cjs/lib/transformers/TransformerSubTyped.js.map +1 -0
  34. package/dist/cjs/lib/transformers/TransformerTyped.js +87 -120
  35. package/dist/cjs/lib/transformers/TransformerTyped.js.map +1 -0
  36. package/dist/cjs/lib/types.js +2 -15
  37. package/dist/cjs/lib/types.js.map +1 -0
  38. package/dist/cjs/lib/utils.js +20 -34
  39. package/dist/cjs/lib/utils.js.map +1 -0
  40. package/dist/esm/lib/AstCoreFactory.d.ts +19 -7
  41. package/dist/esm/lib/AstCoreFactory.js +50 -5
  42. package/dist/esm/lib/AstCoreFactory.js.map +1 -1
  43. package/dist/esm/lib/generator-builder/dynamicGenerator.d.ts +5 -0
  44. package/dist/esm/lib/generator-builder/dynamicGenerator.js +20 -0
  45. package/dist/esm/lib/generator-builder/dynamicGenerator.js.map +1 -1
  46. package/dist/esm/lib/parser-builder/dynamicParser.js +1 -0
  47. package/dist/esm/lib/parser-builder/dynamicParser.js.map +1 -1
  48. package/dist/esm/lib/parser-builder/parserBuilder.js +2 -2
  49. package/dist/esm/lib/parser-builder/parserBuilder.js.map +1 -1
  50. package/dist/esm/lib/transformers/TransformerObject.d.ts +1 -1
  51. package/dist/esm/lib/transformers/TransformerObject.js.map +1 -1
  52. package/dist/esm/lib/transformers/TransformerSubTyped.d.ts +31 -22
  53. package/dist/esm/lib/transformers/TransformerSubTyped.js +30 -40
  54. package/dist/esm/lib/transformers/TransformerSubTyped.js.map +1 -1
  55. package/dist/esm/lib/transformers/TransformerTyped.d.ts +24 -20
  56. package/dist/esm/lib/transformers/TransformerTyped.js +23 -35
  57. package/dist/esm/lib/transformers/TransformerTyped.js.map +1 -1
  58. package/dist/esm/lib/types.d.ts +67 -5
  59. package/dist/esm/lib/types.js.map +1 -1
  60. package/dist/esm/lib/utils.d.ts +10 -0
  61. package/dist/esm/lib/utils.js +7 -0
  62. package/dist/esm/lib/utils.js.map +1 -1
  63. package/package.json +9 -9
  64. package/dist/cjs/test/generatorBuilder/generatorBuilder.types.test.js +0 -30
  65. package/dist/cjs/test/grammar-builder/parserBuilder.types.test.js +0 -27
  66. package/dist/cjs/test/transformer.test.js +0 -82
  67. package/dist/esm/test/generatorBuilder/generatorBuilder.types.test.d.ts +0 -1
  68. package/dist/esm/test/generatorBuilder/generatorBuilder.types.test.js +0 -38
  69. package/dist/esm/test/generatorBuilder/generatorBuilder.types.test.js.map +0 -1
  70. package/dist/esm/test/grammar-builder/parserBuilder.types.test.d.ts +0 -1
  71. package/dist/esm/test/grammar-builder/parserBuilder.types.test.js +0 -38
  72. package/dist/esm/test/grammar-builder/parserBuilder.types.test.js.map +0 -1
  73. package/dist/esm/test/transformer.test.d.ts +0 -1
  74. package/dist/esm/test/transformer.test.js +0 -82
  75. package/dist/esm/test/transformer.test.js.map +0 -1
@@ -1,207 +1,216 @@
1
1
  "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var dynamicGenerator_exports = {};
20
- __export(dynamicGenerator_exports, {
21
- DynamicGenerator: () => DynamicGenerator
22
- });
23
- module.exports = __toCommonJS(dynamicGenerator_exports);
24
- var import_AstCoreFactory = require("../AstCoreFactory.js");
25
- var import_utils = require("../utils.js");
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DynamicGenerator = void 0;
4
+ const AstCoreFactory_js_1 = require("../AstCoreFactory.js");
5
+ const utils_js_1 = require("../utils.js");
26
6
  class DynamicGenerator {
27
- rules;
28
- factory = new import_AstCoreFactory.AstCoreFactory();
29
- __context = void 0;
30
- origSource = "";
31
- generatedUntil = 0;
32
- toEnsure = [];
33
- /**
34
- * Should not contain empty strings
35
- * @protected
36
- */
37
- stringBuilder = [];
38
- constructor(rules) {
39
- this.rules = rules;
40
- for (const rule of Object.values(rules)) {
41
- this[rule.name] = ((input, context, args) => {
42
- this.stringBuilder.length = 0;
43
- this.origSource = context.origSource;
44
- this.generatedUntil = context?.offset ?? 0;
45
- this.setContext(context);
46
- this.subrule(rule, input, args);
47
- this.catchup(this.origSource.length);
48
- return this.stringBuilder.join("");
49
- });
50
- }
51
- }
52
- setContext(context) {
53
- this.__context = context;
54
- }
55
- getSafeContext() {
56
- return this.__context;
57
- }
58
- subrule = (cstDef, ast, ...arg) => {
59
- const def = this.rules[cstDef.name];
60
- if (!def) {
61
- throw new Error(`Rule ${cstDef.name} not found`);
62
- }
63
- const generate = () => def.gImpl({
64
- SUBRULE: this.subrule,
65
- PRINT: this.print,
66
- ENSURE: this.ensure,
67
- ENSURE_EITHER: this.ensureEither,
68
- NEW_LINE: this.newLine,
69
- HANDLE_LOC: this.handleLoc,
70
- CATCHUP: this.catchup,
71
- PRINT_WORD: this.printWord,
72
- PRINT_WORDS: this.printWords,
73
- PRINT_ON_EMPTY: this.printOnEmpty,
74
- PRINT_ON_OWN_LINE: this.printOnOwnLine
75
- })(ast, this.getSafeContext(), ...arg);
76
- if (this.factory.isLocalized(ast)) {
77
- this.handleLoc(ast, generate);
78
- } else {
79
- generate();
80
- }
81
- };
82
- handleLoc = (localized, handle) => {
83
- if (this.factory.isSourceLocationNoMaterialize(localized.loc)) {
84
- return;
85
- }
86
- if (this.factory.isSourceLocationStringReplace(localized.loc)) {
87
- this.catchup(localized.loc.start);
88
- this.print(localized.loc.newSource);
89
- this.generatedUntil = localized.loc.end;
90
- return;
91
- }
92
- if (this.factory.isSourceLocationNodeReplace(localized.loc)) {
93
- this.catchup(localized.loc.start);
94
- this.generatedUntil = localized.loc.end;
95
- }
96
- if (this.factory.isSourceLocationSource(localized.loc)) {
97
- this.catchup(localized.loc.start);
98
- }
99
- const ret = handle();
100
- if (this.factory.isSourceLocationSource(localized.loc)) {
101
- this.catchup(localized.loc.end);
102
- }
103
- return ret;
104
- };
105
- catchup = (until) => {
106
- const start = this.generatedUntil;
107
- if (start < until) {
108
- this.print(this.origSource.slice(start, until));
109
- }
110
- this.generatedUntil = Math.max(this.generatedUntil, until);
111
- };
112
- handeEnsured(toPrint) {
113
- for (const callBack of this.toEnsure) {
114
- callBack(toPrint);
115
- }
116
- this.toEnsure.length = 0;
117
- }
118
- print = (...args) => {
119
- const joined = args.join("");
120
- this.handeEnsured(joined);
121
- this.stringBuilder.push(joined);
122
- };
123
- doesEndWith(subsStr) {
124
- const len = subsStr.length;
125
- let temp = "";
126
- while (temp.length < len && this.stringBuilder.length > 0) {
127
- temp = this.stringBuilder.pop() + temp;
128
- }
129
- this.stringBuilder.push(temp);
130
- return temp.endsWith(subsStr);
131
- }
132
- ensure = (...args) => {
133
- const toEnsure = args.join("");
134
- if (!this.doesEndWith(toEnsure)) {
135
- this.toEnsure.push((willPrint) => {
136
- if (!willPrint.startsWith(toEnsure) && !this.doesEndWith(toEnsure)) {
137
- this.stringBuilder.push(toEnsure);
138
- }
139
- });
140
- }
141
- };
142
- ensureEither = (...args) => {
143
- if (args.length === 1) {
144
- this.ensure(...args);
145
- } else if (args.length > 1 && // Not already matched?
146
- !args.some((subStr) => this.doesEndWith(subStr))) {
147
- this.toEnsure.push((willPrint) => {
148
- if (!args.some((subStr) => willPrint.startsWith(subStr)) && !args.some((subStr) => this.doesEndWith(subStr))) {
149
- this.stringBuilder.push(args[0]);
150
- }
151
- });
152
- }
153
- };
154
- pruneEndingBlanks() {
155
- let temp = "";
156
- while (/^[ \t]*$/u.test(temp) && this.stringBuilder.length > 0) {
157
- temp = this.stringBuilder.pop() + temp;
7
+ rules;
8
+ factory = new AstCoreFactory_js_1.AstCoreFactory();
9
+ __context = undefined;
10
+ origSource = '';
11
+ handledInlineSource;
12
+ generatedUntil = 0;
13
+ toEnsure = [];
14
+ /**
15
+ * Should not contain empty strings
16
+ * @protected
17
+ */
18
+ stringBuilder = [];
19
+ constructor(rules) {
20
+ this.rules = rules;
21
+ // eslint-disable-next-line ts/no-unnecessary-type-assertion
22
+ for (const rule of Object.values(rules)) {
23
+ // Define function implementation
24
+ this[rule.name] =
25
+ ((input, context, args) => {
26
+ this.stringBuilder.length = 0;
27
+ this.origSource = context.origSource;
28
+ this.generatedUntil = context?.offset ?? 0;
29
+ this.setContext(context);
30
+ this.subrule(rule, input, args);
31
+ this.catchup(this.origSource.length);
32
+ return this.stringBuilder.join('');
33
+ });
34
+ }
158
35
  }
159
- this.print(temp.trimEnd());
160
- }
161
- newLine = (arg) => {
162
- const indentation = this.getSafeContext()[import_utils.traqulaIndentation] ?? 0;
163
- if (indentation === -1) {
164
- return;
36
+ setContext(context) {
37
+ this.__context = context;
165
38
  }
166
- const force = arg?.force ?? false;
167
- this.pruneEndingBlanks();
168
- if (force) {
169
- this.print("\n", " ".repeat(indentation));
170
- } else {
171
- let temp = "";
172
- while (!temp.includes("\n") && this.stringBuilder.length > 0) {
173
- temp = this.stringBuilder.pop() + temp;
174
- }
175
- if (/\n[ \t]*$/u.test(temp)) {
176
- temp = temp.replace(/\n[ \t]*$/u, `
177
- ${" ".repeat(indentation)}`);
178
- this.print(temp);
179
- } else {
180
- this.print(temp, "\n", " ".repeat(indentation));
181
- }
39
+ getSafeContext() {
40
+ return this.__context;
182
41
  }
183
- };
184
- printWord = (...args) => {
185
- this.ensureEither(" ", "\n");
186
- this.print(...args);
187
- this.ensureEither(" ", "\n");
188
- };
189
- printWords = (...args) => {
190
- for (const arg of args) {
191
- this.printWord(arg);
42
+ subrule = (cstDef, ast, ...arg) => {
43
+ const def = this.rules[cstDef.name];
44
+ if (!def) {
45
+ throw new Error(`Rule ${cstDef.name} not found`);
46
+ }
47
+ const generate = () => def.gImpl({
48
+ SUBRULE: this.subrule,
49
+ PRINT: this.print,
50
+ ENSURE: this.ensure,
51
+ ENSURE_EITHER: this.ensureEither,
52
+ NEW_LINE: this.newLine,
53
+ HANDLE_LOC: this.handleLoc,
54
+ CATCHUP: this.catchup,
55
+ PRINT_WORD: this.printWord,
56
+ PRINT_WORDS: this.printWords,
57
+ PRINT_ON_EMPTY: this.printOnEmpty,
58
+ PRINT_ON_OWN_LINE: this.printOnOwnLine,
59
+ })(ast, this.getSafeContext(), ...arg);
60
+ if (this.factory.isLocalized(ast)) {
61
+ this.handleLoc(ast, generate);
62
+ }
63
+ else {
64
+ generate();
65
+ }
66
+ };
67
+ handleLoc = (localized, handle) => {
68
+ if (this.factory.isSourceLocationNoMaterialize(localized.loc)) {
69
+ return;
70
+ }
71
+ if (this.factory.isSourceLocationStringReplace(localized.loc)) {
72
+ this.catchup(localized.loc.start);
73
+ this.print(localized.loc.newSource);
74
+ this.generatedUntil = localized.loc.end;
75
+ return;
76
+ }
77
+ if (this.factory.isSourceLocationNodeReplace(localized.loc)) {
78
+ this.catchup(localized.loc.start);
79
+ this.generatedUntil = localized.loc.end;
80
+ }
81
+ if (this.factory.isSourceLocationSource(localized.loc)) {
82
+ this.catchup(localized.loc.start);
83
+ }
84
+ if (this.factory.isSourceLocationInlinedSource(localized.loc) && this.handledInlineSource !== localized.loc) {
85
+ // Calling handleLoc on the same AST multiple times should be the same as doing it once.
86
+ this.handledInlineSource = localized.loc;
87
+ this.catchup(localized.loc.start);
88
+ const origSource = this.origSource;
89
+ const origPointer = this.generatedUntil;
90
+ this.origSource = localized.loc.newSource;
91
+ this.generatedUntil = 0;
92
+ this.catchup(localized.loc.startOnNew);
93
+ this.handleLoc(localized.loc, handle);
94
+ this.generatedUntil = localized.loc.endOnNew;
95
+ this.catchup(this.origSource.length);
96
+ this.origSource = origSource;
97
+ this.generatedUntil = Math.max(origPointer, localized.loc.end);
98
+ return;
99
+ }
100
+ // If autoGenerate - do nothing
101
+ const ret = handle();
102
+ if (this.factory.isSourceLocationSource(localized.loc)) {
103
+ this.catchup(localized.loc.end);
104
+ }
105
+ return ret;
106
+ };
107
+ /**
108
+ * Catchup until, excluding
109
+ */
110
+ catchup = (until) => {
111
+ const start = this.generatedUntil;
112
+ if (start < until) {
113
+ this.print(this.origSource.slice(start, until));
114
+ }
115
+ this.generatedUntil = Math.max(this.generatedUntil, until);
116
+ };
117
+ handeEnsured(toPrint) {
118
+ for (const callBack of this.toEnsure) {
119
+ callBack(toPrint);
120
+ }
121
+ this.toEnsure.length = 0;
122
+ }
123
+ print = (...args) => {
124
+ const joined = args.join('');
125
+ this.handeEnsured(joined);
126
+ this.stringBuilder.push(joined);
127
+ };
128
+ doesEndWith(subsStr) {
129
+ const len = subsStr.length;
130
+ let temp = '';
131
+ while (temp.length < len && this.stringBuilder.length > 0) {
132
+ temp = this.stringBuilder.pop() + temp;
133
+ }
134
+ this.stringBuilder.push(temp);
135
+ return temp.endsWith(subsStr);
136
+ }
137
+ ensure = (...args) => {
138
+ // Check whether already present
139
+ const toEnsure = args.join('');
140
+ if (!this.doesEndWith(toEnsure)) {
141
+ this.toEnsure.push((willPrint) => {
142
+ if (!willPrint.startsWith(toEnsure) && !this.doesEndWith(toEnsure)) {
143
+ this.stringBuilder.push(toEnsure);
144
+ }
145
+ });
146
+ }
147
+ };
148
+ ensureEither = (...args) => {
149
+ if (args.length === 1) {
150
+ this.ensure(...args);
151
+ }
152
+ else if (args.length > 1 &&
153
+ // Not already matched?
154
+ !args.some(subStr => this.doesEndWith(subStr))) {
155
+ this.toEnsure.push((willPrint) => {
156
+ if (!args.some(subStr => willPrint.startsWith(subStr)) && !args.some(subStr => this.doesEndWith(subStr))) {
157
+ this.stringBuilder.push(args[0]);
158
+ }
159
+ });
160
+ }
161
+ };
162
+ pruneEndingBlanks() {
163
+ let temp = '';
164
+ while (/^[ \t]*$/u.test(temp) && this.stringBuilder.length > 0) {
165
+ temp = this.stringBuilder.pop() + temp;
166
+ }
167
+ this.print(temp.trimEnd());
192
168
  }
193
- };
194
- printOnEmpty = (...args) => {
195
- this.newLine();
196
- this.print(...args);
197
- };
198
- printOnOwnLine = (...args) => {
199
- this.newLine();
200
- this.print(...args);
201
- this.newLine();
202
- };
169
+ newLine = (arg) => {
170
+ const indentation = this.getSafeContext()[utils_js_1.traqulaIndentation] ?? 0;
171
+ if (indentation === -1) {
172
+ return;
173
+ }
174
+ const force = arg?.force ?? false;
175
+ this.pruneEndingBlanks();
176
+ if (force) {
177
+ this.print('\n', ' '.repeat(indentation));
178
+ }
179
+ else {
180
+ let temp = '';
181
+ while (!temp.includes('\n') && this.stringBuilder.length > 0) {
182
+ temp = this.stringBuilder.pop() + temp;
183
+ }
184
+ if (/\n[ \t]*$/u.test(temp)) {
185
+ // Pointer is on empty newline -> set correct indentation
186
+ temp = temp.replace(/\n[ \t]*$/u, `\n${' '.repeat(indentation)}`);
187
+ this.print(temp);
188
+ }
189
+ else {
190
+ // Pointer not on empty newline, print newline.
191
+ this.print(temp, '\n', ' '.repeat(indentation));
192
+ }
193
+ }
194
+ };
195
+ printWord = (...args) => {
196
+ this.ensureEither(' ', '\n');
197
+ this.print(...args);
198
+ this.ensureEither(' ', '\n');
199
+ };
200
+ printWords = (...args) => {
201
+ for (const arg of args) {
202
+ this.printWord(arg);
203
+ }
204
+ };
205
+ printOnEmpty = (...args) => {
206
+ this.newLine();
207
+ this.print(...args);
208
+ };
209
+ printOnOwnLine = (...args) => {
210
+ this.newLine();
211
+ this.print(...args);
212
+ this.newLine();
213
+ };
203
214
  }
204
- // Annotate the CommonJS export names for ESM import in node:
205
- 0 && (module.exports = {
206
- DynamicGenerator
207
- });
215
+ exports.DynamicGenerator = DynamicGenerator;
216
+ //# sourceMappingURL=dynamicGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamicGenerator.js","sourceRoot":"","sources":["../../../../lib/generator-builder/dynamicGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["import { AstCoreFactory } from '../AstCoreFactory.js';\nimport type { SourceLocationInlinedSource } from '../types.js';\nimport { traqulaIndentation } from '../utils.js';\nimport type { GenRuleMap } from './builderTypes.js';\nimport type { GeneratorRule, RuleDefArg } from './generatorTypes.js';\n\nexport class DynamicGenerator<Context, Names extends string, RuleDefs extends GenRuleMap<Names>> {\n protected readonly factory = new AstCoreFactory();\n protected __context: Context | undefined = undefined;\n protected origSource = '';\n protected handledInlineSource: SourceLocationInlinedSource | undefined;\n protected generatedUntil = 0;\n protected toEnsure: ((willPrint: string) => void)[] = [];\n /**\n * Should not contain empty strings\n * @protected\n */\n protected readonly stringBuilder: string[] = [];\n\n public constructor(protected rules: RuleDefs) {\n // eslint-disable-next-line ts/no-unnecessary-type-assertion\n for (const rule of <GeneratorRule[]> Object.values(rules)) {\n // Define function implementation\n this[<keyof (typeof this)> rule.name] =\n <any> ((input: any, context: Context & { origSource: string; offset?: number }, args: any) => {\n this.stringBuilder.length = 0;\n this.origSource = context.origSource;\n this.generatedUntil = context?.offset ?? 0;\n this.setContext(context);\n\n this.subrule(rule, input, args);\n\n this.catchup(this.origSource.length);\n\n return this.stringBuilder.join('');\n });\n }\n }\n\n public setContext(context: Context): void {\n this.__context = context;\n }\n\n protected getSafeContext(): Context & { [traqulaIndentation]?: number } {\n return <Context & { [traqulaIndentation]?: number }> this.__context;\n }\n\n protected readonly subrule: RuleDefArg['SUBRULE'] = (cstDef, ast, ...arg) => {\n const def = this.rules[<Names> cstDef.name];\n if (!def) {\n throw new Error(`Rule ${cstDef.name} not found`);\n }\n\n const generate = (): void => def.gImpl({\n SUBRULE: this.subrule,\n PRINT: this.print,\n ENSURE: this.ensure,\n ENSURE_EITHER: this.ensureEither,\n NEW_LINE: this.newLine,\n HANDLE_LOC: this.handleLoc,\n CATCHUP: this.catchup,\n\n PRINT_WORD: this.printWord,\n PRINT_WORDS: this.printWords,\n PRINT_ON_EMPTY: this.printOnEmpty,\n PRINT_ON_OWN_LINE: this.printOnOwnLine,\n })(ast, this.getSafeContext(), ...arg);\n\n if (this.factory.isLocalized(ast)) {\n this.handleLoc(ast, generate);\n } else {\n generate();\n }\n };\n\n protected readonly handleLoc: RuleDefArg['HANDLE_LOC'] = (localized, handle) => {\n if (this.factory.isSourceLocationNoMaterialize(localized.loc)) {\n return;\n }\n if (this.factory.isSourceLocationStringReplace(localized.loc)) {\n this.catchup(localized.loc.start);\n this.print(localized.loc.newSource);\n this.generatedUntil = localized.loc.end;\n return;\n }\n if (this.factory.isSourceLocationNodeReplace(localized.loc)) {\n this.catchup(localized.loc.start);\n this.generatedUntil = localized.loc.end;\n }\n if (this.factory.isSourceLocationSource(localized.loc)) {\n this.catchup(localized.loc.start);\n }\n if (this.factory.isSourceLocationInlinedSource(localized.loc) && this.handledInlineSource !== localized.loc) {\n // Calling handleLoc on the same AST multiple times should be the same as doing it once.\n this.handledInlineSource = localized.loc;\n this.catchup(localized.loc.start);\n const origSource = this.origSource;\n const origPointer = this.generatedUntil;\n this.origSource = localized.loc.newSource;\n this.generatedUntil = 0;\n this.catchup(localized.loc.startOnNew);\n\n this.handleLoc(localized.loc, handle);\n\n this.generatedUntil = localized.loc.endOnNew;\n this.catchup(this.origSource.length);\n this.origSource = origSource;\n this.generatedUntil = Math.max(origPointer, localized.loc.end);\n return;\n }\n // If autoGenerate - do nothing\n\n const ret = handle();\n\n if (this.factory.isSourceLocationSource(localized.loc)) {\n this.catchup(localized.loc.end);\n }\n return ret;\n };\n\n /**\n * Catchup until, excluding\n */\n protected readonly catchup: RuleDefArg['CATCHUP'] = (until) => {\n const start = this.generatedUntil;\n if (start < until) {\n this.print(this.origSource.slice(start, until));\n }\n this.generatedUntil = Math.max(this.generatedUntil, until);\n };\n\n private handeEnsured(toPrint: string): void {\n for (const callBack of this.toEnsure) {\n callBack(toPrint);\n }\n this.toEnsure.length = 0;\n }\n\n protected readonly print: RuleDefArg['PRINT'] = (...args) => {\n const joined = args.join('');\n this.handeEnsured(joined);\n this.stringBuilder.push(joined);\n };\n\n private doesEndWith(subsStr: string): boolean {\n const len = subsStr.length;\n let temp = '';\n while (temp.length < len && this.stringBuilder.length > 0) {\n temp = this.stringBuilder.pop() + temp;\n }\n this.stringBuilder.push(temp);\n return temp.endsWith(subsStr);\n }\n\n protected readonly ensure: RuleDefArg['ENSURE'] = (...args) => {\n // Check whether already present\n const toEnsure = args.join('');\n if (!this.doesEndWith(toEnsure)) {\n this.toEnsure.push((willPrint) => {\n if (!willPrint.startsWith(toEnsure) && !this.doesEndWith(toEnsure)) {\n this.stringBuilder.push(toEnsure);\n }\n });\n }\n };\n\n protected readonly ensureEither: RuleDefArg['ENSURE_EITHER'] = (...args) => {\n if (args.length === 1) {\n this.ensure(...args);\n } else if (args.length > 1 &&\n // Not already matched?\n !args.some(subStr => this.doesEndWith(subStr))) {\n this.toEnsure.push((willPrint) => {\n if (!args.some(subStr => willPrint.startsWith(subStr)) && !args.some(subStr => this.doesEndWith(subStr))) {\n this.stringBuilder.push(args[0]);\n }\n });\n }\n };\n\n private pruneEndingBlanks(): void {\n let temp = '';\n while (/^[ \\t]*$/u.test(temp) && this.stringBuilder.length > 0) {\n temp = this.stringBuilder.pop() + temp;\n }\n this.print(temp.trimEnd());\n }\n\n protected readonly newLine: RuleDefArg['NEW_LINE'] = (arg) => {\n const indentation = this.getSafeContext()[traqulaIndentation] ?? 0;\n if (indentation === -1) {\n return;\n }\n const force = arg?.force ?? false;\n this.pruneEndingBlanks();\n if (force) {\n this.print('\\n', ' '.repeat(indentation));\n } else {\n let temp = '';\n while (!temp.includes('\\n') && this.stringBuilder.length > 0) {\n temp = this.stringBuilder.pop() + temp;\n }\n if (/\\n[ \\t]*$/u.test(temp)) {\n // Pointer is on empty newline -> set correct indentation\n temp = temp.replace(/\\n[ \\t]*$/u, `\\n${' '.repeat(indentation)}`);\n this.print(temp);\n } else {\n // Pointer not on empty newline, print newline.\n this.print(temp, '\\n', ' '.repeat(indentation));\n }\n }\n };\n\n private readonly printWord: RuleDefArg['PRINT_WORD'] = (...args) => {\n this.ensureEither(' ', '\\n');\n this.print(...args);\n this.ensureEither(' ', '\\n');\n };\n\n private readonly printWords: RuleDefArg['PRINT_WORD'] = (...args) => {\n for (const arg of args) {\n this.printWord(arg);\n }\n };\n\n private readonly printOnEmpty: RuleDefArg['PRINT_ON_EMPTY'] = (...args) => {\n this.newLine();\n this.print(...args);\n };\n\n private readonly printOnOwnLine: RuleDefArg['PRINT_ON_OWN_LINE'] = (...args) => {\n this.newLine();\n this.print(...args);\n this.newLine();\n };\n}\n"]}