@bablr/agast-vm-helpers 0.8.0 → 0.9.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/lib/builders.js CHANGED
@@ -1,11 +1,4 @@
1
- import {
2
- EmbeddedNode,
3
- EmbeddedMatcher,
4
- EmbeddedRegex,
5
- EmbeddedTag,
6
- EmbeddedObject,
7
- EmbeddedInstruction,
8
- } from './symbols.js';
1
+ import { Node, Matcher, Regex, Tag, EmbeddedObject, Instruction } from './symbols.js';
9
2
 
10
3
  const isObject = (val) => val !== null && typeof val === 'object';
11
4
 
@@ -22,27 +15,27 @@ export const buildEmbeddedObject = (obj) => {
22
15
 
23
16
  export const buildEmbeddedNode = (node) => {
24
17
  if (!isObject(node)) throw new Error();
25
- return freeze({ type: EmbeddedNode, value: freeze(node) });
18
+ return freeze({ type: Node, value: freeze(node) });
26
19
  };
27
20
 
28
21
  export const buildEmbeddedMatcher = (matcher) => {
29
22
  if (!isObject(matcher)) throw new Error();
30
- return freeze({ type: EmbeddedMatcher, value: matcher });
23
+ return freeze({ type: Matcher, value: matcher });
31
24
  };
32
25
 
33
26
  export const buildEmbeddedInstruction = (instr) => {
34
27
  if (!isObject(instr)) throw new Error();
35
- return freeze({ type: EmbeddedInstruction, value: instr });
28
+ return freeze({ type: Instruction, value: instr });
36
29
  };
37
30
 
38
31
  export const buildEmbeddedRegex = (re) => {
39
32
  if (!isObject(re)) throw new Error();
40
- return freeze({ type: EmbeddedRegex, value: re });
33
+ return freeze({ type: Regex, value: re });
41
34
  };
42
35
 
43
36
  export const buildEmbeddedTag = (tag) => {
44
37
  if (!isObject(tag)) throw new Error();
45
- return freeze({ type: EmbeddedTag, value: tag });
38
+ return freeze({ type: Tag, value: tag });
46
39
  };
47
40
 
48
41
  export const buildEffect = (value) => {
package/lib/deembed.js CHANGED
@@ -1,11 +1,4 @@
1
- import {
2
- EmbeddedNode,
3
- EmbeddedObject,
4
- EmbeddedTag,
5
- EmbeddedMatcher,
6
- EmbeddedRegex,
7
- EmbeddedInstruction,
8
- } from './symbols.js';
1
+ import { Node, EmbeddedObject, Tag, Matcher, Regex, Instruction } from './symbols.js';
9
2
 
10
3
  export const getEmbeddedObject = (expr) => {
11
4
  if (!expr) return expr;
@@ -15,30 +8,30 @@ export const getEmbeddedObject = (expr) => {
15
8
 
16
9
  export const getEmbeddedNode = (expr) => {
17
10
  if (!expr) return expr;
18
- if (expr.type !== EmbeddedNode) throw new Error();
11
+ if (expr.type !== Node) throw new Error();
19
12
  return expr.value;
20
13
  };
21
14
 
22
15
  export const getEmbeddedMatcher = (expr) => {
23
16
  if (!expr) return expr;
24
- if (expr.type !== EmbeddedMatcher) throw new Error();
17
+ if (expr.type !== Matcher) throw new Error();
25
18
  return expr.value;
26
19
  };
27
20
 
28
21
  export const getEmbeddedInstruction = (expr) => {
29
22
  if (!expr) return expr;
30
- if (expr.type !== EmbeddedInstruction) throw new Error();
23
+ if (expr.type !== Instruction) throw new Error();
31
24
  return expr.value;
32
25
  };
33
26
 
34
27
  export const getEmbeddedRegex = (expr) => {
35
28
  if (!expr) return expr;
36
- if (expr.type !== EmbeddedRegex) throw new Error();
29
+ if (expr.type !== Regex) throw new Error();
37
30
  return expr.value;
38
31
  };
39
32
 
40
33
  export const getEmbeddedTag = (expr) => {
41
- if (expr.type !== EmbeddedTag) throw new Error();
34
+ if (expr.type !== Tag) throw new Error();
42
35
  const tag = expr.value;
43
36
  return tag;
44
37
  };
package/lib/index.js CHANGED
@@ -2,16 +2,17 @@ import {
2
2
  sourceTextFor,
3
3
  getCooked,
4
4
  isNull,
5
- nodeFlags,
6
5
  isNullNode,
7
6
  buildStubNode,
8
7
  isFragmentNode,
9
8
  buildReferenceTag,
10
9
  getRoot,
11
10
  buildChild,
11
+ get,
12
+ list,
13
+ buildBounds,
12
14
  } from '@bablr/agast-helpers/tree';
13
- import * as btree from '@bablr/agast-helpers/btree';
14
- import * as sumtree from '@bablr/agast-helpers/children';
15
+ import * as Tags from '@bablr/agast-helpers/tags';
15
16
  import {
16
17
  buildGapTag,
17
18
  buildNullTag,
@@ -24,15 +25,22 @@ import {
24
25
  buildDoctypeTag,
25
26
  referenceFlags,
26
27
  buildProperty,
28
+ fragmentFlags,
29
+ buildBinding,
30
+ buildAttributeDefinition,
31
+ buildPropertyWrapper,
27
32
  } from '@bablr/agast-helpers/builders';
28
33
  import { buildEmbeddedMatcher, buildEmbeddedRegex } from './builders.js';
29
34
  import {
30
35
  AttributeDefinition,
36
+ CloseNodeTag,
31
37
  GapTag,
32
38
  InitializerTag,
33
39
  LiteralTag,
34
40
  NullTag,
41
+ OpenNodeTag,
35
42
  Property,
43
+ PropertyWrapper,
36
44
  } from './symbols.js';
37
45
  import { isStubNode } from '@bablr/agast-helpers/path';
38
46
 
@@ -64,103 +72,94 @@ export const shouldBranch = (effects) => {
64
72
  };
65
73
 
66
74
  export const reifyNodeFlags = (flags) => {
67
- let { tokenToken, hasGapToken, fragmentToken, coverFragmentToken } = flags.properties;
75
+ let tokenToken = get('tokenToken', flags);
76
+ let hasGapToken = get('hasGapToken', flags);
77
+ let fragmentToken = get('fragmentToken', flags);
78
+ let multiFragmentToken = get('multiFragmentToken', flags);
68
79
 
69
- return {
70
- token: !!(tokenToken && reifyExpression(tokenToken.node)),
71
- hasGap: !!(hasGapToken && reifyExpression(hasGapToken.node)),
72
- fragment: !!(fragmentToken && reifyExpression(fragmentToken.node)),
73
- cover: !!(coverFragmentToken && reifyExpression(coverFragmentToken.node)),
74
- };
80
+ let token = !!(tokenToken && reifyExpression(tokenToken));
81
+ let hasGap = !!(hasGapToken && reifyExpression(hasGapToken));
82
+ let fragment = !!(fragmentToken && reifyExpression(fragmentToken));
83
+ let cover = !!(fragment && !(multiFragmentToken && reifyExpression(multiFragmentToken)));
84
+
85
+ return { token, hasGap, fragment, cover };
75
86
  };
76
87
 
77
88
  export const reifyReferenceFlags = (flags) => {
78
- let { expressionToken, hasGapToken } = flags.properties;
89
+ let expressionToken = get('expressionToken', flags);
90
+ let hasGapToken = get('hasGapToken', flags);
79
91
 
80
92
  return {
81
- expression: !!(expressionToken && reifyExpression(expressionToken.node)),
82
- hasGap: !!(hasGapToken && reifyExpression(hasGapToken.node)),
93
+ expression: !!(expressionToken && reifyExpression(expressionToken)),
94
+ hasGap: !!(hasGapToken && reifyExpression(hasGapToken)),
83
95
  };
84
96
  };
85
97
 
86
- export const reifyProperties = (properties = { node: [] }) => {
87
- const built = {};
88
- for (const property of btree.traverse(properties.node)) {
89
- switch (property.node.type) {
90
- case Symbol.for('Property'): {
91
- let { reference, value: node } = property.node.properties;
92
-
93
- reference = reference ? reifyExpression(reference.node) : buildReferenceTag('.');
94
- node = reifyExpression(node.node);
95
-
96
- let { name, isArray } = reference.value;
97
- if (name) {
98
- if (isArray) {
99
- built[name] ||= [];
100
- built[name].push({ reference, node });
101
- } else {
102
- built[name] = { reference, node };
103
- }
104
- }
105
- break;
106
- }
107
- }
108
- }
109
- return built;
110
- };
98
+ export const buildTags = (node) => {
99
+ let open = get('open', node);
111
100
 
112
- export const buildChildren = (node) => {
113
- let { open, children = [], close } = node.properties;
101
+ let children = buildChildren(list('children', node));
102
+ let openTag = reifyExpression(open);
103
+ let closeTag = buildCloseNodeTag();
114
104
 
115
- const selfClosing = !isNull(open.node.properties.selfClosingTagToken?.node);
116
- const { intrinsicValue } = open.node.properties;
117
- let built = [];
105
+ let literalValue = reifyExpression(get('literalValue', open));
118
106
 
119
- open = reifyExpression(open.node);
120
- close = reifyExpression(close?.node);
107
+ if (literalValue) {
108
+ children = Tags.fromValues([buildLiteralTag(literalValue)]);
109
+ }
110
+
111
+ return Tags.fromValues([openTag, children, closeTag]);
112
+ };
113
+
114
+ export const buildChildren = (children) => {
115
+ let built = Tags.fromValues([]);
121
116
 
122
- if (selfClosing) {
123
- built = sumtree.push(built, open);
124
- if (!isNull(intrinsicValue?.node)) {
125
- built = sumtree.push(built, buildLiteralTag(reifyExpression(intrinsicValue.node)));
117
+ for (const child of children) {
118
+ if ([AttributeDefinition, LiteralTag].includes(child.type)) {
119
+ built = Tags.push(built, reifyExpression(child));
120
+ continue;
126
121
  }
127
- built = sumtree.push(built, buildCloseNodeTag());
128
- } else {
129
- built = sumtree.push(built, open);
130
- for (const child of sumtree.traverse(children.node)) {
131
- if ([AttributeDefinition, LiteralTag].includes(child.node.type)) {
132
- built = sumtree.push(built, reifyExpression(child.node));
133
- continue;
134
- }
135
122
 
136
- if (child.node.type !== Symbol.for('Property')) throw new Error('umimplemented');
123
+ if (child.type !== Symbol.for('Property')) throw new Error('umimplemented');
137
124
 
138
- let { reference, binding, value } = child.node.properties;
125
+ let reference = get('reference', child);
126
+ let binding = get('binding', child);
127
+ let value = get('value', child);
139
128
 
140
- let referenceTag = reference ? reifyExpression(reference.node) : buildReferenceTag('.');
141
- let bindingTag = binding
142
- ? reifyExpression(binding.node)
143
- : buildBindingTag(isStubNode(value.node) ? null : []);
129
+ let referenceTag = reference ? reifyExpression(reference) : buildReferenceTag('.');
130
+ let bindingTag = binding
131
+ ? reifyExpression(binding)
132
+ : buildBindingTag(isStubNode(value) ? null : []);
144
133
 
145
- value = reifyExpression(value.node);
134
+ value = reifyExpression(value);
146
135
 
147
- if (value.type === NullTag || value.type === GapTag) {
148
- value = buildStubNode(value);
136
+ if (referenceTag.value.type === '_') {
137
+ for (let child of Tags.traverse(value.tags)) {
138
+ if (![OpenNodeTag, CloseNodeTag].includes(child.type)) built = Tags.push(built, child);
149
139
  }
140
+ continue;
141
+ }
150
142
 
151
- built = sumtree.push(built, referenceTag);
152
- if (value.type === InitializerTag) {
153
- built = sumtree.push(built, value);
154
- } else {
155
- built = sumtree.push(built, bindingTag);
156
- built = sumtree.push(
157
- built,
158
- buildChild(Property, buildProperty(referenceTag.value, buildBindingTag().value, value)),
159
- );
160
- }
143
+ if (value.type === NullTag || value.type === GapTag) {
144
+ value = buildStubNode(value);
161
145
  }
162
146
 
163
- built = sumtree.push(built, close);
147
+ built = Tags.push(built, referenceTag);
148
+ if (value.type === InitializerTag) {
149
+ built = Tags.push(built, value);
150
+ } else {
151
+ let property = buildProperty(referenceTag.value, bindingTag.value, value);
152
+ built = Tags.push(
153
+ built,
154
+ buildChild(
155
+ PropertyWrapper,
156
+ buildPropertyWrapper(
157
+ [referenceTag, bindingTag, buildChild(Property, property)],
158
+ property,
159
+ ),
160
+ ),
161
+ );
162
+ }
164
163
  }
165
164
 
166
165
  return built;
@@ -178,83 +177,95 @@ export const reifyExpression = (node) => {
178
177
 
179
178
  switch (node.type?.description || node.type) {
180
179
  case 'Document': {
181
- let { doctype, tree } = node.properties;
180
+ let doctype = get('doctype', node);
181
+ let tree = get('tree', node);
182
182
 
183
- doctype = reifyExpression(doctype.node);
184
- tree = reifyExpression(tree.node);
183
+ doctype = reifyExpression(doctype);
184
+ tree = reifyExpression(tree);
185
185
 
186
186
  let { attributes } = doctype.value;
187
- let { properties } = tree;
188
187
 
189
188
  return Object.freeze({
190
- flags: nodeFlags,
189
+ flags: fragmentFlags,
191
190
  type: null,
192
- children: sumtree.addAt(
193
- 0,
194
- buildChildren(node.properties.tree.node),
195
- buildDoctypeTag(attributes),
196
- ),
197
- properties,
191
+ bounds: tree.bounds,
192
+ tags: tree.tags,
198
193
  attributes,
199
194
  });
200
195
  }
201
196
 
202
197
  case 'Node': {
203
- let { open, children } = node.properties;
204
-
205
- open = reifyExpression(open.node);
198
+ let open = get('open', node);
206
199
 
207
- let { flags, type, attributes } = open.value;
200
+ let openTag = reifyExpression(open);
208
201
 
209
- const properties = reifyProperties(children);
202
+ let { flags, type, attributes } = openTag.value;
210
203
 
211
204
  return Object.freeze({
212
205
  flags,
213
206
  type,
214
- children: buildChildren(node),
215
- properties,
207
+ bounds: buildBounds(),
208
+ tags: buildTags(node),
216
209
  attributes,
217
210
  });
218
211
  }
219
212
 
220
213
  case 'DoctypeTag': {
221
- let { version, attributes } = node.properties;
214
+ let version = get('version', node);
215
+ let attributes = get('attributes', node);
216
+
222
217
  return buildDoctypeTag(
223
- attributes && reifyExpression(attributes.node),
224
- parseInt(sourceTextFor(version.node), 10),
218
+ attributes && reifyExpression(attributes),
219
+ parseInt(sourceTextFor(version), 10),
225
220
  );
226
221
  }
227
222
 
228
223
  case 'ReferenceTag': {
229
- let { type, name, arrayOperatorToken, flags } = node.properties;
230
-
231
- name = name && reifyExpression(name.node);
232
- type = type && reifyExpression(type.node);
233
- flags = freeze({ expression: !!flags?.expressionToken, hasGap: !!flags?.hasGapToken });
224
+ let type = get('type', node);
225
+ let name = get('name', node);
226
+ let arrayOperatorToken = get('arrayOperatorToken', node);
227
+ let flags = get('flags', node);
228
+
229
+ name = name && reifyExpression(name);
230
+ type = type && reifyExpression(type);
231
+ flags = freeze({
232
+ expression: !!(flags && get('expressionToken', flags)),
233
+ hasGap: !!(flags && get('hasGapToken', flags)),
234
+ });
234
235
 
235
- return buildReferenceTag(type, name, !isNull(arrayOperatorToken?.node), flags);
236
+ return buildReferenceTag(type, name, !isNull(arrayOperatorToken), flags);
236
237
  }
237
238
 
238
239
  case 'LiteralTag': {
239
- let { value } = node.properties;
240
-
241
- return buildLiteralTag(getCooked(value.node.properties.content.node));
240
+ return buildLiteralTag(getCooked(get(['value', 'content'], node)));
242
241
  }
243
242
 
244
243
  case 'Identifier': {
245
- return getCooked(node.properties.content.node);
244
+ return getCooked(get('content', node));
246
245
  }
247
246
 
248
247
  case 'IdentifierPath': {
249
- return node.properties.segments.node.map((segment) => reifyExpression(segment.node));
248
+ return [...list('segments', node)].map((segment) => reifyExpression(segment));
249
+ }
250
+
251
+ case 'AttributeDefinition': {
252
+ let path = get('path', node);
253
+ let value = get('value', node);
254
+
255
+ path = path && reifyExpression(path);
256
+ value = value && reifyExpression(value);
257
+
258
+ return buildAttributeDefinition(path, value);
250
259
  }
251
260
 
252
261
  case 'OpenNodeTag': {
253
- let { flags, type, attributes } = node.properties;
262
+ let flags = get('flags', node);
263
+ let type = get('type', node);
264
+ let attributes = get('attributes', node);
254
265
 
255
- flags = reifyNodeFlags(flags.node);
256
- type = reifyExpression(type?.node);
257
- attributes = reifyExpression(attributes?.node);
266
+ flags = reifyNodeFlags(flags);
267
+ type = reifyExpression(type);
268
+ attributes = reifyExpression(attributes);
258
269
 
259
270
  return buildOpenNodeTag(flags, type, attributes);
260
271
  }
@@ -264,12 +275,11 @@ export const reifyExpression = (node) => {
264
275
  }
265
276
 
266
277
  case 'Integer': {
267
- let { digits } = node.properties;
268
- return parseInt(digits.map((digit) => getCooked(digit.node)).join(''), 10);
278
+ return parseInt([...list('digits', node)].map((digit) => getCooked(digit)).join(''), 10);
269
279
  }
270
280
 
271
281
  case 'Infinity': {
272
- return getCooked(node.properties.sign.node) === '-' ? -Infinity : Infinity;
282
+ return getCooked(get('sign', node)) === '-' ? -Infinity : Infinity;
273
283
  }
274
284
 
275
285
  case 'Punctuator': {
@@ -283,7 +293,7 @@ export const reifyExpression = (node) => {
283
293
  return buildInitializerTag();
284
294
 
285
295
  case 'BindingTag':
286
- let { languagePath } = node.properties;
296
+ let languagePath = get('languagePath', node);
287
297
 
288
298
  return buildBindingTag(reifyExpression(languagePath));
289
299
 
@@ -294,74 +304,79 @@ export const reifyExpression = (node) => {
294
304
  return buildShiftTag();
295
305
 
296
306
  case 'String':
297
- return node.properties.content.node ? getCooked(node.properties.content.node) : '';
307
+ return get('content', node) ? getCooked(get('content', node)) : '';
298
308
 
299
309
  case 'SpamexString': {
300
- return buildEmbeddedMatcher(node.properties.content.node);
310
+ return buildEmbeddedMatcher(get('content', node));
301
311
  }
302
312
 
303
313
  case 'RegexString': {
304
- return buildEmbeddedRegex(node.properties.content.node);
314
+ return buildEmbeddedRegex(get('content', node));
305
315
  }
306
316
 
307
317
  case 'OpenNodeMatcher': {
308
- let { flags, type, attributes, intrinsicValue } = node.properties;
318
+ let flags = get('flags', node);
319
+ let type = get('type', node);
320
+ let attributes = get('attributes', node);
321
+ let literalValue = get('literalValue', node);
309
322
 
310
- flags = (flags && reifyNodeFlags(flags.node)) || {};
323
+ flags = (flags && reifyNodeFlags(flags)) || {};
311
324
  type =
312
- type.node.type === Symbol.for('String')
313
- ? getCooked(type.node.properties.content.node)
314
- : reifyExpression(type.node);
315
- attributes = attributes ? reifyExpression(attributes.node) : {};
316
- intrinsicValue = intrinsicValue && reifyExpression(intrinsicValue.node);
325
+ type.type === Symbol.for('String')
326
+ ? getCooked(get('content', type))
327
+ : reifyExpression(type);
328
+ attributes = attributes ? reifyExpression(attributes) : {};
329
+ literalValue = literalValue && reifyExpression(literalValue);
317
330
 
318
- return { flags, type, intrinsicValue, attributes };
331
+ return { flags, type, literalValue, attributes };
319
332
  }
320
333
 
321
334
  case 'FragmentMatcher': {
322
- let { flags } = node.properties;
335
+ let flags = get('flags', node);
323
336
 
324
- flags = (flags && reifyNodeFlags(flags.node)) || {};
337
+ flags = (flags && reifyNodeFlags(flags)) || {};
325
338
 
326
339
  return {
327
340
  flags,
328
341
  type: Symbol.for('@bablr/fragment'),
329
- intrinsicValue: null,
342
+ literalValue: null,
330
343
  attributes: null,
331
344
  };
332
345
  }
333
346
 
334
347
  case 'BasicNodeMatcher': {
335
- let { open } = node.properties;
336
-
337
- return reifyExpression(open.node);
348
+ return reifyExpression(get('open', node));
338
349
  }
339
350
 
340
351
  case 'PropertyMatcher': {
341
- let { refMatcher, bindingMatcher, nodeMatcher } = node.properties;
352
+ let refMatcher = get('refMatcher', node);
353
+ let bindingMatcher = get('bindingMatcher', node);
354
+ let nodeMatcher = get('nodeMatcher', node);
342
355
 
343
- refMatcher = refMatcher ? reifyExpression(refMatcher.node) : null;
344
- bindingMatcher = bindingMatcher ? reifyExpression(bindingMatcher.node) : null;
345
- nodeMatcher = reifyExpression(nodeMatcher.node);
356
+ refMatcher = refMatcher ? reifyExpression(refMatcher) : null;
357
+ bindingMatcher = bindingMatcher ? reifyExpression(bindingMatcher) : null;
358
+ nodeMatcher = reifyExpression(nodeMatcher);
346
359
 
347
360
  return { refMatcher, bindingMatcher, nodeMatcher };
348
361
  }
349
362
 
350
363
  case 'ReferenceMatcher': {
351
- let { type, name, openIndexToken, flags } = node.properties;
364
+ let type = get('type', node);
365
+ let name = get('name', node);
366
+ let isArray = !isNull(get('openIndexToken', node));
367
+ let flags = get('flags', node);
352
368
 
353
- type = type && reifyExpression(type.node);
354
- name = name && reifyExpression(name.node);
355
- let isArray = !isNull(openIndexToken?.node);
356
- flags = (flags && reifyReferenceFlags(flags?.node)) || referenceFlags;
369
+ type = type && reifyExpression(type);
370
+ name = name && reifyExpression(name);
371
+ flags = (flags && reifyReferenceFlags(flags)) || referenceFlags;
357
372
 
358
373
  return { type, name, isArray, flags };
359
374
  }
360
375
 
361
376
  case 'BindingMatcher': {
362
- let { languagePath } = node.properties;
377
+ let languagePath = get('languagePath', node);
363
378
 
364
- languagePath = languagePath && reifyExpression(languagePath.node);
379
+ languagePath = languagePath && reifyExpression(languagePath);
365
380
 
366
381
  return { languagePath };
367
382
  }
@@ -376,32 +391,25 @@ export const reifyExpression = (node) => {
376
391
  return [];
377
392
 
378
393
  case 'Call': {
379
- const { verb, arguments: args } = node.properties;
394
+ const verb = get('verb', node);
380
395
 
381
- const args_ = [...btree.traverse(args.node)].map((el) => reifyExpression(el.node));
396
+ const args = [...list('arguments', node)].map((el) => reifyExpression(el));
382
397
 
383
- return { verb: reifyExpression(verb.node), arguments: args_ };
398
+ return { verb: reifyExpression(verb), arguments: args };
384
399
  }
385
400
 
386
401
  case 'Object': {
387
- const { properties } = node.properties;
388
-
389
402
  return Object.fromEntries(
390
- [...btree.traverse(properties.node)].map((property) => {
391
- const {
392
- node: {
393
- properties: { key, value },
394
- },
395
- } = property;
396
- return [getCooked(key.node), reifyExpression(value.node)];
403
+ [...list('properties', node)].map((property) => {
404
+ const key = get('key', property);
405
+ const value = get('value', property);
406
+ return [reifyExpression(key), reifyExpression(value)];
397
407
  }),
398
408
  );
399
409
  }
400
410
 
401
411
  case 'Array': {
402
- const { elements = [] } = node.properties;
403
-
404
- return [...btree.traverse(elements.node)].map((el) => reifyExpression(el.node));
412
+ return [...list('elements', node)].map((el) => reifyExpression(el));
405
413
  }
406
414
 
407
415
  case 'Punctuator':
@@ -410,7 +418,7 @@ export const reifyExpression = (node) => {
410
418
 
411
419
  case 'Boolean': {
412
420
  // prettier-ignore
413
- switch (getCooked(node.properties.sigilToken.node)) {
421
+ switch (getCooked(get('sigilToken', node))) {
414
422
  case 'true': return true;
415
423
  case 'false': return false;
416
424
  default: throw new Error();
package/lib/print.js CHANGED
@@ -3,34 +3,27 @@ import {
3
3
  printTag,
4
4
  printExpression as printExpression_,
5
5
  } from '@bablr/agast-helpers/tree';
6
- import {
7
- EmbeddedNode,
8
- EmbeddedTag,
9
- EmbeddedObject,
10
- EmbeddedMatcher,
11
- EmbeddedRegex,
12
- EmbeddedInstruction,
13
- } from './symbols.js';
6
+ import { Node, Tag, EmbeddedObject, Matcher, Regex, Instruction } from './symbols.js';
14
7
 
15
8
  export const printEmbedded = (value) => {
16
9
  switch (value.type) {
17
- case EmbeddedTag:
10
+ case Tag:
18
11
  return `t\`${printTag(value.value)}\``;
19
12
 
20
- case EmbeddedMatcher:
13
+ case Matcher:
21
14
  return `m\`${printSource(value.value)}\``;
22
15
 
23
- case EmbeddedRegex:
16
+ case Regex:
24
17
  return `re\`${printSource(value.value)}\``;
25
18
 
26
- case EmbeddedInstruction:
19
+ case Instruction:
27
20
  return `i\`${printCall(value.value)}\``;
28
21
 
29
22
  case EmbeddedObject: {
30
23
  return printObject(value.value);
31
24
  }
32
25
 
33
- case EmbeddedNode: {
26
+ case Node: {
34
27
  return printSource(value.value);
35
28
  }
36
29
 
package/lib/stream.js CHANGED
@@ -7,14 +7,12 @@ import {
7
7
  NullTag,
8
8
  OpenNodeTag,
9
9
  ReferenceTag,
10
- TokenGroup,
11
10
  } from './symbols.js';
12
11
  import {
13
12
  getStreamIterator,
14
- prettyGroupTags,
15
- printSelfClosingNodeTag,
16
13
  printTag,
17
14
  StreamIterable,
15
+ prettyGroupTags,
18
16
  } from '@bablr/agast-helpers/stream';
19
17
  import { buildWriteEffect } from './builders.js';
20
18
  import { getCooked } from '@bablr/agast-helpers/tree';
@@ -117,12 +115,7 @@ function* __writeCSTMLStrategy(tags) {
117
115
  continue;
118
116
  }
119
117
 
120
- if (tag.type === TokenGroup) {
121
- const intrinsicValue = getCooked(tag.value);
122
- yield buildWriteEffect(printSelfClosingNodeTag(tag.value[0], intrinsicValue));
123
- } else {
124
- yield buildWriteEffect(printTag(tag));
125
- }
118
+ yield buildWriteEffect(printTag(tag));
126
119
 
127
120
  prevTag = tag;
128
121
  }
@@ -182,7 +175,7 @@ function* __writePrettyCSTMLStrategy(tags, options) {
182
175
  (tag.type === NullTag ||
183
176
  tag.type === GapTag ||
184
177
  tag.type === InitializerTag ||
185
- tag.type === TokenGroup);
178
+ (tag.type === OpenNodeTag && tag.value.selfClosing));
186
179
 
187
180
  if (!first && !inline) {
188
181
  yield buildWriteEffect('\n');
@@ -203,20 +196,14 @@ function* __writePrettyCSTMLStrategy(tags, options) {
203
196
  yield buildWriteEffect(' ');
204
197
  }
205
198
 
206
- if (tag.type === TokenGroup) {
207
- ref = null;
208
- const intrinsicValue = tag.value[0].value.flags.token ? getCooked(tag.value) : null;
209
- yield buildWriteEffect(printSelfClosingNodeTag(tag.value[0], intrinsicValue));
210
- } else {
211
- yield buildWriteEffect(printTag(tag));
212
- }
199
+ yield buildWriteEffect(printTag(tag));
213
200
 
214
201
  if (tag.type === ReferenceTag) {
215
202
  inline = true;
216
203
  ref = tag;
217
204
  }
218
205
 
219
- if (tag.type === OpenNodeTag) {
206
+ if (tag.type === OpenNodeTag && !tag.value.literalValue) {
220
207
  indentLevel++;
221
208
  }
222
209
 
package/lib/symbols.js CHANGED
@@ -3,9 +3,9 @@ export * from '@bablr/agast-helpers/symbols';
3
3
  export const node = Symbol.for('@bablr/node');
4
4
  export const fragment = Symbol.for('@bablr/fragment');
5
5
 
6
- export const EmbeddedInstruction = Symbol.for('EmbeddedInstruction');
7
- export const EmbeddedMatcher = Symbol.for('EmbeddedMatcher');
8
- export const EmbeddedNode = Symbol.for('EmbeddedNode');
9
- export const EmbeddedRegex = Symbol.for('EmbeddedRegex');
10
- export const EmbeddedTag = Symbol.for('EmbeddedTag');
11
- export const EmbeddedObject = Symbol.for('EmbeddedObject');
6
+ export const Instruction = Symbol.for('Instruction');
7
+ export const Matcher = Symbol.for('Matcher');
8
+ export const Regex = Symbol.for('Regex');
9
+ export const Tag = Symbol.for('Tag');
10
+ export const Object = Symbol.for('Object');
11
+ export const EmbeddedObject = Object;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bablr/agast-vm-helpers",
3
3
  "description": "Helper functions for working with the BABLR VM",
4
- "version": "0.8.0",
4
+ "version": "0.9.0",
5
5
  "author": "Conrad Buck<conartist6@gmail.com>",
6
6
  "type": "module",
7
7
  "files": [
@@ -22,7 +22,7 @@
22
22
  },
23
23
  "sideEffects": false,
24
24
  "dependencies": {
25
- "@bablr/agast-helpers": "0.8.0",
25
+ "@bablr/agast-helpers": "0.9.0",
26
26
  "@bablr/coroutine": "0.1.0"
27
27
  },
28
28
  "devDependencies": {