@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 +6 -13
- package/lib/deembed.js +6 -13
- package/lib/index.js +169 -161
- package/lib/print.js +6 -13
- package/lib/stream.js +5 -18
- package/lib/symbols.js +6 -6
- package/package.json +2 -2
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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 !==
|
|
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 !==
|
|
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 !==
|
|
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 !==
|
|
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 !==
|
|
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
|
|
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
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
|
89
|
+
let expressionToken = get('expressionToken', flags);
|
|
90
|
+
let hasGapToken = get('hasGapToken', flags);
|
|
79
91
|
|
|
80
92
|
return {
|
|
81
|
-
expression: !!(expressionToken && reifyExpression(expressionToken
|
|
82
|
-
hasGap: !!(hasGapToken && reifyExpression(hasGapToken
|
|
93
|
+
expression: !!(expressionToken && reifyExpression(expressionToken)),
|
|
94
|
+
hasGap: !!(hasGapToken && reifyExpression(hasGapToken)),
|
|
83
95
|
};
|
|
84
96
|
};
|
|
85
97
|
|
|
86
|
-
export const
|
|
87
|
-
|
|
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
|
-
|
|
113
|
-
let
|
|
101
|
+
let children = buildChildren(list('children', node));
|
|
102
|
+
let openTag = reifyExpression(open);
|
|
103
|
+
let closeTag = buildCloseNodeTag();
|
|
114
104
|
|
|
115
|
-
|
|
116
|
-
const { intrinsicValue } = open.node.properties;
|
|
117
|
-
let built = [];
|
|
105
|
+
let literalValue = reifyExpression(get('literalValue', open));
|
|
118
106
|
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
|
|
123
|
+
if (child.type !== Symbol.for('Property')) throw new Error('umimplemented');
|
|
137
124
|
|
|
138
|
-
|
|
125
|
+
let reference = get('reference', child);
|
|
126
|
+
let binding = get('binding', child);
|
|
127
|
+
let value = get('value', child);
|
|
139
128
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
129
|
+
let referenceTag = reference ? reifyExpression(reference) : buildReferenceTag('.');
|
|
130
|
+
let bindingTag = binding
|
|
131
|
+
? reifyExpression(binding)
|
|
132
|
+
: buildBindingTag(isStubNode(value) ? null : []);
|
|
144
133
|
|
|
145
|
-
|
|
134
|
+
value = reifyExpression(value);
|
|
146
135
|
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
|
|
152
|
-
|
|
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 =
|
|
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
|
|
180
|
+
let doctype = get('doctype', node);
|
|
181
|
+
let tree = get('tree', node);
|
|
182
182
|
|
|
183
|
-
doctype = reifyExpression(doctype
|
|
184
|
-
tree = reifyExpression(tree
|
|
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:
|
|
189
|
+
flags: fragmentFlags,
|
|
191
190
|
type: null,
|
|
192
|
-
|
|
193
|
-
|
|
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
|
|
204
|
-
|
|
205
|
-
open = reifyExpression(open.node);
|
|
198
|
+
let open = get('open', node);
|
|
206
199
|
|
|
207
|
-
let
|
|
200
|
+
let openTag = reifyExpression(open);
|
|
208
201
|
|
|
209
|
-
|
|
202
|
+
let { flags, type, attributes } = openTag.value;
|
|
210
203
|
|
|
211
204
|
return Object.freeze({
|
|
212
205
|
flags,
|
|
213
206
|
type,
|
|
214
|
-
|
|
215
|
-
|
|
207
|
+
bounds: buildBounds(),
|
|
208
|
+
tags: buildTags(node),
|
|
216
209
|
attributes,
|
|
217
210
|
});
|
|
218
211
|
}
|
|
219
212
|
|
|
220
213
|
case 'DoctypeTag': {
|
|
221
|
-
let
|
|
214
|
+
let version = get('version', node);
|
|
215
|
+
let attributes = get('attributes', node);
|
|
216
|
+
|
|
222
217
|
return buildDoctypeTag(
|
|
223
|
-
attributes && reifyExpression(attributes
|
|
224
|
-
parseInt(sourceTextFor(version
|
|
218
|
+
attributes && reifyExpression(attributes),
|
|
219
|
+
parseInt(sourceTextFor(version), 10),
|
|
225
220
|
);
|
|
226
221
|
}
|
|
227
222
|
|
|
228
223
|
case 'ReferenceTag': {
|
|
229
|
-
let
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
|
236
|
+
return buildReferenceTag(type, name, !isNull(arrayOperatorToken), flags);
|
|
236
237
|
}
|
|
237
238
|
|
|
238
239
|
case 'LiteralTag': {
|
|
239
|
-
|
|
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(
|
|
244
|
+
return getCooked(get('content', node));
|
|
246
245
|
}
|
|
247
246
|
|
|
248
247
|
case 'IdentifierPath': {
|
|
249
|
-
return
|
|
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
|
|
262
|
+
let flags = get('flags', node);
|
|
263
|
+
let type = get('type', node);
|
|
264
|
+
let attributes = get('attributes', node);
|
|
254
265
|
|
|
255
|
-
flags = reifyNodeFlags(flags
|
|
256
|
-
type = reifyExpression(type
|
|
257
|
-
attributes = reifyExpression(attributes
|
|
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
|
-
|
|
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(
|
|
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
|
|
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
|
|
307
|
+
return get('content', node) ? getCooked(get('content', node)) : '';
|
|
298
308
|
|
|
299
309
|
case 'SpamexString': {
|
|
300
|
-
return buildEmbeddedMatcher(
|
|
310
|
+
return buildEmbeddedMatcher(get('content', node));
|
|
301
311
|
}
|
|
302
312
|
|
|
303
313
|
case 'RegexString': {
|
|
304
|
-
return buildEmbeddedRegex(
|
|
314
|
+
return buildEmbeddedRegex(get('content', node));
|
|
305
315
|
}
|
|
306
316
|
|
|
307
317
|
case 'OpenNodeMatcher': {
|
|
308
|
-
let
|
|
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
|
|
323
|
+
flags = (flags && reifyNodeFlags(flags)) || {};
|
|
311
324
|
type =
|
|
312
|
-
type.
|
|
313
|
-
? getCooked(type
|
|
314
|
-
: reifyExpression(type
|
|
315
|
-
attributes = attributes ? reifyExpression(attributes
|
|
316
|
-
|
|
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,
|
|
331
|
+
return { flags, type, literalValue, attributes };
|
|
319
332
|
}
|
|
320
333
|
|
|
321
334
|
case 'FragmentMatcher': {
|
|
322
|
-
let
|
|
335
|
+
let flags = get('flags', node);
|
|
323
336
|
|
|
324
|
-
flags = (flags && reifyNodeFlags(flags
|
|
337
|
+
flags = (flags && reifyNodeFlags(flags)) || {};
|
|
325
338
|
|
|
326
339
|
return {
|
|
327
340
|
flags,
|
|
328
341
|
type: Symbol.for('@bablr/fragment'),
|
|
329
|
-
|
|
342
|
+
literalValue: null,
|
|
330
343
|
attributes: null,
|
|
331
344
|
};
|
|
332
345
|
}
|
|
333
346
|
|
|
334
347
|
case 'BasicNodeMatcher': {
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
return reifyExpression(open.node);
|
|
348
|
+
return reifyExpression(get('open', node));
|
|
338
349
|
}
|
|
339
350
|
|
|
340
351
|
case 'PropertyMatcher': {
|
|
341
|
-
let
|
|
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
|
|
344
|
-
bindingMatcher = bindingMatcher ? reifyExpression(bindingMatcher
|
|
345
|
-
nodeMatcher = reifyExpression(nodeMatcher
|
|
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
|
|
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
|
|
354
|
-
name = name && reifyExpression(name
|
|
355
|
-
|
|
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
|
|
377
|
+
let languagePath = get('languagePath', node);
|
|
363
378
|
|
|
364
|
-
languagePath = languagePath && reifyExpression(languagePath
|
|
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
|
|
394
|
+
const verb = get('verb', node);
|
|
380
395
|
|
|
381
|
-
const
|
|
396
|
+
const args = [...list('arguments', node)].map((el) => reifyExpression(el));
|
|
382
397
|
|
|
383
|
-
return { verb: reifyExpression(verb
|
|
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
|
-
[...
|
|
391
|
-
const
|
|
392
|
-
|
|
393
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
10
|
+
case Tag:
|
|
18
11
|
return `t\`${printTag(value.value)}\``;
|
|
19
12
|
|
|
20
|
-
case
|
|
13
|
+
case Matcher:
|
|
21
14
|
return `m\`${printSource(value.value)}\``;
|
|
22
15
|
|
|
23
|
-
case
|
|
16
|
+
case Regex:
|
|
24
17
|
return `re\`${printSource(value.value)}\``;
|
|
25
18
|
|
|
26
|
-
case
|
|
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
|
|
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
|
-
|
|
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 ===
|
|
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
|
-
|
|
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
|
|
7
|
-
export const
|
|
8
|
-
export const
|
|
9
|
-
export const
|
|
10
|
-
export const
|
|
11
|
-
export const 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.
|
|
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.
|
|
25
|
+
"@bablr/agast-helpers": "0.9.0",
|
|
26
26
|
"@bablr/coroutine": "0.1.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|