simplex-lang 0.2.2 → 1.0.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/README.md +530 -13
- package/build/parser/index.js +1161 -479
- package/build/parser/index.js.map +1 -1
- package/build/src/compiler.d.ts +26 -18
- package/build/src/compiler.js +211 -457
- package/build/src/compiler.js.map +1 -1
- package/build/src/constants.d.ts +25 -0
- package/build/src/constants.js +29 -0
- package/build/src/constants.js.map +1 -0
- package/build/src/error-mapping.d.ts +31 -0
- package/build/src/error-mapping.js +72 -0
- package/build/src/error-mapping.js.map +1 -0
- package/build/src/errors.d.ts +8 -5
- package/build/src/errors.js +8 -10
- package/build/src/errors.js.map +1 -1
- package/build/src/index.d.ts +1 -0
- package/build/src/index.js +1 -0
- package/build/src/index.js.map +1 -1
- package/build/src/simplex-tree.d.ts +25 -3
- package/build/src/simplex.peggy +120 -3
- package/build/src/tools/index.d.ts +25 -6
- package/build/src/tools/index.js +91 -19
- package/build/src/tools/index.js.map +1 -1
- package/build/src/version.js +1 -1
- package/build/src/visitors.d.ts +15 -0
- package/build/src/visitors.js +330 -0
- package/build/src/visitors.js.map +1 -0
- package/package.json +10 -8
- package/parser/index.js +1161 -479
- package/parser/index.js.map +1 -1
- package/src/compiler.ts +332 -609
- package/src/constants.ts +30 -0
- package/src/error-mapping.ts +112 -0
- package/src/errors.ts +8 -12
- package/src/index.ts +1 -0
- package/src/simplex-tree.ts +30 -2
- package/src/simplex.peggy +120 -3
- package/src/tools/index.ts +117 -24
- package/src/visitors.ts +491 -0
- package/build/src/tools/cast.d.ts +0 -2
- package/build/src/tools/cast.js +0 -20
- package/build/src/tools/cast.js.map +0 -1
- package/build/src/tools/ensure.d.ts +0 -3
- package/build/src/tools/ensure.js +0 -30
- package/build/src/tools/ensure.js.map +0 -1
- package/build/src/tools/guards.d.ts +0 -2
- package/build/src/tools/guards.js +0 -20
- package/build/src/tools/guards.js.map +0 -1
- package/src/tools/cast.ts +0 -26
- package/src/tools/ensure.ts +0 -41
- package/src/tools/guards.ts +0 -29
package/build/src/tools/index.js
CHANGED
|
@@ -1,24 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
export * from './ensure.js';
|
|
3
|
-
export * from './guards.js';
|
|
4
|
-
// eslint-disable-next-line @typescript-eslint/unbound-method
|
|
5
|
-
const toString = Object.prototype.toString;
|
|
1
|
+
import { UnexpectedTypeError } from '../errors.js';
|
|
6
2
|
/**
|
|
7
|
-
*
|
|
3
|
+
* Alias for `Object.prototype.toString`
|
|
8
4
|
*/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return val;
|
|
12
|
-
const objConstructor = val.constructor;
|
|
13
|
-
if (objConstructor === Number ||
|
|
14
|
-
objConstructor === String ||
|
|
15
|
-
objConstructor === Boolean) {
|
|
16
|
-
return val.valueOf();
|
|
17
|
-
}
|
|
18
|
-
return val;
|
|
19
|
-
}
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/unbound-method
|
|
6
|
+
export const objToStringAlias = Object.prototype.toString;
|
|
20
7
|
/**
|
|
21
|
-
*
|
|
8
|
+
* The method is needed to obtain the most specific readable data type.
|
|
9
|
+
*
|
|
10
|
+
* *Usage note:* Type handling, from a performance perspective, should be done
|
|
11
|
+
* in a targeted manner. It is not possible to replace specific checks like typeof
|
|
12
|
+
* `some === "number"` or `Num.isFinite(some)` with a universal
|
|
13
|
+
* `typeOf(some) === "FiniteNumber"`.
|
|
22
14
|
*/
|
|
23
15
|
export function typeOf(val) {
|
|
24
16
|
const type = typeof val;
|
|
@@ -33,8 +25,88 @@ export function typeOf(val) {
|
|
|
33
25
|
return 'NaN';
|
|
34
26
|
}
|
|
35
27
|
if (type === 'object') {
|
|
36
|
-
return
|
|
28
|
+
return objToStringAlias.call(val).slice(8, -1);
|
|
37
29
|
}
|
|
38
30
|
return type;
|
|
39
31
|
}
|
|
32
|
+
// --- Guards ---
|
|
33
|
+
/** Check if value is a plain object (not Array, Map, etc.). */
|
|
34
|
+
export function isObject(val) {
|
|
35
|
+
return objToStringAlias.call(val) === '[object Object]';
|
|
36
|
+
}
|
|
37
|
+
// Boxed primitives (new String, etc.) are intentionally not handled — they
|
|
38
|
+
// cannot originate from SimplEx expressions and are not worth the overhead.
|
|
39
|
+
export function isSimpleValue(val) {
|
|
40
|
+
const type = typeof val;
|
|
41
|
+
if (type === 'string' ||
|
|
42
|
+
type === 'number' ||
|
|
43
|
+
type === 'boolean' ||
|
|
44
|
+
type === 'bigint') {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
if (val == null)
|
|
48
|
+
return true;
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
// --- Cast ---
|
|
52
|
+
/** Coerce any value to boolean (standard JS truthiness). */
|
|
53
|
+
export function castToBoolean(val) {
|
|
54
|
+
// Boxed primitives (new String, etc.) are intentionally not handled — see isSimpleValue comment.
|
|
55
|
+
return Boolean(val);
|
|
56
|
+
}
|
|
57
|
+
/** Coerce value to string; objects use Object.prototype.toString. */
|
|
58
|
+
export function castToString(val) {
|
|
59
|
+
const type = typeof val;
|
|
60
|
+
// Boxed primitives (new String, etc.) are intentionally not handled — see isSimpleValue comment.
|
|
61
|
+
if (type === 'string')
|
|
62
|
+
return val;
|
|
63
|
+
if (val == null ||
|
|
64
|
+
type === 'number' ||
|
|
65
|
+
type === 'boolean' ||
|
|
66
|
+
type === 'bigint') {
|
|
67
|
+
return String(val);
|
|
68
|
+
}
|
|
69
|
+
return objToStringAlias.call(val);
|
|
70
|
+
}
|
|
71
|
+
// --- Ensure ---
|
|
72
|
+
/** Validate that value is a finite number or bigint; throw UnexpectedTypeError otherwise. */
|
|
73
|
+
export function ensureNumber(val) {
|
|
74
|
+
if (typeof val === 'number' && Number.isFinite(val)) {
|
|
75
|
+
return val;
|
|
76
|
+
}
|
|
77
|
+
if (typeof val === 'bigint') {
|
|
78
|
+
return val;
|
|
79
|
+
}
|
|
80
|
+
// Boxed primitives (new Number, etc.) are intentionally not handled — see isSimpleValue comment.
|
|
81
|
+
throw new UnexpectedTypeError(['number', 'bigint'], val);
|
|
82
|
+
}
|
|
83
|
+
/** Validate that value is a function; throw UnexpectedTypeError otherwise. */
|
|
84
|
+
export function ensureFunction(val) {
|
|
85
|
+
if (typeof val === 'function')
|
|
86
|
+
return val;
|
|
87
|
+
throw new UnexpectedTypeError(['function'], val);
|
|
88
|
+
}
|
|
89
|
+
/** Validate that value is a plain object; throw UnexpectedTypeError otherwise. */
|
|
90
|
+
export function ensureObject(val) {
|
|
91
|
+
if (isObject(val))
|
|
92
|
+
return val;
|
|
93
|
+
throw new UnexpectedTypeError(['object'], val);
|
|
94
|
+
}
|
|
95
|
+
/** Validate that value is an array; throw UnexpectedTypeError otherwise. */
|
|
96
|
+
export function ensureArray(val) {
|
|
97
|
+
if (Array.isArray(val))
|
|
98
|
+
return val;
|
|
99
|
+
throw new UnexpectedTypeError(['Array'], val);
|
|
100
|
+
}
|
|
101
|
+
/** Validate that value is comparable (<, >, <=, >=); must be number, bigint, or string. */
|
|
102
|
+
export function ensureRelationalComparable(val) {
|
|
103
|
+
// Boxed primitives (new String, etc.) are intentionally not handled — see isSimpleValue comment.
|
|
104
|
+
const type = typeof val;
|
|
105
|
+
if ((type === 'number' && Number.isNaN(val) === false) ||
|
|
106
|
+
type === 'string' ||
|
|
107
|
+
type === 'bigint') {
|
|
108
|
+
return val;
|
|
109
|
+
}
|
|
110
|
+
throw new UnexpectedTypeError(['number', 'bigint', 'string'], val);
|
|
111
|
+
}
|
|
40
112
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
package/build/src/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = '0.
|
|
1
|
+
export const version = '1.0.0';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ExpressionStatement, Location } from './simplex-tree.js';
|
|
2
|
+
export interface SourceLocation {
|
|
3
|
+
len: number;
|
|
4
|
+
location: Location;
|
|
5
|
+
}
|
|
6
|
+
export interface VisitResult {
|
|
7
|
+
code: string;
|
|
8
|
+
offsets: SourceLocation[];
|
|
9
|
+
}
|
|
10
|
+
export interface TraverseContext {
|
|
11
|
+
expression: string;
|
|
12
|
+
insidePipe: boolean;
|
|
13
|
+
}
|
|
14
|
+
/** Walk the AST and produce generated JS code with source location offsets. */
|
|
15
|
+
export declare function traverse(tree: ExpressionStatement, expression: string): VisitResult;
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
import { CompileError } from './errors.js';
|
|
2
|
+
import { TOPIC_TOKEN, GEN } from './constants.js';
|
|
3
|
+
const codePart = (codePart, ownerNode) => ({
|
|
4
|
+
code: codePart,
|
|
5
|
+
offsets: [{ len: codePart.length, location: ownerNode.location }]
|
|
6
|
+
});
|
|
7
|
+
const combineVisitResults = (parts) => {
|
|
8
|
+
return parts.reduce((res, it) => {
|
|
9
|
+
return {
|
|
10
|
+
code: res.code + it.code,
|
|
11
|
+
offsets: res.offsets.concat(it.offsets)
|
|
12
|
+
};
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
/** Build a comma-separated list of VisitResult[] segments. */
|
|
16
|
+
const commaSeparated = (items, commaNode) => {
|
|
17
|
+
if (items.length === 0)
|
|
18
|
+
return [];
|
|
19
|
+
return items.flatMap((item, i) => i < items.length - 1 ? [...item, codePart(',', commaNode)] : item);
|
|
20
|
+
};
|
|
21
|
+
/** Wrap visited args as `fnName(arg1, arg2, ...)`. */
|
|
22
|
+
const wrapCall = (fnName, node, ...args) => [
|
|
23
|
+
codePart(`${fnName}(`, node),
|
|
24
|
+
...commaSeparated(args, node),
|
|
25
|
+
codePart(')', node)
|
|
26
|
+
];
|
|
27
|
+
/** Wrap visited args as `registry["op"](arg1, arg2, ...)`. */
|
|
28
|
+
const wrapOp = (registry, operator, node, ...args) => [
|
|
29
|
+
codePart(`${registry}["${operator}"](`, node),
|
|
30
|
+
...commaSeparated(args, node),
|
|
31
|
+
codePart(')', node)
|
|
32
|
+
];
|
|
33
|
+
/** Wrap visit results as a thunk: `()=>(...)`. */
|
|
34
|
+
const thunk = (node, parts) => [codePart('()=>(', node), ...parts, codePart(')', node)];
|
|
35
|
+
// --- AST Visitors ---
|
|
36
|
+
const visitors = {
|
|
37
|
+
Literal: node => {
|
|
38
|
+
const parts = [codePart(JSON.stringify(node.value), node)];
|
|
39
|
+
return parts;
|
|
40
|
+
},
|
|
41
|
+
Identifier: node => {
|
|
42
|
+
const parts = [
|
|
43
|
+
codePart(`${GEN.get}(${GEN.scope},${JSON.stringify(node.name)})`, node)
|
|
44
|
+
];
|
|
45
|
+
return parts;
|
|
46
|
+
},
|
|
47
|
+
UnaryExpression: (node, visit) => wrapOp(GEN.uop, node.operator, node, visit(node.argument)),
|
|
48
|
+
BinaryExpression: (node, visit) => wrapOp(GEN.bop, node.operator, node, visit(node.left), visit(node.right)),
|
|
49
|
+
LogicalExpression: (node, visit) => wrapOp(GEN.lop, node.operator, node, thunk(node, visit(node.left)), thunk(node, visit(node.right))),
|
|
50
|
+
ConditionalExpression: (node, visit) => {
|
|
51
|
+
const parts = [
|
|
52
|
+
codePart(`(${GEN.bool}(`, node),
|
|
53
|
+
...visit(node.test),
|
|
54
|
+
codePart(')?', node),
|
|
55
|
+
...visit(node.consequent),
|
|
56
|
+
codePart(':', node),
|
|
57
|
+
...(node.alternate !== null
|
|
58
|
+
? visit(node.alternate)
|
|
59
|
+
: [codePart('undefined', node)]),
|
|
60
|
+
codePart(')', node)
|
|
61
|
+
];
|
|
62
|
+
return parts;
|
|
63
|
+
},
|
|
64
|
+
ObjectExpression: (node, visit, context) => {
|
|
65
|
+
const items = node.properties.map(p => {
|
|
66
|
+
if (p.type === 'SpreadElement') {
|
|
67
|
+
return [
|
|
68
|
+
codePart(`...${GEN.ensObj}(`, p),
|
|
69
|
+
...visit(p.argument),
|
|
70
|
+
codePart(')', p)
|
|
71
|
+
];
|
|
72
|
+
}
|
|
73
|
+
let keyParts;
|
|
74
|
+
if (p.computed) {
|
|
75
|
+
keyParts = [codePart('[', p), ...visit(p.key), codePart(']', p)];
|
|
76
|
+
}
|
|
77
|
+
else if (p.key.type === 'Identifier') {
|
|
78
|
+
keyParts = [codePart(p.key.name, p)];
|
|
79
|
+
}
|
|
80
|
+
else if (p.key.type === 'Literal') {
|
|
81
|
+
// JSON.stringify(Infinity) returns "null", producing wrong key
|
|
82
|
+
if (typeof p.key.value === 'number' && !Number.isFinite(p.key.value)) {
|
|
83
|
+
throw new CompileError(`Invalid object key: ${p.key.value}`, context.expression, p.key.location);
|
|
84
|
+
}
|
|
85
|
+
keyParts = [codePart(JSON.stringify(p.key.value), p)];
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// Unreachable: grammar restricts keys to Identifier and Literal
|
|
89
|
+
throw new CompileError(`Unsupported object key type: ${p.key.type}`, context.expression, p.key.location);
|
|
90
|
+
}
|
|
91
|
+
return [...keyParts, codePart(':', node), ...visit(p.value)];
|
|
92
|
+
});
|
|
93
|
+
return [
|
|
94
|
+
codePart('{', node),
|
|
95
|
+
...commaSeparated(items, node),
|
|
96
|
+
codePart('}', node)
|
|
97
|
+
];
|
|
98
|
+
},
|
|
99
|
+
ArrayExpression: (node, visit) => {
|
|
100
|
+
const items = node.elements.map(el => {
|
|
101
|
+
if (el === null)
|
|
102
|
+
return [];
|
|
103
|
+
if (el.type === 'SpreadElement') {
|
|
104
|
+
return [
|
|
105
|
+
codePart(`...${GEN.ensArr}(`, el),
|
|
106
|
+
...visit(el.argument),
|
|
107
|
+
codePart(')', el)
|
|
108
|
+
];
|
|
109
|
+
}
|
|
110
|
+
return visit(el);
|
|
111
|
+
});
|
|
112
|
+
return [
|
|
113
|
+
codePart('[', node),
|
|
114
|
+
...commaSeparated(items, node),
|
|
115
|
+
codePart(']', node)
|
|
116
|
+
];
|
|
117
|
+
},
|
|
118
|
+
NonNullAssertExpression: (node, visit) => wrapCall(GEN.nna, node, visit(node.expression)),
|
|
119
|
+
MemberExpression: (node, visit) => {
|
|
120
|
+
const { computed, object, property } = node;
|
|
121
|
+
// TODO Pass computed to prop?
|
|
122
|
+
const propertyPart = computed
|
|
123
|
+
? visit(property)
|
|
124
|
+
: [codePart(JSON.stringify(property.name), property)];
|
|
125
|
+
const extension = !computed && node.extension === true;
|
|
126
|
+
return wrapCall(GEN.prop, node, visit(object), propertyPart, [
|
|
127
|
+
codePart(String(extension), node)
|
|
128
|
+
]);
|
|
129
|
+
},
|
|
130
|
+
CallExpression: (node, visit) => {
|
|
131
|
+
if (node.arguments.length > 0) {
|
|
132
|
+
const items = node.arguments.map((arg, index) => arg.type === 'CurryPlaceholder'
|
|
133
|
+
? [codePart(`a${index}`, arg)]
|
|
134
|
+
: visit(arg));
|
|
135
|
+
const curriedArgs = node.arguments.flatMap((arg, index) => arg.type === 'CurryPlaceholder' ? [`a${index}`] : []);
|
|
136
|
+
// call({{callee}},[{{arguments}}])
|
|
137
|
+
let parts = [
|
|
138
|
+
codePart(`${GEN.call}(`, node),
|
|
139
|
+
...visit(node.callee),
|
|
140
|
+
codePart(',[', node),
|
|
141
|
+
...commaSeparated(items, node),
|
|
142
|
+
codePart('])', node)
|
|
143
|
+
];
|
|
144
|
+
if (curriedArgs.length > 0) {
|
|
145
|
+
parts = [
|
|
146
|
+
codePart(`(${GEN.scope}=>(${curriedArgs.join()})=>`, node),
|
|
147
|
+
...parts,
|
|
148
|
+
codePart(`)(${GEN.scope})`, node)
|
|
149
|
+
];
|
|
150
|
+
}
|
|
151
|
+
return parts;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
const parts = [
|
|
155
|
+
codePart(`${GEN.call}(`, node),
|
|
156
|
+
...visit(node.callee),
|
|
157
|
+
codePart(',null)', node)
|
|
158
|
+
];
|
|
159
|
+
return parts;
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
NullishCoalescingExpression: (node, visit) => {
|
|
163
|
+
const parts = [
|
|
164
|
+
codePart('(', node),
|
|
165
|
+
...visit(node.left),
|
|
166
|
+
codePart('??', node),
|
|
167
|
+
...visit(node.right),
|
|
168
|
+
codePart(')', node)
|
|
169
|
+
];
|
|
170
|
+
return parts;
|
|
171
|
+
},
|
|
172
|
+
PipeSequence: (node, visit, context) => {
|
|
173
|
+
const headCode = visit(node.head);
|
|
174
|
+
const prevInsidePipe = context.insidePipe;
|
|
175
|
+
context.insidePipe = true;
|
|
176
|
+
const items = node.tail.map(t => {
|
|
177
|
+
const opt = t.operator === '|?';
|
|
178
|
+
const fwd = t.operator === '|>';
|
|
179
|
+
return [
|
|
180
|
+
codePart(`{opt:${opt},fwd:${fwd},next:(${GEN.scope}=>topic=>{${GEN.scope}=[["${TOPIC_TOKEN}"],[topic],${GEN.scope}];return `, t.expression),
|
|
181
|
+
...visit(t.expression),
|
|
182
|
+
codePart(`})(${GEN.scope})}`, t.expression)
|
|
183
|
+
];
|
|
184
|
+
});
|
|
185
|
+
context.insidePipe = prevInsidePipe;
|
|
186
|
+
return [
|
|
187
|
+
codePart(`${GEN.pipe}(`, node),
|
|
188
|
+
...headCode,
|
|
189
|
+
codePart(',[', node),
|
|
190
|
+
...commaSeparated(items, node),
|
|
191
|
+
codePart('])', node)
|
|
192
|
+
];
|
|
193
|
+
},
|
|
194
|
+
TopicReference: (node, _visit, context) => {
|
|
195
|
+
if (!context.insidePipe) {
|
|
196
|
+
throw new CompileError(`Topic reference "${TOPIC_TOKEN}" is unbound; it must be inside a pipe body`, context.expression, node.location);
|
|
197
|
+
}
|
|
198
|
+
const parts = [
|
|
199
|
+
codePart(`${GEN.get}(${GEN.scope},"${TOPIC_TOKEN}")`, node)
|
|
200
|
+
];
|
|
201
|
+
return parts;
|
|
202
|
+
},
|
|
203
|
+
LambdaExpression: (node, visit) => {
|
|
204
|
+
// Lambda with parameters
|
|
205
|
+
if (node.params.length > 0) {
|
|
206
|
+
const paramsNames = node.params.map(p => p.name);
|
|
207
|
+
const fnParams = Array.from({ length: paramsNames.length }, (_, index) => `p${index}`);
|
|
208
|
+
const fnParamsList = fnParams.join();
|
|
209
|
+
const fnParamsNamesList = paramsNames.map(p => JSON.stringify(p)).join();
|
|
210
|
+
const parts = [
|
|
211
|
+
codePart(`((${GEN.scope},params)=>function(${fnParamsList}){${GEN.scope}=[params,[${fnParamsList}],${GEN.scope}];return `, node),
|
|
212
|
+
...visit(node.expression),
|
|
213
|
+
codePart(`})(${GEN.scope},[${fnParamsNamesList}])`, node)
|
|
214
|
+
];
|
|
215
|
+
return parts;
|
|
216
|
+
}
|
|
217
|
+
// Lambda without parameters
|
|
218
|
+
else {
|
|
219
|
+
// (() => {{code}})
|
|
220
|
+
const parts = [
|
|
221
|
+
codePart(`(()=>`, node),
|
|
222
|
+
...visit(node.expression),
|
|
223
|
+
codePart(`)`, node)
|
|
224
|
+
];
|
|
225
|
+
return parts;
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
TemplateLiteral: (node, visit) => {
|
|
229
|
+
const { quasis, expressions, tag } = node;
|
|
230
|
+
// --- Tagged template literal ---
|
|
231
|
+
if (tag !== null) {
|
|
232
|
+
const quasisItems = quasis.map(q => [codePart(JSON.stringify(q.value), q)]);
|
|
233
|
+
const quasisArray = [
|
|
234
|
+
codePart('[', node),
|
|
235
|
+
...commaSeparated(quasisItems, node),
|
|
236
|
+
codePart(']', node)
|
|
237
|
+
];
|
|
238
|
+
const allArgs = [quasisArray, ...expressions.map(e => visit(e))];
|
|
239
|
+
return [
|
|
240
|
+
codePart(`${GEN.call}(`, node),
|
|
241
|
+
...visit(tag),
|
|
242
|
+
codePart(',[', node),
|
|
243
|
+
...commaSeparated(allArgs, node),
|
|
244
|
+
codePart('])', node)
|
|
245
|
+
];
|
|
246
|
+
}
|
|
247
|
+
// No interpolations → emit as plain string literal
|
|
248
|
+
if (expressions.length === 0) {
|
|
249
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
250
|
+
return [codePart(JSON.stringify(quasis[0].value), node)];
|
|
251
|
+
}
|
|
252
|
+
const parts = [codePart('(', node)];
|
|
253
|
+
for (let i = 0; i < quasis.length; i++) {
|
|
254
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
255
|
+
const quasi = quasis[i];
|
|
256
|
+
const expr = expressions[i];
|
|
257
|
+
// Add "+" between parts (skip before the first part)
|
|
258
|
+
if (i > 0) {
|
|
259
|
+
parts.push(codePart('+', node));
|
|
260
|
+
}
|
|
261
|
+
// Emit the static string part
|
|
262
|
+
if (quasi.value !== '' || expr == null) {
|
|
263
|
+
parts.push(codePart(JSON.stringify(quasi.value), quasi));
|
|
264
|
+
if (expr != null) {
|
|
265
|
+
parts.push(codePart('+', node));
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// Emit the interpolated expression wrapped in castToString
|
|
269
|
+
if (expr != null) {
|
|
270
|
+
parts.push(codePart(`${GEN.str}(`, node));
|
|
271
|
+
parts.push(...visit(expr));
|
|
272
|
+
parts.push(codePart(')', node));
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
parts.push(codePart(')', node));
|
|
276
|
+
return parts;
|
|
277
|
+
},
|
|
278
|
+
LetExpression: (node, visit, context) => {
|
|
279
|
+
const declarationsNamesSet = new Set();
|
|
280
|
+
for (const d of node.declarations) {
|
|
281
|
+
if (declarationsNamesSet.has(d.id.name)) {
|
|
282
|
+
throw new CompileError(`"${d.id.name}" name defined inside let expression was repeated`, context.expression, d.id.location);
|
|
283
|
+
}
|
|
284
|
+
declarationsNamesSet.add(d.id.name);
|
|
285
|
+
}
|
|
286
|
+
// (scope=> {
|
|
287
|
+
// var _varNames = [];
|
|
288
|
+
// var _varValues = [];
|
|
289
|
+
// scope = [_varNames, _varValues, scope];
|
|
290
|
+
// // a = {{init}}
|
|
291
|
+
// _varNames.push("a");
|
|
292
|
+
// _varValues.push({{init}});
|
|
293
|
+
// // {{expression}}
|
|
294
|
+
// return {{expression}}
|
|
295
|
+
// })(scope)
|
|
296
|
+
const parts = [
|
|
297
|
+
codePart(`(${GEN.scope}=>{var ${GEN._varNames}=[];var ${GEN._varValues}=[];${GEN.scope}=[${GEN._varNames},${GEN._varValues},${GEN.scope}];`, node),
|
|
298
|
+
...node.declarations.flatMap(d => [
|
|
299
|
+
codePart(`${GEN._varValues}.push(`, d),
|
|
300
|
+
...visit(d.init),
|
|
301
|
+
codePart(`);`, d),
|
|
302
|
+
codePart(`${GEN._varNames}.push(`, d),
|
|
303
|
+
codePart(JSON.stringify(d.id.name), d.id),
|
|
304
|
+
codePart(`);`, d)
|
|
305
|
+
]),
|
|
306
|
+
codePart(`return `, node),
|
|
307
|
+
...visit(node.expression),
|
|
308
|
+
codePart(`})(${GEN.scope})`, node)
|
|
309
|
+
];
|
|
310
|
+
return parts;
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
// --- Traverse ---
|
|
314
|
+
const visit = (node, _parentNode, context) => {
|
|
315
|
+
const nodeTypeVisitor = visitors[node.type];
|
|
316
|
+
if (nodeTypeVisitor === undefined) {
|
|
317
|
+
throw new Error(`No handler for node type - ${node.type}`);
|
|
318
|
+
}
|
|
319
|
+
const innerVisit = (childNode) => {
|
|
320
|
+
return visit(childNode, node, context);
|
|
321
|
+
};
|
|
322
|
+
// @ts-expect-error skip node is never
|
|
323
|
+
return nodeTypeVisitor(node, innerVisit, context);
|
|
324
|
+
};
|
|
325
|
+
/** Walk the AST and produce generated JS code with source location offsets. */
|
|
326
|
+
export function traverse(tree, expression) {
|
|
327
|
+
const context = { expression, insidePipe: false };
|
|
328
|
+
return combineVisitResults(visit(tree.expression, null, context));
|
|
329
|
+
}
|
|
330
|
+
//# sourceMappingURL=visitors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visitors.js","sourceRoot":"","sources":["../../src/visitors.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "simplex-lang",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "SimplEx - simple expression language",
|
|
6
6
|
"files": [
|
|
@@ -36,9 +36,11 @@
|
|
|
36
36
|
"copy-parser": "cp -rf ./parser/ ./build/ && cp -f ./src/simplex.peggy ./build/src/",
|
|
37
37
|
"build:dev": "npm run lint && npm run compile:dev",
|
|
38
38
|
"build": "npm run build:parser && npm run lint && npm run compile && npm run copy-parser",
|
|
39
|
-
"coverage": "c8 node -r dotenv/config --test --enable-source-maps",
|
|
40
|
-
"coverage:report": "c8 report",
|
|
41
|
-
"test": "npm run build && npm run coverage",
|
|
39
|
+
"coverage": "c8 node -r dotenv/config --test \"build/test/**/*.test.js\" --enable-source-maps",
|
|
40
|
+
"coverage:report": "c8 report --reporter=json-summary",
|
|
41
|
+
"test": "npm run build && npm run coverage && npm run coverage:report",
|
|
42
|
+
"test:playground": "cd playground && npm test",
|
|
43
|
+
"posttest": "node scripts/coverage-badge.js",
|
|
42
44
|
"version": "npm run pick-version && auto-changelog -p && git add CHANGELOG.md",
|
|
43
45
|
"release": "np"
|
|
44
46
|
},
|
|
@@ -70,13 +72,13 @@
|
|
|
70
72
|
"@types/node": "^22.13.4",
|
|
71
73
|
"auto-changelog": "^2.5.0",
|
|
72
74
|
"awesome-code-frame": "^1.1.0",
|
|
73
|
-
"c8": "^
|
|
75
|
+
"c8": "^11.0.0",
|
|
74
76
|
"dotenv": "^16.4.7",
|
|
75
|
-
"eslint": "^9.
|
|
76
|
-
"eslint-plugin-n": "^17.
|
|
77
|
+
"eslint": "^9.39.4",
|
|
78
|
+
"eslint-plugin-n": "^17.24.0",
|
|
77
79
|
"peggy": "^4.2.0",
|
|
78
80
|
"prettier": "^3.5.1",
|
|
79
81
|
"typescript": "^5.7.3",
|
|
80
|
-
"typescript-eslint": "^8.
|
|
82
|
+
"typescript-eslint": "^8.57.1"
|
|
81
83
|
}
|
|
82
84
|
}
|