@mojir/lits 2.1.0 → 2.1.1
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 +392 -109
- package/dist/cli/cli.js +863 -914
- package/dist/cli/reference/index.d.ts +208 -208
- package/dist/cli/src/builtin/bindingNode.d.ts +2 -2
- package/dist/cli/src/builtin/index.d.ts +10 -50
- package/dist/cli/src/builtin/interface.d.ts +10 -17
- package/dist/cli/src/builtin/normalExpressions/index.d.ts +4 -1
- package/dist/cli/src/builtin/specialExpressionTypes.d.ts +27 -0
- package/dist/cli/src/builtin/specialExpressions/and.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/array.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/cond.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/def.d.ts +3 -6
- package/dist/cli/src/builtin/specialExpressions/defined.d.ts +5 -0
- package/dist/cli/src/builtin/specialExpressions/do.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/functions.d.ts +5 -13
- package/dist/cli/src/builtin/specialExpressions/if.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/let.d.ts +3 -6
- package/dist/cli/src/builtin/specialExpressions/loop.d.ts +3 -4
- package/dist/cli/src/builtin/specialExpressions/loops.d.ts +5 -14
- package/dist/cli/src/builtin/specialExpressions/object.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/or.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/qq.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/recur.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/switch.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/throw.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/try.d.ts +3 -5
- package/dist/cli/src/builtin/specialExpressions/unless.d.ts +3 -3
- package/dist/cli/src/builtin/utils.d.ts +2 -5
- package/dist/cli/src/constants/constants.d.ts +15 -3
- package/dist/cli/src/evaluator/ContextStack.d.ts +3 -3
- package/dist/cli/src/evaluator/functionExecutors.d.ts +3 -3
- package/dist/cli/src/evaluator/index.d.ts +2 -2
- package/dist/cli/src/evaluator/interface.d.ts +3 -3
- package/dist/cli/src/getUndefinedSymbols/index.d.ts +3 -3
- package/dist/cli/src/parser/Parser.d.ts +7 -5
- package/dist/cli/src/parser/types.d.ts +33 -96
- package/dist/cli/src/typeGuards/astNode.d.ts +24 -16
- package/dist/cli/src/typeGuards/index.d.ts +2 -5
- package/dist/cli/src/typeGuards/litsFunction.d.ts +2 -2
- package/dist/cli/src/utils/index.d.ts +0 -1
- package/dist/index.esm.js +836 -887
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +836 -887
- package/dist/index.js.map +1 -1
- package/dist/lits.iife.js +836 -887
- package/dist/lits.iife.js.map +1 -1
- package/dist/reference/index.d.ts +208 -208
- package/dist/src/builtin/bindingNode.d.ts +2 -2
- package/dist/src/builtin/index.d.ts +10 -50
- package/dist/src/builtin/interface.d.ts +10 -17
- package/dist/src/builtin/normalExpressions/index.d.ts +4 -1
- package/dist/src/builtin/specialExpressionTypes.d.ts +27 -0
- package/dist/src/builtin/specialExpressions/and.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/array.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/cond.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/def.d.ts +3 -6
- package/dist/src/builtin/specialExpressions/defined.d.ts +5 -0
- package/dist/src/builtin/specialExpressions/do.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/functions.d.ts +5 -13
- package/dist/src/builtin/specialExpressions/if.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/let.d.ts +3 -6
- package/dist/src/builtin/specialExpressions/loop.d.ts +3 -4
- package/dist/src/builtin/specialExpressions/loops.d.ts +5 -14
- package/dist/src/builtin/specialExpressions/object.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/or.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/qq.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/recur.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/switch.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/throw.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/try.d.ts +3 -5
- package/dist/src/builtin/specialExpressions/unless.d.ts +3 -3
- package/dist/src/builtin/utils.d.ts +2 -5
- package/dist/src/constants/constants.d.ts +15 -3
- package/dist/src/evaluator/ContextStack.d.ts +3 -3
- package/dist/src/evaluator/functionExecutors.d.ts +3 -3
- package/dist/src/evaluator/index.d.ts +2 -2
- package/dist/src/evaluator/interface.d.ts +3 -3
- package/dist/src/getUndefinedSymbols/index.d.ts +3 -3
- package/dist/src/parser/Parser.d.ts +7 -5
- package/dist/src/parser/types.d.ts +33 -96
- package/dist/src/typeGuards/astNode.d.ts +24 -16
- package/dist/src/typeGuards/index.d.ts +2 -5
- package/dist/src/typeGuards/litsFunction.d.ts +2 -2
- package/dist/src/utils/index.d.ts +0 -1
- package/dist/testFramework.esm.js +851 -901
- package/dist/testFramework.esm.js.map +1 -1
- package/dist/testFramework.js +851 -901
- package/dist/testFramework.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/src/builtin/specialExpressions/declared.d.ts +0 -5
- package/dist/src/builtin/specialExpressions/declared.d.ts +0 -5
package/dist/cli/cli.js
CHANGED
|
@@ -92,7 +92,7 @@ typeof SuppressedError === "function" ? SuppressedError : function (error, suppr
|
|
|
92
92
|
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
93
93
|
};
|
|
94
94
|
|
|
95
|
-
var version = "2.1.
|
|
95
|
+
var version = "2.1.1";
|
|
96
96
|
|
|
97
97
|
function getCodeMarker(sourceCodeInfo) {
|
|
98
98
|
if (!sourceCodeInfo.position || !sourceCodeInfo.code)
|
|
@@ -184,23 +184,50 @@ var UndefinedSymbolError = /** @class */ (function (_super) {
|
|
|
184
184
|
return UndefinedSymbolError;
|
|
185
185
|
}(LitsError));
|
|
186
186
|
|
|
187
|
-
var
|
|
188
|
-
'
|
|
189
|
-
'
|
|
190
|
-
'
|
|
191
|
-
'
|
|
192
|
-
'
|
|
193
|
-
'
|
|
194
|
-
'
|
|
195
|
-
'
|
|
196
|
-
'
|
|
197
|
-
'
|
|
198
|
-
'
|
|
199
|
-
'
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
187
|
+
var specialExpressionTypes = {
|
|
188
|
+
'??': 0,
|
|
189
|
+
'&&': 1,
|
|
190
|
+
'||': 2,
|
|
191
|
+
'array': 3,
|
|
192
|
+
'cond': 4,
|
|
193
|
+
'def': 5,
|
|
194
|
+
'defined?': 6,
|
|
195
|
+
'defn': 7,
|
|
196
|
+
'do': 8,
|
|
197
|
+
'doseq': 9,
|
|
198
|
+
'fn': 10,
|
|
199
|
+
'for': 11,
|
|
200
|
+
'function': 12,
|
|
201
|
+
'if': 13,
|
|
202
|
+
'let': 14,
|
|
203
|
+
'loop': 15,
|
|
204
|
+
'object': 16,
|
|
205
|
+
'recur': 17,
|
|
206
|
+
'switch': 18,
|
|
207
|
+
'throw': 19,
|
|
208
|
+
'try': 20,
|
|
209
|
+
'unless': 21,
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
var NodeTypes = {
|
|
213
|
+
Number: 1,
|
|
214
|
+
String: 2,
|
|
215
|
+
NormalExpression: 3,
|
|
216
|
+
SpecialExpression: 4,
|
|
217
|
+
UserDefinedSymbol: 5,
|
|
218
|
+
NormalBuiltinSymbol: 6,
|
|
219
|
+
SpecialBuiltinSymbol: 7,
|
|
220
|
+
ReservedSymbol: 8,
|
|
221
|
+
Binding: 9,
|
|
222
|
+
Spread: 10,
|
|
223
|
+
};
|
|
224
|
+
var NodeTypesSet = new Set(Object.values(NodeTypes));
|
|
225
|
+
function getNodeTypeName(type) {
|
|
226
|
+
return Object.keys(NodeTypes).find(function (key) { return NodeTypes[key] === type; });
|
|
227
|
+
}
|
|
228
|
+
// TODO, is this needed?
|
|
229
|
+
function isNodeType(type) {
|
|
230
|
+
return typeof type === 'number' && NodeTypesSet.has(type);
|
|
204
231
|
}
|
|
205
232
|
var functionTypes = [
|
|
206
233
|
'UserDefined',
|
|
@@ -228,17 +255,17 @@ function isLitsFunction$1(func) {
|
|
|
228
255
|
return false;
|
|
229
256
|
return FUNCTION_SYMBOL in func && 'functionType' in func && isFunctionType(func.functionType);
|
|
230
257
|
}
|
|
231
|
-
function
|
|
232
|
-
if (value
|
|
258
|
+
function isNode(value) {
|
|
259
|
+
if (!Array.isArray(value) || value.length < 2)
|
|
233
260
|
return false;
|
|
234
|
-
return
|
|
261
|
+
return isNodeType(value[0]);
|
|
235
262
|
}
|
|
236
263
|
function valueToString(value) {
|
|
237
264
|
if (isLitsFunction$1(value))
|
|
238
265
|
// eslint-disable-next-line ts/no-unsafe-member-access
|
|
239
266
|
return "<function ".concat(value.name || '\u03BB', ">");
|
|
240
|
-
if (
|
|
241
|
-
return "".concat(value
|
|
267
|
+
if (isNode(value))
|
|
268
|
+
return "".concat(getNodeTypeName(value[0]), "-node");
|
|
242
269
|
if (value === null)
|
|
243
270
|
return 'null';
|
|
244
271
|
if (typeof value === 'object' && value instanceof RegExp)
|
|
@@ -254,153 +281,155 @@ function getSourceCodeInfo(anyValue, sourceCodeInfo) {
|
|
|
254
281
|
return (_a = anyValue === null || anyValue === void 0 ? void 0 : anyValue.sourceCodeInfo) !== null && _a !== void 0 ? _a : sourceCodeInfo;
|
|
255
282
|
}
|
|
256
283
|
|
|
257
|
-
function
|
|
258
|
-
|
|
259
|
-
count: count,
|
|
260
|
-
length: node.params.length,
|
|
261
|
-
name: node.name,
|
|
262
|
-
sourceCodeInfo: node.sourceCodeInfo,
|
|
263
|
-
});
|
|
284
|
+
function getAssertionError(typeName, value, sourceCodeInfo) {
|
|
285
|
+
return new LitsError("Expected ".concat(typeName, ", got ").concat(valueToString(value), "."), getSourceCodeInfo(value, sourceCodeInfo));
|
|
264
286
|
}
|
|
265
|
-
|
|
266
|
-
|
|
287
|
+
|
|
288
|
+
function isSymbolNode(node) {
|
|
289
|
+
var nodeType = node[0];
|
|
290
|
+
return NodeTypes.UserDefinedSymbol === nodeType
|
|
291
|
+
|| NodeTypes.NormalBuiltinSymbol === nodeType
|
|
292
|
+
|| NodeTypes.SpecialBuiltinSymbol === nodeType;
|
|
267
293
|
}
|
|
268
|
-
function
|
|
269
|
-
|
|
270
|
-
|
|
294
|
+
function assertSymbolNode(node, sourceCodeInfo) {
|
|
295
|
+
if (!isSymbolNode(node))
|
|
296
|
+
throw getAssertionError('SymbolNode', node, sourceCodeInfo);
|
|
271
297
|
}
|
|
272
|
-
function
|
|
273
|
-
|
|
274
|
-
throw new LitsError('Unexpected undefined', getSourceCodeInfo(value, sourceCodeInfo));
|
|
298
|
+
function isUserDefinedSymbolNode(node) {
|
|
299
|
+
return NodeTypes.UserDefinedSymbol === node[0];
|
|
275
300
|
}
|
|
276
|
-
function
|
|
277
|
-
|
|
301
|
+
function asUserDefinedSymbolNode(node, sourceCodeInfo) {
|
|
302
|
+
assertUserDefinedSymbolNode(node, sourceCodeInfo);
|
|
303
|
+
return node;
|
|
278
304
|
}
|
|
279
|
-
function
|
|
280
|
-
if (!
|
|
281
|
-
throw
|
|
282
|
-
}
|
|
305
|
+
function assertUserDefinedSymbolNode(node, sourceCodeInfo) {
|
|
306
|
+
if (!isUserDefinedSymbolNode(node))
|
|
307
|
+
throw getAssertionError('UserDefinedSymbolNode', node, sourceCodeInfo);
|
|
283
308
|
}
|
|
284
|
-
function
|
|
285
|
-
|
|
286
|
-
if (typeof count === 'number') {
|
|
287
|
-
if (length !== count) {
|
|
288
|
-
throw new LitsError("Wrong number of arguments to \"".concat(name, "\", expected ").concat(count, ", got ").concat(valueToString(length), "."), sourceCodeInfo);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
else {
|
|
292
|
-
var min = count.min, max = count.max, even = count.even, odd = count.odd;
|
|
293
|
-
if (even) {
|
|
294
|
-
if (length % 2 !== 0) {
|
|
295
|
-
throw new LitsError("Wrong number of arguments to \"".concat(name, "\",, expected an even number, got ").concat(valueToString(length), "."), sourceCodeInfo);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
if (odd) {
|
|
299
|
-
if (length % 2 !== 1) {
|
|
300
|
-
throw new LitsError("Wrong number of arguments to \"".concat(name, "\",, expected an odd number, got ").concat(valueToString(length), "."), sourceCodeInfo);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
if (typeof min === 'number' && length < min) {
|
|
304
|
-
throw new LitsError("Wrong number of arguments to \"".concat(name, "\", expected at least ").concat(min, ", got ").concat(valueToString(length), "."), sourceCodeInfo);
|
|
305
|
-
}
|
|
306
|
-
if (typeof max === 'number' && length > max) {
|
|
307
|
-
throw new LitsError("Wrong number of arguments to \"".concat(name, "\", expected at most ").concat(max, ", got ").concat(valueToString(length), "."), sourceCodeInfo);
|
|
308
|
-
}
|
|
309
|
-
}
|
|
309
|
+
function isNormalBuiltinSymbolNode(node) {
|
|
310
|
+
return NodeTypes.NormalBuiltinSymbol === node[0];
|
|
310
311
|
}
|
|
311
|
-
function
|
|
312
|
-
if (
|
|
313
|
-
return count === 2;
|
|
314
|
-
}
|
|
315
|
-
if (count.odd) {
|
|
312
|
+
function isSpecialBuiltinSymbolNode(node, name) {
|
|
313
|
+
if (NodeTypes.SpecialBuiltinSymbol !== node[0]) {
|
|
316
314
|
return false;
|
|
317
315
|
}
|
|
318
|
-
|
|
319
|
-
return
|
|
316
|
+
{
|
|
317
|
+
return true;
|
|
320
318
|
}
|
|
321
|
-
|
|
319
|
+
}
|
|
320
|
+
// export function isNumberNode(node: Node): node is NumberNode {
|
|
321
|
+
// return node[0] === NodeTypes.Number
|
|
322
|
+
// }
|
|
323
|
+
// export function asNumberNode(node: Node, sourceCodeInfo?: SourceCodeInfo): NumberNode {
|
|
324
|
+
// assertNumberNode(node, sourceCodeInfo)
|
|
325
|
+
// return node
|
|
326
|
+
// }
|
|
327
|
+
// export function assertNumberNode(node: Node, sourceCodeInfo?: SourceCodeInfo): asserts node is NumberNode {
|
|
328
|
+
// if (!isNumberNode(node))
|
|
329
|
+
// throw getAssertionError('NumberNode', node, sourceCodeInfo)
|
|
330
|
+
// }
|
|
331
|
+
function isNormalExpressionNode(node) {
|
|
332
|
+
return node[0] === NodeTypes.NormalExpression;
|
|
333
|
+
}
|
|
334
|
+
function isNormalExpressionNodeWithName(node) {
|
|
335
|
+
if (!isNormalExpressionNode(node)) {
|
|
322
336
|
return false;
|
|
323
337
|
}
|
|
324
|
-
return
|
|
338
|
+
return isSymbolNode(node[1][0]);
|
|
339
|
+
}
|
|
340
|
+
function isSpreadNode(node) {
|
|
341
|
+
return node[0] === NodeTypes.Spread;
|
|
325
342
|
}
|
|
326
343
|
|
|
327
|
-
var getUndefinedSymbols = function (ast, contextStack, builtin,
|
|
344
|
+
var getUndefinedSymbols = function (ast, contextStack, builtin, evaluateNode) {
|
|
328
345
|
var e_1, _a;
|
|
329
346
|
var _b;
|
|
330
|
-
var
|
|
347
|
+
var nodes = Array.isArray(ast)
|
|
331
348
|
? ast
|
|
332
|
-
: [
|
|
333
|
-
type: 'SpecialExpression',
|
|
334
|
-
name: 'do',
|
|
335
|
-
params: ast.body,
|
|
336
|
-
sourceCodeInfo: undefined,
|
|
337
|
-
}];
|
|
349
|
+
: [[NodeTypes.SpecialExpression, [specialExpressionTypes.do, ast.body]]];
|
|
338
350
|
var unresolvedSymbols = new Set();
|
|
339
351
|
try {
|
|
340
|
-
for (var
|
|
341
|
-
var subNode =
|
|
342
|
-
(_b =
|
|
352
|
+
for (var nodes_1 = __values(nodes), nodes_1_1 = nodes_1.next(); !nodes_1_1.done; nodes_1_1 = nodes_1.next()) {
|
|
353
|
+
var subNode = nodes_1_1.value;
|
|
354
|
+
(_b = findUnresolvedSymbolsInNode(subNode, contextStack, builtin, evaluateNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols.add(symbol); });
|
|
343
355
|
}
|
|
344
356
|
}
|
|
345
357
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
346
358
|
finally {
|
|
347
359
|
try {
|
|
348
|
-
if (
|
|
360
|
+
if (nodes_1_1 && !nodes_1_1.done && (_a = nodes_1.return)) _a.call(nodes_1);
|
|
349
361
|
}
|
|
350
362
|
finally { if (e_1) throw e_1.error; }
|
|
351
363
|
}
|
|
352
364
|
return unresolvedSymbols;
|
|
353
365
|
};
|
|
354
|
-
function
|
|
366
|
+
function findUnresolvedSymbolsInNode(node, contextStack, builtin, evaluateNode) {
|
|
355
367
|
var e_2, _a;
|
|
356
|
-
var _b;
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
368
|
+
var _b, _c;
|
|
369
|
+
var nodeType = node[0];
|
|
370
|
+
switch (nodeType) {
|
|
371
|
+
case NodeTypes.UserDefinedSymbol: {
|
|
372
|
+
var symbolNode = node;
|
|
373
|
+
var lookUpResult = contextStack.lookUp(symbolNode);
|
|
360
374
|
if (lookUpResult === null)
|
|
361
|
-
return new Set([
|
|
375
|
+
return new Set([symbolNode[1]]);
|
|
362
376
|
return null;
|
|
363
377
|
}
|
|
364
|
-
case
|
|
365
|
-
case
|
|
366
|
-
case
|
|
367
|
-
case
|
|
368
|
-
case
|
|
378
|
+
case NodeTypes.NormalBuiltinSymbol:
|
|
379
|
+
case NodeTypes.SpecialBuiltinSymbol:
|
|
380
|
+
case NodeTypes.String:
|
|
381
|
+
case NodeTypes.Number:
|
|
382
|
+
case NodeTypes.ReservedSymbol:
|
|
369
383
|
return null;
|
|
370
|
-
case
|
|
384
|
+
case NodeTypes.NormalExpression: {
|
|
385
|
+
var normalExpressionNode = node;
|
|
371
386
|
var unresolvedSymbols_1 = new Set();
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
387
|
+
if (isNormalExpressionNodeWithName(normalExpressionNode)) {
|
|
388
|
+
var _d = __read(normalExpressionNode, 2), _e = __read(_d[1], 1), symbolNode = _e[0];
|
|
389
|
+
if (isUserDefinedSymbolNode(symbolNode)) {
|
|
390
|
+
var lookUpResult = contextStack.lookUp(symbolNode);
|
|
391
|
+
if (lookUpResult === null)
|
|
392
|
+
unresolvedSymbols_1.add(symbolNode[1]);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
var _f = __read(normalExpressionNode, 2), _g = __read(_f[1], 1), expressionNode = _g[0];
|
|
397
|
+
(_b = findUnresolvedSymbolsInNode(expressionNode, contextStack, builtin, evaluateNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
|
|
377
398
|
}
|
|
378
399
|
try {
|
|
379
|
-
for (var
|
|
380
|
-
var subNode =
|
|
381
|
-
(
|
|
400
|
+
for (var _h = __values(normalExpressionNode[1][1]), _j = _h.next(); !_j.done; _j = _h.next()) {
|
|
401
|
+
var subNode = _j.value;
|
|
402
|
+
(_c = findUnresolvedSymbolsInNode(subNode, contextStack, builtin, evaluateNode)) === null || _c === void 0 ? void 0 : _c.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
|
|
382
403
|
}
|
|
383
404
|
}
|
|
384
405
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
385
406
|
finally {
|
|
386
407
|
try {
|
|
387
|
-
if (
|
|
408
|
+
if (_j && !_j.done && (_a = _h.return)) _a.call(_h);
|
|
388
409
|
}
|
|
389
410
|
finally { if (e_2) throw e_2.error; }
|
|
390
411
|
}
|
|
391
412
|
return unresolvedSymbols_1;
|
|
392
413
|
}
|
|
393
|
-
case
|
|
394
|
-
var
|
|
395
|
-
|
|
396
|
-
|
|
414
|
+
case NodeTypes.SpecialExpression: {
|
|
415
|
+
var specialExpressionNode = node;
|
|
416
|
+
var specialExpressionType = specialExpressionNode[1][0];
|
|
417
|
+
var specialExpression = builtin.specialExpressions[specialExpressionType];
|
|
418
|
+
var castedGetUndefinedSymbols = specialExpression.getUndefinedSymbols;
|
|
419
|
+
return castedGetUndefinedSymbols(specialExpressionNode, contextStack, {
|
|
397
420
|
getUndefinedSymbols: getUndefinedSymbols,
|
|
398
421
|
builtin: builtin,
|
|
399
|
-
|
|
422
|
+
evaluateNode: evaluateNode,
|
|
400
423
|
});
|
|
401
424
|
}
|
|
402
|
-
case
|
|
403
|
-
return
|
|
425
|
+
case NodeTypes.Spread:
|
|
426
|
+
return findUnresolvedSymbolsInNode(node[1], contextStack, builtin, evaluateNode);
|
|
427
|
+
case NodeTypes.Binding: {
|
|
428
|
+
var bindingNode = node;
|
|
429
|
+
return findUnresolvedSymbolsInNode(bindingNode[1][1], contextStack, builtin, evaluateNode);
|
|
430
|
+
}
|
|
431
|
+
default:
|
|
432
|
+
throw new Error("Unhandled node type: ".concat(nodeType));
|
|
404
433
|
}
|
|
405
434
|
}
|
|
406
435
|
|
|
@@ -606,8 +635,71 @@ var bitwiseNormalExpression = {
|
|
|
606
635
|
},
|
|
607
636
|
};
|
|
608
637
|
|
|
609
|
-
function
|
|
610
|
-
|
|
638
|
+
function assertNumberOfParams(count, node) {
|
|
639
|
+
var length = node[1][1].length;
|
|
640
|
+
if (typeof count === 'number') {
|
|
641
|
+
if (length !== count) {
|
|
642
|
+
var name_1 = getNodeTypeName(node[0]);
|
|
643
|
+
throw new LitsError("Wrong number of arguments to \"".concat(name_1, "\", expected ").concat(count, ", got ").concat(valueToString(length), "."), node[2]);
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
else {
|
|
647
|
+
var min = count.min, max = count.max, even = count.even, odd = count.odd;
|
|
648
|
+
if (even) {
|
|
649
|
+
var name_2 = getNodeTypeName(node[0]);
|
|
650
|
+
if (length % 2 !== 0) {
|
|
651
|
+
throw new LitsError("Wrong number of arguments to \"".concat(name_2, "\",, expected an even number, got ").concat(valueToString(length), "."), node[2]);
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
if (odd) {
|
|
655
|
+
if (length % 2 !== 1) {
|
|
656
|
+
var name_3 = getNodeTypeName(node[0]);
|
|
657
|
+
throw new LitsError("Wrong number of arguments to \"".concat(name_3, "\",, expected an odd number, got ").concat(valueToString(length), "."), node[2]);
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
if (typeof min === 'number' && length < min) {
|
|
661
|
+
var name_4 = getNodeTypeName(node[0]);
|
|
662
|
+
throw new LitsError("Wrong number of arguments to \"".concat(name_4, "\", expected at least ").concat(min, ", got ").concat(valueToString(length), "."), node[2]);
|
|
663
|
+
}
|
|
664
|
+
if (typeof max === 'number' && length > max) {
|
|
665
|
+
var name_5 = getNodeTypeName(node[0]);
|
|
666
|
+
throw new LitsError("Wrong number of arguments to \"".concat(name_5, "\", expected at most ").concat(max, ", got ").concat(valueToString(length), "."), node[2]);
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
function isNonUndefined(value) {
|
|
671
|
+
return value !== undefined;
|
|
672
|
+
}
|
|
673
|
+
function asNonUndefined(value, sourceCodeInfo) {
|
|
674
|
+
assertNonUndefined(value, sourceCodeInfo);
|
|
675
|
+
return value;
|
|
676
|
+
}
|
|
677
|
+
function assertNonUndefined(value, sourceCodeInfo) {
|
|
678
|
+
if (!isNonUndefined(value))
|
|
679
|
+
throw new LitsError('Unexpected undefined', getSourceCodeInfo(value, sourceCodeInfo));
|
|
680
|
+
}
|
|
681
|
+
function isUnknownRecord(value) {
|
|
682
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
683
|
+
}
|
|
684
|
+
function assertUnknownRecord(value, sourceCodeInfo) {
|
|
685
|
+
if (!isUnknownRecord(value)) {
|
|
686
|
+
throw new LitsError("Expected ".concat('UnknownRecord', ", got ").concat(valueToString(value), "."), getSourceCodeInfo(value, sourceCodeInfo));
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
function canBeOperator(count) {
|
|
690
|
+
if (typeof count === 'number') {
|
|
691
|
+
return count === 2;
|
|
692
|
+
}
|
|
693
|
+
if (count.odd) {
|
|
694
|
+
return false;
|
|
695
|
+
}
|
|
696
|
+
if (typeof count.max === 'number' && count.max < 2) {
|
|
697
|
+
return false;
|
|
698
|
+
}
|
|
699
|
+
if (typeof count.min === 'number' && count.min > 2) {
|
|
700
|
+
return false;
|
|
701
|
+
}
|
|
702
|
+
return true;
|
|
611
703
|
}
|
|
612
704
|
|
|
613
705
|
function isLitsFunction(value) {
|
|
@@ -792,12 +884,6 @@ function clone(value) {
|
|
|
792
884
|
function cloneColl(value) {
|
|
793
885
|
return clone(value);
|
|
794
886
|
}
|
|
795
|
-
function arrayToPairs(arr) {
|
|
796
|
-
var pairs = [];
|
|
797
|
-
for (var i = 0; i < arr.length; i += 2)
|
|
798
|
-
pairs.push([arr[i], arr[i + 1]]);
|
|
799
|
-
return pairs;
|
|
800
|
-
}
|
|
801
887
|
function joinSets() {
|
|
802
888
|
var e_1, _a;
|
|
803
889
|
var results = [];
|
|
@@ -3695,17 +3781,24 @@ Object.values(expressions$1).forEach(function (normalExpression) {
|
|
|
3695
3781
|
});
|
|
3696
3782
|
});
|
|
3697
3783
|
var normalExpressions = __assign(__assign({}, expressions$1), aliases);
|
|
3784
|
+
var normalExpressionTypes = {};
|
|
3785
|
+
var allNormalExpressions = [];
|
|
3786
|
+
Object.entries(normalExpressions).forEach(function (_a, index) {
|
|
3787
|
+
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
3788
|
+
normalExpressionTypes[key] = index;
|
|
3789
|
+
allNormalExpressions.push(value);
|
|
3790
|
+
});
|
|
3698
3791
|
|
|
3699
3792
|
var andSpecialExpression = {
|
|
3700
3793
|
paramCount: {},
|
|
3701
3794
|
evaluate: function (node, contextStack, _a) {
|
|
3702
3795
|
var e_1, _b;
|
|
3703
|
-
var
|
|
3796
|
+
var evaluateNode = _a.evaluateNode;
|
|
3704
3797
|
var value = true;
|
|
3705
3798
|
try {
|
|
3706
|
-
for (var _c = __values(node
|
|
3799
|
+
for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
3707
3800
|
var param = _d.value;
|
|
3708
|
-
value =
|
|
3801
|
+
value = evaluateNode(param, contextStack);
|
|
3709
3802
|
if (!value)
|
|
3710
3803
|
break;
|
|
3711
3804
|
}
|
|
@@ -3720,8 +3813,8 @@ var andSpecialExpression = {
|
|
|
3720
3813
|
return value;
|
|
3721
3814
|
},
|
|
3722
3815
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3723
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3724
|
-
return getUndefinedSymbols(node
|
|
3816
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
3817
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
3725
3818
|
},
|
|
3726
3819
|
};
|
|
3727
3820
|
|
|
@@ -3729,28 +3822,29 @@ var condSpecialExpression = {
|
|
|
3729
3822
|
paramCount: { even: true },
|
|
3730
3823
|
evaluate: function (node, contextStack, _a) {
|
|
3731
3824
|
var e_1, _b;
|
|
3732
|
-
var
|
|
3825
|
+
var evaluateNode = _a.evaluateNode;
|
|
3826
|
+
var params = node[1][1];
|
|
3733
3827
|
try {
|
|
3734
|
-
for (var
|
|
3735
|
-
var
|
|
3736
|
-
var value =
|
|
3828
|
+
for (var params_1 = __values(params), params_1_1 = params_1.next(); !params_1_1.done; params_1_1 = params_1.next()) {
|
|
3829
|
+
var _c = __read(params_1_1.value, 2), test = _c[0], form = _c[1];
|
|
3830
|
+
var value = evaluateNode(test, contextStack);
|
|
3737
3831
|
if (!value)
|
|
3738
3832
|
continue;
|
|
3739
|
-
return
|
|
3833
|
+
return evaluateNode(form, contextStack);
|
|
3740
3834
|
}
|
|
3741
3835
|
}
|
|
3742
3836
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
3743
3837
|
finally {
|
|
3744
3838
|
try {
|
|
3745
|
-
if (
|
|
3839
|
+
if (params_1_1 && !params_1_1.done && (_b = params_1.return)) _b.call(params_1);
|
|
3746
3840
|
}
|
|
3747
3841
|
finally { if (e_1) throw e_1.error; }
|
|
3748
3842
|
}
|
|
3749
3843
|
return null;
|
|
3750
3844
|
},
|
|
3751
3845
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3752
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3753
|
-
return getUndefinedSymbols(node.
|
|
3846
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
3847
|
+
return getUndefinedSymbols(node[1][1].flat(), contextStack, builtin, evaluateNode);
|
|
3754
3848
|
},
|
|
3755
3849
|
};
|
|
3756
3850
|
|
|
@@ -3758,66 +3852,78 @@ var switchSpecialExpression = {
|
|
|
3758
3852
|
paramCount: { odd: true },
|
|
3759
3853
|
evaluate: function (node, contextStack, _a) {
|
|
3760
3854
|
var e_1, _b;
|
|
3761
|
-
var
|
|
3762
|
-
var
|
|
3855
|
+
var evaluateNode = _a.evaluateNode;
|
|
3856
|
+
var _c = __read(node[1], 3), switchValueNode = _c[1], cases = _c[2];
|
|
3857
|
+
var switchValue = evaluateNode(switchValueNode, contextStack);
|
|
3763
3858
|
try {
|
|
3764
|
-
for (var
|
|
3765
|
-
var
|
|
3766
|
-
var value =
|
|
3859
|
+
for (var cases_1 = __values(cases), cases_1_1 = cases_1.next(); !cases_1_1.done; cases_1_1 = cases_1.next()) {
|
|
3860
|
+
var _d = __read(cases_1_1.value, 2), test = _d[0], form = _d[1];
|
|
3861
|
+
var value = evaluateNode(test, contextStack);
|
|
3767
3862
|
if (value === switchValue) {
|
|
3768
|
-
return
|
|
3863
|
+
return evaluateNode(form, contextStack);
|
|
3769
3864
|
}
|
|
3770
3865
|
}
|
|
3771
3866
|
}
|
|
3772
3867
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
3773
3868
|
finally {
|
|
3774
3869
|
try {
|
|
3775
|
-
if (
|
|
3870
|
+
if (cases_1_1 && !cases_1_1.done && (_b = cases_1.return)) _b.call(cases_1);
|
|
3776
3871
|
}
|
|
3777
3872
|
finally { if (e_1) throw e_1.error; }
|
|
3778
3873
|
}
|
|
3779
3874
|
return null;
|
|
3780
3875
|
},
|
|
3781
3876
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3782
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3783
|
-
return getUndefinedSymbols(node.
|
|
3877
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
3878
|
+
return getUndefinedSymbols(__spreadArray([node[1][1]], __read(node[1][2].flat()), false), contextStack, builtin, evaluateNode);
|
|
3784
3879
|
},
|
|
3785
3880
|
};
|
|
3786
3881
|
|
|
3787
|
-
var
|
|
3882
|
+
var definedSpecialExpression = {
|
|
3788
3883
|
paramCount: 1,
|
|
3789
3884
|
evaluate: function (node, contextStack) {
|
|
3790
|
-
var
|
|
3885
|
+
var symbolNode = node[1][1];
|
|
3886
|
+
assertSymbolNode(symbolNode);
|
|
3887
|
+
if (!isUserDefinedSymbolNode(symbolNode)) {
|
|
3888
|
+
return true; // If the symbol is not a user defined symbol, it is defined. normal or special builtin
|
|
3889
|
+
}
|
|
3890
|
+
var lookUpResult = contextStack.lookUp(symbolNode);
|
|
3791
3891
|
return lookUpResult !== null;
|
|
3792
3892
|
},
|
|
3793
3893
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3794
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3795
|
-
return getUndefinedSymbols(node
|
|
3894
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
3895
|
+
return getUndefinedSymbols([node[1][1]], contextStack, builtin, evaluateNode);
|
|
3796
3896
|
},
|
|
3797
3897
|
};
|
|
3798
3898
|
|
|
3799
|
-
|
|
3800
|
-
|
|
3801
|
-
|
|
3899
|
+
var bindingTargetTypes = {
|
|
3900
|
+
symbol: 11,
|
|
3901
|
+
rest: 12,
|
|
3902
|
+
object: 13,
|
|
3903
|
+
array: 14,
|
|
3904
|
+
};
|
|
3905
|
+
|
|
3906
|
+
function evalueateBindingNodeValues(target, value, evaluate) {
|
|
3907
|
+
var sourceCodeInfo = target[2];
|
|
3802
3908
|
var record = {};
|
|
3803
3909
|
createRecord(target, value, evaluate, sourceCodeInfo, record);
|
|
3804
3910
|
return record;
|
|
3805
3911
|
}
|
|
3806
3912
|
function createRecord(bindingTarget, value, evaluate, sourceCodeInfo, record) {
|
|
3807
3913
|
var _a, _b;
|
|
3808
|
-
if (bindingTarget
|
|
3914
|
+
if (bindingTarget[0] === bindingTargetTypes.object) {
|
|
3809
3915
|
assertUnknownRecord(value, sourceCodeInfo);
|
|
3810
3916
|
var capturedKeys_1 = new Set();
|
|
3811
3917
|
var restElement_1;
|
|
3812
|
-
Object.entries(bindingTarget
|
|
3918
|
+
Object.entries(bindingTarget[1][0]).forEach(function (_a) {
|
|
3813
3919
|
var _b;
|
|
3814
3920
|
var _c = __read(_a, 2), key = _c[0], element = _c[1];
|
|
3815
|
-
if (element
|
|
3921
|
+
if (element[0] === bindingTargetTypes.rest) {
|
|
3816
3922
|
restElement_1 = element;
|
|
3817
3923
|
return;
|
|
3818
3924
|
}
|
|
3819
3925
|
capturedKeys_1.add(key);
|
|
3820
|
-
var val = (_b = (value[key] !== undefined ? value[key] : element
|
|
3926
|
+
var val = (_b = (value[key] !== undefined ? value[key] : element[1][1] && evaluate(element[1][1]))) !== null && _b !== void 0 ? _b : null;
|
|
3821
3927
|
assertAny(val, sourceCodeInfo);
|
|
3822
3928
|
createRecord(element, val, evaluate, sourceCodeInfo, record);
|
|
3823
3929
|
});
|
|
@@ -3832,33 +3938,36 @@ function createRecord(bindingTarget, value, evaluate, sourceCodeInfo, record) {
|
|
|
3832
3938
|
acc[key] = asAny(val);
|
|
3833
3939
|
return acc;
|
|
3834
3940
|
}, {});
|
|
3835
|
-
record[restElement_1
|
|
3941
|
+
record[restElement_1[1][0]] = restValues;
|
|
3836
3942
|
}
|
|
3837
3943
|
}
|
|
3838
|
-
else if (bindingTarget
|
|
3944
|
+
else if (bindingTarget[0] === bindingTargetTypes.array) {
|
|
3839
3945
|
var restIndex = null;
|
|
3840
3946
|
assertArray(value, sourceCodeInfo);
|
|
3841
|
-
for (var index = 0; index < bindingTarget.
|
|
3842
|
-
var element = (_a = bindingTarget
|
|
3947
|
+
for (var index = 0; index < bindingTarget[1][0].length; index += 1) {
|
|
3948
|
+
var element = (_a = bindingTarget[1][0][index]) !== null && _a !== void 0 ? _a : null;
|
|
3843
3949
|
if (element === null) {
|
|
3844
3950
|
continue;
|
|
3845
3951
|
}
|
|
3846
|
-
if (element
|
|
3952
|
+
if (element[0] === bindingTargetTypes.rest) {
|
|
3847
3953
|
restIndex = index;
|
|
3848
3954
|
break;
|
|
3849
3955
|
}
|
|
3850
|
-
var val = (_b = (value[index] !== undefined ? value[index] : element
|
|
3956
|
+
var val = (_b = (value[index] !== undefined ? value[index] : element[1][1] && evaluate(element[1][1]))) !== null && _b !== void 0 ? _b : null;
|
|
3851
3957
|
assertAny(val, sourceCodeInfo);
|
|
3852
3958
|
createRecord(element, val, evaluate, sourceCodeInfo, record);
|
|
3853
3959
|
}
|
|
3854
3960
|
if (restIndex !== null) {
|
|
3855
3961
|
var restValues = value.slice(restIndex);
|
|
3856
|
-
var restElement = bindingTarget
|
|
3857
|
-
record[restElement
|
|
3962
|
+
var restElement = bindingTarget[1][0][restIndex];
|
|
3963
|
+
record[restElement[1][0]] = restValues;
|
|
3858
3964
|
}
|
|
3859
3965
|
}
|
|
3966
|
+
else if (bindingTarget[0] === bindingTargetTypes.rest) {
|
|
3967
|
+
record[bindingTarget[1][0]] = asAny(value);
|
|
3968
|
+
}
|
|
3860
3969
|
else {
|
|
3861
|
-
record[bindingTarget
|
|
3970
|
+
record[bindingTarget[1][0][1]] = asAny(value);
|
|
3862
3971
|
}
|
|
3863
3972
|
}
|
|
3864
3973
|
function getAllBindingTargetNames(bindingTarget) {
|
|
@@ -3871,9 +3980,9 @@ function getNamesFromBindingTarget(target, names) {
|
|
|
3871
3980
|
if (target === null) {
|
|
3872
3981
|
return;
|
|
3873
3982
|
}
|
|
3874
|
-
if (target
|
|
3983
|
+
if (target[0] === bindingTargetTypes.array) {
|
|
3875
3984
|
try {
|
|
3876
|
-
for (var _c = __values(target
|
|
3985
|
+
for (var _c = __values(target[1][0]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
3877
3986
|
var element = _d.value;
|
|
3878
3987
|
getNamesFromBindingTarget(element, names);
|
|
3879
3988
|
}
|
|
@@ -3886,9 +3995,9 @@ function getNamesFromBindingTarget(target, names) {
|
|
|
3886
3995
|
finally { if (e_1) throw e_1.error; }
|
|
3887
3996
|
}
|
|
3888
3997
|
}
|
|
3889
|
-
else if (target
|
|
3998
|
+
else if (target[0] === bindingTargetTypes.object) {
|
|
3890
3999
|
try {
|
|
3891
|
-
for (var _e = __values(Object.values(target
|
|
4000
|
+
for (var _e = __values(Object.values(target[1][0])), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
3892
4001
|
var element = _f.value;
|
|
3893
4002
|
getNamesFromBindingTarget(element, names);
|
|
3894
4003
|
}
|
|
@@ -3901,27 +4010,39 @@ function getNamesFromBindingTarget(target, names) {
|
|
|
3901
4010
|
finally { if (e_2) throw e_2.error; }
|
|
3902
4011
|
}
|
|
3903
4012
|
}
|
|
4013
|
+
else if (target[0] === bindingTargetTypes.rest) {
|
|
4014
|
+
if (names[target[1][0]]) {
|
|
4015
|
+
throw new LitsError("Duplicate binding name: ".concat(target[1][0]), target[2]);
|
|
4016
|
+
}
|
|
4017
|
+
names[target[1][0]] = true;
|
|
4018
|
+
}
|
|
3904
4019
|
else {
|
|
3905
|
-
if (names[target
|
|
3906
|
-
throw new LitsError("Duplicate binding name: ".concat(target
|
|
4020
|
+
if (names[target[1][0][1]]) {
|
|
4021
|
+
throw new LitsError("Duplicate binding name: ".concat(target[1][0]), target[2]);
|
|
3907
4022
|
}
|
|
3908
|
-
names[target
|
|
4023
|
+
names[target[1][0][1]] = true;
|
|
3909
4024
|
}
|
|
3910
4025
|
}
|
|
3911
4026
|
|
|
3912
4027
|
var defSpecialExpression = {
|
|
3913
4028
|
paramCount: 2,
|
|
3914
4029
|
evaluate: function (node, contextStack, _a) {
|
|
3915
|
-
var
|
|
3916
|
-
var
|
|
3917
|
-
var
|
|
4030
|
+
var evaluateNode = _a.evaluateNode;
|
|
4031
|
+
var bindingNode = node[1][1];
|
|
4032
|
+
var target = bindingNode[1][0];
|
|
4033
|
+
var value = bindingNode[1][1];
|
|
4034
|
+
var bindingValue = evaluateNode(value, contextStack);
|
|
4035
|
+
var values = evalueateBindingNodeValues(target, bindingValue, function (Node) { return evaluateNode(Node, contextStack); });
|
|
3918
4036
|
contextStack.exportValues(values);
|
|
3919
4037
|
return null;
|
|
3920
4038
|
},
|
|
3921
4039
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3922
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3923
|
-
var
|
|
3924
|
-
|
|
4040
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4041
|
+
var bindingNode = node[1][1];
|
|
4042
|
+
var target = bindingNode[1][0];
|
|
4043
|
+
var value = bindingNode[1][1];
|
|
4044
|
+
var bindingResult = getUndefinedSymbols([value], contextStack, builtin, evaluateNode);
|
|
4045
|
+
contextStack.addValues(getAllBindingTargetNames(target));
|
|
3925
4046
|
return bindingResult;
|
|
3926
4047
|
},
|
|
3927
4048
|
};
|
|
@@ -3930,14 +4051,14 @@ var doSpecialExpression = {
|
|
|
3930
4051
|
paramCount: {},
|
|
3931
4052
|
evaluate: function (node, contextStack, _a) {
|
|
3932
4053
|
var e_1, _b;
|
|
3933
|
-
var
|
|
4054
|
+
var evaluateNode = _a.evaluateNode;
|
|
3934
4055
|
var newContext = {};
|
|
3935
4056
|
var newContextStack = contextStack.create(newContext);
|
|
3936
4057
|
var result = null;
|
|
3937
4058
|
try {
|
|
3938
|
-
for (var _c = __values(node
|
|
4059
|
+
for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
3939
4060
|
var form = _d.value;
|
|
3940
|
-
result =
|
|
4061
|
+
result = evaluateNode(form, newContextStack);
|
|
3941
4062
|
}
|
|
3942
4063
|
}
|
|
3943
4064
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
@@ -3950,8 +4071,8 @@ var doSpecialExpression = {
|
|
|
3950
4071
|
return result;
|
|
3951
4072
|
},
|
|
3952
4073
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3953
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3954
|
-
return getUndefinedSymbols(node
|
|
4074
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4075
|
+
return getUndefinedSymbols(node[1][1], contextStack.create({}), builtin, evaluateNode);
|
|
3955
4076
|
},
|
|
3956
4077
|
};
|
|
3957
4078
|
|
|
@@ -4012,7 +4133,8 @@ function isNumberReservedSymbol(symbol) {
|
|
|
4012
4133
|
function assertNameNotDefined(name, contextStack, builtin, sourceCodeInfo) {
|
|
4013
4134
|
if (typeof name !== 'string')
|
|
4014
4135
|
return;
|
|
4015
|
-
|
|
4136
|
+
// TODO only subset of special expressions are necessary to check (CommonSpecialExpressionType)
|
|
4137
|
+
if (specialExpressionTypes[name])
|
|
4016
4138
|
throw new LitsError("Cannot define variable ".concat(name, ", it's a special expression."), sourceCodeInfo);
|
|
4017
4139
|
if (builtin.normalExpressions[name])
|
|
4018
4140
|
throw new LitsError("Cannot define variable ".concat(name, ", it's a builtin function."), sourceCodeInfo);
|
|
@@ -4026,63 +4148,69 @@ var functionSpecialExpression = {
|
|
|
4026
4148
|
paramCount: {},
|
|
4027
4149
|
evaluate: function (node, contextStack, _a) {
|
|
4028
4150
|
var _b, _c;
|
|
4029
|
-
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols,
|
|
4030
|
-
var
|
|
4031
|
-
|
|
4032
|
-
|
|
4151
|
+
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
|
|
4152
|
+
var _d = __read(node[1], 3), functionSymbol = _d[1], fn = _d[2];
|
|
4153
|
+
assertUserDefinedSymbolNode(functionSymbol, node[2]);
|
|
4154
|
+
assertNameNotDefined(functionSymbol[1], contextStack, builtin, node[2]);
|
|
4155
|
+
var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
|
|
4033
4156
|
var litsFunction = (_b = {},
|
|
4034
4157
|
_b[FUNCTION_SYMBOL] = true,
|
|
4035
|
-
_b.sourceCodeInfo = node
|
|
4158
|
+
_b.sourceCodeInfo = node[2],
|
|
4036
4159
|
_b.functionType = 'UserDefined',
|
|
4037
|
-
_b.name =
|
|
4160
|
+
_b.name = functionSymbol[1],
|
|
4038
4161
|
_b.evaluatedfunction = evaluatedFunction,
|
|
4039
4162
|
_b);
|
|
4040
|
-
contextStack.addValues((_c = {}, _c[
|
|
4163
|
+
contextStack.addValues((_c = {}, _c[functionSymbol[1]] = litsFunction, _c));
|
|
4041
4164
|
return null;
|
|
4042
4165
|
},
|
|
4043
4166
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4044
4167
|
var _b, _c;
|
|
4045
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4046
|
-
|
|
4047
|
-
|
|
4048
|
-
|
|
4168
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4169
|
+
var functionName = node[1][1][1];
|
|
4170
|
+
contextStack.addValues((_b = {}, _b[functionName] = true, _b));
|
|
4171
|
+
var newContext = (_c = {}, _c[functionName] = { value: true }, _c);
|
|
4172
|
+
return addFunctionUnresolvedSymbols(node[1][2], contextStack, getUndefinedSymbols, builtin, evaluateNode, newContext);
|
|
4049
4173
|
},
|
|
4050
4174
|
};
|
|
4051
4175
|
var defnSpecialExpression = {
|
|
4052
4176
|
paramCount: {},
|
|
4053
4177
|
evaluate: function (node, contextStack, _a) {
|
|
4054
4178
|
var _b, _c;
|
|
4055
|
-
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols,
|
|
4056
|
-
var
|
|
4057
|
-
|
|
4058
|
-
|
|
4179
|
+
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
|
|
4180
|
+
var _d = __read(node[1], 3), functionSymbol = _d[1], fn = _d[2];
|
|
4181
|
+
assertUserDefinedSymbolNode(functionSymbol, node[2]);
|
|
4182
|
+
assertNameNotDefined(functionSymbol[1], contextStack, builtin, node[2]);
|
|
4183
|
+
var evaluatedFunctionOverloades = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
|
|
4059
4184
|
var litsFunction = (_b = {},
|
|
4060
4185
|
_b[FUNCTION_SYMBOL] = true,
|
|
4061
|
-
_b.sourceCodeInfo = node
|
|
4186
|
+
_b.sourceCodeInfo = node[2],
|
|
4062
4187
|
_b.functionType = 'UserDefined',
|
|
4063
|
-
_b.name =
|
|
4188
|
+
_b.name = functionSymbol[1],
|
|
4064
4189
|
_b.evaluatedfunction = evaluatedFunctionOverloades,
|
|
4065
4190
|
_b);
|
|
4066
|
-
contextStack.exportValues((_c = {}, _c[
|
|
4191
|
+
contextStack.exportValues((_c = {}, _c[functionSymbol[1]] = litsFunction, _c));
|
|
4067
4192
|
return null;
|
|
4068
4193
|
},
|
|
4069
4194
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4070
4195
|
var _b, _c;
|
|
4071
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4072
|
-
|
|
4073
|
-
var
|
|
4074
|
-
|
|
4196
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4197
|
+
var functionName = node[1][1][1];
|
|
4198
|
+
var fn = node[1][2];
|
|
4199
|
+
contextStack.exportValues((_b = {}, _b[functionName] = true, _b));
|
|
4200
|
+
var newContext = (_c = {}, _c[functionName] = { value: true }, _c);
|
|
4201
|
+
return addFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode, newContext);
|
|
4075
4202
|
},
|
|
4076
4203
|
};
|
|
4077
4204
|
var fnSpecialExpression = {
|
|
4078
4205
|
paramCount: {},
|
|
4079
4206
|
evaluate: function (node, contextStack, _a) {
|
|
4080
4207
|
var _b;
|
|
4081
|
-
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols,
|
|
4082
|
-
var
|
|
4208
|
+
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
|
|
4209
|
+
var fn = node[1][1];
|
|
4210
|
+
var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
|
|
4083
4211
|
var litsFunction = (_b = {},
|
|
4084
4212
|
_b[FUNCTION_SYMBOL] = true,
|
|
4085
|
-
_b.sourceCodeInfo = node
|
|
4213
|
+
_b.sourceCodeInfo = node[2],
|
|
4086
4214
|
_b.functionType = 'UserDefined',
|
|
4087
4215
|
_b.name = undefined,
|
|
4088
4216
|
_b.evaluatedfunction = evaluatedFunction,
|
|
@@ -4090,129 +4218,103 @@ var fnSpecialExpression = {
|
|
|
4090
4218
|
return litsFunction;
|
|
4091
4219
|
},
|
|
4092
4220
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4093
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4094
|
-
|
|
4221
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4222
|
+
var fn = node[1][1];
|
|
4223
|
+
return addFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode);
|
|
4095
4224
|
},
|
|
4096
4225
|
};
|
|
4097
|
-
function evaluateFunction(
|
|
4098
|
-
var fn = node.function;
|
|
4226
|
+
function evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode) {
|
|
4099
4227
|
var functionContext = {};
|
|
4100
|
-
var context = fn.
|
|
4228
|
+
var context = fn[0].reduce(function (ctx, arg) {
|
|
4101
4229
|
Object.keys(getAllBindingTargetNames(arg)).forEach(function (name) {
|
|
4102
4230
|
ctx[name] = { value: null };
|
|
4103
4231
|
});
|
|
4104
4232
|
return ctx;
|
|
4105
4233
|
}, {});
|
|
4106
|
-
var undefinedSymbols = getUndefinedSymbols(fn
|
|
4234
|
+
var undefinedSymbols = getUndefinedSymbols(fn[1], contextStack.new(context), builtin, evaluateNode);
|
|
4107
4235
|
undefinedSymbols.forEach(function (name) {
|
|
4108
4236
|
var value = contextStack.getValue(name);
|
|
4109
4237
|
if (isAny(value)) {
|
|
4110
4238
|
functionContext[name] = { value: value };
|
|
4111
4239
|
}
|
|
4112
4240
|
});
|
|
4113
|
-
var evaluatedFunction =
|
|
4114
|
-
|
|
4115
|
-
|
|
4116
|
-
|
|
4117
|
-
|
|
4241
|
+
var evaluatedFunction = [
|
|
4242
|
+
fn[0],
|
|
4243
|
+
fn[1],
|
|
4244
|
+
functionContext,
|
|
4245
|
+
];
|
|
4118
4246
|
return evaluatedFunction;
|
|
4119
4247
|
}
|
|
4120
|
-
function addFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin,
|
|
4248
|
+
function addFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode, functionNameContext) {
|
|
4121
4249
|
var result = new Set();
|
|
4122
4250
|
var contextStackWithFunctionName = functionNameContext ? contextStack.create(functionNameContext) : contextStack;
|
|
4123
4251
|
var newContext = {};
|
|
4124
|
-
fn.
|
|
4252
|
+
fn[0].forEach(function (arg) {
|
|
4125
4253
|
Object.assign(newContext, getAllBindingTargetNames(arg));
|
|
4126
4254
|
});
|
|
4127
4255
|
var newContextStack = contextStackWithFunctionName.create(newContext);
|
|
4128
|
-
var overloadResult = getUndefinedSymbols(fn
|
|
4256
|
+
var overloadResult = getUndefinedSymbols(fn[1], newContextStack, builtin, evaluateNode);
|
|
4129
4257
|
addToSet(result, overloadResult);
|
|
4130
4258
|
return result;
|
|
4131
4259
|
}
|
|
4132
4260
|
|
|
4133
|
-
function isAstNode(value) {
|
|
4134
|
-
if (value === null || typeof value !== 'object')
|
|
4135
|
-
return false;
|
|
4136
|
-
if (!isAstNodeType(value.type))
|
|
4137
|
-
return false;
|
|
4138
|
-
return true;
|
|
4139
|
-
}
|
|
4140
|
-
function asAstNode(value, sourceCodeInfo) {
|
|
4141
|
-
assertAstNode(value, sourceCodeInfo);
|
|
4142
|
-
return value;
|
|
4143
|
-
}
|
|
4144
|
-
function assertAstNode(value, sourceCodeInfo) {
|
|
4145
|
-
if (!isAstNode(value))
|
|
4146
|
-
throw getAssertionError('AstNode', value, sourceCodeInfo);
|
|
4147
|
-
}
|
|
4148
|
-
function isSymbolNode(value) {
|
|
4149
|
-
if (!isAstNode(value))
|
|
4150
|
-
return false;
|
|
4151
|
-
return value.type === 'Symbol';
|
|
4152
|
-
}
|
|
4153
|
-
function isNormalExpressionNodeWithName(value) {
|
|
4154
|
-
if (!isAstNode(value))
|
|
4155
|
-
return false;
|
|
4156
|
-
return value.type === 'NormalExpression' && typeof value.name === 'string';
|
|
4157
|
-
}
|
|
4158
|
-
|
|
4159
4261
|
var ifSpecialExpression = {
|
|
4160
4262
|
paramCount: { min: 2, max: 3 },
|
|
4161
4263
|
evaluate: function (node, contextStack, _a) {
|
|
4162
|
-
var
|
|
4163
|
-
var
|
|
4164
|
-
|
|
4165
|
-
|
|
4166
|
-
return evaluateAstNode(asAstNode(trueNode, sourceCodeInfo), contextStack);
|
|
4264
|
+
var evaluateNode = _a.evaluateNode;
|
|
4265
|
+
var _b = __read(node[1][1], 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
|
|
4266
|
+
if (evaluateNode(conditionNode, contextStack)) {
|
|
4267
|
+
return evaluateNode(trueNode, contextStack);
|
|
4167
4268
|
}
|
|
4168
|
-
else {
|
|
4169
|
-
|
|
4170
|
-
return evaluateAstNode(asAstNode(falseNode, sourceCodeInfo), contextStack);
|
|
4171
|
-
else
|
|
4172
|
-
return null;
|
|
4269
|
+
else if (falseNode) {
|
|
4270
|
+
return evaluateNode(falseNode, contextStack);
|
|
4173
4271
|
}
|
|
4272
|
+
return null;
|
|
4174
4273
|
},
|
|
4175
4274
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4176
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4177
|
-
return getUndefinedSymbols(node.
|
|
4275
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4276
|
+
return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
|
|
4178
4277
|
},
|
|
4179
4278
|
};
|
|
4180
4279
|
|
|
4181
4280
|
var unlessSpecialExpression = {
|
|
4182
4281
|
paramCount: { min: 2, max: 3 },
|
|
4183
4282
|
evaluate: function (node, contextStack, _a) {
|
|
4184
|
-
var
|
|
4185
|
-
var
|
|
4186
|
-
|
|
4187
|
-
|
|
4188
|
-
return evaluateAstNode(asAstNode(trueNode, sourceCodeInfo), contextStack);
|
|
4283
|
+
var evaluateNode = _a.evaluateNode;
|
|
4284
|
+
var _b = __read(node[1][1], 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
|
|
4285
|
+
if (!evaluateNode(conditionNode, contextStack)) {
|
|
4286
|
+
return evaluateNode(trueNode, contextStack);
|
|
4189
4287
|
}
|
|
4190
|
-
else {
|
|
4191
|
-
|
|
4192
|
-
return evaluateAstNode(asAstNode(falseNode, sourceCodeInfo), contextStack);
|
|
4193
|
-
else
|
|
4194
|
-
return null;
|
|
4288
|
+
else if (falseNode) {
|
|
4289
|
+
return evaluateNode(falseNode, contextStack);
|
|
4195
4290
|
}
|
|
4291
|
+
return null;
|
|
4196
4292
|
},
|
|
4197
4293
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4198
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4199
|
-
return getUndefinedSymbols(node.
|
|
4294
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4295
|
+
return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
|
|
4200
4296
|
},
|
|
4201
4297
|
};
|
|
4202
4298
|
|
|
4203
4299
|
var letSpecialExpression = {
|
|
4204
4300
|
paramCount: 0,
|
|
4205
4301
|
evaluate: function (node, contextStack, _a) {
|
|
4206
|
-
var
|
|
4207
|
-
var
|
|
4208
|
-
var
|
|
4302
|
+
var evaluateNode = _a.evaluateNode;
|
|
4303
|
+
var bindingNode = node[1][1];
|
|
4304
|
+
var target = bindingNode[1][0];
|
|
4305
|
+
var value = bindingNode[1][1];
|
|
4306
|
+
var bindingValue = evaluateNode(value, contextStack);
|
|
4307
|
+
var values = evalueateBindingNodeValues(target, bindingValue, function (Node) { return evaluateNode(Node, contextStack); });
|
|
4209
4308
|
contextStack.addValues(values);
|
|
4210
4309
|
return null;
|
|
4211
4310
|
},
|
|
4212
4311
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4213
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4214
|
-
var
|
|
4215
|
-
|
|
4312
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4313
|
+
var bindingNode = node[1][1];
|
|
4314
|
+
var target = bindingNode[1][0];
|
|
4315
|
+
var value = bindingNode[1][1];
|
|
4316
|
+
var bindingResult = getUndefinedSymbols([value], contextStack, builtin, evaluateNode);
|
|
4317
|
+
contextStack.addValues(getAllBindingTargetNames(target));
|
|
4216
4318
|
return bindingResult;
|
|
4217
4319
|
},
|
|
4218
4320
|
};
|
|
@@ -4220,11 +4322,11 @@ var letSpecialExpression = {
|
|
|
4220
4322
|
var loopSpecialExpression = {
|
|
4221
4323
|
paramCount: {},
|
|
4222
4324
|
evaluate: function (node, contextStack, _a) {
|
|
4223
|
-
var
|
|
4224
|
-
var
|
|
4225
|
-
var bindingContext =
|
|
4226
|
-
var val =
|
|
4227
|
-
var valueRecord = evalueateBindingNodeValues(
|
|
4325
|
+
var evaluateNode = _a.evaluateNode;
|
|
4326
|
+
var bindingNodes = node[1][1];
|
|
4327
|
+
var bindingContext = bindingNodes.reduce(function (result, bindingNode) {
|
|
4328
|
+
var val = evaluateNode(bindingNode[1][1], contextStack.create(result));
|
|
4329
|
+
var valueRecord = evalueateBindingNodeValues(bindingNode[1][0], val, function (Node) { return evaluateNode(Node, contextStack); });
|
|
4228
4330
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4229
4331
|
var _b = __read(_a, 2), name = _b[0], value = _b[1];
|
|
4230
4332
|
result[name] = { value: value };
|
|
@@ -4232,20 +4334,21 @@ var loopSpecialExpression = {
|
|
|
4232
4334
|
return result;
|
|
4233
4335
|
}, {});
|
|
4234
4336
|
var newContextStack = contextStack.create(bindingContext);
|
|
4337
|
+
var body = node[1][2];
|
|
4235
4338
|
var _loop_1 = function () {
|
|
4236
4339
|
var e_1, _b;
|
|
4237
4340
|
var result = null;
|
|
4238
4341
|
try {
|
|
4239
4342
|
try {
|
|
4240
|
-
for (var
|
|
4241
|
-
var form =
|
|
4242
|
-
result =
|
|
4343
|
+
for (var body_1 = (e_1 = void 0, __values(body)), body_1_1 = body_1.next(); !body_1_1.done; body_1_1 = body_1.next()) {
|
|
4344
|
+
var form = body_1_1.value;
|
|
4345
|
+
result = evaluateNode(form, newContextStack);
|
|
4243
4346
|
}
|
|
4244
4347
|
}
|
|
4245
4348
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
4246
4349
|
finally {
|
|
4247
4350
|
try {
|
|
4248
|
-
if (
|
|
4351
|
+
if (body_1_1 && !body_1_1.done && (_b = body_1.return)) _b.call(body_1);
|
|
4249
4352
|
}
|
|
4250
4353
|
finally { if (e_1) throw e_1.error; }
|
|
4251
4354
|
}
|
|
@@ -4253,16 +4356,16 @@ var loopSpecialExpression = {
|
|
|
4253
4356
|
catch (error) {
|
|
4254
4357
|
if (error instanceof RecurSignal) {
|
|
4255
4358
|
var params_1 = error.params;
|
|
4256
|
-
if (params_1.length !==
|
|
4257
|
-
throw new LitsError("recur expected ".concat(
|
|
4359
|
+
if (params_1.length !== bindingNodes.length) {
|
|
4360
|
+
throw new LitsError("recur expected ".concat(bindingNodes.length, " parameters, got ").concat(valueToString(params_1.length)), node[2]);
|
|
4258
4361
|
}
|
|
4259
|
-
|
|
4362
|
+
bindingNodes.forEach(function (bindingNode, index) {
|
|
4260
4363
|
var e_2, _a;
|
|
4261
|
-
var valueRecord = evalueateBindingNodeValues(
|
|
4364
|
+
var valueRecord = evalueateBindingNodeValues(bindingNode[1][0], asAny(params_1[index]), function (Node) { return evaluateNode(Node, contextStack); });
|
|
4262
4365
|
try {
|
|
4263
4366
|
for (var _b = (e_2 = void 0, __values(Object.entries(valueRecord))), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
4264
4367
|
var _d = __read(_c.value, 2), name_1 = _d[0], value = _d[1];
|
|
4265
|
-
|
|
4368
|
+
bindingContext[name_1].value = value;
|
|
4266
4369
|
}
|
|
4267
4370
|
}
|
|
4268
4371
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
@@ -4286,29 +4389,31 @@ var loopSpecialExpression = {
|
|
|
4286
4389
|
}
|
|
4287
4390
|
},
|
|
4288
4391
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4289
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4290
|
-
var
|
|
4392
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4393
|
+
var bindingNodes = node[1][1];
|
|
4394
|
+
var newContext = bindingNodes
|
|
4291
4395
|
.reduce(function (context, bindingNode) {
|
|
4292
|
-
var names = getAllBindingTargetNames(bindingNode
|
|
4396
|
+
var names = getAllBindingTargetNames(bindingNode[1][0]);
|
|
4293
4397
|
Object.keys(names).forEach(function (name) {
|
|
4294
4398
|
context[name] = { value: true };
|
|
4295
4399
|
});
|
|
4296
4400
|
return context;
|
|
4297
4401
|
}, {});
|
|
4298
|
-
var bindingValueNodes =
|
|
4299
|
-
var bindingsResult = getUndefinedSymbols(bindingValueNodes, contextStack, builtin,
|
|
4300
|
-
var paramsResult = getUndefinedSymbols(node
|
|
4402
|
+
var bindingValueNodes = bindingNodes.map(function (bindingNode) { return bindingNode[1][1]; });
|
|
4403
|
+
var bindingsResult = getUndefinedSymbols(bindingValueNodes, contextStack, builtin, evaluateNode);
|
|
4404
|
+
var paramsResult = getUndefinedSymbols(node[1][2], contextStack.create(newContext), builtin, evaluateNode);
|
|
4301
4405
|
return joinSets(bindingsResult, paramsResult);
|
|
4302
4406
|
},
|
|
4303
4407
|
};
|
|
4304
4408
|
|
|
4305
|
-
function addToContext(bindings, context, contextStack,
|
|
4409
|
+
function addToContext(bindings, context, contextStack, evaluateNode) {
|
|
4306
4410
|
var e_1, _a;
|
|
4307
4411
|
try {
|
|
4308
4412
|
for (var bindings_1 = __values(bindings), bindings_1_1 = bindings_1.next(); !bindings_1_1.done; bindings_1_1 = bindings_1.next()) {
|
|
4309
|
-
var
|
|
4310
|
-
var
|
|
4311
|
-
var
|
|
4413
|
+
var bindingNode = bindings_1_1.value;
|
|
4414
|
+
var _b = __read(bindingNode[1], 2), target = _b[0], bindingValue = _b[1];
|
|
4415
|
+
var val = evaluateNode(bindingValue, contextStack);
|
|
4416
|
+
var valueRecord = evalueateBindingNodeValues(target, val, function (Node) { return evaluateNode(Node, contextStack); });
|
|
4312
4417
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4313
4418
|
var _b = __read(_a, 2), name = _b[0], value = _b[1];
|
|
4314
4419
|
context[name] = { value: value };
|
|
@@ -4323,9 +4428,9 @@ function addToContext(bindings, context, contextStack, evaluateAstNode) {
|
|
|
4323
4428
|
finally { if (e_1) throw e_1.error; }
|
|
4324
4429
|
}
|
|
4325
4430
|
}
|
|
4326
|
-
function evaluateLoop(returnResult,
|
|
4327
|
-
var sourceCodeInfo =
|
|
4328
|
-
var _a =
|
|
4431
|
+
function evaluateLoop(returnResult, loopNode, contextStack, evaluateNode) {
|
|
4432
|
+
var sourceCodeInfo = loopNode[2];
|
|
4433
|
+
var _a = __read(loopNode[1], 3), loopBindings = _a[1], body = _a[2];
|
|
4329
4434
|
var result = [];
|
|
4330
4435
|
var bindingIndices = loopBindings.map(function () { return 0; });
|
|
4331
4436
|
var abort = false;
|
|
@@ -4335,8 +4440,9 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
|
|
|
4335
4440
|
var newContextStack = contextStack.create(context);
|
|
4336
4441
|
var skip = false;
|
|
4337
4442
|
bindingsLoop: for (var bindingIndex = 0; bindingIndex < loopBindings.length; bindingIndex += 1) {
|
|
4338
|
-
var _c =
|
|
4339
|
-
var
|
|
4443
|
+
var _c = __read(loopBindings[bindingIndex], 4), bindingNode = _c[0], letBindings = _c[1], whenNode = _c[2], whileNode = _c[3];
|
|
4444
|
+
var _d = __read(bindingNode[1], 2), targetNode = _d[0], valueNode = _d[1];
|
|
4445
|
+
var coll = asColl(evaluateNode(valueNode, newContextStack), sourceCodeInfo);
|
|
4340
4446
|
var seq = isSeq(coll) ? coll : Object.entries(coll);
|
|
4341
4447
|
if (seq.length === 0) {
|
|
4342
4448
|
skip = true;
|
|
@@ -4355,45 +4461,40 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
|
|
|
4355
4461
|
break;
|
|
4356
4462
|
}
|
|
4357
4463
|
var val = asAny(seq[index], sourceCodeInfo);
|
|
4358
|
-
var valueRecord = evalueateBindingNodeValues(
|
|
4464
|
+
var valueRecord = evalueateBindingNodeValues(targetNode, val, function (Node) { return evaluateNode(Node, newContextStack); });
|
|
4359
4465
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4360
4466
|
var _b = __read(_a, 2), name = _b[0], value = _b[1];
|
|
4361
4467
|
context[name] = { value: value };
|
|
4362
4468
|
});
|
|
4469
|
+
if (letBindings) {
|
|
4470
|
+
addToContext(letBindings, context, newContextStack, evaluateNode);
|
|
4471
|
+
}
|
|
4472
|
+
if (whenNode && !evaluateNode(whenNode, newContextStack)) {
|
|
4473
|
+
bindingIndices[bindingIndex] = asNonUndefined(bindingIndices[bindingIndex], sourceCodeInfo) + 1;
|
|
4474
|
+
skip = true;
|
|
4475
|
+
break bindingsLoop;
|
|
4476
|
+
}
|
|
4477
|
+
if (whileNode && !evaluateNode(whileNode, newContextStack)) {
|
|
4478
|
+
bindingIndices[bindingIndex] = Number.POSITIVE_INFINITY;
|
|
4479
|
+
skip = true;
|
|
4480
|
+
break bindingsLoop;
|
|
4481
|
+
}
|
|
4482
|
+
}
|
|
4483
|
+
if (!skip) {
|
|
4484
|
+
var value = null;
|
|
4363
4485
|
try {
|
|
4364
|
-
for (var
|
|
4365
|
-
var
|
|
4366
|
-
|
|
4367
|
-
case '&let':
|
|
4368
|
-
addToContext(asNonUndefined(letBindings, sourceCodeInfo), context, newContextStack, evaluateAstNode);
|
|
4369
|
-
break;
|
|
4370
|
-
case '&when':
|
|
4371
|
-
if (!evaluateAstNode(asAstNode(whenNode, sourceCodeInfo), newContextStack)) {
|
|
4372
|
-
bindingIndices[bindingIndex] = asNonUndefined(bindingIndices[bindingIndex], sourceCodeInfo) + 1;
|
|
4373
|
-
skip = true;
|
|
4374
|
-
break bindingsLoop;
|
|
4375
|
-
}
|
|
4376
|
-
break;
|
|
4377
|
-
case '&while':
|
|
4378
|
-
if (!evaluateAstNode(asAstNode(whileNode, sourceCodeInfo), newContextStack)) {
|
|
4379
|
-
bindingIndices[bindingIndex] = Number.POSITIVE_INFINITY;
|
|
4380
|
-
skip = true;
|
|
4381
|
-
break bindingsLoop;
|
|
4382
|
-
}
|
|
4383
|
-
break;
|
|
4384
|
-
}
|
|
4486
|
+
for (var body_1 = (e_2 = void 0, __values(body)), body_1_1 = body_1.next(); !body_1_1.done; body_1_1 = body_1.next()) {
|
|
4487
|
+
var form = body_1_1.value;
|
|
4488
|
+
value = evaluateNode(form, newContextStack);
|
|
4385
4489
|
}
|
|
4386
4490
|
}
|
|
4387
4491
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
4388
4492
|
finally {
|
|
4389
4493
|
try {
|
|
4390
|
-
if (
|
|
4494
|
+
if (body_1_1 && !body_1_1.done && (_b = body_1.return)) _b.call(body_1);
|
|
4391
4495
|
}
|
|
4392
4496
|
finally { if (e_2) throw e_2.error; }
|
|
4393
4497
|
}
|
|
4394
|
-
}
|
|
4395
|
-
if (!skip) {
|
|
4396
|
-
var value = evaluateAstNode(params[0], newContextStack);
|
|
4397
4498
|
if (returnResult)
|
|
4398
4499
|
result.push(value);
|
|
4399
4500
|
if (bindingIndices.length > 0)
|
|
@@ -4405,57 +4506,59 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
|
|
|
4405
4506
|
}
|
|
4406
4507
|
return returnResult ? result : null;
|
|
4407
4508
|
}
|
|
4408
|
-
function analyze(
|
|
4509
|
+
function analyze(loopNode, contextStack, getUndefinedSymbols, builtin, evaluateNode) {
|
|
4409
4510
|
var result = new Set();
|
|
4410
4511
|
var newContext = {};
|
|
4411
|
-
var loopBindings =
|
|
4412
|
-
loopBindings.forEach(function (
|
|
4413
|
-
var
|
|
4414
|
-
|
|
4512
|
+
var _a = __read(loopNode[1], 3), loopBindings = _a[1], body = _a[2];
|
|
4513
|
+
loopBindings.forEach(function (loopBindingNode) {
|
|
4514
|
+
var _a = __read(loopBindingNode, 4), bindingNode = _a[0], letBindings = _a[1], whenNode = _a[2], whileNode = _a[3];
|
|
4515
|
+
var _b = __read(bindingNode[1], 2), target = _b[0], value = _b[1];
|
|
4516
|
+
getUndefinedSymbols([value], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4415
4517
|
return result.add(symbol);
|
|
4416
4518
|
});
|
|
4417
|
-
Object.assign(newContext, getAllBindingTargetNames(
|
|
4519
|
+
Object.assign(newContext, getAllBindingTargetNames(target));
|
|
4418
4520
|
if (letBindings) {
|
|
4419
|
-
letBindings.forEach(function (
|
|
4420
|
-
|
|
4521
|
+
letBindings.forEach(function (letBindingNode) {
|
|
4522
|
+
var _a = __read(letBindingNode[1], 2), letTarget = _a[0], letValue = _a[1];
|
|
4523
|
+
getUndefinedSymbols([letValue], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4421
4524
|
return result.add(symbol);
|
|
4422
4525
|
});
|
|
4423
|
-
Object.assign(newContext, getAllBindingTargetNames(
|
|
4526
|
+
Object.assign(newContext, getAllBindingTargetNames(letTarget));
|
|
4424
4527
|
});
|
|
4425
4528
|
}
|
|
4426
4529
|
if (whenNode) {
|
|
4427
|
-
getUndefinedSymbols([whenNode], contextStack.create(newContext), builtin,
|
|
4530
|
+
getUndefinedSymbols([whenNode], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4428
4531
|
return result.add(symbol);
|
|
4429
4532
|
});
|
|
4430
4533
|
}
|
|
4431
4534
|
if (whileNode) {
|
|
4432
|
-
getUndefinedSymbols([whileNode], contextStack.create(newContext), builtin,
|
|
4535
|
+
getUndefinedSymbols([whileNode], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4433
4536
|
return result.add(symbol);
|
|
4434
4537
|
});
|
|
4435
4538
|
}
|
|
4436
4539
|
});
|
|
4437
|
-
getUndefinedSymbols(
|
|
4540
|
+
getUndefinedSymbols(body, contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4438
4541
|
return result.add(symbol);
|
|
4439
4542
|
});
|
|
4440
4543
|
return result;
|
|
4441
4544
|
}
|
|
4442
4545
|
var forSpecialExpression = {
|
|
4443
4546
|
paramCount: 1,
|
|
4444
|
-
evaluate: function (node, contextStack, helpers) { return evaluateLoop(true, node, contextStack, helpers.
|
|
4547
|
+
evaluate: function (node, contextStack, helpers) { return evaluateLoop(true, node, contextStack, helpers.evaluateNode); },
|
|
4445
4548
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4446
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4447
|
-
return analyze(node, contextStack, getUndefinedSymbols, builtin,
|
|
4549
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4550
|
+
return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateNode);
|
|
4448
4551
|
},
|
|
4449
4552
|
};
|
|
4450
4553
|
var doseqSpecialExpression = {
|
|
4451
4554
|
paramCount: 1,
|
|
4452
4555
|
evaluate: function (node, contextStack, helpers) {
|
|
4453
|
-
evaluateLoop(false, node, contextStack, helpers.
|
|
4556
|
+
evaluateLoop(false, node, contextStack, helpers.evaluateNode);
|
|
4454
4557
|
return null;
|
|
4455
4558
|
},
|
|
4456
4559
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4457
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4458
|
-
return analyze(node, contextStack, getUndefinedSymbols, builtin,
|
|
4560
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4561
|
+
return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateNode);
|
|
4459
4562
|
},
|
|
4460
4563
|
};
|
|
4461
4564
|
|
|
@@ -4463,12 +4566,12 @@ var orSpecialExpression = {
|
|
|
4463
4566
|
paramCount: {},
|
|
4464
4567
|
evaluate: function (node, contextStack, _a) {
|
|
4465
4568
|
var e_1, _b;
|
|
4466
|
-
var
|
|
4569
|
+
var evaluateNode = _a.evaluateNode;
|
|
4467
4570
|
var value = false;
|
|
4468
4571
|
try {
|
|
4469
|
-
for (var _c = __values(node
|
|
4572
|
+
for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
4470
4573
|
var param = _d.value;
|
|
4471
|
-
value =
|
|
4574
|
+
value = evaluateNode(param, contextStack);
|
|
4472
4575
|
if (value)
|
|
4473
4576
|
break;
|
|
4474
4577
|
}
|
|
@@ -4483,55 +4586,55 @@ var orSpecialExpression = {
|
|
|
4483
4586
|
return value;
|
|
4484
4587
|
},
|
|
4485
4588
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4486
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4487
|
-
return getUndefinedSymbols(node
|
|
4589
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4590
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
4488
4591
|
},
|
|
4489
4592
|
};
|
|
4490
4593
|
|
|
4491
4594
|
var qqSpecialExpression = {
|
|
4492
4595
|
paramCount: { min: 1, max: 2 },
|
|
4493
4596
|
evaluate: function (node, contextStack, _a) {
|
|
4494
|
-
var
|
|
4495
|
-
var _b = __read(node
|
|
4496
|
-
if (
|
|
4497
|
-
|
|
4498
|
-
return secondNode ? evaluateAstNode(secondNode, contextStack) : null;
|
|
4597
|
+
var evaluateNode = _a.evaluateNode;
|
|
4598
|
+
var _b = __read(node[1][1], 2), firstNode = _b[0], secondNode = _b[1];
|
|
4599
|
+
if (isUserDefinedSymbolNode(firstNode) && contextStack.lookUp(firstNode) === null) {
|
|
4600
|
+
return secondNode ? evaluateNode(secondNode, contextStack) : null;
|
|
4499
4601
|
}
|
|
4500
|
-
assertAny(firstNode, node
|
|
4501
|
-
var firstResult =
|
|
4502
|
-
return firstResult !== null && firstResult !== void 0 ? firstResult : (secondNode ?
|
|
4602
|
+
assertAny(firstNode, node[2]);
|
|
4603
|
+
var firstResult = evaluateNode(firstNode, contextStack);
|
|
4604
|
+
return firstResult !== null && firstResult !== void 0 ? firstResult : (secondNode ? evaluateNode(secondNode, contextStack) : null);
|
|
4503
4605
|
},
|
|
4504
4606
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4505
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4506
|
-
return getUndefinedSymbols(node.
|
|
4607
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4608
|
+
return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
|
|
4507
4609
|
},
|
|
4508
4610
|
};
|
|
4509
4611
|
|
|
4510
4612
|
var recurSpecialExpression = {
|
|
4511
4613
|
paramCount: {},
|
|
4512
4614
|
evaluate: function (node, contextStack, _a) {
|
|
4513
|
-
var
|
|
4514
|
-
var params = node
|
|
4515
|
-
|
|
4615
|
+
var evaluateNode = _a.evaluateNode;
|
|
4616
|
+
var params = node[1][1];
|
|
4617
|
+
var evaluatedParams = params.map(function (paramNode) { return evaluateNode(paramNode, contextStack); });
|
|
4618
|
+
throw new RecurSignal(evaluatedParams);
|
|
4516
4619
|
},
|
|
4517
4620
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4518
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4519
|
-
return getUndefinedSymbols(node
|
|
4621
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4622
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
4520
4623
|
},
|
|
4521
4624
|
};
|
|
4522
4625
|
|
|
4523
4626
|
var throwSpecialExpression = {
|
|
4524
4627
|
paramCount: 1,
|
|
4525
4628
|
evaluate: function (node, contextStack, _a) {
|
|
4526
|
-
var
|
|
4527
|
-
var message = asString(
|
|
4629
|
+
var evaluateNode = _a.evaluateNode;
|
|
4630
|
+
var message = asString(evaluateNode(node[1][1], contextStack), node[2], {
|
|
4528
4631
|
nonEmpty: true,
|
|
4529
4632
|
});
|
|
4530
|
-
throw new UserDefinedError(message, node
|
|
4633
|
+
throw new UserDefinedError(message, node[2]);
|
|
4531
4634
|
},
|
|
4532
4635
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4533
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4534
|
-
return getUndefinedSymbols(node
|
|
4636
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4637
|
+
return getUndefinedSymbols([node[1][1]], contextStack, builtin, evaluateNode);
|
|
4535
4638
|
},
|
|
4536
4639
|
};
|
|
4537
4640
|
|
|
@@ -4539,29 +4642,29 @@ var trySpecialExpression = {
|
|
|
4539
4642
|
paramCount: 1,
|
|
4540
4643
|
evaluate: function (node, contextStack, _a) {
|
|
4541
4644
|
var _b;
|
|
4542
|
-
var
|
|
4543
|
-
var
|
|
4645
|
+
var evaluateNode = _a.evaluateNode;
|
|
4646
|
+
var _c = __read(node[1], 4), tryExpression = _c[1], errorSymbol = _c[2], catchExpression = _c[3];
|
|
4544
4647
|
try {
|
|
4545
|
-
return
|
|
4648
|
+
return evaluateNode(tryExpression, contextStack);
|
|
4546
4649
|
}
|
|
4547
4650
|
catch (error) {
|
|
4548
|
-
var newContext =
|
|
4651
|
+
var newContext = errorSymbol
|
|
4549
4652
|
? (_b = {},
|
|
4550
|
-
_b[
|
|
4653
|
+
_b[errorSymbol[1]] = { value: error },
|
|
4551
4654
|
_b) : {};
|
|
4552
|
-
return
|
|
4655
|
+
return evaluateNode(catchExpression, contextStack.create(newContext));
|
|
4553
4656
|
}
|
|
4554
4657
|
},
|
|
4555
4658
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4556
4659
|
var _b;
|
|
4557
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4558
|
-
var
|
|
4559
|
-
var tryResult = getUndefinedSymbols(
|
|
4560
|
-
var newContext =
|
|
4660
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4661
|
+
var _c = __read(node[1], 4), tryExpression = _c[1], errorSymbol = _c[2], catchExpression = _c[3];
|
|
4662
|
+
var tryResult = getUndefinedSymbols([tryExpression], contextStack, builtin, evaluateNode);
|
|
4663
|
+
var newContext = errorSymbol
|
|
4561
4664
|
? (_b = {},
|
|
4562
|
-
_b[
|
|
4665
|
+
_b[errorSymbol[1]] = { value: true },
|
|
4563
4666
|
_b) : {};
|
|
4564
|
-
var catchResult = getUndefinedSymbols([catchExpression], contextStack.create(newContext), builtin,
|
|
4667
|
+
var catchResult = getUndefinedSymbols([catchExpression], contextStack.create(newContext), builtin, evaluateNode);
|
|
4565
4668
|
return joinSets(tryResult, catchResult);
|
|
4566
4669
|
},
|
|
4567
4670
|
};
|
|
@@ -4570,20 +4673,20 @@ var arraySpecialExpression = {
|
|
|
4570
4673
|
paramCount: {},
|
|
4571
4674
|
evaluate: function (node, contextStack, _a) {
|
|
4572
4675
|
var e_1, _b;
|
|
4573
|
-
var
|
|
4676
|
+
var evaluateNode = _a.evaluateNode;
|
|
4574
4677
|
var result = [];
|
|
4575
4678
|
try {
|
|
4576
|
-
for (var _c = __values(node
|
|
4679
|
+
for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
4577
4680
|
var param = _d.value;
|
|
4578
|
-
if (param
|
|
4579
|
-
var spreadValue =
|
|
4681
|
+
if (isSpreadNode(param)) {
|
|
4682
|
+
var spreadValue = evaluateNode(param[1], contextStack);
|
|
4580
4683
|
if (!Array.isArray(spreadValue)) {
|
|
4581
|
-
throw new LitsError('Spread value is not an array', param
|
|
4684
|
+
throw new LitsError('Spread value is not an array', param[2]);
|
|
4582
4685
|
}
|
|
4583
4686
|
result.push.apply(result, __spreadArray([], __read(spreadValue), false));
|
|
4584
4687
|
}
|
|
4585
4688
|
else {
|
|
4586
|
-
result.push(
|
|
4689
|
+
result.push(evaluateNode(param, contextStack));
|
|
4587
4690
|
}
|
|
4588
4691
|
}
|
|
4589
4692
|
}
|
|
@@ -4597,76 +4700,79 @@ var arraySpecialExpression = {
|
|
|
4597
4700
|
return result;
|
|
4598
4701
|
},
|
|
4599
4702
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4600
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4601
|
-
return getUndefinedSymbols(node
|
|
4703
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4704
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
4602
4705
|
},
|
|
4603
4706
|
};
|
|
4604
4707
|
|
|
4605
4708
|
var objectSpecialExpression = {
|
|
4606
4709
|
paramCount: {},
|
|
4607
4710
|
evaluate: function (node, contextStack, _a) {
|
|
4608
|
-
var
|
|
4711
|
+
var evaluateNode = _a.evaluateNode;
|
|
4609
4712
|
var result = {};
|
|
4610
|
-
|
|
4611
|
-
|
|
4612
|
-
|
|
4613
|
-
|
|
4713
|
+
var params = node[1][1];
|
|
4714
|
+
for (var i = 0; i < params.length; i += 2) {
|
|
4715
|
+
var keyNode = params[i];
|
|
4716
|
+
if (isSpreadNode(keyNode)) {
|
|
4717
|
+
var spreadObject = evaluateNode(keyNode[1], contextStack);
|
|
4614
4718
|
if (!isUnknownRecord(spreadObject)) {
|
|
4615
|
-
throw new LitsError('Spread value is not an object', keyNode
|
|
4719
|
+
throw new LitsError('Spread value is not an object', keyNode[2]);
|
|
4616
4720
|
}
|
|
4617
4721
|
Object.assign(result, spreadObject);
|
|
4618
4722
|
i -= 1;
|
|
4619
4723
|
}
|
|
4620
4724
|
else {
|
|
4621
|
-
var key =
|
|
4622
|
-
var value =
|
|
4623
|
-
assertString(key, keyNode
|
|
4725
|
+
var key = evaluateNode(keyNode, contextStack);
|
|
4726
|
+
var value = evaluateNode(params[i + 1], contextStack);
|
|
4727
|
+
assertString(key, keyNode[2]);
|
|
4624
4728
|
result[key] = value;
|
|
4625
4729
|
}
|
|
4626
4730
|
}
|
|
4627
4731
|
return result;
|
|
4628
4732
|
},
|
|
4629
4733
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4630
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4631
|
-
return getUndefinedSymbols(node
|
|
4734
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4735
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
4632
4736
|
},
|
|
4633
4737
|
};
|
|
4634
4738
|
|
|
4635
|
-
var specialExpressions =
|
|
4636
|
-
|
|
4637
|
-
|
|
4638
|
-
|
|
4639
|
-
|
|
4640
|
-
|
|
4641
|
-
|
|
4642
|
-
|
|
4643
|
-
|
|
4644
|
-
|
|
4645
|
-
|
|
4646
|
-
|
|
4647
|
-
|
|
4648
|
-
|
|
4649
|
-
|
|
4650
|
-
|
|
4651
|
-
|
|
4652
|
-
|
|
4653
|
-
|
|
4654
|
-
|
|
4655
|
-
|
|
4656
|
-
|
|
4657
|
-
|
|
4658
|
-
|
|
4739
|
+
var specialExpressions = [
|
|
4740
|
+
qqSpecialExpression,
|
|
4741
|
+
andSpecialExpression,
|
|
4742
|
+
orSpecialExpression,
|
|
4743
|
+
arraySpecialExpression,
|
|
4744
|
+
condSpecialExpression,
|
|
4745
|
+
defSpecialExpression,
|
|
4746
|
+
definedSpecialExpression,
|
|
4747
|
+
defnSpecialExpression,
|
|
4748
|
+
doSpecialExpression,
|
|
4749
|
+
doseqSpecialExpression,
|
|
4750
|
+
fnSpecialExpression,
|
|
4751
|
+
forSpecialExpression,
|
|
4752
|
+
functionSpecialExpression,
|
|
4753
|
+
ifSpecialExpression,
|
|
4754
|
+
letSpecialExpression,
|
|
4755
|
+
loopSpecialExpression,
|
|
4756
|
+
objectSpecialExpression,
|
|
4757
|
+
recurSpecialExpression,
|
|
4758
|
+
switchSpecialExpression,
|
|
4759
|
+
throwSpecialExpression,
|
|
4760
|
+
trySpecialExpression,
|
|
4761
|
+
unlessSpecialExpression,
|
|
4762
|
+
];
|
|
4659
4763
|
var builtin = {
|
|
4660
4764
|
normalExpressions: normalExpressions,
|
|
4661
4765
|
specialExpressions: specialExpressions,
|
|
4766
|
+
allNormalExpressions: allNormalExpressions,
|
|
4662
4767
|
};
|
|
4663
4768
|
var normalExpressionKeys = Object.keys(normalExpressions);
|
|
4664
|
-
var specialExpressionKeys = Object.keys(
|
|
4769
|
+
var specialExpressionKeys = Object.keys(specialExpressionTypes);
|
|
4770
|
+
new Set(specialExpressionKeys);
|
|
4665
4771
|
|
|
4666
4772
|
function checkParams(evaluatedFunction, nbrOfParams, sourceCodeInfo) {
|
|
4667
|
-
var hasRest = evaluatedFunction.
|
|
4668
|
-
var minArity = evaluatedFunction.
|
|
4669
|
-
var maxArity = hasRest ? Number.MAX_SAFE_INTEGER : evaluatedFunction.
|
|
4773
|
+
var hasRest = evaluatedFunction[0].some(function (arg) { return arg[0] === bindingTargetTypes.rest; });
|
|
4774
|
+
var minArity = evaluatedFunction[0].filter(function (arg) { return arg[0] !== bindingTargetTypes.rest && arg[1][1] === undefined; }).length;
|
|
4775
|
+
var maxArity = hasRest ? Number.MAX_SAFE_INTEGER : evaluatedFunction[0].length;
|
|
4670
4776
|
if (nbrOfParams < minArity || nbrOfParams > maxArity) {
|
|
4671
4777
|
throw new LitsError("Unexpected number of arguments, got ".concat(valueToString(nbrOfParams), "."), sourceCodeInfo);
|
|
4672
4778
|
}
|
|
@@ -4690,21 +4796,21 @@ var functionExecutors = {
|
|
|
4690
4796
|
}
|
|
4691
4797
|
},
|
|
4692
4798
|
UserDefined: function (fn, params, sourceCodeInfo, contextStack, _a) {
|
|
4693
|
-
var
|
|
4799
|
+
var evaluateNode = _a.evaluateNode;
|
|
4694
4800
|
var _loop_1 = function () {
|
|
4695
4801
|
var e_1, _b;
|
|
4696
4802
|
checkParams(fn.evaluatedfunction, params.length, sourceCodeInfo);
|
|
4697
4803
|
var evaluatedFunction = fn.evaluatedfunction;
|
|
4698
|
-
var args = evaluatedFunction
|
|
4699
|
-
var nbrOfNonRestArgs = args.filter(function (arg) { return arg
|
|
4700
|
-
var newContextStack = contextStack.create(fn.evaluatedfunction
|
|
4804
|
+
var args = evaluatedFunction[0];
|
|
4805
|
+
var nbrOfNonRestArgs = args.filter(function (arg) { return arg[0] !== bindingTargetTypes.rest; }).length;
|
|
4806
|
+
var newContextStack = contextStack.create(fn.evaluatedfunction[2]);
|
|
4701
4807
|
var newContext = {};
|
|
4702
4808
|
var rest = [];
|
|
4703
4809
|
for (var i = 0; i < params.length; i += 1) {
|
|
4704
4810
|
if (i < nbrOfNonRestArgs) {
|
|
4705
4811
|
var param = toAny(params[i]);
|
|
4706
|
-
var valueRecord = evalueateBindingNodeValues(args[i], param, function (
|
|
4707
|
-
return
|
|
4812
|
+
var valueRecord = evalueateBindingNodeValues(args[i], param, function (Node) {
|
|
4813
|
+
return evaluateNode(Node, newContextStack.create(newContext));
|
|
4708
4814
|
});
|
|
4709
4815
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4710
4816
|
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
@@ -4717,18 +4823,18 @@ var functionExecutors = {
|
|
|
4717
4823
|
}
|
|
4718
4824
|
for (var i = params.length; i < nbrOfNonRestArgs; i++) {
|
|
4719
4825
|
var arg = args[i];
|
|
4720
|
-
var defaultValue =
|
|
4721
|
-
var valueRecord = evalueateBindingNodeValues(arg, defaultValue, function (
|
|
4722
|
-
return
|
|
4826
|
+
var defaultValue = evaluateNode(arg[1][1], contextStack.create(newContext));
|
|
4827
|
+
var valueRecord = evalueateBindingNodeValues(arg, defaultValue, function (Node) {
|
|
4828
|
+
return evaluateNode(Node, contextStack.create(newContext));
|
|
4723
4829
|
});
|
|
4724
4830
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4725
4831
|
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
4726
4832
|
newContext[key] = { value: value };
|
|
4727
4833
|
});
|
|
4728
4834
|
}
|
|
4729
|
-
var restArgument = args.find(function (arg) { return arg
|
|
4835
|
+
var restArgument = args.find(function (arg) { return arg[0] === bindingTargetTypes.rest; });
|
|
4730
4836
|
if (restArgument !== undefined) {
|
|
4731
|
-
var valueRecord = evalueateBindingNodeValues(restArgument, rest, function (
|
|
4837
|
+
var valueRecord = evalueateBindingNodeValues(restArgument, rest, function (Node) { return evaluateNode(Node, contextStack.create(newContext)); });
|
|
4732
4838
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4733
4839
|
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
4734
4840
|
newContext[key] = { value: value };
|
|
@@ -4738,9 +4844,9 @@ var functionExecutors = {
|
|
|
4738
4844
|
var result = null;
|
|
4739
4845
|
var newContextStack2 = newContextStack.create(newContext);
|
|
4740
4846
|
try {
|
|
4741
|
-
for (var _c = (e_1 = void 0, __values(evaluatedFunction
|
|
4847
|
+
for (var _c = (e_1 = void 0, __values(evaluatedFunction[1])), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
4742
4848
|
var node = _d.value;
|
|
4743
|
-
result =
|
|
4849
|
+
result = evaluateNode(node, newContextStack2);
|
|
4744
4850
|
}
|
|
4745
4851
|
}
|
|
4746
4852
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
@@ -4864,7 +4970,7 @@ var functionExecutors = {
|
|
|
4864
4970
|
},
|
|
4865
4971
|
Builtin: function (fn, params, sourceCodeInfo, contextStack, _a) {
|
|
4866
4972
|
var executeFunction = _a.executeFunction;
|
|
4867
|
-
var normalExpression = asNonUndefined(
|
|
4973
|
+
var normalExpression = asNonUndefined(allNormalExpressions[fn.normalBuitinSymbolType], sourceCodeInfo);
|
|
4868
4974
|
return normalExpression.evaluate(params, sourceCodeInfo, contextStack, { executeFunction: executeFunction });
|
|
4869
4975
|
},
|
|
4870
4976
|
};
|
|
@@ -4875,7 +4981,7 @@ function evaluate(ast, contextStack) {
|
|
|
4875
4981
|
try {
|
|
4876
4982
|
for (var _b = __values(ast.body), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
4877
4983
|
var node = _c.value;
|
|
4878
|
-
result =
|
|
4984
|
+
result = evaluateNode(node, contextStack);
|
|
4879
4985
|
}
|
|
4880
4986
|
}
|
|
4881
4987
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
@@ -4887,53 +4993,66 @@ function evaluate(ast, contextStack) {
|
|
|
4887
4993
|
}
|
|
4888
4994
|
return result;
|
|
4889
4995
|
}
|
|
4890
|
-
function
|
|
4891
|
-
switch (node
|
|
4892
|
-
case
|
|
4996
|
+
function evaluateNode(node, contextStack) {
|
|
4997
|
+
switch (node[0]) {
|
|
4998
|
+
case NodeTypes.Number:
|
|
4893
4999
|
return evaluateNumber(node);
|
|
4894
|
-
case
|
|
5000
|
+
case NodeTypes.String:
|
|
4895
5001
|
return evaluateString(node);
|
|
4896
|
-
case
|
|
4897
|
-
|
|
4898
|
-
case
|
|
4899
|
-
return
|
|
4900
|
-
case
|
|
5002
|
+
case NodeTypes.NormalBuiltinSymbol:
|
|
5003
|
+
case NodeTypes.SpecialBuiltinSymbol:
|
|
5004
|
+
case NodeTypes.UserDefinedSymbol:
|
|
5005
|
+
return contextStack.evaluateSymbol(node);
|
|
5006
|
+
case NodeTypes.ReservedSymbol:
|
|
5007
|
+
return evaluateReservedSymbol(node);
|
|
5008
|
+
case NodeTypes.NormalExpression:
|
|
4901
5009
|
return evaluateNormalExpression(node, contextStack);
|
|
4902
|
-
case
|
|
5010
|
+
case NodeTypes.SpecialExpression:
|
|
4903
5011
|
return evaluateSpecialExpression(node, contextStack);
|
|
4904
5012
|
/* v8 ignore next 2 */
|
|
4905
5013
|
default:
|
|
4906
|
-
throw new LitsError("".concat(node
|
|
5014
|
+
throw new LitsError("".concat(getNodeTypeName(node[0]), "-node cannot be evaluated"), node[2]);
|
|
4907
5015
|
}
|
|
4908
5016
|
}
|
|
4909
5017
|
function evaluateNumber(node) {
|
|
4910
|
-
return node
|
|
5018
|
+
return node[1];
|
|
4911
5019
|
}
|
|
4912
5020
|
function evaluateString(node) {
|
|
4913
|
-
return node
|
|
5021
|
+
return node[1];
|
|
4914
5022
|
}
|
|
4915
|
-
function
|
|
4916
|
-
var reservedName = node
|
|
5023
|
+
function evaluateReservedSymbol(node) {
|
|
5024
|
+
var reservedName = node[1];
|
|
4917
5025
|
var value = reservedSymbolRecord[reservedName];
|
|
4918
|
-
return asNonUndefined(value, node
|
|
5026
|
+
return asNonUndefined(value, node[2]);
|
|
4919
5027
|
}
|
|
4920
5028
|
function evaluateNormalExpression(node, contextStack) {
|
|
4921
|
-
var
|
|
4922
|
-
var
|
|
5029
|
+
var sourceCodeInfo = node[2];
|
|
5030
|
+
var paramNodes = node[1][1];
|
|
5031
|
+
var params = paramNodes.map(function (paramNode) { return evaluateNode(paramNode, contextStack); });
|
|
4923
5032
|
if (isNormalExpressionNodeWithName(node)) {
|
|
4924
|
-
var
|
|
4925
|
-
if (
|
|
4926
|
-
|
|
4927
|
-
|
|
5033
|
+
var nameSymbol = node[1][0];
|
|
5034
|
+
if (isNormalBuiltinSymbolNode(nameSymbol)) {
|
|
5035
|
+
var type = nameSymbol[1];
|
|
5036
|
+
var normalExpression = builtin.allNormalExpressions[type];
|
|
5037
|
+
return normalExpression.evaluate(params, node[2], contextStack, { executeFunction: executeFunction });
|
|
5038
|
+
}
|
|
5039
|
+
else {
|
|
5040
|
+
var fn = contextStack.getValue(nameSymbol[1]);
|
|
5041
|
+
if (fn !== undefined) {
|
|
5042
|
+
return executeFunction(asAny(fn), params, contextStack, sourceCodeInfo);
|
|
5043
|
+
}
|
|
5044
|
+
throw new UndefinedSymbolError(nameSymbol[1], node[2]);
|
|
5045
|
+
}
|
|
4928
5046
|
}
|
|
4929
5047
|
else {
|
|
4930
|
-
var
|
|
4931
|
-
|
|
5048
|
+
var fnNode = node[1][0];
|
|
5049
|
+
var fn = evaluateNode(fnNode, contextStack);
|
|
5050
|
+
return executeFunction(fn, params, contextStack, sourceCodeInfo);
|
|
4932
5051
|
}
|
|
4933
5052
|
}
|
|
4934
5053
|
function executeFunction(fn, params, contextStack, sourceCodeInfo) {
|
|
4935
5054
|
if (isLitsFunction(fn))
|
|
4936
|
-
return functionExecutors[fn.functionType](fn, params, sourceCodeInfo, contextStack, {
|
|
5055
|
+
return functionExecutors[fn.functionType](fn, params, sourceCodeInfo, contextStack, { evaluateNode: evaluateNode, executeFunction: executeFunction });
|
|
4937
5056
|
if (Array.isArray(fn))
|
|
4938
5057
|
return evaluateArrayAsFunction(fn, params, sourceCodeInfo);
|
|
4939
5058
|
if (isObj(fn))
|
|
@@ -4944,16 +5063,11 @@ function executeFunction(fn, params, contextStack, sourceCodeInfo) {
|
|
|
4944
5063
|
return evaluateNumberAsFunction(fn, params, sourceCodeInfo);
|
|
4945
5064
|
throw new NotAFunctionError(fn, sourceCodeInfo);
|
|
4946
5065
|
}
|
|
4947
|
-
function evaluateBuiltinNormalExpression(node, params, contextStack) {
|
|
4948
|
-
var normalExpression = builtin.normalExpressions[node.name];
|
|
4949
|
-
if (!normalExpression)
|
|
4950
|
-
throw new UndefinedSymbolError(node.name, node.sourceCodeInfo);
|
|
4951
|
-
return normalExpression.evaluate(params, node.sourceCodeInfo, contextStack, { executeFunction: executeFunction });
|
|
4952
|
-
}
|
|
4953
5066
|
function evaluateSpecialExpression(node, contextStack) {
|
|
4954
|
-
var
|
|
4955
|
-
|
|
4956
|
-
|
|
5067
|
+
var specialExpressionType = node[1][0];
|
|
5068
|
+
var specialExpression = asNonUndefined(builtin.specialExpressions[specialExpressionType], node[2]);
|
|
5069
|
+
var castedEvaluate = specialExpression.evaluate;
|
|
5070
|
+
return castedEvaluate(node, contextStack, { evaluateNode: evaluateNode, builtin: builtin, getUndefinedSymbols: getUndefinedSymbols });
|
|
4957
5071
|
}
|
|
4958
5072
|
function evalueateObjectAsFunction(fn, params, sourceCodeInfo) {
|
|
4959
5073
|
if (params.length !== 1)
|
|
@@ -5095,13 +5209,13 @@ var ContextStackImpl = /** @class */ (function () {
|
|
|
5095
5209
|
return (_d = this.values) === null || _d === void 0 ? void 0 : _d[name];
|
|
5096
5210
|
};
|
|
5097
5211
|
ContextStackImpl.prototype.lookUp = function (node) {
|
|
5098
|
-
var e_4, _a
|
|
5099
|
-
var _c, _d
|
|
5100
|
-
var value = node
|
|
5101
|
-
var sourceCodeInfo = node.sourceCodeInfo;
|
|
5212
|
+
var e_4, _a;
|
|
5213
|
+
var _b, _c, _d;
|
|
5214
|
+
var value = node[1];
|
|
5102
5215
|
try {
|
|
5103
|
-
|
|
5104
|
-
|
|
5216
|
+
// const sourceCodeInfo = node[2]
|
|
5217
|
+
for (var _e = __values(this.contexts), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
5218
|
+
var context = _f.value;
|
|
5105
5219
|
var contextEntry = context[value];
|
|
5106
5220
|
if (contextEntry)
|
|
5107
5221
|
return contextEntry;
|
|
@@ -5110,32 +5224,23 @@ var ContextStackImpl = /** @class */ (function () {
|
|
|
5110
5224
|
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
5111
5225
|
finally {
|
|
5112
5226
|
try {
|
|
5113
|
-
if (
|
|
5227
|
+
if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
|
|
5114
5228
|
}
|
|
5115
5229
|
finally { if (e_4) throw e_4.error; }
|
|
5116
5230
|
}
|
|
5117
|
-
var lazyHostValue = (
|
|
5231
|
+
var lazyHostValue = (_b = this.lazyValues) === null || _b === void 0 ? void 0 : _b[value];
|
|
5118
5232
|
if (lazyHostValue !== undefined) {
|
|
5119
5233
|
return {
|
|
5120
5234
|
value: toAny(lazyHostValue.read()),
|
|
5121
5235
|
};
|
|
5122
5236
|
}
|
|
5123
|
-
var hostValue = (
|
|
5237
|
+
var hostValue = (_c = this.values) === null || _c === void 0 ? void 0 : _c[value];
|
|
5124
5238
|
if (hostValue !== undefined) {
|
|
5125
5239
|
return {
|
|
5126
5240
|
value: toAny(hostValue),
|
|
5127
5241
|
};
|
|
5128
5242
|
}
|
|
5129
|
-
|
|
5130
|
-
var builtinFunction = (_b = {},
|
|
5131
|
-
_b[FUNCTION_SYMBOL] = true,
|
|
5132
|
-
_b.sourceCodeInfo = sourceCodeInfo,
|
|
5133
|
-
_b.functionType = 'Builtin',
|
|
5134
|
-
_b.n = value,
|
|
5135
|
-
_b);
|
|
5136
|
-
return builtinFunction;
|
|
5137
|
-
}
|
|
5138
|
-
var nativeJsFunction = (_e = this.nativeJsFunctions) === null || _e === void 0 ? void 0 : _e[value];
|
|
5243
|
+
var nativeJsFunction = (_d = this.nativeJsFunctions) === null || _d === void 0 ? void 0 : _d[value];
|
|
5139
5244
|
if (nativeJsFunction) {
|
|
5140
5245
|
return {
|
|
5141
5246
|
value: nativeJsFunction,
|
|
@@ -5143,13 +5248,26 @@ var ContextStackImpl = /** @class */ (function () {
|
|
|
5143
5248
|
}
|
|
5144
5249
|
return null;
|
|
5145
5250
|
};
|
|
5146
|
-
ContextStackImpl.prototype.
|
|
5251
|
+
ContextStackImpl.prototype.evaluateSymbol = function (node) {
|
|
5252
|
+
var _a;
|
|
5253
|
+
if (isSpecialBuiltinSymbolNode(node)) {
|
|
5254
|
+
throw new Error('Special builtin symbols should not be evaluated');
|
|
5255
|
+
}
|
|
5256
|
+
if (isNormalBuiltinSymbolNode(node)) {
|
|
5257
|
+
var type = node[1];
|
|
5258
|
+
return _a = {},
|
|
5259
|
+
_a[FUNCTION_SYMBOL] = true,
|
|
5260
|
+
_a.functionType = 'Builtin',
|
|
5261
|
+
_a.normalBuitinSymbolType = type,
|
|
5262
|
+
_a.sourceCodeInfo = node[2],
|
|
5263
|
+
_a;
|
|
5264
|
+
}
|
|
5147
5265
|
var lookUpResult = this.lookUp(node);
|
|
5148
5266
|
if (isContextEntry(lookUpResult))
|
|
5149
5267
|
return lookUpResult.value;
|
|
5150
5268
|
else if (isBuiltinFunction(lookUpResult))
|
|
5151
5269
|
return lookUpResult;
|
|
5152
|
-
throw new UndefinedSymbolError(node
|
|
5270
|
+
throw new UndefinedSymbolError(node[1], node[2]);
|
|
5153
5271
|
};
|
|
5154
5272
|
return ContextStackImpl;
|
|
5155
5273
|
}());
|
|
@@ -5684,6 +5802,10 @@ function assertReservedSymbolToken(token, symbolName) {
|
|
|
5684
5802
|
throwUnexpectedToken('ReservedSymbol', symbolName, token);
|
|
5685
5803
|
}
|
|
5686
5804
|
}
|
|
5805
|
+
function asReservedSymbolToken(token, symbolName) {
|
|
5806
|
+
assertReservedSymbolToken(token, symbolName);
|
|
5807
|
+
return token;
|
|
5808
|
+
}
|
|
5687
5809
|
function isSingleLineCommentToken(token) {
|
|
5688
5810
|
return (token === null || token === void 0 ? void 0 : token[0]) === 'SingleLineComment';
|
|
5689
5811
|
}
|
|
@@ -5766,6 +5888,9 @@ function assertRBraceToken(token) {
|
|
|
5766
5888
|
throwUnexpectedToken('RBrace', undefined, token);
|
|
5767
5889
|
}
|
|
5768
5890
|
}
|
|
5891
|
+
function isStringToken(token) {
|
|
5892
|
+
return (token === null || token === void 0 ? void 0 : token[0]) === 'String';
|
|
5893
|
+
}
|
|
5769
5894
|
function isA_BinaryOperatorToken(token) {
|
|
5770
5895
|
return (token === null || token === void 0 ? void 0 : token[0]) === 'Operator' && isBinaryOperator(token[1]);
|
|
5771
5896
|
}
|
|
@@ -5803,6 +5928,12 @@ function untokenize(tokenStream) {
|
|
|
5803
5928
|
var exponentiationPrecedence = 10;
|
|
5804
5929
|
var binaryFunctionalOperatorPrecedence = 1;
|
|
5805
5930
|
var placeholderRegexp = /^\$([1-9]\d?)?$/;
|
|
5931
|
+
function withSourceCodeInfo(node, sourceCodeInfo) {
|
|
5932
|
+
if (sourceCodeInfo) {
|
|
5933
|
+
node[2] = sourceCodeInfo;
|
|
5934
|
+
}
|
|
5935
|
+
return node;
|
|
5936
|
+
}
|
|
5806
5937
|
function getPrecedence(operatorSign) {
|
|
5807
5938
|
switch (operatorSign) {
|
|
5808
5939
|
case '**': // exponentiation
|
|
@@ -5845,29 +5976,18 @@ function getPrecedence(operatorSign) {
|
|
|
5845
5976
|
throw new Error("Unknown binary operator: ".concat(operatorSign));
|
|
5846
5977
|
}
|
|
5847
5978
|
}
|
|
5848
|
-
function createNamedNormalExpressionNode(
|
|
5849
|
-
var node =
|
|
5850
|
-
|
|
5851
|
-
|
|
5852
|
-
params: params,
|
|
5853
|
-
sourceCodeInfo: sourceCodeInfo,
|
|
5854
|
-
};
|
|
5855
|
-
var builtinExpression = builtin.normalExpressions[node.name];
|
|
5856
|
-
if (builtinExpression) {
|
|
5857
|
-
assertNumberOfParams(builtinExpression.paramCount, node);
|
|
5979
|
+
function createNamedNormalExpressionNode(symbolNode, params, sourceCodeInfo) {
|
|
5980
|
+
var node = withSourceCodeInfo([NodeTypes.NormalExpression, [symbolNode, params]], sourceCodeInfo);
|
|
5981
|
+
if (isNormalBuiltinSymbolNode(symbolNode)) {
|
|
5982
|
+
assertNumberOfParams(allNormalExpressions[symbolNode[1]].paramCount, node);
|
|
5858
5983
|
}
|
|
5859
5984
|
return node;
|
|
5860
5985
|
}
|
|
5861
5986
|
function createAccessorNode(left, right, sourceCodeInfo) {
|
|
5862
5987
|
// Unnamed normal expression
|
|
5863
|
-
return
|
|
5864
|
-
type: 'NormalExpression',
|
|
5865
|
-
params: [left, right],
|
|
5866
|
-
name: undefined,
|
|
5867
|
-
sourceCodeInfo: sourceCodeInfo,
|
|
5868
|
-
};
|
|
5988
|
+
return withSourceCodeInfo([NodeTypes.NormalExpression, [left, [right]]], sourceCodeInfo);
|
|
5869
5989
|
}
|
|
5870
|
-
function
|
|
5990
|
+
function fromBinaryOperatorToNode(operator, symbolNode, left, right, sourceCodeInfo) {
|
|
5871
5991
|
var operatorName = operator[1];
|
|
5872
5992
|
switch (operatorName) {
|
|
5873
5993
|
case '**': // exponentiation
|
|
@@ -5892,16 +6012,11 @@ function fromBinaryOperatorToAstNode(operator, left, right, sourceCodeInfo) {
|
|
|
5892
6012
|
case '&':
|
|
5893
6013
|
case '^':
|
|
5894
6014
|
case '|':
|
|
5895
|
-
return createNamedNormalExpressionNode(
|
|
6015
|
+
return createNamedNormalExpressionNode(symbolNode, [left, right], sourceCodeInfo);
|
|
5896
6016
|
case '&&':
|
|
5897
6017
|
case '||':
|
|
5898
6018
|
case '??':
|
|
5899
|
-
return
|
|
5900
|
-
type: 'SpecialExpression',
|
|
5901
|
-
name: operatorName,
|
|
5902
|
-
params: [left, right],
|
|
5903
|
-
sourceCodeInfo: sourceCodeInfo,
|
|
5904
|
-
};
|
|
6019
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes[operatorName], [left, right]]], sourceCodeInfo);
|
|
5905
6020
|
/* v8 ignore next 10 */
|
|
5906
6021
|
case '.':
|
|
5907
6022
|
case ';':
|
|
@@ -5997,9 +6112,12 @@ var Parser = /** @class */ (function () {
|
|
|
5997
6112
|
&& !(newPrecedece === exponentiationPrecedence && precedence === exponentiationPrecedence)) {
|
|
5998
6113
|
break;
|
|
5999
6114
|
}
|
|
6115
|
+
var symbol = specialExpressionTypes[name_1]
|
|
6116
|
+
? withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[name_1]], operator[2])
|
|
6117
|
+
: withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[name_1]], operator[2]);
|
|
6000
6118
|
this.advance();
|
|
6001
6119
|
var right = this.parseExpression(newPrecedece);
|
|
6002
|
-
left =
|
|
6120
|
+
left = fromBinaryOperatorToNode(operator, symbol, left, right, operator[2]);
|
|
6003
6121
|
}
|
|
6004
6122
|
else if (isSymbolToken(operator)) {
|
|
6005
6123
|
if (!isFunctionOperator(operator[1])) {
|
|
@@ -6009,9 +6127,12 @@ var Parser = /** @class */ (function () {
|
|
|
6009
6127
|
if (newPrecedece <= precedence) {
|
|
6010
6128
|
break;
|
|
6011
6129
|
}
|
|
6012
|
-
this.
|
|
6130
|
+
var operatorSymbol = this.parseSymbol();
|
|
6013
6131
|
var right = this.parseExpression(newPrecedece);
|
|
6014
|
-
|
|
6132
|
+
if (isSpecialBuiltinSymbolNode(operatorSymbol)) {
|
|
6133
|
+
throw new LitsError('Special expressions are not allowed in binary functional operators', operatorSymbol[2]);
|
|
6134
|
+
}
|
|
6135
|
+
left = createNamedNormalExpressionNode(operatorSymbol, [left, right], operator[2]);
|
|
6015
6136
|
}
|
|
6016
6137
|
else {
|
|
6017
6138
|
break;
|
|
@@ -6030,11 +6151,7 @@ var Parser = /** @class */ (function () {
|
|
|
6030
6151
|
if (!isSymbolToken(symbolToken)) {
|
|
6031
6152
|
throw new LitsError('Expected symbol', this.peek()[2]);
|
|
6032
6153
|
}
|
|
6033
|
-
var stringNode =
|
|
6034
|
-
type: 'String',
|
|
6035
|
-
value: symbolToken[1],
|
|
6036
|
-
sourceCodeInfo: symbolToken[2],
|
|
6037
|
-
};
|
|
6154
|
+
var stringNode = withSourceCodeInfo([NodeTypes.String, symbolToken[1]], symbolToken[2]);
|
|
6038
6155
|
operand = createAccessorNode(operand, stringNode, token[2]);
|
|
6039
6156
|
this.advance();
|
|
6040
6157
|
token = this.peek();
|
|
@@ -6074,16 +6191,17 @@ var Parser = /** @class */ (function () {
|
|
|
6074
6191
|
this.advance();
|
|
6075
6192
|
return expression;
|
|
6076
6193
|
}
|
|
6077
|
-
// Unary operators
|
|
6078
6194
|
else if (isOperatorToken(token)) {
|
|
6079
6195
|
var operatorName = token[1];
|
|
6080
6196
|
if (isBinaryOperator(operatorName)) {
|
|
6081
6197
|
this.advance();
|
|
6082
|
-
|
|
6083
|
-
|
|
6084
|
-
|
|
6085
|
-
|
|
6086
|
-
|
|
6198
|
+
if (specialExpressionTypes[operatorName] !== undefined) {
|
|
6199
|
+
return withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[operatorName]], token[2]);
|
|
6200
|
+
}
|
|
6201
|
+
else if (normalExpressionTypes[operatorName] !== undefined) {
|
|
6202
|
+
return withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[operatorName]], token[2]);
|
|
6203
|
+
}
|
|
6204
|
+
return withSourceCodeInfo([NodeTypes.UserDefinedSymbol, operatorName], token[2]);
|
|
6087
6205
|
}
|
|
6088
6206
|
if (operatorName === '->') {
|
|
6089
6207
|
return this.parseShorthandLamdaFunction();
|
|
@@ -6131,22 +6249,24 @@ var Parser = /** @class */ (function () {
|
|
|
6131
6249
|
while (!this.isAtEnd() && !isRBraceToken(this.peek())) {
|
|
6132
6250
|
if (isOperatorToken(this.peek(), '...')) {
|
|
6133
6251
|
this.advance();
|
|
6134
|
-
params.push(
|
|
6135
|
-
type: 'Spread',
|
|
6136
|
-
value: this.parseExpression(),
|
|
6137
|
-
sourceCodeInfo: this.peek()[2],
|
|
6138
|
-
});
|
|
6252
|
+
params.push(withSourceCodeInfo([NodeTypes.Spread, this.parseExpression()], this.peek()[2]));
|
|
6139
6253
|
}
|
|
6140
6254
|
else {
|
|
6141
|
-
var
|
|
6142
|
-
if (
|
|
6255
|
+
var token = this.peek();
|
|
6256
|
+
if (isStringToken(token)) {
|
|
6257
|
+
var stringNode = this.parseString();
|
|
6258
|
+
params.push(withSourceCodeInfo([NodeTypes.String, stringNode[1]], token[2]));
|
|
6259
|
+
}
|
|
6260
|
+
else if (isSymbolToken(token)) {
|
|
6261
|
+
var value = token[1].startsWith('\'')
|
|
6262
|
+
? this.stringFromQuotedSymbol(token[1])
|
|
6263
|
+
: token[1];
|
|
6264
|
+
params.push(withSourceCodeInfo([NodeTypes.String, value], token[2]));
|
|
6265
|
+
this.advance();
|
|
6266
|
+
}
|
|
6267
|
+
else {
|
|
6143
6268
|
throw new LitsError('Expected key to be a symbol or a string', this.peek()[2]);
|
|
6144
6269
|
}
|
|
6145
|
-
params.push({
|
|
6146
|
-
type: 'String',
|
|
6147
|
-
value: key.value,
|
|
6148
|
-
sourceCodeInfo: key.sourceCodeInfo,
|
|
6149
|
-
});
|
|
6150
6270
|
assertOperatorToken(this.peek(), ':=');
|
|
6151
6271
|
this.advance();
|
|
6152
6272
|
params.push(this.parseExpression());
|
|
@@ -6161,12 +6281,7 @@ var Parser = /** @class */ (function () {
|
|
|
6161
6281
|
}
|
|
6162
6282
|
assertRBraceToken(this.peek());
|
|
6163
6283
|
this.advance();
|
|
6164
|
-
return
|
|
6165
|
-
type: 'SpecialExpression',
|
|
6166
|
-
name: 'object',
|
|
6167
|
-
params: params,
|
|
6168
|
-
sourceCodeInfo: firstToken[2],
|
|
6169
|
-
};
|
|
6284
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.object, params]], firstToken[2]);
|
|
6170
6285
|
};
|
|
6171
6286
|
Parser.prototype.parseArray = function () {
|
|
6172
6287
|
var firstToken = asLBracketToken(this.peek());
|
|
@@ -6175,11 +6290,7 @@ var Parser = /** @class */ (function () {
|
|
|
6175
6290
|
while (!this.isAtEnd() && !isRBracketToken(this.peek())) {
|
|
6176
6291
|
if (isOperatorToken(this.peek(), '...')) {
|
|
6177
6292
|
this.advance();
|
|
6178
|
-
params.push(
|
|
6179
|
-
type: 'Spread',
|
|
6180
|
-
value: this.parseExpression(),
|
|
6181
|
-
sourceCodeInfo: this.peek()[2],
|
|
6182
|
-
});
|
|
6293
|
+
params.push(withSourceCodeInfo([NodeTypes.Spread, this.parseExpression()], this.peek()[2]));
|
|
6183
6294
|
}
|
|
6184
6295
|
else {
|
|
6185
6296
|
params.push(this.parseExpression());
|
|
@@ -6194,15 +6305,9 @@ var Parser = /** @class */ (function () {
|
|
|
6194
6305
|
}
|
|
6195
6306
|
assertRBracketToken(this.peek());
|
|
6196
6307
|
this.advance();
|
|
6197
|
-
return
|
|
6198
|
-
type: 'SpecialExpression',
|
|
6199
|
-
name: 'array',
|
|
6200
|
-
params: params,
|
|
6201
|
-
sourceCodeInfo: firstToken[2],
|
|
6202
|
-
};
|
|
6308
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.array, params]], firstToken[2]);
|
|
6203
6309
|
};
|
|
6204
6310
|
Parser.prototype.parseFunctionCall = function (symbol) {
|
|
6205
|
-
var isNamedFunction = symbol.type === 'Symbol';
|
|
6206
6311
|
this.advance();
|
|
6207
6312
|
var params = [];
|
|
6208
6313
|
while (!this.isAtEnd() && !isRParenToken(this.peek())) {
|
|
@@ -6219,45 +6324,57 @@ var Parser = /** @class */ (function () {
|
|
|
6219
6324
|
throw new LitsError('Expected closing parenthesis', this.peek()[2]);
|
|
6220
6325
|
}
|
|
6221
6326
|
this.advance();
|
|
6222
|
-
if (
|
|
6223
|
-
|
|
6224
|
-
|
|
6225
|
-
|
|
6226
|
-
|
|
6227
|
-
|
|
6228
|
-
|
|
6229
|
-
|
|
6230
|
-
|
|
6231
|
-
|
|
6232
|
-
|
|
6233
|
-
|
|
6234
|
-
|
|
6235
|
-
|
|
6236
|
-
|
|
6237
|
-
|
|
6238
|
-
|
|
6239
|
-
|
|
6240
|
-
|
|
6241
|
-
return
|
|
6327
|
+
if (isSpecialBuiltinSymbolNode(symbol)) { // Named function
|
|
6328
|
+
var specialExpressionType = symbol[1];
|
|
6329
|
+
var type = specialExpressionType;
|
|
6330
|
+
switch (type) {
|
|
6331
|
+
case specialExpressionTypes['||']:
|
|
6332
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6333
|
+
case specialExpressionTypes['&&']:
|
|
6334
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6335
|
+
case specialExpressionTypes.recur:
|
|
6336
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6337
|
+
case specialExpressionTypes.array:
|
|
6338
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6339
|
+
case specialExpressionTypes.object:
|
|
6340
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6341
|
+
case specialExpressionTypes['??']: {
|
|
6342
|
+
if (params.length === 1) {
|
|
6343
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, [params[0], undefined]]], symbol[2]);
|
|
6344
|
+
}
|
|
6345
|
+
if (params.length === 2) {
|
|
6346
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, [params[0], params[1]]]], symbol[2]);
|
|
6347
|
+
}
|
|
6348
|
+
throw new LitsError('Expected exactly two parameters', symbol[2]);
|
|
6349
|
+
}
|
|
6350
|
+
case specialExpressionTypes['defined?']: {
|
|
6351
|
+
if (params.length !== 1) {
|
|
6352
|
+
throw new LitsError('Expected exactly one parameter', symbol[2]);
|
|
6353
|
+
}
|
|
6354
|
+
var _a = __read(params, 1), param = _a[0];
|
|
6355
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, param]], symbol[2]);
|
|
6356
|
+
}
|
|
6357
|
+
case specialExpressionTypes.throw: {
|
|
6358
|
+
if (params.length !== 1) {
|
|
6359
|
+
throw new LitsError('Expected exactly one parameter', symbol[2]);
|
|
6242
6360
|
}
|
|
6243
|
-
|
|
6244
|
-
|
|
6245
|
-
case 'defn':
|
|
6246
|
-
throw new Error("".concat(name_2, " is not allowed"));
|
|
6247
|
-
/* v8 ignore next 2 */
|
|
6248
|
-
default:
|
|
6249
|
-
throw new Error("Unknown special expression: ".concat(name_2));
|
|
6361
|
+
var _b = __read(params, 1), param = _b[0];
|
|
6362
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, param]], symbol[2]);
|
|
6250
6363
|
}
|
|
6364
|
+
case specialExpressionTypes.fn:
|
|
6365
|
+
case specialExpressionTypes.def:
|
|
6366
|
+
case specialExpressionTypes.defn:
|
|
6367
|
+
throw new LitsError("".concat(type, " is not allowed"), symbol[2]);
|
|
6368
|
+
/* v8 ignore next 2 */
|
|
6369
|
+
default:
|
|
6370
|
+
throw new Error("Unknown special expression: ".concat(type));
|
|
6251
6371
|
}
|
|
6252
|
-
|
|
6372
|
+
}
|
|
6373
|
+
else if (isNormalBuiltinSymbolNode(symbol) || isNormalBuiltinSymbolNode(symbol)) {
|
|
6374
|
+
return createNamedNormalExpressionNode(symbol, params, symbol[2]);
|
|
6253
6375
|
}
|
|
6254
6376
|
else {
|
|
6255
|
-
return
|
|
6256
|
-
type: 'NormalExpression',
|
|
6257
|
-
name: undefined,
|
|
6258
|
-
params: __spreadArray([symbol], __read(params), false),
|
|
6259
|
-
sourceCodeInfo: symbol.sourceCodeInfo,
|
|
6260
|
-
};
|
|
6377
|
+
return withSourceCodeInfo([NodeTypes.NormalExpression, [symbol, params]], symbol[2]);
|
|
6261
6378
|
}
|
|
6262
6379
|
};
|
|
6263
6380
|
Parser.prototype.parseLambdaFunction = function () {
|
|
@@ -6274,16 +6391,10 @@ var Parser = /** @class */ (function () {
|
|
|
6274
6391
|
}
|
|
6275
6392
|
this.advance();
|
|
6276
6393
|
var body = this.parseExpression();
|
|
6277
|
-
return
|
|
6278
|
-
|
|
6279
|
-
|
|
6280
|
-
|
|
6281
|
-
function: {
|
|
6282
|
-
arguments: functionArguments,
|
|
6283
|
-
body: [body],
|
|
6284
|
-
},
|
|
6285
|
-
sourceCodeInfo: firstToken[2],
|
|
6286
|
-
};
|
|
6394
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.fn, [
|
|
6395
|
+
functionArguments,
|
|
6396
|
+
[body],
|
|
6397
|
+
]]], firstToken[2]);
|
|
6287
6398
|
}
|
|
6288
6399
|
catch (_a) {
|
|
6289
6400
|
return null;
|
|
@@ -6292,11 +6403,7 @@ var Parser = /** @class */ (function () {
|
|
|
6292
6403
|
Parser.prototype.parseFunctionArguments = function () {
|
|
6293
6404
|
var firstToken = this.peek();
|
|
6294
6405
|
if (isSymbolToken(firstToken)) {
|
|
6295
|
-
return [
|
|
6296
|
-
type: 'symbol',
|
|
6297
|
-
name: this.parseSymbol().value,
|
|
6298
|
-
sourceCodeInfo: firstToken[2],
|
|
6299
|
-
}];
|
|
6406
|
+
return [withSourceCodeInfo([bindingTargetTypes.symbol, [this.parseSymbol(), undefined]], firstToken[2])];
|
|
6300
6407
|
}
|
|
6301
6408
|
assertLParenToken(firstToken);
|
|
6302
6409
|
this.advance();
|
|
@@ -6308,13 +6415,13 @@ var Parser = /** @class */ (function () {
|
|
|
6308
6415
|
throw new LitsError('Rest argument must be last', this.peek()[2]);
|
|
6309
6416
|
}
|
|
6310
6417
|
var bindingTarget = this.parseBindingTarget();
|
|
6311
|
-
if (bindingTarget
|
|
6418
|
+
if (bindingTarget[1][1] !== undefined) {
|
|
6312
6419
|
defaults = true;
|
|
6313
6420
|
}
|
|
6314
|
-
if (bindingTarget
|
|
6421
|
+
if (bindingTarget[0] === bindingTargetTypes.rest) {
|
|
6315
6422
|
rest = true;
|
|
6316
6423
|
}
|
|
6317
|
-
if (defaults && !bindingTarget
|
|
6424
|
+
if (defaults && !bindingTarget[1][1]) {
|
|
6318
6425
|
throw new LitsError('Default arguments must be last', this.peek()[2]);
|
|
6319
6426
|
}
|
|
6320
6427
|
functionArguments.push(bindingTarget);
|
|
@@ -6361,22 +6468,16 @@ var Parser = /** @class */ (function () {
|
|
|
6361
6468
|
var functionArguments = [];
|
|
6362
6469
|
for (var i = 1; i <= arity; i += 1) {
|
|
6363
6470
|
if (i === 1 && dollar1 === 'NAKED') {
|
|
6364
|
-
functionArguments.push(
|
|
6471
|
+
functionArguments.push(withSourceCodeInfo([bindingTargetTypes.symbol, [[NodeTypes.UserDefinedSymbol, '$'], undefined]], firstToken[2]));
|
|
6365
6472
|
}
|
|
6366
6473
|
else {
|
|
6367
|
-
functionArguments.push(
|
|
6474
|
+
functionArguments.push(withSourceCodeInfo([bindingTargetTypes.symbol, [[NodeTypes.UserDefinedSymbol, "$".concat(i)], undefined]], firstToken[2]));
|
|
6368
6475
|
}
|
|
6369
6476
|
}
|
|
6370
|
-
var node =
|
|
6371
|
-
|
|
6372
|
-
|
|
6373
|
-
|
|
6374
|
-
function: {
|
|
6375
|
-
arguments: functionArguments,
|
|
6376
|
-
body: [exprNode],
|
|
6377
|
-
},
|
|
6378
|
-
sourceCodeInfo: firstToken[2],
|
|
6379
|
-
};
|
|
6477
|
+
var node = withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.fn, [
|
|
6478
|
+
functionArguments,
|
|
6479
|
+
[exprNode],
|
|
6480
|
+
]]], firstToken[2]);
|
|
6380
6481
|
return node;
|
|
6381
6482
|
};
|
|
6382
6483
|
Parser.prototype.parseOptionalDefaulValue = function () {
|
|
@@ -6392,16 +6493,14 @@ var Parser = /** @class */ (function () {
|
|
|
6392
6493
|
// Symbol
|
|
6393
6494
|
if (isSymbolToken(firstToken)) {
|
|
6394
6495
|
var symbol = this.parseSymbol();
|
|
6496
|
+
if (!isUserDefinedSymbolNode(symbol)) {
|
|
6497
|
+
throw new LitsError('Expected user defined symbol', firstToken[2]);
|
|
6498
|
+
}
|
|
6395
6499
|
var defaultValue = this.parseOptionalDefaulValue();
|
|
6396
6500
|
if (requireDefaultValue && !defaultValue) {
|
|
6397
6501
|
throw new LitsError('Expected assignment', this.peek()[2]);
|
|
6398
6502
|
}
|
|
6399
|
-
return
|
|
6400
|
-
type: 'symbol',
|
|
6401
|
-
name: symbol.value,
|
|
6402
|
-
default: defaultValue,
|
|
6403
|
-
sourceCodeInfo: firstToken[2],
|
|
6404
|
-
};
|
|
6503
|
+
return withSourceCodeInfo([bindingTargetTypes.symbol, [symbol, defaultValue]], firstToken[2]);
|
|
6405
6504
|
}
|
|
6406
6505
|
// Rest
|
|
6407
6506
|
if (isOperatorToken(firstToken, '...')) {
|
|
@@ -6409,15 +6508,11 @@ var Parser = /** @class */ (function () {
|
|
|
6409
6508
|
throw new LitsError('Rest element not allowed', firstToken[2]);
|
|
6410
6509
|
}
|
|
6411
6510
|
this.advance();
|
|
6412
|
-
var symbol = this.parseSymbol();
|
|
6511
|
+
var symbol = asUserDefinedSymbolNode(this.parseSymbol());
|
|
6413
6512
|
if (isOperatorToken(this.peek(), ':=')) {
|
|
6414
6513
|
throw new LitsError('Rest argument can not have default value', this.peek()[2]);
|
|
6415
6514
|
}
|
|
6416
|
-
return
|
|
6417
|
-
type: 'rest',
|
|
6418
|
-
name: symbol.value,
|
|
6419
|
-
sourceCodeInfo: firstToken[2],
|
|
6420
|
-
};
|
|
6515
|
+
return withSourceCodeInfo([bindingTargetTypes.rest, [symbol[1], undefined]], firstToken[2]);
|
|
6421
6516
|
}
|
|
6422
6517
|
// Array
|
|
6423
6518
|
if (isLBracketToken(firstToken)) {
|
|
@@ -6436,7 +6531,7 @@ var Parser = /** @class */ (function () {
|
|
|
6436
6531
|
continue;
|
|
6437
6532
|
}
|
|
6438
6533
|
var target = this.parseBindingTarget();
|
|
6439
|
-
if (target
|
|
6534
|
+
if (target[0] === bindingTargetTypes.rest) {
|
|
6440
6535
|
rest = true;
|
|
6441
6536
|
}
|
|
6442
6537
|
elements.push(target);
|
|
@@ -6452,12 +6547,7 @@ var Parser = /** @class */ (function () {
|
|
|
6452
6547
|
if (requireDefaultValue && !defaultValue) {
|
|
6453
6548
|
throw new LitsError('Expected assignment', this.peek()[2]);
|
|
6454
6549
|
}
|
|
6455
|
-
return
|
|
6456
|
-
type: 'array',
|
|
6457
|
-
elements: elements,
|
|
6458
|
-
default: defaultValue,
|
|
6459
|
-
sourceCodeInfo: firstToken[2],
|
|
6460
|
-
};
|
|
6550
|
+
return withSourceCodeInfo([bindingTargetTypes.array, [elements, defaultValue]], firstToken[2]);
|
|
6461
6551
|
}
|
|
6462
6552
|
// Object
|
|
6463
6553
|
if (isLBraceToken(firstToken)) {
|
|
@@ -6473,40 +6563,32 @@ var Parser = /** @class */ (function () {
|
|
|
6473
6563
|
rest = true;
|
|
6474
6564
|
this.advance();
|
|
6475
6565
|
}
|
|
6476
|
-
var key = this.parseSymbol()
|
|
6566
|
+
var key = asUserDefinedSymbolNode(this.parseSymbol());
|
|
6477
6567
|
token = this.peek();
|
|
6478
6568
|
if (isReservedSymbolToken(token, 'as')) {
|
|
6479
6569
|
if (rest) {
|
|
6480
6570
|
throw new LitsError('Rest argument can not have alias', token[2]);
|
|
6481
6571
|
}
|
|
6482
6572
|
this.advance();
|
|
6483
|
-
var
|
|
6484
|
-
if (elements[
|
|
6485
|
-
throw new LitsError("Duplicate binding name: ".concat(
|
|
6573
|
+
var name_2 = asUserDefinedSymbolNode(this.parseSymbol());
|
|
6574
|
+
if (elements[name_2[1]]) {
|
|
6575
|
+
throw new LitsError("Duplicate binding name: ".concat(name_2), token[2]);
|
|
6486
6576
|
}
|
|
6487
|
-
elements[key] =
|
|
6488
|
-
type: 'symbol',
|
|
6489
|
-
name: name_3,
|
|
6490
|
-
default: this.parseOptionalDefaulValue(),
|
|
6491
|
-
sourceCodeInfo: firstToken[2],
|
|
6492
|
-
};
|
|
6577
|
+
elements[key[1]] = withSourceCodeInfo([bindingTargetTypes.symbol, [name_2, this.parseOptionalDefaulValue()]], firstToken[2]);
|
|
6493
6578
|
}
|
|
6494
6579
|
else if (isRBraceToken(token) || isOperatorToken(token, ',') || isOperatorToken(token, ':=')) {
|
|
6495
|
-
if (elements[key]) {
|
|
6580
|
+
if (elements[key[1]]) {
|
|
6496
6581
|
throw new LitsError("Duplicate binding name: ".concat(key), token[2]);
|
|
6497
6582
|
}
|
|
6498
6583
|
if (rest && isOperatorToken(this.peek(), ':=')) {
|
|
6499
6584
|
throw new LitsError('Rest argument can not have default value', this.peek()[2]);
|
|
6500
6585
|
}
|
|
6501
|
-
elements[key] =
|
|
6502
|
-
|
|
6503
|
-
|
|
6504
|
-
default: this.parseOptionalDefaulValue(),
|
|
6505
|
-
sourceCodeInfo: firstToken[2],
|
|
6506
|
-
};
|
|
6586
|
+
elements[key[1]] = rest
|
|
6587
|
+
? withSourceCodeInfo([bindingTargetTypes.rest, [key[1], this.parseOptionalDefaulValue()]], firstToken[2])
|
|
6588
|
+
: withSourceCodeInfo([bindingTargetTypes.symbol, [key, this.parseOptionalDefaulValue()]], firstToken[2]);
|
|
6507
6589
|
}
|
|
6508
6590
|
else if (isLBraceToken(token) || isLBracketToken(token)) {
|
|
6509
|
-
elements[key] = this.parseBindingTarget();
|
|
6591
|
+
elements[key[1]] = this.parseBindingTarget();
|
|
6510
6592
|
}
|
|
6511
6593
|
if (!isRBraceToken(this.peek())) {
|
|
6512
6594
|
assertOperatorToken(this.peek(), ',');
|
|
@@ -6520,12 +6602,7 @@ var Parser = /** @class */ (function () {
|
|
|
6520
6602
|
if (requireDefaultValue && !defaultValue) {
|
|
6521
6603
|
throw new LitsError('Expected assignment', token[2]);
|
|
6522
6604
|
}
|
|
6523
|
-
return
|
|
6524
|
-
type: 'object',
|
|
6525
|
-
elements: elements,
|
|
6526
|
-
default: defaultValue,
|
|
6527
|
-
sourceCodeInfo: firstToken[2],
|
|
6528
|
-
};
|
|
6605
|
+
return withSourceCodeInfo([bindingTargetTypes.object, [elements, defaultValue]], firstToken[2]);
|
|
6529
6606
|
}
|
|
6530
6607
|
throw new LitsError('Expected symbol', this.peek()[2]);
|
|
6531
6608
|
};
|
|
@@ -6533,22 +6610,13 @@ var Parser = /** @class */ (function () {
|
|
|
6533
6610
|
if (optionalSemicolon === void 0) { optionalSemicolon = false; }
|
|
6534
6611
|
this.advance();
|
|
6535
6612
|
var target = this.parseBindingTarget({ requireDefaultValue: true, noRest: true });
|
|
6536
|
-
var value = target
|
|
6537
|
-
|
|
6613
|
+
var value = target[1][1];
|
|
6614
|
+
target[1][1] = undefined;
|
|
6538
6615
|
if (!optionalSemicolon) {
|
|
6539
6616
|
assertOperatorToken(this.peek(), ';');
|
|
6540
6617
|
}
|
|
6541
|
-
|
|
6542
|
-
|
|
6543
|
-
name: 'let',
|
|
6544
|
-
bindingNode: {
|
|
6545
|
-
type: 'Binding',
|
|
6546
|
-
target: target,
|
|
6547
|
-
value: value,
|
|
6548
|
-
sourceCodeInfo: token[2],
|
|
6549
|
-
},
|
|
6550
|
-
sourceCodeInfo: token[2],
|
|
6551
|
-
};
|
|
6618
|
+
var bindingTarget = withSourceCodeInfo([NodeTypes.Binding, [target, value]], token[2]);
|
|
6619
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.let, bindingTarget]], token[2]);
|
|
6552
6620
|
};
|
|
6553
6621
|
Parser.prototype.parseDo = function (token) {
|
|
6554
6622
|
this.advance();
|
|
@@ -6564,12 +6632,7 @@ var Parser = /** @class */ (function () {
|
|
|
6564
6632
|
}
|
|
6565
6633
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6566
6634
|
this.advance();
|
|
6567
|
-
return
|
|
6568
|
-
type: 'SpecialExpression',
|
|
6569
|
-
name: 'do',
|
|
6570
|
-
params: expressions,
|
|
6571
|
-
sourceCodeInfo: token[2],
|
|
6572
|
-
};
|
|
6635
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
|
|
6573
6636
|
};
|
|
6574
6637
|
Parser.prototype.parseLoop = function (firstToken) {
|
|
6575
6638
|
this.advance();
|
|
@@ -6579,14 +6642,9 @@ var Parser = /** @class */ (function () {
|
|
|
6579
6642
|
assertSymbolToken(token, 'let');
|
|
6580
6643
|
this.advance();
|
|
6581
6644
|
var target = this.parseBindingTarget({ requireDefaultValue: true, noRest: true });
|
|
6582
|
-
var value = target
|
|
6583
|
-
|
|
6584
|
-
bindingNodes.push(
|
|
6585
|
-
type: 'Binding',
|
|
6586
|
-
target: target,
|
|
6587
|
-
value: value,
|
|
6588
|
-
sourceCodeInfo: token[2],
|
|
6589
|
-
});
|
|
6645
|
+
var value = target[1][1];
|
|
6646
|
+
target[1][1] = undefined;
|
|
6647
|
+
bindingNodes.push(withSourceCodeInfo([NodeTypes.Binding, [target, value]], token[2]));
|
|
6590
6648
|
if (isOperatorToken(this.peek(), ',')) {
|
|
6591
6649
|
this.advance();
|
|
6592
6650
|
}
|
|
@@ -6609,13 +6667,7 @@ var Parser = /** @class */ (function () {
|
|
|
6609
6667
|
}
|
|
6610
6668
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6611
6669
|
this.advance();
|
|
6612
|
-
return
|
|
6613
|
-
type: 'SpecialExpression',
|
|
6614
|
-
name: 'loop',
|
|
6615
|
-
params: params,
|
|
6616
|
-
bindingNodes: bindingNodes,
|
|
6617
|
-
sourceCodeInfo: firstToken[2],
|
|
6618
|
-
};
|
|
6670
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.loop, bindingNodes, params]], firstToken[2]);
|
|
6619
6671
|
};
|
|
6620
6672
|
Parser.prototype.parseTry = function (token) {
|
|
6621
6673
|
this.advance();
|
|
@@ -6631,12 +6683,7 @@ var Parser = /** @class */ (function () {
|
|
|
6631
6683
|
}
|
|
6632
6684
|
var tryExpression = tryExpressions.length === 1
|
|
6633
6685
|
? tryExpressions[0]
|
|
6634
|
-
:
|
|
6635
|
-
type: 'SpecialExpression',
|
|
6636
|
-
name: 'do',
|
|
6637
|
-
params: tryExpressions,
|
|
6638
|
-
sourceCodeInfo: token[2],
|
|
6639
|
-
};
|
|
6686
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, tryExpressions]], token[2]);
|
|
6640
6687
|
assertReservedSymbolToken(this.peek(), 'catch');
|
|
6641
6688
|
this.advance();
|
|
6642
6689
|
var errorSymbol;
|
|
@@ -6660,20 +6707,8 @@ var Parser = /** @class */ (function () {
|
|
|
6660
6707
|
this.advance();
|
|
6661
6708
|
var catchExpression = catchExpressions.length === 1
|
|
6662
6709
|
? catchExpressions[0]
|
|
6663
|
-
:
|
|
6664
|
-
|
|
6665
|
-
name: 'do',
|
|
6666
|
-
params: catchExpressions,
|
|
6667
|
-
sourceCodeInfo: token[2],
|
|
6668
|
-
};
|
|
6669
|
-
return {
|
|
6670
|
-
type: 'SpecialExpression',
|
|
6671
|
-
name: 'try',
|
|
6672
|
-
params: [tryExpression],
|
|
6673
|
-
ce: catchExpression,
|
|
6674
|
-
e: errorSymbol,
|
|
6675
|
-
sourceCodeInfo: token[2],
|
|
6676
|
-
};
|
|
6710
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, catchExpressions]], token[2]);
|
|
6711
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.try, tryExpression, errorSymbol, catchExpression]], token[2]);
|
|
6677
6712
|
};
|
|
6678
6713
|
Parser.prototype.parseForOrDoseq = function (firstToken) {
|
|
6679
6714
|
var isDoseq = firstToken[1] === 'doseq';
|
|
@@ -6681,10 +6716,10 @@ var Parser = /** @class */ (function () {
|
|
|
6681
6716
|
var forLoopBindings = [];
|
|
6682
6717
|
var _loop_1 = function () {
|
|
6683
6718
|
var loopBinding = this_1.parseForLoopBinding();
|
|
6684
|
-
var existingBoundNames = forLoopBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b
|
|
6685
|
-
var newBoundNames = getAllBindingTargetNames(loopBinding
|
|
6719
|
+
var existingBoundNames = forLoopBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b[0][1][0])); });
|
|
6720
|
+
var newBoundNames = getAllBindingTargetNames(loopBinding[0][1][0]);
|
|
6686
6721
|
if (Object.keys(newBoundNames).some(function (n) { return existingBoundNames.includes(n); })) {
|
|
6687
|
-
throw new LitsError('Duplicate binding', loopBinding
|
|
6722
|
+
throw new LitsError('Duplicate binding', loopBinding[0][2]);
|
|
6688
6723
|
}
|
|
6689
6724
|
forLoopBindings.push(loopBinding);
|
|
6690
6725
|
};
|
|
@@ -6706,13 +6741,9 @@ var Parser = /** @class */ (function () {
|
|
|
6706
6741
|
}
|
|
6707
6742
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6708
6743
|
this.advance();
|
|
6709
|
-
return
|
|
6710
|
-
|
|
6711
|
-
|
|
6712
|
-
params: expressions,
|
|
6713
|
-
sourceCodeInfo: firstToken[2],
|
|
6714
|
-
l: forLoopBindings,
|
|
6715
|
-
};
|
|
6744
|
+
return isDoseq
|
|
6745
|
+
? withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.doseq, forLoopBindings, expressions]], firstToken[2])
|
|
6746
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.for, forLoopBindings, expressions]], firstToken[2]);
|
|
6716
6747
|
};
|
|
6717
6748
|
Parser.prototype.parseForLoopBinding = function () {
|
|
6718
6749
|
assertReservedSymbolToken(this.peek(), 'each');
|
|
@@ -6734,18 +6765,17 @@ var Parser = /** @class */ (function () {
|
|
|
6734
6765
|
&& !isReservedSymbolToken(token, 'each')) {
|
|
6735
6766
|
throw new LitsError('Expected symbol each, do, let, when or while', token[2]);
|
|
6736
6767
|
}
|
|
6737
|
-
var letBindings;
|
|
6768
|
+
var letBindings = [];
|
|
6738
6769
|
if (token[1] === 'let') {
|
|
6739
6770
|
modifiers.push('&let');
|
|
6740
|
-
letBindings = [];
|
|
6741
6771
|
var _loop_2 = function () {
|
|
6742
6772
|
var letNode = this_2.parseLet(token, true);
|
|
6743
|
-
var existingBoundNames = letBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b
|
|
6744
|
-
var newBoundNames = Object.keys(getAllBindingTargetNames(letNode
|
|
6773
|
+
var existingBoundNames = letBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b[1][0])); });
|
|
6774
|
+
var newBoundNames = Object.keys(getAllBindingTargetNames(letNode[1][1][1][0]));
|
|
6745
6775
|
if (newBoundNames.some(function (n) { return existingBoundNames.includes(n); })) {
|
|
6746
|
-
throw new LitsError('Duplicate binding', letNode
|
|
6776
|
+
throw new LitsError('Duplicate binding', letNode[1][1][2]);
|
|
6747
6777
|
}
|
|
6748
|
-
letBindings.push(letNode
|
|
6778
|
+
letBindings.push(letNode[1][1]);
|
|
6749
6779
|
token = this_2.peek();
|
|
6750
6780
|
if (!isSymbolToken(token, 'do') && !isReservedSymbolToken(this_2.peek(), 'each') && !isOperatorToken(token, ',')) {
|
|
6751
6781
|
throw new LitsError('Expected do, each or comma', token[2]);
|
|
@@ -6791,31 +6821,21 @@ var Parser = /** @class */ (function () {
|
|
|
6791
6821
|
if (!isSymbolToken(token, 'do') && !isReservedSymbolToken(this.peek(), 'each')) {
|
|
6792
6822
|
throw new LitsError('Expected do or each', token[2]);
|
|
6793
6823
|
}
|
|
6794
|
-
return
|
|
6795
|
-
b: bindingNode,
|
|
6796
|
-
m: modifiers,
|
|
6797
|
-
l: letBindings,
|
|
6798
|
-
wn: whenNode,
|
|
6799
|
-
we: whileNode,
|
|
6800
|
-
};
|
|
6824
|
+
return [bindingNode, letBindings, whenNode, whileNode];
|
|
6801
6825
|
};
|
|
6802
6826
|
Parser.prototype.parseBinding = function () {
|
|
6803
6827
|
var firstToken = asSymbolToken(this.peek());
|
|
6804
|
-
var name =
|
|
6805
|
-
this.advance();
|
|
6828
|
+
var name = asUserDefinedSymbolNode(this.parseSymbol());
|
|
6806
6829
|
assertReservedSymbolToken(this.peek(), 'in');
|
|
6807
6830
|
this.advance();
|
|
6808
6831
|
var value = this.parseExpression();
|
|
6809
|
-
var node =
|
|
6810
|
-
|
|
6811
|
-
|
|
6812
|
-
|
|
6813
|
-
|
|
6814
|
-
|
|
6815
|
-
|
|
6816
|
-
value: value,
|
|
6817
|
-
sourceCodeInfo: firstToken[2],
|
|
6818
|
-
};
|
|
6832
|
+
var node = withSourceCodeInfo([
|
|
6833
|
+
NodeTypes.Binding,
|
|
6834
|
+
[
|
|
6835
|
+
withSourceCodeInfo([bindingTargetTypes.symbol, [name, undefined]], firstToken[2]),
|
|
6836
|
+
value,
|
|
6837
|
+
],
|
|
6838
|
+
], firstToken[2]);
|
|
6819
6839
|
return node;
|
|
6820
6840
|
};
|
|
6821
6841
|
Parser.prototype.parseIfOrUnless = function (token) {
|
|
@@ -6838,12 +6858,7 @@ var Parser = /** @class */ (function () {
|
|
|
6838
6858
|
}
|
|
6839
6859
|
var thenExpression = thenExpressions.length === 1
|
|
6840
6860
|
? thenExpressions[0]
|
|
6841
|
-
:
|
|
6842
|
-
type: 'SpecialExpression',
|
|
6843
|
-
name: 'do',
|
|
6844
|
-
params: thenExpressions,
|
|
6845
|
-
sourceCodeInfo: token[2],
|
|
6846
|
-
};
|
|
6861
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, thenExpressions]], token[2]);
|
|
6847
6862
|
var elseExpression;
|
|
6848
6863
|
if (isReservedSymbolToken(this.peek(), 'else')) {
|
|
6849
6864
|
this.advance();
|
|
@@ -6859,25 +6874,13 @@ var Parser = /** @class */ (function () {
|
|
|
6859
6874
|
}
|
|
6860
6875
|
elseExpression = elseExpressions.length === 1
|
|
6861
6876
|
? elseExpressions[0]
|
|
6862
|
-
:
|
|
6863
|
-
type: 'SpecialExpression',
|
|
6864
|
-
name: 'do',
|
|
6865
|
-
params: elseExpressions,
|
|
6866
|
-
sourceCodeInfo: token[2],
|
|
6867
|
-
};
|
|
6877
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, elseExpressions]], token[2]);
|
|
6868
6878
|
}
|
|
6869
6879
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6870
6880
|
this.advance();
|
|
6871
|
-
|
|
6872
|
-
|
|
6873
|
-
|
|
6874
|
-
}
|
|
6875
|
-
return {
|
|
6876
|
-
type: 'SpecialExpression',
|
|
6877
|
-
name: isUnless ? 'unless' : 'if',
|
|
6878
|
-
params: params,
|
|
6879
|
-
sourceCodeInfo: token[2],
|
|
6880
|
-
};
|
|
6881
|
+
return isUnless
|
|
6882
|
+
? withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.unless, [condition, thenExpression, elseExpression]]], token[2])
|
|
6883
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.if, [condition, thenExpression, elseExpression]]], token[2]);
|
|
6881
6884
|
};
|
|
6882
6885
|
Parser.prototype.parseCond = function (token) {
|
|
6883
6886
|
this.advance();
|
|
@@ -6885,7 +6888,7 @@ var Parser = /** @class */ (function () {
|
|
|
6885
6888
|
while (!this.isAtEnd() && !isReservedSymbolToken(this.peek(), 'end')) {
|
|
6886
6889
|
assertReservedSymbolToken(this.peek(), 'case');
|
|
6887
6890
|
this.advance();
|
|
6888
|
-
|
|
6891
|
+
var caseExpression = this.parseExpression();
|
|
6889
6892
|
assertReservedSymbolToken(this.peek(), 'then');
|
|
6890
6893
|
this.advance();
|
|
6891
6894
|
var expressions = [];
|
|
@@ -6900,14 +6903,10 @@ var Parser = /** @class */ (function () {
|
|
|
6900
6903
|
throw new LitsError('Expected ;', this.peek()[2]);
|
|
6901
6904
|
}
|
|
6902
6905
|
}
|
|
6903
|
-
|
|
6906
|
+
var thenExpression = expressions.length === 1
|
|
6904
6907
|
? expressions[0]
|
|
6905
|
-
:
|
|
6906
|
-
|
|
6907
|
-
name: 'do',
|
|
6908
|
-
params: expressions,
|
|
6909
|
-
sourceCodeInfo: token[2],
|
|
6910
|
-
});
|
|
6908
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
|
|
6909
|
+
params.push([caseExpression, thenExpression]);
|
|
6911
6910
|
if (isReservedSymbolToken(this.peek(), 'end')) {
|
|
6912
6911
|
break;
|
|
6913
6912
|
}
|
|
@@ -6915,20 +6914,16 @@ var Parser = /** @class */ (function () {
|
|
|
6915
6914
|
}
|
|
6916
6915
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6917
6916
|
this.advance();
|
|
6918
|
-
return
|
|
6919
|
-
type: 'SpecialExpression',
|
|
6920
|
-
name: 'cond',
|
|
6921
|
-
params: params,
|
|
6922
|
-
sourceCodeInfo: token[2],
|
|
6923
|
-
};
|
|
6917
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.cond, params]], token[2]);
|
|
6924
6918
|
};
|
|
6925
6919
|
Parser.prototype.parseSwitch = function (token) {
|
|
6926
6920
|
this.advance();
|
|
6927
|
-
var
|
|
6921
|
+
var valueExpression = this.parseExpression();
|
|
6922
|
+
var params = [];
|
|
6928
6923
|
while (!this.isAtEnd() && !isReservedSymbolToken(this.peek(), 'end')) {
|
|
6929
6924
|
assertReservedSymbolToken(this.peek(), 'case');
|
|
6930
6925
|
this.advance();
|
|
6931
|
-
|
|
6926
|
+
var caseExpression = this.parseExpression();
|
|
6932
6927
|
assertReservedSymbolToken(this.peek(), 'then');
|
|
6933
6928
|
this.advance();
|
|
6934
6929
|
var expressions = [];
|
|
@@ -6943,14 +6938,10 @@ var Parser = /** @class */ (function () {
|
|
|
6943
6938
|
throw new LitsError('Expected ;', this.peek()[2]);
|
|
6944
6939
|
}
|
|
6945
6940
|
}
|
|
6946
|
-
|
|
6941
|
+
var thenExpression = expressions.length === 1
|
|
6947
6942
|
? expressions[0]
|
|
6948
|
-
:
|
|
6949
|
-
|
|
6950
|
-
name: 'do',
|
|
6951
|
-
params: expressions,
|
|
6952
|
-
sourceCodeInfo: token[2],
|
|
6953
|
-
});
|
|
6943
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
|
|
6944
|
+
params.push([caseExpression, thenExpression]);
|
|
6954
6945
|
if (isReservedSymbolToken(this.peek(), 'end')) {
|
|
6955
6946
|
break;
|
|
6956
6947
|
}
|
|
@@ -6958,12 +6949,7 @@ var Parser = /** @class */ (function () {
|
|
|
6958
6949
|
}
|
|
6959
6950
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6960
6951
|
this.advance();
|
|
6961
|
-
return
|
|
6962
|
-
type: 'SpecialExpression',
|
|
6963
|
-
name: 'switch',
|
|
6964
|
-
params: params,
|
|
6965
|
-
sourceCodeInfo: token[2],
|
|
6966
|
-
};
|
|
6952
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.switch, valueExpression, params]], token[2]);
|
|
6967
6953
|
};
|
|
6968
6954
|
Parser.prototype.parseFunction = function (token) {
|
|
6969
6955
|
this.advance();
|
|
@@ -6982,17 +6968,10 @@ var Parser = /** @class */ (function () {
|
|
|
6982
6968
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6983
6969
|
this.advance();
|
|
6984
6970
|
assertOperatorToken(this.peek(), ';');
|
|
6985
|
-
return
|
|
6986
|
-
|
|
6987
|
-
|
|
6988
|
-
|
|
6989
|
-
params: [],
|
|
6990
|
-
function: {
|
|
6991
|
-
arguments: functionArguments,
|
|
6992
|
-
body: body,
|
|
6993
|
-
},
|
|
6994
|
-
sourceCodeInfo: token[2],
|
|
6995
|
-
};
|
|
6971
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.function, symbol, [
|
|
6972
|
+
functionArguments,
|
|
6973
|
+
body,
|
|
6974
|
+
]]], token[2]);
|
|
6996
6975
|
};
|
|
6997
6976
|
Parser.prototype.isAtEnd = function () {
|
|
6998
6977
|
return this.parseState.position >= this.tokenStream.tokens.length;
|
|
@@ -7014,7 +6993,7 @@ var Parser = /** @class */ (function () {
|
|
|
7014
6993
|
this.advance();
|
|
7015
6994
|
if (isSymbolToken(this.peek(), 'let')) {
|
|
7016
6995
|
var letNode = this.parseLet(asSymbolToken(this.peek()));
|
|
7017
|
-
return
|
|
6996
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.def, letNode[1][1]]], token[2]);
|
|
7018
6997
|
}
|
|
7019
6998
|
else if (isReservedSymbolToken(this.peek(), 'function')) {
|
|
7020
6999
|
this.advance();
|
|
@@ -7032,71 +7011,57 @@ var Parser = /** @class */ (function () {
|
|
|
7032
7011
|
}
|
|
7033
7012
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
7034
7013
|
this.advance();
|
|
7035
|
-
return
|
|
7036
|
-
|
|
7037
|
-
|
|
7038
|
-
|
|
7039
|
-
params: [],
|
|
7040
|
-
function: {
|
|
7041
|
-
arguments: functionArguments,
|
|
7042
|
-
body: body,
|
|
7043
|
-
},
|
|
7044
|
-
sourceCodeInfo: token[2],
|
|
7045
|
-
};
|
|
7014
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.defn, symbol, [
|
|
7015
|
+
functionArguments,
|
|
7016
|
+
body,
|
|
7017
|
+
]]], token[2]);
|
|
7046
7018
|
}
|
|
7047
7019
|
else {
|
|
7048
7020
|
throw new LitsError('Expected let or function', this.peek()[2]);
|
|
7049
7021
|
}
|
|
7050
7022
|
};
|
|
7023
|
+
Parser.prototype.stringToSymbolNode = function (value, sourceCodeInfo) {
|
|
7024
|
+
if (specialExpressionTypes[value] !== undefined) {
|
|
7025
|
+
return withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[value]], sourceCodeInfo);
|
|
7026
|
+
}
|
|
7027
|
+
if (normalExpressionTypes[value] !== undefined) {
|
|
7028
|
+
return withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[value]], sourceCodeInfo);
|
|
7029
|
+
}
|
|
7030
|
+
return withSourceCodeInfo([NodeTypes.UserDefinedSymbol, value], sourceCodeInfo);
|
|
7031
|
+
};
|
|
7032
|
+
Parser.prototype.stringFromQuotedSymbol = function (value) {
|
|
7033
|
+
return value.substring(1, value.length - 1)
|
|
7034
|
+
.replace(/(\\{2})|(\\')|\\(.)/g, function (_, backslash, singleQuote, normalChar) {
|
|
7035
|
+
if (backslash) {
|
|
7036
|
+
return '\\';
|
|
7037
|
+
}
|
|
7038
|
+
if (singleQuote) {
|
|
7039
|
+
return '\'';
|
|
7040
|
+
}
|
|
7041
|
+
return "\\".concat(normalChar);
|
|
7042
|
+
});
|
|
7043
|
+
};
|
|
7051
7044
|
Parser.prototype.parseSymbol = function () {
|
|
7052
7045
|
var token = this.peek();
|
|
7053
7046
|
this.advance();
|
|
7054
7047
|
if (!isSymbolToken(token)) {
|
|
7055
7048
|
throw new LitsError("Expected symbol token, got ".concat(token[0]), token[2]);
|
|
7056
7049
|
}
|
|
7057
|
-
if (token[1][0]
|
|
7058
|
-
return
|
|
7059
|
-
type: 'Symbol',
|
|
7060
|
-
value: token[1],
|
|
7061
|
-
sourceCodeInfo: token[2],
|
|
7062
|
-
};
|
|
7050
|
+
if (token[1][0] === '\'') {
|
|
7051
|
+
return this.stringToSymbolNode(this.stringFromQuotedSymbol(token[1]), token[2]);
|
|
7063
7052
|
}
|
|
7064
7053
|
else {
|
|
7065
|
-
|
|
7066
|
-
.replace(/(\\{2})|(\\')|\\(.)/g, function (_, backslash, singleQuote, normalChar) {
|
|
7067
|
-
if (backslash) {
|
|
7068
|
-
return '\\';
|
|
7069
|
-
}
|
|
7070
|
-
if (singleQuote) {
|
|
7071
|
-
return '\'';
|
|
7072
|
-
}
|
|
7073
|
-
return "\\".concat(normalChar);
|
|
7074
|
-
});
|
|
7075
|
-
return {
|
|
7076
|
-
type: 'Symbol',
|
|
7077
|
-
value: value,
|
|
7078
|
-
sourceCodeInfo: token[2],
|
|
7079
|
-
};
|
|
7054
|
+
return this.stringToSymbolNode(token[1], token[2]);
|
|
7080
7055
|
}
|
|
7081
7056
|
};
|
|
7082
7057
|
Parser.prototype.parseReservedSymbol = function () {
|
|
7083
|
-
var token = this.peek();
|
|
7058
|
+
var token = asReservedSymbolToken(this.peek());
|
|
7084
7059
|
this.advance();
|
|
7085
|
-
|
|
7086
|
-
|
|
7087
|
-
|
|
7088
|
-
return {
|
|
7089
|
-
type: 'Number',
|
|
7090
|
-
value: numberReservedSymbolRecord[symbol],
|
|
7091
|
-
sourceCodeInfo: token[2],
|
|
7092
|
-
};
|
|
7093
|
-
}
|
|
7060
|
+
var symbol = token[1];
|
|
7061
|
+
if (isNumberReservedSymbol(symbol)) {
|
|
7062
|
+
return withSourceCodeInfo([NodeTypes.Number, numberReservedSymbolRecord[symbol]], token[2]);
|
|
7094
7063
|
}
|
|
7095
|
-
return
|
|
7096
|
-
type: 'ReservedSymbol',
|
|
7097
|
-
value: token[1],
|
|
7098
|
-
sourceCodeInfo: token[2],
|
|
7099
|
-
};
|
|
7064
|
+
return withSourceCodeInfo([NodeTypes.ReservedSymbol, token[1]], token[2]);
|
|
7100
7065
|
};
|
|
7101
7066
|
Parser.prototype.parseNumber = function () {
|
|
7102
7067
|
var token = this.peek();
|
|
@@ -7104,11 +7069,7 @@ var Parser = /** @class */ (function () {
|
|
|
7104
7069
|
var value = token[1];
|
|
7105
7070
|
var negative = value[0] === '-';
|
|
7106
7071
|
var numberString = (negative ? value.substring(1) : value).replace(/_/g, '');
|
|
7107
|
-
return
|
|
7108
|
-
type: 'Number',
|
|
7109
|
-
value: negative ? -Number(numberString) : Number(numberString),
|
|
7110
|
-
sourceCodeInfo: token[2],
|
|
7111
|
-
};
|
|
7072
|
+
return withSourceCodeInfo([NodeTypes.Number, negative ? -Number(numberString) : Number(numberString)], token[2]);
|
|
7112
7073
|
};
|
|
7113
7074
|
Parser.prototype.parseString = function () {
|
|
7114
7075
|
var token = this.peek();
|
|
@@ -7140,11 +7101,7 @@ var Parser = /** @class */ (function () {
|
|
|
7140
7101
|
}
|
|
7141
7102
|
return normalChar;
|
|
7142
7103
|
});
|
|
7143
|
-
return
|
|
7144
|
-
type: 'String',
|
|
7145
|
-
value: value,
|
|
7146
|
-
sourceCodeInfo: token[2],
|
|
7147
|
-
};
|
|
7104
|
+
return withSourceCodeInfo([NodeTypes.String, value], token[2]);
|
|
7148
7105
|
};
|
|
7149
7106
|
Parser.prototype.parseRegexpShorthand = function () {
|
|
7150
7107
|
var token = this.peek();
|
|
@@ -7152,22 +7109,15 @@ var Parser = /** @class */ (function () {
|
|
|
7152
7109
|
var endStringPosition = token[1].lastIndexOf('"');
|
|
7153
7110
|
var regexpString = token[1].substring(2, endStringPosition);
|
|
7154
7111
|
var optionsString = token[1].substring(endStringPosition + 1);
|
|
7155
|
-
var stringNode =
|
|
7156
|
-
|
|
7157
|
-
|
|
7158
|
-
|
|
7159
|
-
|
|
7160
|
-
|
|
7161
|
-
|
|
7162
|
-
|
|
7163
|
-
|
|
7164
|
-
};
|
|
7165
|
-
var node = {
|
|
7166
|
-
type: 'NormalExpression',
|
|
7167
|
-
name: 'regexp',
|
|
7168
|
-
params: [stringNode, optionsNode],
|
|
7169
|
-
sourceCodeInfo: token[2],
|
|
7170
|
-
};
|
|
7112
|
+
var stringNode = withSourceCodeInfo([NodeTypes.String, regexpString], token[2]);
|
|
7113
|
+
var optionsNode = withSourceCodeInfo([NodeTypes.String, optionsString], token[2]);
|
|
7114
|
+
var node = withSourceCodeInfo([
|
|
7115
|
+
NodeTypes.NormalExpression,
|
|
7116
|
+
[
|
|
7117
|
+
withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes.regexp], token[2]),
|
|
7118
|
+
[stringNode, optionsNode],
|
|
7119
|
+
],
|
|
7120
|
+
], token[2]);
|
|
7171
7121
|
return node;
|
|
7172
7122
|
};
|
|
7173
7123
|
return Parser;
|
|
@@ -7284,7 +7234,7 @@ var Lits = /** @class */ (function () {
|
|
|
7284
7234
|
if (params === void 0) { params = {}; }
|
|
7285
7235
|
var ast = typeof programOrAst === 'string' ? this.generateAst(programOrAst, params) : programOrAst;
|
|
7286
7236
|
var contextStack = createContextStack(params);
|
|
7287
|
-
return getUndefinedSymbols(ast, contextStack, builtin,
|
|
7237
|
+
return getUndefinedSymbols(ast, contextStack, builtin, evaluateNode);
|
|
7288
7238
|
};
|
|
7289
7239
|
Lits.prototype.tokenize = function (program, tokenizeParams) {
|
|
7290
7240
|
if (tokenizeParams === void 0) { tokenizeParams = {}; }
|
|
@@ -13319,8 +13269,7 @@ Object.entries(specialExpressionsReference).forEach(function (_a) {
|
|
|
13319
13269
|
var _b;
|
|
13320
13270
|
var _c = __read(_a, 2), key = _c[0], obj = _c[1];
|
|
13321
13271
|
if (isFunctionReference(obj)) {
|
|
13322
|
-
var
|
|
13323
|
-
var paramCount = (_b = specialExpressions[key]) === null || _b === void 0 ? void 0 : _b.paramCount;
|
|
13272
|
+
var paramCount = (_b = specialExpressions[specialExpressionTypes[key]]) === null || _b === void 0 ? void 0 : _b.paramCount;
|
|
13324
13273
|
if (paramCount && canBeOperator(paramCount)) {
|
|
13325
13274
|
obj._isOperator = true;
|
|
13326
13275
|
}
|
|
@@ -13338,7 +13287,7 @@ function stringifyValue(value, html) {
|
|
|
13338
13287
|
var lt = '<';
|
|
13339
13288
|
if (isLitsFunction(value)) {
|
|
13340
13289
|
if (value.functionType === 'Builtin')
|
|
13341
|
-
return "".concat(lt, "builtin function ").concat(value.
|
|
13290
|
+
return "".concat(lt, "builtin function ").concat(value.normalBuitinSymbolType).concat(gt);
|
|
13342
13291
|
else
|
|
13343
13292
|
return "".concat(lt, "function ").concat((_a = value.n) !== null && _a !== void 0 ? _a : '\u03BB').concat(gt);
|
|
13344
13293
|
}
|