@mojir/lits 2.1.0 → 2.1.2
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 +879 -946
- package/dist/cli/reference/api.d.ts +0 -1
- package/dist/cli/reference/index.d.ts +208 -208
- package/dist/cli/src/builtin/bindingNode.d.ts +3 -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 +25 -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 +19 -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 +849 -913
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +849 -913
- package/dist/index.js.map +1 -1
- package/dist/lits.iife.js +849 -913
- package/dist/lits.iife.js.map +1 -1
- package/dist/reference/api.d.ts +0 -1
- package/dist/reference/index.d.ts +208 -208
- package/dist/src/builtin/bindingNode.d.ts +3 -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 +25 -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 +19 -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 +865 -909
- package/dist/testFramework.esm.js.map +1 -1
- package/dist/testFramework.js +865 -909
- 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
|
@@ -177,23 +177,50 @@ var UndefinedSymbolError = /** @class */ (function (_super) {
|
|
|
177
177
|
return UndefinedSymbolError;
|
|
178
178
|
}(LitsError));
|
|
179
179
|
|
|
180
|
-
var
|
|
181
|
-
'
|
|
182
|
-
'
|
|
183
|
-
'
|
|
184
|
-
'
|
|
185
|
-
'
|
|
186
|
-
'
|
|
187
|
-
'
|
|
188
|
-
'
|
|
189
|
-
'
|
|
190
|
-
'
|
|
191
|
-
'
|
|
192
|
-
'
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
180
|
+
var specialExpressionTypes = {
|
|
181
|
+
'??': 0,
|
|
182
|
+
'&&': 1,
|
|
183
|
+
'||': 2,
|
|
184
|
+
'array': 3,
|
|
185
|
+
'cond': 4,
|
|
186
|
+
'0_def': 5,
|
|
187
|
+
'defined?': 6,
|
|
188
|
+
'0_defn': 7,
|
|
189
|
+
'do': 8,
|
|
190
|
+
'doseq': 9,
|
|
191
|
+
'0_fn': 10,
|
|
192
|
+
'for': 11,
|
|
193
|
+
'function': 12,
|
|
194
|
+
'if': 13,
|
|
195
|
+
'let': 14,
|
|
196
|
+
'loop': 15,
|
|
197
|
+
'object': 16,
|
|
198
|
+
'recur': 17,
|
|
199
|
+
'switch': 18,
|
|
200
|
+
'throw': 19,
|
|
201
|
+
'try': 20,
|
|
202
|
+
'unless': 21,
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
var NodeTypes = {
|
|
206
|
+
Number: 1,
|
|
207
|
+
String: 2,
|
|
208
|
+
NormalExpression: 3,
|
|
209
|
+
SpecialExpression: 4,
|
|
210
|
+
UserDefinedSymbol: 5,
|
|
211
|
+
NormalBuiltinSymbol: 6,
|
|
212
|
+
SpecialBuiltinSymbol: 7,
|
|
213
|
+
ReservedSymbol: 8,
|
|
214
|
+
Binding: 9,
|
|
215
|
+
Spread: 10,
|
|
216
|
+
};
|
|
217
|
+
var NodeTypesSet = new Set(Object.values(NodeTypes));
|
|
218
|
+
function getNodeTypeName(type) {
|
|
219
|
+
return Object.keys(NodeTypes).find(function (key) { return NodeTypes[key] === type; });
|
|
220
|
+
}
|
|
221
|
+
// TODO, is this needed?
|
|
222
|
+
function isNodeType(type) {
|
|
223
|
+
return typeof type === 'number' && NodeTypesSet.has(type);
|
|
197
224
|
}
|
|
198
225
|
var functionTypes = [
|
|
199
226
|
'UserDefined',
|
|
@@ -221,17 +248,17 @@ function isLitsFunction$1(func) {
|
|
|
221
248
|
return false;
|
|
222
249
|
return FUNCTION_SYMBOL in func && 'functionType' in func && isFunctionType(func.functionType);
|
|
223
250
|
}
|
|
224
|
-
function
|
|
225
|
-
if (value
|
|
251
|
+
function isNode(value) {
|
|
252
|
+
if (!Array.isArray(value) || value.length < 2)
|
|
226
253
|
return false;
|
|
227
|
-
return
|
|
254
|
+
return isNodeType(value[0]);
|
|
228
255
|
}
|
|
229
256
|
function valueToString(value) {
|
|
230
257
|
if (isLitsFunction$1(value))
|
|
231
258
|
// eslint-disable-next-line ts/no-unsafe-member-access
|
|
232
259
|
return "<function ".concat(value.name || '\u03BB', ">");
|
|
233
|
-
if (
|
|
234
|
-
return "".concat(value
|
|
260
|
+
if (isNode(value))
|
|
261
|
+
return "".concat(getNodeTypeName(value[0]), "-node");
|
|
235
262
|
if (value === null)
|
|
236
263
|
return 'null';
|
|
237
264
|
if (typeof value === 'object' && value instanceof RegExp)
|
|
@@ -247,138 +274,137 @@ function getSourceCodeInfo(anyValue, sourceCodeInfo) {
|
|
|
247
274
|
return (_a = anyValue === null || anyValue === void 0 ? void 0 : anyValue.sourceCodeInfo) !== null && _a !== void 0 ? _a : sourceCodeInfo;
|
|
248
275
|
}
|
|
249
276
|
|
|
250
|
-
function
|
|
251
|
-
|
|
252
|
-
count: count,
|
|
253
|
-
length: node.params.length,
|
|
254
|
-
name: node.name,
|
|
255
|
-
sourceCodeInfo: node.sourceCodeInfo,
|
|
256
|
-
});
|
|
277
|
+
function getAssertionError(typeName, value, sourceCodeInfo) {
|
|
278
|
+
return new LitsError("Expected ".concat(typeName, ", got ").concat(valueToString(value), "."), getSourceCodeInfo(value, sourceCodeInfo));
|
|
257
279
|
}
|
|
258
|
-
|
|
259
|
-
|
|
280
|
+
|
|
281
|
+
function isSymbolNode(node) {
|
|
282
|
+
var nodeType = node[0];
|
|
283
|
+
return NodeTypes.UserDefinedSymbol === nodeType
|
|
284
|
+
|| NodeTypes.NormalBuiltinSymbol === nodeType
|
|
285
|
+
|| NodeTypes.SpecialBuiltinSymbol === nodeType;
|
|
260
286
|
}
|
|
261
|
-
function
|
|
262
|
-
|
|
263
|
-
|
|
287
|
+
function assertSymbolNode(node, sourceCodeInfo) {
|
|
288
|
+
if (!isSymbolNode(node))
|
|
289
|
+
throw getAssertionError('SymbolNode', node, sourceCodeInfo);
|
|
264
290
|
}
|
|
265
|
-
function
|
|
266
|
-
|
|
267
|
-
throw new LitsError('Unexpected undefined', getSourceCodeInfo(value, sourceCodeInfo));
|
|
291
|
+
function isUserDefinedSymbolNode(node) {
|
|
292
|
+
return NodeTypes.UserDefinedSymbol === node[0];
|
|
268
293
|
}
|
|
269
|
-
function
|
|
270
|
-
|
|
294
|
+
function asUserDefinedSymbolNode(node, sourceCodeInfo) {
|
|
295
|
+
assertUserDefinedSymbolNode(node, sourceCodeInfo);
|
|
296
|
+
return node;
|
|
271
297
|
}
|
|
272
|
-
function
|
|
273
|
-
if (!
|
|
274
|
-
throw
|
|
275
|
-
}
|
|
298
|
+
function assertUserDefinedSymbolNode(node, sourceCodeInfo) {
|
|
299
|
+
if (!isUserDefinedSymbolNode(node))
|
|
300
|
+
throw getAssertionError('UserDefinedSymbolNode', node, sourceCodeInfo);
|
|
276
301
|
}
|
|
277
|
-
function
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
if (odd) {
|
|
292
|
-
if (length % 2 !== 1) {
|
|
293
|
-
throw new LitsError("Wrong number of arguments to \"".concat(name, "\",, expected an odd number, got ").concat(valueToString(length), "."), sourceCodeInfo);
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
if (typeof min === 'number' && length < min) {
|
|
297
|
-
throw new LitsError("Wrong number of arguments to \"".concat(name, "\", expected at least ").concat(min, ", got ").concat(valueToString(length), "."), sourceCodeInfo);
|
|
298
|
-
}
|
|
299
|
-
if (typeof max === 'number' && length > max) {
|
|
300
|
-
throw new LitsError("Wrong number of arguments to \"".concat(name, "\", expected at most ").concat(max, ", got ").concat(valueToString(length), "."), sourceCodeInfo);
|
|
301
|
-
}
|
|
302
|
+
function isNormalBuiltinSymbolNode(node) {
|
|
303
|
+
return NodeTypes.NormalBuiltinSymbol === node[0];
|
|
304
|
+
}
|
|
305
|
+
function isSpecialBuiltinSymbolNode(node) {
|
|
306
|
+
return NodeTypes.SpecialBuiltinSymbol === node[0];
|
|
307
|
+
}
|
|
308
|
+
function isNormalExpressionNode(node) {
|
|
309
|
+
return node[0] === NodeTypes.NormalExpression;
|
|
310
|
+
}
|
|
311
|
+
function isNormalExpressionNodeWithName(node) {
|
|
312
|
+
if (!isNormalExpressionNode(node)) {
|
|
313
|
+
return false;
|
|
302
314
|
}
|
|
315
|
+
return isSymbolNode(node[1][0]);
|
|
316
|
+
}
|
|
317
|
+
function isSpreadNode(node) {
|
|
318
|
+
return node[0] === NodeTypes.Spread;
|
|
303
319
|
}
|
|
304
320
|
|
|
305
|
-
var getUndefinedSymbols = function (ast, contextStack, builtin,
|
|
321
|
+
var getUndefinedSymbols = function (ast, contextStack, builtin, evaluateNode) {
|
|
306
322
|
var e_1, _a;
|
|
307
323
|
var _b;
|
|
308
|
-
var
|
|
324
|
+
var nodes = Array.isArray(ast)
|
|
309
325
|
? ast
|
|
310
|
-
: [
|
|
311
|
-
type: 'SpecialExpression',
|
|
312
|
-
name: 'do',
|
|
313
|
-
params: ast.body,
|
|
314
|
-
sourceCodeInfo: undefined,
|
|
315
|
-
}];
|
|
326
|
+
: [[NodeTypes.SpecialExpression, [specialExpressionTypes.do, ast.body]]];
|
|
316
327
|
var unresolvedSymbols = new Set();
|
|
317
328
|
try {
|
|
318
|
-
for (var
|
|
319
|
-
var subNode =
|
|
320
|
-
(_b =
|
|
329
|
+
for (var nodes_1 = __values(nodes), nodes_1_1 = nodes_1.next(); !nodes_1_1.done; nodes_1_1 = nodes_1.next()) {
|
|
330
|
+
var subNode = nodes_1_1.value;
|
|
331
|
+
(_b = findUnresolvedSymbolsInNode(subNode, contextStack, builtin, evaluateNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols.add(symbol); });
|
|
321
332
|
}
|
|
322
333
|
}
|
|
323
334
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
324
335
|
finally {
|
|
325
336
|
try {
|
|
326
|
-
if (
|
|
337
|
+
if (nodes_1_1 && !nodes_1_1.done && (_a = nodes_1.return)) _a.call(nodes_1);
|
|
327
338
|
}
|
|
328
339
|
finally { if (e_1) throw e_1.error; }
|
|
329
340
|
}
|
|
330
341
|
return unresolvedSymbols;
|
|
331
342
|
};
|
|
332
|
-
function
|
|
343
|
+
function findUnresolvedSymbolsInNode(node, contextStack, builtin, evaluateNode) {
|
|
333
344
|
var e_2, _a;
|
|
334
|
-
var _b;
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
345
|
+
var _b, _c;
|
|
346
|
+
var nodeType = node[0];
|
|
347
|
+
switch (nodeType) {
|
|
348
|
+
case NodeTypes.UserDefinedSymbol: {
|
|
349
|
+
var symbolNode = node;
|
|
350
|
+
var lookUpResult = contextStack.lookUp(symbolNode);
|
|
338
351
|
if (lookUpResult === null)
|
|
339
|
-
return new Set([
|
|
352
|
+
return new Set([symbolNode[1]]);
|
|
340
353
|
return null;
|
|
341
354
|
}
|
|
342
|
-
case
|
|
343
|
-
case
|
|
344
|
-
case
|
|
345
|
-
case
|
|
346
|
-
case
|
|
355
|
+
case NodeTypes.NormalBuiltinSymbol:
|
|
356
|
+
case NodeTypes.SpecialBuiltinSymbol:
|
|
357
|
+
case NodeTypes.String:
|
|
358
|
+
case NodeTypes.Number:
|
|
359
|
+
case NodeTypes.ReservedSymbol:
|
|
360
|
+
case NodeTypes.Binding:
|
|
347
361
|
return null;
|
|
348
|
-
case
|
|
362
|
+
case NodeTypes.NormalExpression: {
|
|
363
|
+
var normalExpressionNode = node;
|
|
349
364
|
var unresolvedSymbols_1 = new Set();
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
365
|
+
if (isNormalExpressionNodeWithName(normalExpressionNode)) {
|
|
366
|
+
var _d = __read(normalExpressionNode, 2), _e = __read(_d[1], 1), symbolNode = _e[0];
|
|
367
|
+
if (isUserDefinedSymbolNode(symbolNode)) {
|
|
368
|
+
var lookUpResult = contextStack.lookUp(symbolNode);
|
|
369
|
+
if (lookUpResult === null)
|
|
370
|
+
unresolvedSymbols_1.add(symbolNode[1]);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
var _f = __read(normalExpressionNode, 2), _g = __read(_f[1], 1), expressionNode = _g[0];
|
|
375
|
+
(_b = findUnresolvedSymbolsInNode(expressionNode, contextStack, builtin, evaluateNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
|
|
355
376
|
}
|
|
356
377
|
try {
|
|
357
|
-
for (var
|
|
358
|
-
var subNode =
|
|
359
|
-
(
|
|
378
|
+
for (var _h = __values(normalExpressionNode[1][1]), _j = _h.next(); !_j.done; _j = _h.next()) {
|
|
379
|
+
var subNode = _j.value;
|
|
380
|
+
(_c = findUnresolvedSymbolsInNode(subNode, contextStack, builtin, evaluateNode)) === null || _c === void 0 ? void 0 : _c.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
|
|
360
381
|
}
|
|
361
382
|
}
|
|
362
383
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
363
384
|
finally {
|
|
364
385
|
try {
|
|
365
|
-
if (
|
|
386
|
+
if (_j && !_j.done && (_a = _h.return)) _a.call(_h);
|
|
366
387
|
}
|
|
367
388
|
finally { if (e_2) throw e_2.error; }
|
|
368
389
|
}
|
|
369
390
|
return unresolvedSymbols_1;
|
|
370
391
|
}
|
|
371
|
-
case
|
|
372
|
-
var
|
|
373
|
-
|
|
374
|
-
|
|
392
|
+
case NodeTypes.SpecialExpression: {
|
|
393
|
+
var specialExpressionNode = node;
|
|
394
|
+
var specialExpressionType = specialExpressionNode[1][0];
|
|
395
|
+
var specialExpression = builtin.specialExpressions[specialExpressionType];
|
|
396
|
+
var castedGetUndefinedSymbols = specialExpression.getUndefinedSymbols;
|
|
397
|
+
return castedGetUndefinedSymbols(specialExpressionNode, contextStack, {
|
|
375
398
|
getUndefinedSymbols: getUndefinedSymbols,
|
|
376
399
|
builtin: builtin,
|
|
377
|
-
|
|
400
|
+
evaluateNode: evaluateNode,
|
|
378
401
|
});
|
|
379
402
|
}
|
|
380
|
-
case
|
|
381
|
-
return
|
|
403
|
+
case NodeTypes.Spread:
|
|
404
|
+
return findUnresolvedSymbolsInNode(node[1], contextStack, builtin, evaluateNode);
|
|
405
|
+
/* v8 ignore next 2 */
|
|
406
|
+
default:
|
|
407
|
+
throw new Error("Unhandled node type: ".concat(nodeType));
|
|
382
408
|
}
|
|
383
409
|
}
|
|
384
410
|
|
|
@@ -584,8 +610,56 @@ var bitwiseNormalExpression = {
|
|
|
584
610
|
},
|
|
585
611
|
};
|
|
586
612
|
|
|
587
|
-
function
|
|
588
|
-
|
|
613
|
+
function assertNumberOfParams(count, node) {
|
|
614
|
+
var length = node[1][1].length;
|
|
615
|
+
if (typeof count === 'number') {
|
|
616
|
+
if (length !== count) {
|
|
617
|
+
var name_1 = getNodeTypeName(node[0]);
|
|
618
|
+
throw new LitsError("Wrong number of arguments to \"".concat(name_1, "\", expected ").concat(count, ", got ").concat(valueToString(length), "."), node[2]);
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
else {
|
|
622
|
+
var min = count.min, max = count.max, even = count.even, odd = count.odd;
|
|
623
|
+
if (even) {
|
|
624
|
+
var name_2 = getNodeTypeName(node[0]);
|
|
625
|
+
if (length % 2 !== 0) {
|
|
626
|
+
throw new LitsError("Wrong number of arguments to \"".concat(name_2, "\",, expected an even number, got ").concat(valueToString(length), "."), node[2]);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
if (odd) {
|
|
630
|
+
if (length % 2 !== 1) {
|
|
631
|
+
var name_3 = getNodeTypeName(node[0]);
|
|
632
|
+
throw new LitsError("Wrong number of arguments to \"".concat(name_3, "\",, expected an odd number, got ").concat(valueToString(length), "."), node[2]);
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
if (typeof min === 'number' && length < min) {
|
|
636
|
+
var name_4 = getNodeTypeName(node[0]);
|
|
637
|
+
throw new LitsError("Wrong number of arguments to \"".concat(name_4, "\", expected at least ").concat(min, ", got ").concat(valueToString(length), "."), node[2]);
|
|
638
|
+
}
|
|
639
|
+
if (typeof max === 'number' && length > max) {
|
|
640
|
+
var name_5 = getNodeTypeName(node[0]);
|
|
641
|
+
throw new LitsError("Wrong number of arguments to \"".concat(name_5, "\", expected at most ").concat(max, ", got ").concat(valueToString(length), "."), node[2]);
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
function isNonUndefined(value) {
|
|
646
|
+
return value !== undefined;
|
|
647
|
+
}
|
|
648
|
+
function asNonUndefined(value, sourceCodeInfo) {
|
|
649
|
+
assertNonUndefined(value, sourceCodeInfo);
|
|
650
|
+
return value;
|
|
651
|
+
}
|
|
652
|
+
function assertNonUndefined(value, sourceCodeInfo) {
|
|
653
|
+
if (!isNonUndefined(value))
|
|
654
|
+
throw new LitsError('Unexpected undefined', getSourceCodeInfo(value, sourceCodeInfo));
|
|
655
|
+
}
|
|
656
|
+
function isUnknownRecord(value) {
|
|
657
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
658
|
+
}
|
|
659
|
+
function assertUnknownRecord(value, sourceCodeInfo) {
|
|
660
|
+
if (!isUnknownRecord(value)) {
|
|
661
|
+
throw new LitsError("Expected ".concat('UnknownRecord', ", got ").concat(valueToString(value), "."), getSourceCodeInfo(value, sourceCodeInfo));
|
|
662
|
+
}
|
|
589
663
|
}
|
|
590
664
|
|
|
591
665
|
function isLitsFunction(value) {
|
|
@@ -597,9 +671,6 @@ function assertLitsFunction(value, sourceCodeInfo) {
|
|
|
597
671
|
if (!isLitsFunction(value))
|
|
598
672
|
throw getAssertionError('LitsFunction', value, sourceCodeInfo);
|
|
599
673
|
}
|
|
600
|
-
function isBuiltinFunction(value) {
|
|
601
|
-
return isUnknownRecord(value) && value.functionType === 'Builtin';
|
|
602
|
-
}
|
|
603
674
|
|
|
604
675
|
function isAny(value) {
|
|
605
676
|
// TODO weak test
|
|
@@ -770,12 +841,6 @@ function clone(value) {
|
|
|
770
841
|
function cloneColl(value) {
|
|
771
842
|
return clone(value);
|
|
772
843
|
}
|
|
773
|
-
function arrayToPairs(arr) {
|
|
774
|
-
var pairs = [];
|
|
775
|
-
for (var i = 0; i < arr.length; i += 2)
|
|
776
|
-
pairs.push([arr[i], arr[i + 1]]);
|
|
777
|
-
return pairs;
|
|
778
|
-
}
|
|
779
844
|
function joinSets() {
|
|
780
845
|
var e_1, _a;
|
|
781
846
|
var results = [];
|
|
@@ -3673,17 +3738,24 @@ Object.values(expressions).forEach(function (normalExpression) {
|
|
|
3673
3738
|
});
|
|
3674
3739
|
});
|
|
3675
3740
|
var normalExpressions = __assign(__assign({}, expressions), aliases);
|
|
3741
|
+
var normalExpressionTypes = {};
|
|
3742
|
+
var allNormalExpressions = [];
|
|
3743
|
+
Object.entries(normalExpressions).forEach(function (_a, index) {
|
|
3744
|
+
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
3745
|
+
normalExpressionTypes[key] = index;
|
|
3746
|
+
allNormalExpressions.push(value);
|
|
3747
|
+
});
|
|
3676
3748
|
|
|
3677
3749
|
var andSpecialExpression = {
|
|
3678
3750
|
paramCount: {},
|
|
3679
3751
|
evaluate: function (node, contextStack, _a) {
|
|
3680
3752
|
var e_1, _b;
|
|
3681
|
-
var
|
|
3753
|
+
var evaluateNode = _a.evaluateNode;
|
|
3682
3754
|
var value = true;
|
|
3683
3755
|
try {
|
|
3684
|
-
for (var _c = __values(node
|
|
3756
|
+
for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
3685
3757
|
var param = _d.value;
|
|
3686
|
-
value =
|
|
3758
|
+
value = evaluateNode(param, contextStack);
|
|
3687
3759
|
if (!value)
|
|
3688
3760
|
break;
|
|
3689
3761
|
}
|
|
@@ -3698,8 +3770,8 @@ var andSpecialExpression = {
|
|
|
3698
3770
|
return value;
|
|
3699
3771
|
},
|
|
3700
3772
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3701
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3702
|
-
return getUndefinedSymbols(node
|
|
3773
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
3774
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
3703
3775
|
},
|
|
3704
3776
|
};
|
|
3705
3777
|
|
|
@@ -3707,28 +3779,29 @@ var condSpecialExpression = {
|
|
|
3707
3779
|
paramCount: { even: true },
|
|
3708
3780
|
evaluate: function (node, contextStack, _a) {
|
|
3709
3781
|
var e_1, _b;
|
|
3710
|
-
var
|
|
3782
|
+
var evaluateNode = _a.evaluateNode;
|
|
3783
|
+
var params = node[1][1];
|
|
3711
3784
|
try {
|
|
3712
|
-
for (var
|
|
3713
|
-
var
|
|
3714
|
-
var value =
|
|
3785
|
+
for (var params_1 = __values(params), params_1_1 = params_1.next(); !params_1_1.done; params_1_1 = params_1.next()) {
|
|
3786
|
+
var _c = __read(params_1_1.value, 2), test = _c[0], form = _c[1];
|
|
3787
|
+
var value = evaluateNode(test, contextStack);
|
|
3715
3788
|
if (!value)
|
|
3716
3789
|
continue;
|
|
3717
|
-
return
|
|
3790
|
+
return evaluateNode(form, contextStack);
|
|
3718
3791
|
}
|
|
3719
3792
|
}
|
|
3720
3793
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
3721
3794
|
finally {
|
|
3722
3795
|
try {
|
|
3723
|
-
if (
|
|
3796
|
+
if (params_1_1 && !params_1_1.done && (_b = params_1.return)) _b.call(params_1);
|
|
3724
3797
|
}
|
|
3725
3798
|
finally { if (e_1) throw e_1.error; }
|
|
3726
3799
|
}
|
|
3727
3800
|
return null;
|
|
3728
3801
|
},
|
|
3729
3802
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3730
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3731
|
-
return getUndefinedSymbols(node.
|
|
3803
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
3804
|
+
return getUndefinedSymbols(node[1][1].flat(), contextStack, builtin, evaluateNode);
|
|
3732
3805
|
},
|
|
3733
3806
|
};
|
|
3734
3807
|
|
|
@@ -3736,66 +3809,101 @@ var switchSpecialExpression = {
|
|
|
3736
3809
|
paramCount: { odd: true },
|
|
3737
3810
|
evaluate: function (node, contextStack, _a) {
|
|
3738
3811
|
var e_1, _b;
|
|
3739
|
-
var
|
|
3740
|
-
var
|
|
3812
|
+
var evaluateNode = _a.evaluateNode;
|
|
3813
|
+
var _c = __read(node[1], 3), switchValueNode = _c[1], cases = _c[2];
|
|
3814
|
+
var switchValue = evaluateNode(switchValueNode, contextStack);
|
|
3741
3815
|
try {
|
|
3742
|
-
for (var
|
|
3743
|
-
var
|
|
3744
|
-
var value =
|
|
3816
|
+
for (var cases_1 = __values(cases), cases_1_1 = cases_1.next(); !cases_1_1.done; cases_1_1 = cases_1.next()) {
|
|
3817
|
+
var _d = __read(cases_1_1.value, 2), test = _d[0], form = _d[1];
|
|
3818
|
+
var value = evaluateNode(test, contextStack);
|
|
3745
3819
|
if (value === switchValue) {
|
|
3746
|
-
return
|
|
3820
|
+
return evaluateNode(form, contextStack);
|
|
3747
3821
|
}
|
|
3748
3822
|
}
|
|
3749
3823
|
}
|
|
3750
3824
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
3751
3825
|
finally {
|
|
3752
3826
|
try {
|
|
3753
|
-
if (
|
|
3827
|
+
if (cases_1_1 && !cases_1_1.done && (_b = cases_1.return)) _b.call(cases_1);
|
|
3754
3828
|
}
|
|
3755
3829
|
finally { if (e_1) throw e_1.error; }
|
|
3756
3830
|
}
|
|
3757
3831
|
return null;
|
|
3758
3832
|
},
|
|
3759
3833
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3760
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3761
|
-
return getUndefinedSymbols(node.
|
|
3834
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
3835
|
+
return getUndefinedSymbols(__spreadArray([node[1][1]], __read(node[1][2].flat()), false), contextStack, builtin, evaluateNode);
|
|
3762
3836
|
},
|
|
3763
3837
|
};
|
|
3764
3838
|
|
|
3765
|
-
var
|
|
3839
|
+
var definedSpecialExpression = {
|
|
3766
3840
|
paramCount: 1,
|
|
3767
3841
|
evaluate: function (node, contextStack) {
|
|
3768
|
-
var
|
|
3842
|
+
var symbolNode = node[1][1];
|
|
3843
|
+
assertSymbolNode(symbolNode);
|
|
3844
|
+
if (!isUserDefinedSymbolNode(symbolNode)) {
|
|
3845
|
+
return true; // If the symbol is not a user defined symbol, it is defined. normal or special builtin
|
|
3846
|
+
}
|
|
3847
|
+
var lookUpResult = contextStack.lookUp(symbolNode);
|
|
3769
3848
|
return lookUpResult !== null;
|
|
3770
3849
|
},
|
|
3771
3850
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3772
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3773
|
-
return getUndefinedSymbols(node
|
|
3851
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
3852
|
+
return getUndefinedSymbols([node[1][1]], contextStack, builtin, evaluateNode);
|
|
3774
3853
|
},
|
|
3775
3854
|
};
|
|
3776
3855
|
|
|
3777
|
-
|
|
3778
|
-
|
|
3779
|
-
|
|
3856
|
+
var bindingTargetTypes = {
|
|
3857
|
+
symbol: 11,
|
|
3858
|
+
rest: 12,
|
|
3859
|
+
object: 13,
|
|
3860
|
+
array: 14,
|
|
3861
|
+
};
|
|
3862
|
+
|
|
3863
|
+
function walkDefaults(bindingTarget, onDefault) {
|
|
3864
|
+
var _a;
|
|
3865
|
+
if (bindingTarget[0] === bindingTargetTypes.object) {
|
|
3866
|
+
Object.values(bindingTarget[1][0]).forEach(function (element) {
|
|
3867
|
+
if (element[1][1]) {
|
|
3868
|
+
onDefault(element[1][1]);
|
|
3869
|
+
}
|
|
3870
|
+
walkDefaults(element, onDefault);
|
|
3871
|
+
});
|
|
3872
|
+
}
|
|
3873
|
+
else if (bindingTarget[0] === bindingTargetTypes.array) {
|
|
3874
|
+
for (var index = 0; index < bindingTarget[1][0].length; index += 1) {
|
|
3875
|
+
var element = (_a = bindingTarget[1][0][index]) !== null && _a !== void 0 ? _a : null;
|
|
3876
|
+
if (element === null) {
|
|
3877
|
+
continue;
|
|
3878
|
+
}
|
|
3879
|
+
if (element[1][1]) {
|
|
3880
|
+
onDefault(element[1][1]);
|
|
3881
|
+
}
|
|
3882
|
+
walkDefaults(element, onDefault);
|
|
3883
|
+
}
|
|
3884
|
+
}
|
|
3885
|
+
}
|
|
3886
|
+
function evalueateBindingNodeValues(target, value, evaluate) {
|
|
3887
|
+
var sourceCodeInfo = target[2];
|
|
3780
3888
|
var record = {};
|
|
3781
3889
|
createRecord(target, value, evaluate, sourceCodeInfo, record);
|
|
3782
3890
|
return record;
|
|
3783
3891
|
}
|
|
3784
3892
|
function createRecord(bindingTarget, value, evaluate, sourceCodeInfo, record) {
|
|
3785
3893
|
var _a, _b;
|
|
3786
|
-
if (bindingTarget
|
|
3894
|
+
if (bindingTarget[0] === bindingTargetTypes.object) {
|
|
3787
3895
|
assertUnknownRecord(value, sourceCodeInfo);
|
|
3788
3896
|
var capturedKeys_1 = new Set();
|
|
3789
3897
|
var restElement_1;
|
|
3790
|
-
Object.entries(bindingTarget
|
|
3898
|
+
Object.entries(bindingTarget[1][0]).forEach(function (_a) {
|
|
3791
3899
|
var _b;
|
|
3792
3900
|
var _c = __read(_a, 2), key = _c[0], element = _c[1];
|
|
3793
|
-
if (element
|
|
3901
|
+
if (element[0] === bindingTargetTypes.rest) {
|
|
3794
3902
|
restElement_1 = element;
|
|
3795
3903
|
return;
|
|
3796
3904
|
}
|
|
3797
3905
|
capturedKeys_1.add(key);
|
|
3798
|
-
var val = (_b = (value[key] !== undefined ? value[key] : element
|
|
3906
|
+
var val = (_b = (value[key] !== undefined ? value[key] : element[1][1] && evaluate(element[1][1]))) !== null && _b !== void 0 ? _b : null;
|
|
3799
3907
|
assertAny(val, sourceCodeInfo);
|
|
3800
3908
|
createRecord(element, val, evaluate, sourceCodeInfo, record);
|
|
3801
3909
|
});
|
|
@@ -3810,33 +3918,36 @@ function createRecord(bindingTarget, value, evaluate, sourceCodeInfo, record) {
|
|
|
3810
3918
|
acc[key] = asAny(val);
|
|
3811
3919
|
return acc;
|
|
3812
3920
|
}, {});
|
|
3813
|
-
record[restElement_1
|
|
3921
|
+
record[restElement_1[1][0]] = restValues;
|
|
3814
3922
|
}
|
|
3815
3923
|
}
|
|
3816
|
-
else if (bindingTarget
|
|
3924
|
+
else if (bindingTarget[0] === bindingTargetTypes.array) {
|
|
3817
3925
|
var restIndex = null;
|
|
3818
3926
|
assertArray(value, sourceCodeInfo);
|
|
3819
|
-
for (var index = 0; index < bindingTarget.
|
|
3820
|
-
var element = (_a = bindingTarget
|
|
3927
|
+
for (var index = 0; index < bindingTarget[1][0].length; index += 1) {
|
|
3928
|
+
var element = (_a = bindingTarget[1][0][index]) !== null && _a !== void 0 ? _a : null;
|
|
3821
3929
|
if (element === null) {
|
|
3822
3930
|
continue;
|
|
3823
3931
|
}
|
|
3824
|
-
if (element
|
|
3932
|
+
if (element[0] === bindingTargetTypes.rest) {
|
|
3825
3933
|
restIndex = index;
|
|
3826
3934
|
break;
|
|
3827
3935
|
}
|
|
3828
|
-
var val = (_b = (value[index] !== undefined ? value[index] : element
|
|
3936
|
+
var val = (_b = (value[index] !== undefined ? value[index] : element[1][1] && evaluate(element[1][1]))) !== null && _b !== void 0 ? _b : null;
|
|
3829
3937
|
assertAny(val, sourceCodeInfo);
|
|
3830
3938
|
createRecord(element, val, evaluate, sourceCodeInfo, record);
|
|
3831
3939
|
}
|
|
3832
3940
|
if (restIndex !== null) {
|
|
3833
3941
|
var restValues = value.slice(restIndex);
|
|
3834
|
-
var restElement = bindingTarget
|
|
3835
|
-
record[restElement
|
|
3942
|
+
var restElement = bindingTarget[1][0][restIndex];
|
|
3943
|
+
record[restElement[1][0]] = restValues;
|
|
3836
3944
|
}
|
|
3837
3945
|
}
|
|
3946
|
+
else if (bindingTarget[0] === bindingTargetTypes.rest) {
|
|
3947
|
+
record[bindingTarget[1][0]] = asAny(value);
|
|
3948
|
+
}
|
|
3838
3949
|
else {
|
|
3839
|
-
record[bindingTarget
|
|
3950
|
+
record[bindingTarget[1][0][1]] = asAny(value);
|
|
3840
3951
|
}
|
|
3841
3952
|
}
|
|
3842
3953
|
function getAllBindingTargetNames(bindingTarget) {
|
|
@@ -3849,9 +3960,9 @@ function getNamesFromBindingTarget(target, names) {
|
|
|
3849
3960
|
if (target === null) {
|
|
3850
3961
|
return;
|
|
3851
3962
|
}
|
|
3852
|
-
if (target
|
|
3963
|
+
if (target[0] === bindingTargetTypes.array) {
|
|
3853
3964
|
try {
|
|
3854
|
-
for (var _c = __values(target
|
|
3965
|
+
for (var _c = __values(target[1][0]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
3855
3966
|
var element = _d.value;
|
|
3856
3967
|
getNamesFromBindingTarget(element, names);
|
|
3857
3968
|
}
|
|
@@ -3864,9 +3975,9 @@ function getNamesFromBindingTarget(target, names) {
|
|
|
3864
3975
|
finally { if (e_1) throw e_1.error; }
|
|
3865
3976
|
}
|
|
3866
3977
|
}
|
|
3867
|
-
else if (target
|
|
3978
|
+
else if (target[0] === bindingTargetTypes.object) {
|
|
3868
3979
|
try {
|
|
3869
|
-
for (var _e = __values(Object.values(target
|
|
3980
|
+
for (var _e = __values(Object.values(target[1][0])), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
3870
3981
|
var element = _f.value;
|
|
3871
3982
|
getNamesFromBindingTarget(element, names);
|
|
3872
3983
|
}
|
|
@@ -3879,27 +3990,42 @@ function getNamesFromBindingTarget(target, names) {
|
|
|
3879
3990
|
finally { if (e_2) throw e_2.error; }
|
|
3880
3991
|
}
|
|
3881
3992
|
}
|
|
3993
|
+
else if (target[0] === bindingTargetTypes.rest) {
|
|
3994
|
+
if (names[target[1][0]]) {
|
|
3995
|
+
throw new LitsError("Duplicate binding name: ".concat(target[1][0]), target[2]);
|
|
3996
|
+
}
|
|
3997
|
+
names[target[1][0]] = true;
|
|
3998
|
+
}
|
|
3882
3999
|
else {
|
|
3883
|
-
if (names[target
|
|
3884
|
-
throw new LitsError("Duplicate binding name: ".concat(target
|
|
4000
|
+
if (names[target[1][0][1]]) {
|
|
4001
|
+
throw new LitsError("Duplicate binding name: ".concat(target[1][0]), target[2]);
|
|
3885
4002
|
}
|
|
3886
|
-
names[target
|
|
4003
|
+
names[target[1][0][1]] = true;
|
|
3887
4004
|
}
|
|
3888
4005
|
}
|
|
3889
4006
|
|
|
3890
4007
|
var defSpecialExpression = {
|
|
3891
4008
|
paramCount: 2,
|
|
3892
4009
|
evaluate: function (node, contextStack, _a) {
|
|
3893
|
-
var
|
|
3894
|
-
var
|
|
3895
|
-
var
|
|
4010
|
+
var evaluateNode = _a.evaluateNode;
|
|
4011
|
+
var bindingNode = node[1][1];
|
|
4012
|
+
var target = bindingNode[1][0];
|
|
4013
|
+
var value = bindingNode[1][1];
|
|
4014
|
+
var bindingValue = evaluateNode(value, contextStack);
|
|
4015
|
+
var values = evalueateBindingNodeValues(target, bindingValue, function (Node) { return evaluateNode(Node, contextStack); });
|
|
3896
4016
|
contextStack.exportValues(values);
|
|
3897
4017
|
return null;
|
|
3898
4018
|
},
|
|
3899
4019
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3900
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3901
|
-
var
|
|
3902
|
-
|
|
4020
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4021
|
+
var bindingNode = node[1][1];
|
|
4022
|
+
var target = bindingNode[1][0];
|
|
4023
|
+
var value = bindingNode[1][1];
|
|
4024
|
+
var bindingResult = getUndefinedSymbols([value], contextStack, builtin, evaluateNode);
|
|
4025
|
+
walkDefaults(target, function (defaultNode) {
|
|
4026
|
+
addToSet(bindingResult, getUndefinedSymbols([defaultNode], contextStack, builtin, evaluateNode));
|
|
4027
|
+
});
|
|
4028
|
+
contextStack.addValues(getAllBindingTargetNames(target));
|
|
3903
4029
|
return bindingResult;
|
|
3904
4030
|
},
|
|
3905
4031
|
};
|
|
@@ -3908,14 +4034,14 @@ var doSpecialExpression = {
|
|
|
3908
4034
|
paramCount: {},
|
|
3909
4035
|
evaluate: function (node, contextStack, _a) {
|
|
3910
4036
|
var e_1, _b;
|
|
3911
|
-
var
|
|
4037
|
+
var evaluateNode = _a.evaluateNode;
|
|
3912
4038
|
var newContext = {};
|
|
3913
4039
|
var newContextStack = contextStack.create(newContext);
|
|
3914
4040
|
var result = null;
|
|
3915
4041
|
try {
|
|
3916
|
-
for (var _c = __values(node
|
|
4042
|
+
for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
3917
4043
|
var form = _d.value;
|
|
3918
|
-
result =
|
|
4044
|
+
result = evaluateNode(form, newContextStack);
|
|
3919
4045
|
}
|
|
3920
4046
|
}
|
|
3921
4047
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
@@ -3928,8 +4054,8 @@ var doSpecialExpression = {
|
|
|
3928
4054
|
return result;
|
|
3929
4055
|
},
|
|
3930
4056
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3931
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3932
|
-
return getUndefinedSymbols(node
|
|
4057
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4058
|
+
return getUndefinedSymbols(node[1][1], contextStack.create({}), builtin, evaluateNode);
|
|
3933
4059
|
},
|
|
3934
4060
|
};
|
|
3935
4061
|
|
|
@@ -3990,7 +4116,8 @@ function isNumberReservedSymbol(symbol) {
|
|
|
3990
4116
|
function assertNameNotDefined(name, contextStack, builtin, sourceCodeInfo) {
|
|
3991
4117
|
if (typeof name !== 'string')
|
|
3992
4118
|
return;
|
|
3993
|
-
|
|
4119
|
+
// TODO only subset of special expressions are necessary to check (CommonSpecialExpressionType)
|
|
4120
|
+
if (specialExpressionTypes[name])
|
|
3994
4121
|
throw new LitsError("Cannot define variable ".concat(name, ", it's a special expression."), sourceCodeInfo);
|
|
3995
4122
|
if (builtin.normalExpressions[name])
|
|
3996
4123
|
throw new LitsError("Cannot define variable ".concat(name, ", it's a builtin function."), sourceCodeInfo);
|
|
@@ -4004,63 +4131,69 @@ var functionSpecialExpression = {
|
|
|
4004
4131
|
paramCount: {},
|
|
4005
4132
|
evaluate: function (node, contextStack, _a) {
|
|
4006
4133
|
var _b, _c;
|
|
4007
|
-
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols,
|
|
4008
|
-
var
|
|
4009
|
-
|
|
4010
|
-
|
|
4134
|
+
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
|
|
4135
|
+
var _d = __read(node[1], 3), functionSymbol = _d[1], fn = _d[2];
|
|
4136
|
+
assertUserDefinedSymbolNode(functionSymbol, node[2]);
|
|
4137
|
+
assertNameNotDefined(functionSymbol[1], contextStack, builtin, node[2]);
|
|
4138
|
+
var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
|
|
4011
4139
|
var litsFunction = (_b = {},
|
|
4012
4140
|
_b[FUNCTION_SYMBOL] = true,
|
|
4013
|
-
_b.sourceCodeInfo = node
|
|
4141
|
+
_b.sourceCodeInfo = node[2],
|
|
4014
4142
|
_b.functionType = 'UserDefined',
|
|
4015
|
-
_b.name =
|
|
4143
|
+
_b.name = functionSymbol[1],
|
|
4016
4144
|
_b.evaluatedfunction = evaluatedFunction,
|
|
4017
4145
|
_b);
|
|
4018
|
-
contextStack.addValues((_c = {}, _c[
|
|
4146
|
+
contextStack.addValues((_c = {}, _c[functionSymbol[1]] = litsFunction, _c));
|
|
4019
4147
|
return null;
|
|
4020
4148
|
},
|
|
4021
4149
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4022
4150
|
var _b, _c;
|
|
4023
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4024
|
-
|
|
4025
|
-
|
|
4026
|
-
|
|
4151
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4152
|
+
var functionName = node[1][1][1];
|
|
4153
|
+
contextStack.addValues((_b = {}, _b[functionName] = true, _b));
|
|
4154
|
+
var newContext = (_c = {}, _c[functionName] = { value: true }, _c);
|
|
4155
|
+
return getFunctionUnresolvedSymbols(node[1][2], contextStack, getUndefinedSymbols, builtin, evaluateNode, newContext);
|
|
4027
4156
|
},
|
|
4028
4157
|
};
|
|
4029
4158
|
var defnSpecialExpression = {
|
|
4030
4159
|
paramCount: {},
|
|
4031
4160
|
evaluate: function (node, contextStack, _a) {
|
|
4032
4161
|
var _b, _c;
|
|
4033
|
-
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols,
|
|
4034
|
-
var
|
|
4035
|
-
|
|
4036
|
-
|
|
4162
|
+
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
|
|
4163
|
+
var _d = __read(node[1], 3), functionSymbol = _d[1], fn = _d[2];
|
|
4164
|
+
assertUserDefinedSymbolNode(functionSymbol, node[2]);
|
|
4165
|
+
assertNameNotDefined(functionSymbol[1], contextStack, builtin, node[2]);
|
|
4166
|
+
var evaluatedFunctionOverloades = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
|
|
4037
4167
|
var litsFunction = (_b = {},
|
|
4038
4168
|
_b[FUNCTION_SYMBOL] = true,
|
|
4039
|
-
_b.sourceCodeInfo = node
|
|
4169
|
+
_b.sourceCodeInfo = node[2],
|
|
4040
4170
|
_b.functionType = 'UserDefined',
|
|
4041
|
-
_b.name =
|
|
4171
|
+
_b.name = functionSymbol[1],
|
|
4042
4172
|
_b.evaluatedfunction = evaluatedFunctionOverloades,
|
|
4043
4173
|
_b);
|
|
4044
|
-
contextStack.exportValues((_c = {}, _c[
|
|
4174
|
+
contextStack.exportValues((_c = {}, _c[functionSymbol[1]] = litsFunction, _c));
|
|
4045
4175
|
return null;
|
|
4046
4176
|
},
|
|
4047
4177
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4048
4178
|
var _b, _c;
|
|
4049
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4050
|
-
|
|
4051
|
-
var
|
|
4052
|
-
|
|
4179
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4180
|
+
var functionName = node[1][1][1];
|
|
4181
|
+
var fn = node[1][2];
|
|
4182
|
+
contextStack.exportValues((_b = {}, _b[functionName] = true, _b));
|
|
4183
|
+
var newContext = (_c = {}, _c[functionName] = { value: true }, _c);
|
|
4184
|
+
return getFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode, newContext);
|
|
4053
4185
|
},
|
|
4054
4186
|
};
|
|
4055
4187
|
var fnSpecialExpression = {
|
|
4056
4188
|
paramCount: {},
|
|
4057
4189
|
evaluate: function (node, contextStack, _a) {
|
|
4058
4190
|
var _b;
|
|
4059
|
-
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols,
|
|
4060
|
-
var
|
|
4191
|
+
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
|
|
4192
|
+
var fn = node[1][1];
|
|
4193
|
+
var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
|
|
4061
4194
|
var litsFunction = (_b = {},
|
|
4062
4195
|
_b[FUNCTION_SYMBOL] = true,
|
|
4063
|
-
_b.sourceCodeInfo = node
|
|
4196
|
+
_b.sourceCodeInfo = node[2],
|
|
4064
4197
|
_b.functionType = 'UserDefined',
|
|
4065
4198
|
_b.name = undefined,
|
|
4066
4199
|
_b.evaluatedfunction = evaluatedFunction,
|
|
@@ -4068,129 +4201,109 @@ var fnSpecialExpression = {
|
|
|
4068
4201
|
return litsFunction;
|
|
4069
4202
|
},
|
|
4070
4203
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4071
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4072
|
-
|
|
4204
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4205
|
+
var fn = node[1][1];
|
|
4206
|
+
return getFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode);
|
|
4073
4207
|
},
|
|
4074
4208
|
};
|
|
4075
|
-
function evaluateFunction(
|
|
4076
|
-
var fn = node.function;
|
|
4209
|
+
function evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode) {
|
|
4077
4210
|
var functionContext = {};
|
|
4078
|
-
var context = fn.
|
|
4211
|
+
var context = fn[0].reduce(function (ctx, arg) {
|
|
4079
4212
|
Object.keys(getAllBindingTargetNames(arg)).forEach(function (name) {
|
|
4080
4213
|
ctx[name] = { value: null };
|
|
4081
4214
|
});
|
|
4082
4215
|
return ctx;
|
|
4083
4216
|
}, {});
|
|
4084
|
-
var undefinedSymbols = getUndefinedSymbols(fn
|
|
4217
|
+
var undefinedSymbols = getUndefinedSymbols(fn[1], contextStack.new(context), builtin, evaluateNode);
|
|
4085
4218
|
undefinedSymbols.forEach(function (name) {
|
|
4086
4219
|
var value = contextStack.getValue(name);
|
|
4087
4220
|
if (isAny(value)) {
|
|
4088
4221
|
functionContext[name] = { value: value };
|
|
4089
4222
|
}
|
|
4090
4223
|
});
|
|
4091
|
-
var evaluatedFunction =
|
|
4092
|
-
|
|
4093
|
-
|
|
4094
|
-
|
|
4095
|
-
|
|
4224
|
+
var evaluatedFunction = [
|
|
4225
|
+
fn[0],
|
|
4226
|
+
fn[1],
|
|
4227
|
+
functionContext,
|
|
4228
|
+
];
|
|
4096
4229
|
return evaluatedFunction;
|
|
4097
4230
|
}
|
|
4098
|
-
function
|
|
4231
|
+
function getFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode, functionNameContext) {
|
|
4099
4232
|
var result = new Set();
|
|
4100
4233
|
var contextStackWithFunctionName = functionNameContext ? contextStack.create(functionNameContext) : contextStack;
|
|
4101
4234
|
var newContext = {};
|
|
4102
|
-
fn.
|
|
4235
|
+
fn[0].forEach(function (arg) {
|
|
4103
4236
|
Object.assign(newContext, getAllBindingTargetNames(arg));
|
|
4237
|
+
walkDefaults(arg, function (defaultNode) {
|
|
4238
|
+
addToSet(result, getUndefinedSymbols([defaultNode], contextStack, builtin, evaluateNode));
|
|
4239
|
+
});
|
|
4104
4240
|
});
|
|
4105
4241
|
var newContextStack = contextStackWithFunctionName.create(newContext);
|
|
4106
|
-
var overloadResult = getUndefinedSymbols(fn
|
|
4242
|
+
var overloadResult = getUndefinedSymbols(fn[1], newContextStack, builtin, evaluateNode);
|
|
4107
4243
|
addToSet(result, overloadResult);
|
|
4108
4244
|
return result;
|
|
4109
4245
|
}
|
|
4110
4246
|
|
|
4111
|
-
function isAstNode(value) {
|
|
4112
|
-
if (value === null || typeof value !== 'object')
|
|
4113
|
-
return false;
|
|
4114
|
-
if (!isAstNodeType(value.type))
|
|
4115
|
-
return false;
|
|
4116
|
-
return true;
|
|
4117
|
-
}
|
|
4118
|
-
function asAstNode(value, sourceCodeInfo) {
|
|
4119
|
-
assertAstNode(value, sourceCodeInfo);
|
|
4120
|
-
return value;
|
|
4121
|
-
}
|
|
4122
|
-
function assertAstNode(value, sourceCodeInfo) {
|
|
4123
|
-
if (!isAstNode(value))
|
|
4124
|
-
throw getAssertionError('AstNode', value, sourceCodeInfo);
|
|
4125
|
-
}
|
|
4126
|
-
function isSymbolNode(value) {
|
|
4127
|
-
if (!isAstNode(value))
|
|
4128
|
-
return false;
|
|
4129
|
-
return value.type === 'Symbol';
|
|
4130
|
-
}
|
|
4131
|
-
function isNormalExpressionNodeWithName(value) {
|
|
4132
|
-
if (!isAstNode(value))
|
|
4133
|
-
return false;
|
|
4134
|
-
return value.type === 'NormalExpression' && typeof value.name === 'string';
|
|
4135
|
-
}
|
|
4136
|
-
|
|
4137
4247
|
var ifSpecialExpression = {
|
|
4138
4248
|
paramCount: { min: 2, max: 3 },
|
|
4139
4249
|
evaluate: function (node, contextStack, _a) {
|
|
4140
|
-
var
|
|
4141
|
-
var
|
|
4142
|
-
|
|
4143
|
-
|
|
4144
|
-
return evaluateAstNode(asAstNode(trueNode, sourceCodeInfo), contextStack);
|
|
4250
|
+
var evaluateNode = _a.evaluateNode;
|
|
4251
|
+
var _b = __read(node[1][1], 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
|
|
4252
|
+
if (evaluateNode(conditionNode, contextStack)) {
|
|
4253
|
+
return evaluateNode(trueNode, contextStack);
|
|
4145
4254
|
}
|
|
4146
|
-
else {
|
|
4147
|
-
|
|
4148
|
-
return evaluateAstNode(asAstNode(falseNode, sourceCodeInfo), contextStack);
|
|
4149
|
-
else
|
|
4150
|
-
return null;
|
|
4255
|
+
else if (falseNode) {
|
|
4256
|
+
return evaluateNode(falseNode, contextStack);
|
|
4151
4257
|
}
|
|
4258
|
+
return null;
|
|
4152
4259
|
},
|
|
4153
4260
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4154
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4155
|
-
return getUndefinedSymbols(node.
|
|
4261
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4262
|
+
return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
|
|
4156
4263
|
},
|
|
4157
4264
|
};
|
|
4158
4265
|
|
|
4159
4266
|
var unlessSpecialExpression = {
|
|
4160
4267
|
paramCount: { min: 2, max: 3 },
|
|
4161
4268
|
evaluate: function (node, contextStack, _a) {
|
|
4162
|
-
var
|
|
4163
|
-
var
|
|
4164
|
-
|
|
4165
|
-
|
|
4166
|
-
return evaluateAstNode(asAstNode(trueNode, sourceCodeInfo), contextStack);
|
|
4269
|
+
var evaluateNode = _a.evaluateNode;
|
|
4270
|
+
var _b = __read(node[1][1], 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
|
|
4271
|
+
if (!evaluateNode(conditionNode, contextStack)) {
|
|
4272
|
+
return evaluateNode(trueNode, contextStack);
|
|
4167
4273
|
}
|
|
4168
|
-
else {
|
|
4169
|
-
|
|
4170
|
-
return evaluateAstNode(asAstNode(falseNode, sourceCodeInfo), contextStack);
|
|
4171
|
-
else
|
|
4172
|
-
return null;
|
|
4274
|
+
else if (falseNode) {
|
|
4275
|
+
return evaluateNode(falseNode, contextStack);
|
|
4173
4276
|
}
|
|
4277
|
+
return null;
|
|
4174
4278
|
},
|
|
4175
4279
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4176
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4177
|
-
return getUndefinedSymbols(node.
|
|
4280
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4281
|
+
return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
|
|
4178
4282
|
},
|
|
4179
4283
|
};
|
|
4180
4284
|
|
|
4181
4285
|
var letSpecialExpression = {
|
|
4182
4286
|
paramCount: 0,
|
|
4183
4287
|
evaluate: function (node, contextStack, _a) {
|
|
4184
|
-
var
|
|
4185
|
-
var
|
|
4186
|
-
var
|
|
4288
|
+
var evaluateNode = _a.evaluateNode;
|
|
4289
|
+
var bindingNode = node[1][1];
|
|
4290
|
+
var target = bindingNode[1][0];
|
|
4291
|
+
var value = bindingNode[1][1];
|
|
4292
|
+
var bindingValue = evaluateNode(value, contextStack);
|
|
4293
|
+
var values = evalueateBindingNodeValues(target, bindingValue, function (Node) { return evaluateNode(Node, contextStack); });
|
|
4187
4294
|
contextStack.addValues(values);
|
|
4188
4295
|
return null;
|
|
4189
4296
|
},
|
|
4190
4297
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4191
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4192
|
-
var
|
|
4193
|
-
|
|
4298
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4299
|
+
var bindingNode = node[1][1];
|
|
4300
|
+
var target = bindingNode[1][0];
|
|
4301
|
+
var value = bindingNode[1][1];
|
|
4302
|
+
var bindingResult = getUndefinedSymbols([value], contextStack, builtin, evaluateNode);
|
|
4303
|
+
walkDefaults(target, function (defaultNode) {
|
|
4304
|
+
addToSet(bindingResult, getUndefinedSymbols([defaultNode], contextStack, builtin, evaluateNode));
|
|
4305
|
+
});
|
|
4306
|
+
contextStack.addValues(getAllBindingTargetNames(target));
|
|
4194
4307
|
return bindingResult;
|
|
4195
4308
|
},
|
|
4196
4309
|
};
|
|
@@ -4198,11 +4311,11 @@ var letSpecialExpression = {
|
|
|
4198
4311
|
var loopSpecialExpression = {
|
|
4199
4312
|
paramCount: {},
|
|
4200
4313
|
evaluate: function (node, contextStack, _a) {
|
|
4201
|
-
var
|
|
4202
|
-
var
|
|
4203
|
-
var bindingContext =
|
|
4204
|
-
var val =
|
|
4205
|
-
var valueRecord = evalueateBindingNodeValues(
|
|
4314
|
+
var evaluateNode = _a.evaluateNode;
|
|
4315
|
+
var bindingNodes = node[1][1];
|
|
4316
|
+
var bindingContext = bindingNodes.reduce(function (result, bindingNode) {
|
|
4317
|
+
var val = evaluateNode(bindingNode[1][1], contextStack.create(result));
|
|
4318
|
+
var valueRecord = evalueateBindingNodeValues(bindingNode[1][0], val, function (Node) { return evaluateNode(Node, contextStack); });
|
|
4206
4319
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4207
4320
|
var _b = __read(_a, 2), name = _b[0], value = _b[1];
|
|
4208
4321
|
result[name] = { value: value };
|
|
@@ -4210,20 +4323,21 @@ var loopSpecialExpression = {
|
|
|
4210
4323
|
return result;
|
|
4211
4324
|
}, {});
|
|
4212
4325
|
var newContextStack = contextStack.create(bindingContext);
|
|
4326
|
+
var body = node[1][2];
|
|
4213
4327
|
var _loop_1 = function () {
|
|
4214
4328
|
var e_1, _b;
|
|
4215
4329
|
var result = null;
|
|
4216
4330
|
try {
|
|
4217
4331
|
try {
|
|
4218
|
-
for (var
|
|
4219
|
-
var form =
|
|
4220
|
-
result =
|
|
4332
|
+
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()) {
|
|
4333
|
+
var form = body_1_1.value;
|
|
4334
|
+
result = evaluateNode(form, newContextStack);
|
|
4221
4335
|
}
|
|
4222
4336
|
}
|
|
4223
4337
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
4224
4338
|
finally {
|
|
4225
4339
|
try {
|
|
4226
|
-
if (
|
|
4340
|
+
if (body_1_1 && !body_1_1.done && (_b = body_1.return)) _b.call(body_1);
|
|
4227
4341
|
}
|
|
4228
4342
|
finally { if (e_1) throw e_1.error; }
|
|
4229
4343
|
}
|
|
@@ -4231,16 +4345,16 @@ var loopSpecialExpression = {
|
|
|
4231
4345
|
catch (error) {
|
|
4232
4346
|
if (error instanceof RecurSignal) {
|
|
4233
4347
|
var params_1 = error.params;
|
|
4234
|
-
if (params_1.length !==
|
|
4235
|
-
throw new LitsError("recur expected ".concat(
|
|
4348
|
+
if (params_1.length !== bindingNodes.length) {
|
|
4349
|
+
throw new LitsError("recur expected ".concat(bindingNodes.length, " parameters, got ").concat(valueToString(params_1.length)), node[2]);
|
|
4236
4350
|
}
|
|
4237
|
-
|
|
4351
|
+
bindingNodes.forEach(function (bindingNode, index) {
|
|
4238
4352
|
var e_2, _a;
|
|
4239
|
-
var valueRecord = evalueateBindingNodeValues(
|
|
4353
|
+
var valueRecord = evalueateBindingNodeValues(bindingNode[1][0], asAny(params_1[index]), function (Node) { return evaluateNode(Node, contextStack); });
|
|
4240
4354
|
try {
|
|
4241
4355
|
for (var _b = (e_2 = void 0, __values(Object.entries(valueRecord))), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
4242
4356
|
var _d = __read(_c.value, 2), name_1 = _d[0], value = _d[1];
|
|
4243
|
-
|
|
4357
|
+
bindingContext[name_1].value = value;
|
|
4244
4358
|
}
|
|
4245
4359
|
}
|
|
4246
4360
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
@@ -4264,29 +4378,31 @@ var loopSpecialExpression = {
|
|
|
4264
4378
|
}
|
|
4265
4379
|
},
|
|
4266
4380
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4267
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4268
|
-
var
|
|
4381
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4382
|
+
var bindingNodes = node[1][1];
|
|
4383
|
+
var newContext = bindingNodes
|
|
4269
4384
|
.reduce(function (context, bindingNode) {
|
|
4270
|
-
var names = getAllBindingTargetNames(bindingNode
|
|
4385
|
+
var names = getAllBindingTargetNames(bindingNode[1][0]);
|
|
4271
4386
|
Object.keys(names).forEach(function (name) {
|
|
4272
4387
|
context[name] = { value: true };
|
|
4273
4388
|
});
|
|
4274
4389
|
return context;
|
|
4275
4390
|
}, {});
|
|
4276
|
-
var bindingValueNodes =
|
|
4277
|
-
var bindingsResult = getUndefinedSymbols(bindingValueNodes, contextStack, builtin,
|
|
4278
|
-
var paramsResult = getUndefinedSymbols(node
|
|
4391
|
+
var bindingValueNodes = bindingNodes.map(function (bindingNode) { return bindingNode[1][1]; });
|
|
4392
|
+
var bindingsResult = getUndefinedSymbols(bindingValueNodes, contextStack, builtin, evaluateNode);
|
|
4393
|
+
var paramsResult = getUndefinedSymbols(node[1][2], contextStack.create(newContext), builtin, evaluateNode);
|
|
4279
4394
|
return joinSets(bindingsResult, paramsResult);
|
|
4280
4395
|
},
|
|
4281
4396
|
};
|
|
4282
4397
|
|
|
4283
|
-
function addToContext(bindings, context, contextStack,
|
|
4398
|
+
function addToContext(bindings, context, contextStack, evaluateNode) {
|
|
4284
4399
|
var e_1, _a;
|
|
4285
4400
|
try {
|
|
4286
4401
|
for (var bindings_1 = __values(bindings), bindings_1_1 = bindings_1.next(); !bindings_1_1.done; bindings_1_1 = bindings_1.next()) {
|
|
4287
|
-
var
|
|
4288
|
-
var
|
|
4289
|
-
var
|
|
4402
|
+
var bindingNode = bindings_1_1.value;
|
|
4403
|
+
var _b = __read(bindingNode[1], 2), target = _b[0], bindingValue = _b[1];
|
|
4404
|
+
var val = evaluateNode(bindingValue, contextStack);
|
|
4405
|
+
var valueRecord = evalueateBindingNodeValues(target, val, function (Node) { return evaluateNode(Node, contextStack); });
|
|
4290
4406
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4291
4407
|
var _b = __read(_a, 2), name = _b[0], value = _b[1];
|
|
4292
4408
|
context[name] = { value: value };
|
|
@@ -4301,9 +4417,9 @@ function addToContext(bindings, context, contextStack, evaluateAstNode) {
|
|
|
4301
4417
|
finally { if (e_1) throw e_1.error; }
|
|
4302
4418
|
}
|
|
4303
4419
|
}
|
|
4304
|
-
function evaluateLoop(returnResult,
|
|
4305
|
-
var sourceCodeInfo =
|
|
4306
|
-
var _a =
|
|
4420
|
+
function evaluateLoop(returnResult, loopNode, contextStack, evaluateNode) {
|
|
4421
|
+
var sourceCodeInfo = loopNode[2];
|
|
4422
|
+
var _a = __read(loopNode[1], 3), loopBindings = _a[1], body = _a[2];
|
|
4307
4423
|
var result = [];
|
|
4308
4424
|
var bindingIndices = loopBindings.map(function () { return 0; });
|
|
4309
4425
|
var abort = false;
|
|
@@ -4313,8 +4429,9 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
|
|
|
4313
4429
|
var newContextStack = contextStack.create(context);
|
|
4314
4430
|
var skip = false;
|
|
4315
4431
|
bindingsLoop: for (var bindingIndex = 0; bindingIndex < loopBindings.length; bindingIndex += 1) {
|
|
4316
|
-
var _c =
|
|
4317
|
-
var
|
|
4432
|
+
var _c = __read(loopBindings[bindingIndex], 4), bindingNode = _c[0], letBindings = _c[1], whenNode = _c[2], whileNode = _c[3];
|
|
4433
|
+
var _d = __read(bindingNode[1], 2), targetNode = _d[0], valueNode = _d[1];
|
|
4434
|
+
var coll = asColl(evaluateNode(valueNode, newContextStack), sourceCodeInfo);
|
|
4318
4435
|
var seq = isSeq(coll) ? coll : Object.entries(coll);
|
|
4319
4436
|
if (seq.length === 0) {
|
|
4320
4437
|
skip = true;
|
|
@@ -4333,45 +4450,40 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
|
|
|
4333
4450
|
break;
|
|
4334
4451
|
}
|
|
4335
4452
|
var val = asAny(seq[index], sourceCodeInfo);
|
|
4336
|
-
var valueRecord = evalueateBindingNodeValues(
|
|
4453
|
+
var valueRecord = evalueateBindingNodeValues(targetNode, val, function (Node) { return evaluateNode(Node, newContextStack); });
|
|
4337
4454
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4338
4455
|
var _b = __read(_a, 2), name = _b[0], value = _b[1];
|
|
4339
4456
|
context[name] = { value: value };
|
|
4340
4457
|
});
|
|
4458
|
+
if (letBindings) {
|
|
4459
|
+
addToContext(letBindings, context, newContextStack, evaluateNode);
|
|
4460
|
+
}
|
|
4461
|
+
if (whenNode && !evaluateNode(whenNode, newContextStack)) {
|
|
4462
|
+
bindingIndices[bindingIndex] = asNonUndefined(bindingIndices[bindingIndex], sourceCodeInfo) + 1;
|
|
4463
|
+
skip = true;
|
|
4464
|
+
break bindingsLoop;
|
|
4465
|
+
}
|
|
4466
|
+
if (whileNode && !evaluateNode(whileNode, newContextStack)) {
|
|
4467
|
+
bindingIndices[bindingIndex] = Number.POSITIVE_INFINITY;
|
|
4468
|
+
skip = true;
|
|
4469
|
+
break bindingsLoop;
|
|
4470
|
+
}
|
|
4471
|
+
}
|
|
4472
|
+
if (!skip) {
|
|
4473
|
+
var value = null;
|
|
4341
4474
|
try {
|
|
4342
|
-
for (var
|
|
4343
|
-
var
|
|
4344
|
-
|
|
4345
|
-
case '&let':
|
|
4346
|
-
addToContext(asNonUndefined(letBindings, sourceCodeInfo), context, newContextStack, evaluateAstNode);
|
|
4347
|
-
break;
|
|
4348
|
-
case '&when':
|
|
4349
|
-
if (!evaluateAstNode(asAstNode(whenNode, sourceCodeInfo), newContextStack)) {
|
|
4350
|
-
bindingIndices[bindingIndex] = asNonUndefined(bindingIndices[bindingIndex], sourceCodeInfo) + 1;
|
|
4351
|
-
skip = true;
|
|
4352
|
-
break bindingsLoop;
|
|
4353
|
-
}
|
|
4354
|
-
break;
|
|
4355
|
-
case '&while':
|
|
4356
|
-
if (!evaluateAstNode(asAstNode(whileNode, sourceCodeInfo), newContextStack)) {
|
|
4357
|
-
bindingIndices[bindingIndex] = Number.POSITIVE_INFINITY;
|
|
4358
|
-
skip = true;
|
|
4359
|
-
break bindingsLoop;
|
|
4360
|
-
}
|
|
4361
|
-
break;
|
|
4362
|
-
}
|
|
4475
|
+
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()) {
|
|
4476
|
+
var form = body_1_1.value;
|
|
4477
|
+
value = evaluateNode(form, newContextStack);
|
|
4363
4478
|
}
|
|
4364
4479
|
}
|
|
4365
4480
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
4366
4481
|
finally {
|
|
4367
4482
|
try {
|
|
4368
|
-
if (
|
|
4483
|
+
if (body_1_1 && !body_1_1.done && (_b = body_1.return)) _b.call(body_1);
|
|
4369
4484
|
}
|
|
4370
4485
|
finally { if (e_2) throw e_2.error; }
|
|
4371
4486
|
}
|
|
4372
|
-
}
|
|
4373
|
-
if (!skip) {
|
|
4374
|
-
var value = evaluateAstNode(params[0], newContextStack);
|
|
4375
4487
|
if (returnResult)
|
|
4376
4488
|
result.push(value);
|
|
4377
4489
|
if (bindingIndices.length > 0)
|
|
@@ -4383,57 +4495,59 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
|
|
|
4383
4495
|
}
|
|
4384
4496
|
return returnResult ? result : null;
|
|
4385
4497
|
}
|
|
4386
|
-
function analyze(
|
|
4498
|
+
function analyze(loopNode, contextStack, getUndefinedSymbols, builtin, evaluateNode) {
|
|
4387
4499
|
var result = new Set();
|
|
4388
4500
|
var newContext = {};
|
|
4389
|
-
var loopBindings =
|
|
4390
|
-
loopBindings.forEach(function (
|
|
4391
|
-
var
|
|
4392
|
-
|
|
4501
|
+
var _a = __read(loopNode[1], 3), loopBindings = _a[1], body = _a[2];
|
|
4502
|
+
loopBindings.forEach(function (loopBindingNode) {
|
|
4503
|
+
var _a = __read(loopBindingNode, 4), bindingNode = _a[0], letBindings = _a[1], whenNode = _a[2], whileNode = _a[3];
|
|
4504
|
+
var _b = __read(bindingNode[1], 2), target = _b[0], value = _b[1];
|
|
4505
|
+
getUndefinedSymbols([value], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4393
4506
|
return result.add(symbol);
|
|
4394
4507
|
});
|
|
4395
|
-
Object.assign(newContext, getAllBindingTargetNames(
|
|
4508
|
+
Object.assign(newContext, getAllBindingTargetNames(target));
|
|
4396
4509
|
if (letBindings) {
|
|
4397
|
-
letBindings.forEach(function (
|
|
4398
|
-
|
|
4510
|
+
letBindings.forEach(function (letBindingNode) {
|
|
4511
|
+
var _a = __read(letBindingNode[1], 2), letTarget = _a[0], letValue = _a[1];
|
|
4512
|
+
getUndefinedSymbols([letValue], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4399
4513
|
return result.add(symbol);
|
|
4400
4514
|
});
|
|
4401
|
-
Object.assign(newContext, getAllBindingTargetNames(
|
|
4515
|
+
Object.assign(newContext, getAllBindingTargetNames(letTarget));
|
|
4402
4516
|
});
|
|
4403
4517
|
}
|
|
4404
4518
|
if (whenNode) {
|
|
4405
|
-
getUndefinedSymbols([whenNode], contextStack.create(newContext), builtin,
|
|
4519
|
+
getUndefinedSymbols([whenNode], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4406
4520
|
return result.add(symbol);
|
|
4407
4521
|
});
|
|
4408
4522
|
}
|
|
4409
4523
|
if (whileNode) {
|
|
4410
|
-
getUndefinedSymbols([whileNode], contextStack.create(newContext), builtin,
|
|
4524
|
+
getUndefinedSymbols([whileNode], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4411
4525
|
return result.add(symbol);
|
|
4412
4526
|
});
|
|
4413
4527
|
}
|
|
4414
4528
|
});
|
|
4415
|
-
getUndefinedSymbols(
|
|
4529
|
+
getUndefinedSymbols(body, contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4416
4530
|
return result.add(symbol);
|
|
4417
4531
|
});
|
|
4418
4532
|
return result;
|
|
4419
4533
|
}
|
|
4420
4534
|
var forSpecialExpression = {
|
|
4421
4535
|
paramCount: 1,
|
|
4422
|
-
evaluate: function (node, contextStack, helpers) { return evaluateLoop(true, node, contextStack, helpers.
|
|
4536
|
+
evaluate: function (node, contextStack, helpers) { return evaluateLoop(true, node, contextStack, helpers.evaluateNode); },
|
|
4423
4537
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4424
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4425
|
-
return analyze(node, contextStack, getUndefinedSymbols, builtin,
|
|
4538
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4539
|
+
return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateNode);
|
|
4426
4540
|
},
|
|
4427
4541
|
};
|
|
4428
4542
|
var doseqSpecialExpression = {
|
|
4429
4543
|
paramCount: 1,
|
|
4430
4544
|
evaluate: function (node, contextStack, helpers) {
|
|
4431
|
-
evaluateLoop(false, node, contextStack, helpers.
|
|
4545
|
+
evaluateLoop(false, node, contextStack, helpers.evaluateNode);
|
|
4432
4546
|
return null;
|
|
4433
4547
|
},
|
|
4434
4548
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4435
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4436
|
-
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);
|
|
4437
4551
|
},
|
|
4438
4552
|
};
|
|
4439
4553
|
|
|
@@ -4441,12 +4555,12 @@ var orSpecialExpression = {
|
|
|
4441
4555
|
paramCount: {},
|
|
4442
4556
|
evaluate: function (node, contextStack, _a) {
|
|
4443
4557
|
var e_1, _b;
|
|
4444
|
-
var
|
|
4558
|
+
var evaluateNode = _a.evaluateNode;
|
|
4445
4559
|
var value = false;
|
|
4446
4560
|
try {
|
|
4447
|
-
for (var _c = __values(node
|
|
4561
|
+
for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
4448
4562
|
var param = _d.value;
|
|
4449
|
-
value =
|
|
4563
|
+
value = evaluateNode(param, contextStack);
|
|
4450
4564
|
if (value)
|
|
4451
4565
|
break;
|
|
4452
4566
|
}
|
|
@@ -4461,55 +4575,55 @@ var orSpecialExpression = {
|
|
|
4461
4575
|
return value;
|
|
4462
4576
|
},
|
|
4463
4577
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4464
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4465
|
-
return getUndefinedSymbols(node
|
|
4578
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4579
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
4466
4580
|
},
|
|
4467
4581
|
};
|
|
4468
4582
|
|
|
4469
4583
|
var qqSpecialExpression = {
|
|
4470
4584
|
paramCount: { min: 1, max: 2 },
|
|
4471
4585
|
evaluate: function (node, contextStack, _a) {
|
|
4472
|
-
var
|
|
4473
|
-
var _b = __read(node
|
|
4474
|
-
if (
|
|
4475
|
-
|
|
4476
|
-
return secondNode ? evaluateAstNode(secondNode, contextStack) : null;
|
|
4586
|
+
var evaluateNode = _a.evaluateNode;
|
|
4587
|
+
var _b = __read(node[1][1], 2), firstNode = _b[0], secondNode = _b[1];
|
|
4588
|
+
if (isUserDefinedSymbolNode(firstNode) && contextStack.lookUp(firstNode) === null) {
|
|
4589
|
+
return secondNode ? evaluateNode(secondNode, contextStack) : null;
|
|
4477
4590
|
}
|
|
4478
|
-
assertAny(firstNode, node
|
|
4479
|
-
var firstResult =
|
|
4480
|
-
return firstResult !== null && firstResult !== void 0 ? firstResult : (secondNode ?
|
|
4591
|
+
assertAny(firstNode, node[2]);
|
|
4592
|
+
var firstResult = evaluateNode(firstNode, contextStack);
|
|
4593
|
+
return firstResult !== null && firstResult !== void 0 ? firstResult : (secondNode ? evaluateNode(secondNode, contextStack) : null);
|
|
4481
4594
|
},
|
|
4482
4595
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4483
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4484
|
-
return getUndefinedSymbols(node.
|
|
4596
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4597
|
+
return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
|
|
4485
4598
|
},
|
|
4486
4599
|
};
|
|
4487
4600
|
|
|
4488
4601
|
var recurSpecialExpression = {
|
|
4489
4602
|
paramCount: {},
|
|
4490
4603
|
evaluate: function (node, contextStack, _a) {
|
|
4491
|
-
var
|
|
4492
|
-
var params = node
|
|
4493
|
-
|
|
4604
|
+
var evaluateNode = _a.evaluateNode;
|
|
4605
|
+
var params = node[1][1];
|
|
4606
|
+
var evaluatedParams = params.map(function (paramNode) { return evaluateNode(paramNode, contextStack); });
|
|
4607
|
+
throw new RecurSignal(evaluatedParams);
|
|
4494
4608
|
},
|
|
4495
4609
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4496
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4497
|
-
return getUndefinedSymbols(node
|
|
4610
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4611
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
4498
4612
|
},
|
|
4499
4613
|
};
|
|
4500
4614
|
|
|
4501
4615
|
var throwSpecialExpression = {
|
|
4502
4616
|
paramCount: 1,
|
|
4503
4617
|
evaluate: function (node, contextStack, _a) {
|
|
4504
|
-
var
|
|
4505
|
-
var message = asString(
|
|
4618
|
+
var evaluateNode = _a.evaluateNode;
|
|
4619
|
+
var message = asString(evaluateNode(node[1][1], contextStack), node[2], {
|
|
4506
4620
|
nonEmpty: true,
|
|
4507
4621
|
});
|
|
4508
|
-
throw new UserDefinedError(message, node
|
|
4622
|
+
throw new UserDefinedError(message, node[2]);
|
|
4509
4623
|
},
|
|
4510
4624
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4511
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4512
|
-
return getUndefinedSymbols(node
|
|
4625
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4626
|
+
return getUndefinedSymbols([node[1][1]], contextStack, builtin, evaluateNode);
|
|
4513
4627
|
},
|
|
4514
4628
|
};
|
|
4515
4629
|
|
|
@@ -4517,29 +4631,29 @@ var trySpecialExpression = {
|
|
|
4517
4631
|
paramCount: 1,
|
|
4518
4632
|
evaluate: function (node, contextStack, _a) {
|
|
4519
4633
|
var _b;
|
|
4520
|
-
var
|
|
4521
|
-
var
|
|
4634
|
+
var evaluateNode = _a.evaluateNode;
|
|
4635
|
+
var _c = __read(node[1], 4), tryExpression = _c[1], errorSymbol = _c[2], catchExpression = _c[3];
|
|
4522
4636
|
try {
|
|
4523
|
-
return
|
|
4637
|
+
return evaluateNode(tryExpression, contextStack);
|
|
4524
4638
|
}
|
|
4525
4639
|
catch (error) {
|
|
4526
|
-
var newContext =
|
|
4640
|
+
var newContext = errorSymbol
|
|
4527
4641
|
? (_b = {},
|
|
4528
|
-
_b[
|
|
4642
|
+
_b[errorSymbol[1]] = { value: error },
|
|
4529
4643
|
_b) : {};
|
|
4530
|
-
return
|
|
4644
|
+
return evaluateNode(catchExpression, contextStack.create(newContext));
|
|
4531
4645
|
}
|
|
4532
4646
|
},
|
|
4533
4647
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4534
4648
|
var _b;
|
|
4535
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4536
|
-
var
|
|
4537
|
-
var tryResult = getUndefinedSymbols(
|
|
4538
|
-
var newContext =
|
|
4649
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4650
|
+
var _c = __read(node[1], 4), tryExpression = _c[1], errorSymbol = _c[2], catchExpression = _c[3];
|
|
4651
|
+
var tryResult = getUndefinedSymbols([tryExpression], contextStack, builtin, evaluateNode);
|
|
4652
|
+
var newContext = errorSymbol
|
|
4539
4653
|
? (_b = {},
|
|
4540
|
-
_b[
|
|
4654
|
+
_b[errorSymbol[1]] = { value: true },
|
|
4541
4655
|
_b) : {};
|
|
4542
|
-
var catchResult = getUndefinedSymbols([catchExpression], contextStack.create(newContext), builtin,
|
|
4656
|
+
var catchResult = getUndefinedSymbols([catchExpression], contextStack.create(newContext), builtin, evaluateNode);
|
|
4543
4657
|
return joinSets(tryResult, catchResult);
|
|
4544
4658
|
},
|
|
4545
4659
|
};
|
|
@@ -4548,20 +4662,20 @@ var arraySpecialExpression = {
|
|
|
4548
4662
|
paramCount: {},
|
|
4549
4663
|
evaluate: function (node, contextStack, _a) {
|
|
4550
4664
|
var e_1, _b;
|
|
4551
|
-
var
|
|
4665
|
+
var evaluateNode = _a.evaluateNode;
|
|
4552
4666
|
var result = [];
|
|
4553
4667
|
try {
|
|
4554
|
-
for (var _c = __values(node
|
|
4668
|
+
for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
4555
4669
|
var param = _d.value;
|
|
4556
|
-
if (param
|
|
4557
|
-
var spreadValue =
|
|
4670
|
+
if (isSpreadNode(param)) {
|
|
4671
|
+
var spreadValue = evaluateNode(param[1], contextStack);
|
|
4558
4672
|
if (!Array.isArray(spreadValue)) {
|
|
4559
|
-
throw new LitsError('Spread value is not an array', param
|
|
4673
|
+
throw new LitsError('Spread value is not an array', param[2]);
|
|
4560
4674
|
}
|
|
4561
4675
|
result.push.apply(result, __spreadArray([], __read(spreadValue), false));
|
|
4562
4676
|
}
|
|
4563
4677
|
else {
|
|
4564
|
-
result.push(
|
|
4678
|
+
result.push(evaluateNode(param, contextStack));
|
|
4565
4679
|
}
|
|
4566
4680
|
}
|
|
4567
4681
|
}
|
|
@@ -4575,76 +4689,79 @@ var arraySpecialExpression = {
|
|
|
4575
4689
|
return result;
|
|
4576
4690
|
},
|
|
4577
4691
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4578
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4579
|
-
return getUndefinedSymbols(node
|
|
4692
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4693
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
4580
4694
|
},
|
|
4581
4695
|
};
|
|
4582
4696
|
|
|
4583
4697
|
var objectSpecialExpression = {
|
|
4584
4698
|
paramCount: {},
|
|
4585
4699
|
evaluate: function (node, contextStack, _a) {
|
|
4586
|
-
var
|
|
4700
|
+
var evaluateNode = _a.evaluateNode;
|
|
4587
4701
|
var result = {};
|
|
4588
|
-
|
|
4589
|
-
|
|
4590
|
-
|
|
4591
|
-
|
|
4702
|
+
var params = node[1][1];
|
|
4703
|
+
for (var i = 0; i < params.length; i += 2) {
|
|
4704
|
+
var keyNode = params[i];
|
|
4705
|
+
if (isSpreadNode(keyNode)) {
|
|
4706
|
+
var spreadObject = evaluateNode(keyNode[1], contextStack);
|
|
4592
4707
|
if (!isUnknownRecord(spreadObject)) {
|
|
4593
|
-
throw new LitsError('Spread value is not an object', keyNode
|
|
4708
|
+
throw new LitsError('Spread value is not an object', keyNode[2]);
|
|
4594
4709
|
}
|
|
4595
4710
|
Object.assign(result, spreadObject);
|
|
4596
4711
|
i -= 1;
|
|
4597
4712
|
}
|
|
4598
4713
|
else {
|
|
4599
|
-
var key =
|
|
4600
|
-
var value =
|
|
4601
|
-
assertString(key, keyNode
|
|
4714
|
+
var key = evaluateNode(keyNode, contextStack);
|
|
4715
|
+
var value = evaluateNode(params[i + 1], contextStack);
|
|
4716
|
+
assertString(key, keyNode[2]);
|
|
4602
4717
|
result[key] = value;
|
|
4603
4718
|
}
|
|
4604
4719
|
}
|
|
4605
4720
|
return result;
|
|
4606
4721
|
},
|
|
4607
4722
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4608
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4609
|
-
return getUndefinedSymbols(node
|
|
4723
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4724
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
4610
4725
|
},
|
|
4611
4726
|
};
|
|
4612
4727
|
|
|
4613
|
-
var specialExpressions =
|
|
4614
|
-
|
|
4615
|
-
|
|
4616
|
-
|
|
4617
|
-
|
|
4618
|
-
|
|
4619
|
-
|
|
4620
|
-
|
|
4621
|
-
|
|
4622
|
-
|
|
4623
|
-
|
|
4624
|
-
|
|
4625
|
-
|
|
4626
|
-
|
|
4627
|
-
|
|
4628
|
-
|
|
4629
|
-
|
|
4630
|
-
|
|
4631
|
-
|
|
4632
|
-
|
|
4633
|
-
|
|
4634
|
-
|
|
4635
|
-
|
|
4636
|
-
|
|
4728
|
+
var specialExpressions = [
|
|
4729
|
+
qqSpecialExpression,
|
|
4730
|
+
andSpecialExpression,
|
|
4731
|
+
orSpecialExpression,
|
|
4732
|
+
arraySpecialExpression,
|
|
4733
|
+
condSpecialExpression,
|
|
4734
|
+
defSpecialExpression,
|
|
4735
|
+
definedSpecialExpression,
|
|
4736
|
+
defnSpecialExpression,
|
|
4737
|
+
doSpecialExpression,
|
|
4738
|
+
doseqSpecialExpression,
|
|
4739
|
+
fnSpecialExpression,
|
|
4740
|
+
forSpecialExpression,
|
|
4741
|
+
functionSpecialExpression,
|
|
4742
|
+
ifSpecialExpression,
|
|
4743
|
+
letSpecialExpression,
|
|
4744
|
+
loopSpecialExpression,
|
|
4745
|
+
objectSpecialExpression,
|
|
4746
|
+
recurSpecialExpression,
|
|
4747
|
+
switchSpecialExpression,
|
|
4748
|
+
throwSpecialExpression,
|
|
4749
|
+
trySpecialExpression,
|
|
4750
|
+
unlessSpecialExpression,
|
|
4751
|
+
];
|
|
4637
4752
|
var builtin = {
|
|
4638
4753
|
normalExpressions: normalExpressions,
|
|
4639
4754
|
specialExpressions: specialExpressions,
|
|
4755
|
+
allNormalExpressions: allNormalExpressions,
|
|
4640
4756
|
};
|
|
4641
4757
|
var normalExpressionKeys = Object.keys(normalExpressions);
|
|
4642
|
-
var specialExpressionKeys = Object.keys(
|
|
4758
|
+
var specialExpressionKeys = Object.keys(specialExpressionTypes);
|
|
4759
|
+
new Set(specialExpressionKeys);
|
|
4643
4760
|
|
|
4644
4761
|
function checkParams(evaluatedFunction, nbrOfParams, sourceCodeInfo) {
|
|
4645
|
-
var hasRest = evaluatedFunction.
|
|
4646
|
-
var minArity = evaluatedFunction.
|
|
4647
|
-
var maxArity = hasRest ? Number.MAX_SAFE_INTEGER : evaluatedFunction.
|
|
4762
|
+
var hasRest = evaluatedFunction[0].some(function (arg) { return arg[0] === bindingTargetTypes.rest; });
|
|
4763
|
+
var minArity = evaluatedFunction[0].filter(function (arg) { return arg[0] !== bindingTargetTypes.rest && arg[1][1] === undefined; }).length;
|
|
4764
|
+
var maxArity = hasRest ? Number.MAX_SAFE_INTEGER : evaluatedFunction[0].length;
|
|
4648
4765
|
if (nbrOfParams < minArity || nbrOfParams > maxArity) {
|
|
4649
4766
|
throw new LitsError("Unexpected number of arguments, got ".concat(valueToString(nbrOfParams), "."), sourceCodeInfo);
|
|
4650
4767
|
}
|
|
@@ -4668,21 +4785,21 @@ var functionExecutors = {
|
|
|
4668
4785
|
}
|
|
4669
4786
|
},
|
|
4670
4787
|
UserDefined: function (fn, params, sourceCodeInfo, contextStack, _a) {
|
|
4671
|
-
var
|
|
4788
|
+
var evaluateNode = _a.evaluateNode;
|
|
4672
4789
|
var _loop_1 = function () {
|
|
4673
4790
|
var e_1, _b;
|
|
4674
4791
|
checkParams(fn.evaluatedfunction, params.length, sourceCodeInfo);
|
|
4675
4792
|
var evaluatedFunction = fn.evaluatedfunction;
|
|
4676
|
-
var args = evaluatedFunction
|
|
4677
|
-
var nbrOfNonRestArgs = args.filter(function (arg) { return arg
|
|
4678
|
-
var newContextStack = contextStack.create(fn.evaluatedfunction
|
|
4793
|
+
var args = evaluatedFunction[0];
|
|
4794
|
+
var nbrOfNonRestArgs = args.filter(function (arg) { return arg[0] !== bindingTargetTypes.rest; }).length;
|
|
4795
|
+
var newContextStack = contextStack.create(fn.evaluatedfunction[2]);
|
|
4679
4796
|
var newContext = {};
|
|
4680
4797
|
var rest = [];
|
|
4681
4798
|
for (var i = 0; i < params.length; i += 1) {
|
|
4682
4799
|
if (i < nbrOfNonRestArgs) {
|
|
4683
4800
|
var param = toAny(params[i]);
|
|
4684
|
-
var valueRecord = evalueateBindingNodeValues(args[i], param, function (
|
|
4685
|
-
return
|
|
4801
|
+
var valueRecord = evalueateBindingNodeValues(args[i], param, function (Node) {
|
|
4802
|
+
return evaluateNode(Node, newContextStack.create(newContext));
|
|
4686
4803
|
});
|
|
4687
4804
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4688
4805
|
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
@@ -4695,18 +4812,18 @@ var functionExecutors = {
|
|
|
4695
4812
|
}
|
|
4696
4813
|
for (var i = params.length; i < nbrOfNonRestArgs; i++) {
|
|
4697
4814
|
var arg = args[i];
|
|
4698
|
-
var defaultValue =
|
|
4699
|
-
var valueRecord = evalueateBindingNodeValues(arg, defaultValue, function (
|
|
4700
|
-
return
|
|
4815
|
+
var defaultValue = evaluateNode(arg[1][1], contextStack.create(newContext));
|
|
4816
|
+
var valueRecord = evalueateBindingNodeValues(arg, defaultValue, function (Node) {
|
|
4817
|
+
return evaluateNode(Node, contextStack.create(newContext));
|
|
4701
4818
|
});
|
|
4702
4819
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4703
4820
|
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
4704
4821
|
newContext[key] = { value: value };
|
|
4705
4822
|
});
|
|
4706
4823
|
}
|
|
4707
|
-
var restArgument = args.find(function (arg) { return arg
|
|
4824
|
+
var restArgument = args.find(function (arg) { return arg[0] === bindingTargetTypes.rest; });
|
|
4708
4825
|
if (restArgument !== undefined) {
|
|
4709
|
-
var valueRecord = evalueateBindingNodeValues(restArgument, rest, function (
|
|
4826
|
+
var valueRecord = evalueateBindingNodeValues(restArgument, rest, function (Node) { return evaluateNode(Node, contextStack.create(newContext)); });
|
|
4710
4827
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4711
4828
|
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
4712
4829
|
newContext[key] = { value: value };
|
|
@@ -4716,9 +4833,9 @@ var functionExecutors = {
|
|
|
4716
4833
|
var result = null;
|
|
4717
4834
|
var newContextStack2 = newContextStack.create(newContext);
|
|
4718
4835
|
try {
|
|
4719
|
-
for (var _c = (e_1 = void 0, __values(evaluatedFunction
|
|
4836
|
+
for (var _c = (e_1 = void 0, __values(evaluatedFunction[1])), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
4720
4837
|
var node = _d.value;
|
|
4721
|
-
result =
|
|
4838
|
+
result = evaluateNode(node, newContextStack2);
|
|
4722
4839
|
}
|
|
4723
4840
|
}
|
|
4724
4841
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
@@ -4842,7 +4959,7 @@ var functionExecutors = {
|
|
|
4842
4959
|
},
|
|
4843
4960
|
Builtin: function (fn, params, sourceCodeInfo, contextStack, _a) {
|
|
4844
4961
|
var executeFunction = _a.executeFunction;
|
|
4845
|
-
var normalExpression = asNonUndefined(
|
|
4962
|
+
var normalExpression = asNonUndefined(allNormalExpressions[fn.normalBuitinSymbolType], sourceCodeInfo);
|
|
4846
4963
|
return normalExpression.evaluate(params, sourceCodeInfo, contextStack, { executeFunction: executeFunction });
|
|
4847
4964
|
},
|
|
4848
4965
|
};
|
|
@@ -4853,7 +4970,7 @@ function evaluate(ast, contextStack) {
|
|
|
4853
4970
|
try {
|
|
4854
4971
|
for (var _b = __values(ast.body), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
4855
4972
|
var node = _c.value;
|
|
4856
|
-
result =
|
|
4973
|
+
result = evaluateNode(node, contextStack);
|
|
4857
4974
|
}
|
|
4858
4975
|
}
|
|
4859
4976
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
@@ -4865,53 +4982,66 @@ function evaluate(ast, contextStack) {
|
|
|
4865
4982
|
}
|
|
4866
4983
|
return result;
|
|
4867
4984
|
}
|
|
4868
|
-
function
|
|
4869
|
-
switch (node
|
|
4870
|
-
case
|
|
4985
|
+
function evaluateNode(node, contextStack) {
|
|
4986
|
+
switch (node[0]) {
|
|
4987
|
+
case NodeTypes.Number:
|
|
4871
4988
|
return evaluateNumber(node);
|
|
4872
|
-
case
|
|
4989
|
+
case NodeTypes.String:
|
|
4873
4990
|
return evaluateString(node);
|
|
4874
|
-
case
|
|
4875
|
-
|
|
4876
|
-
case
|
|
4877
|
-
return
|
|
4878
|
-
case
|
|
4991
|
+
case NodeTypes.NormalBuiltinSymbol:
|
|
4992
|
+
case NodeTypes.SpecialBuiltinSymbol:
|
|
4993
|
+
case NodeTypes.UserDefinedSymbol:
|
|
4994
|
+
return contextStack.evaluateSymbol(node);
|
|
4995
|
+
case NodeTypes.ReservedSymbol:
|
|
4996
|
+
return evaluateReservedSymbol(node);
|
|
4997
|
+
case NodeTypes.NormalExpression:
|
|
4879
4998
|
return evaluateNormalExpression(node, contextStack);
|
|
4880
|
-
case
|
|
4999
|
+
case NodeTypes.SpecialExpression:
|
|
4881
5000
|
return evaluateSpecialExpression(node, contextStack);
|
|
4882
5001
|
/* v8 ignore next 2 */
|
|
4883
5002
|
default:
|
|
4884
|
-
throw new LitsError("".concat(node
|
|
5003
|
+
throw new LitsError("".concat(getNodeTypeName(node[0]), "-node cannot be evaluated"), node[2]);
|
|
4885
5004
|
}
|
|
4886
5005
|
}
|
|
4887
5006
|
function evaluateNumber(node) {
|
|
4888
|
-
return node
|
|
5007
|
+
return node[1];
|
|
4889
5008
|
}
|
|
4890
5009
|
function evaluateString(node) {
|
|
4891
|
-
return node
|
|
5010
|
+
return node[1];
|
|
4892
5011
|
}
|
|
4893
|
-
function
|
|
4894
|
-
var reservedName = node
|
|
5012
|
+
function evaluateReservedSymbol(node) {
|
|
5013
|
+
var reservedName = node[1];
|
|
4895
5014
|
var value = reservedSymbolRecord[reservedName];
|
|
4896
|
-
return asNonUndefined(value, node
|
|
5015
|
+
return asNonUndefined(value, node[2]);
|
|
4897
5016
|
}
|
|
4898
5017
|
function evaluateNormalExpression(node, contextStack) {
|
|
4899
|
-
var
|
|
4900
|
-
var
|
|
5018
|
+
var sourceCodeInfo = node[2];
|
|
5019
|
+
var paramNodes = node[1][1];
|
|
5020
|
+
var params = paramNodes.map(function (paramNode) { return evaluateNode(paramNode, contextStack); });
|
|
4901
5021
|
if (isNormalExpressionNodeWithName(node)) {
|
|
4902
|
-
var
|
|
4903
|
-
if (
|
|
4904
|
-
|
|
4905
|
-
|
|
5022
|
+
var nameSymbol = node[1][0];
|
|
5023
|
+
if (isNormalBuiltinSymbolNode(nameSymbol)) {
|
|
5024
|
+
var type = nameSymbol[1];
|
|
5025
|
+
var normalExpression = builtin.allNormalExpressions[type];
|
|
5026
|
+
return normalExpression.evaluate(params, node[2], contextStack, { executeFunction: executeFunction });
|
|
5027
|
+
}
|
|
5028
|
+
else {
|
|
5029
|
+
var fn = contextStack.getValue(nameSymbol[1]);
|
|
5030
|
+
if (fn !== undefined) {
|
|
5031
|
+
return executeFunction(asAny(fn), params, contextStack, sourceCodeInfo);
|
|
5032
|
+
}
|
|
5033
|
+
throw new UndefinedSymbolError(nameSymbol[1], node[2]);
|
|
5034
|
+
}
|
|
4906
5035
|
}
|
|
4907
5036
|
else {
|
|
4908
|
-
var
|
|
4909
|
-
|
|
5037
|
+
var fnNode = node[1][0];
|
|
5038
|
+
var fn = evaluateNode(fnNode, contextStack);
|
|
5039
|
+
return executeFunction(fn, params, contextStack, sourceCodeInfo);
|
|
4910
5040
|
}
|
|
4911
5041
|
}
|
|
4912
5042
|
function executeFunction(fn, params, contextStack, sourceCodeInfo) {
|
|
4913
5043
|
if (isLitsFunction(fn))
|
|
4914
|
-
return functionExecutors[fn.functionType](fn, params, sourceCodeInfo, contextStack, {
|
|
5044
|
+
return functionExecutors[fn.functionType](fn, params, sourceCodeInfo, contextStack, { evaluateNode: evaluateNode, executeFunction: executeFunction });
|
|
4915
5045
|
if (Array.isArray(fn))
|
|
4916
5046
|
return evaluateArrayAsFunction(fn, params, sourceCodeInfo);
|
|
4917
5047
|
if (isObj(fn))
|
|
@@ -4922,16 +5052,11 @@ function executeFunction(fn, params, contextStack, sourceCodeInfo) {
|
|
|
4922
5052
|
return evaluateNumberAsFunction(fn, params, sourceCodeInfo);
|
|
4923
5053
|
throw new NotAFunctionError(fn, sourceCodeInfo);
|
|
4924
5054
|
}
|
|
4925
|
-
function evaluateBuiltinNormalExpression(node, params, contextStack) {
|
|
4926
|
-
var normalExpression = builtin.normalExpressions[node.name];
|
|
4927
|
-
if (!normalExpression)
|
|
4928
|
-
throw new UndefinedSymbolError(node.name, node.sourceCodeInfo);
|
|
4929
|
-
return normalExpression.evaluate(params, node.sourceCodeInfo, contextStack, { executeFunction: executeFunction });
|
|
4930
|
-
}
|
|
4931
5055
|
function evaluateSpecialExpression(node, contextStack) {
|
|
4932
|
-
var
|
|
4933
|
-
|
|
4934
|
-
|
|
5056
|
+
var specialExpressionType = node[1][0];
|
|
5057
|
+
var specialExpression = asNonUndefined(builtin.specialExpressions[specialExpressionType], node[2]);
|
|
5058
|
+
var castedEvaluate = specialExpression.evaluate;
|
|
5059
|
+
return castedEvaluate(node, contextStack, { evaluateNode: evaluateNode, builtin: builtin, getUndefinedSymbols: getUndefinedSymbols });
|
|
4935
5060
|
}
|
|
4936
5061
|
function evalueateObjectAsFunction(fn, params, sourceCodeInfo) {
|
|
4937
5062
|
if (params.length !== 1)
|
|
@@ -5073,13 +5198,13 @@ var ContextStackImpl = /** @class */ (function () {
|
|
|
5073
5198
|
return (_d = this.values) === null || _d === void 0 ? void 0 : _d[name];
|
|
5074
5199
|
};
|
|
5075
5200
|
ContextStackImpl.prototype.lookUp = function (node) {
|
|
5076
|
-
var e_4, _a
|
|
5077
|
-
var _c, _d
|
|
5078
|
-
var value = node
|
|
5079
|
-
var sourceCodeInfo = node.sourceCodeInfo;
|
|
5201
|
+
var e_4, _a;
|
|
5202
|
+
var _b, _c, _d;
|
|
5203
|
+
var value = node[1];
|
|
5080
5204
|
try {
|
|
5081
|
-
|
|
5082
|
-
|
|
5205
|
+
// const sourceCodeInfo = node[2]
|
|
5206
|
+
for (var _e = __values(this.contexts), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
5207
|
+
var context = _f.value;
|
|
5083
5208
|
var contextEntry = context[value];
|
|
5084
5209
|
if (contextEntry)
|
|
5085
5210
|
return contextEntry;
|
|
@@ -5088,32 +5213,23 @@ var ContextStackImpl = /** @class */ (function () {
|
|
|
5088
5213
|
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
5089
5214
|
finally {
|
|
5090
5215
|
try {
|
|
5091
|
-
if (
|
|
5216
|
+
if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
|
|
5092
5217
|
}
|
|
5093
5218
|
finally { if (e_4) throw e_4.error; }
|
|
5094
5219
|
}
|
|
5095
|
-
var lazyHostValue = (
|
|
5220
|
+
var lazyHostValue = (_b = this.lazyValues) === null || _b === void 0 ? void 0 : _b[value];
|
|
5096
5221
|
if (lazyHostValue !== undefined) {
|
|
5097
5222
|
return {
|
|
5098
5223
|
value: toAny(lazyHostValue.read()),
|
|
5099
5224
|
};
|
|
5100
5225
|
}
|
|
5101
|
-
var hostValue = (
|
|
5226
|
+
var hostValue = (_c = this.values) === null || _c === void 0 ? void 0 : _c[value];
|
|
5102
5227
|
if (hostValue !== undefined) {
|
|
5103
5228
|
return {
|
|
5104
5229
|
value: toAny(hostValue),
|
|
5105
5230
|
};
|
|
5106
5231
|
}
|
|
5107
|
-
|
|
5108
|
-
var builtinFunction = (_b = {},
|
|
5109
|
-
_b[FUNCTION_SYMBOL] = true,
|
|
5110
|
-
_b.sourceCodeInfo = sourceCodeInfo,
|
|
5111
|
-
_b.functionType = 'Builtin',
|
|
5112
|
-
_b.n = value,
|
|
5113
|
-
_b);
|
|
5114
|
-
return builtinFunction;
|
|
5115
|
-
}
|
|
5116
|
-
var nativeJsFunction = (_e = this.nativeJsFunctions) === null || _e === void 0 ? void 0 : _e[value];
|
|
5232
|
+
var nativeJsFunction = (_d = this.nativeJsFunctions) === null || _d === void 0 ? void 0 : _d[value];
|
|
5117
5233
|
if (nativeJsFunction) {
|
|
5118
5234
|
return {
|
|
5119
5235
|
value: nativeJsFunction,
|
|
@@ -5121,13 +5237,24 @@ var ContextStackImpl = /** @class */ (function () {
|
|
|
5121
5237
|
}
|
|
5122
5238
|
return null;
|
|
5123
5239
|
};
|
|
5124
|
-
ContextStackImpl.prototype.
|
|
5240
|
+
ContextStackImpl.prototype.evaluateSymbol = function (node) {
|
|
5241
|
+
var _a;
|
|
5242
|
+
if (isSpecialBuiltinSymbolNode(node)) {
|
|
5243
|
+
throw new Error('Special builtin symbols should not be evaluated');
|
|
5244
|
+
}
|
|
5245
|
+
if (isNormalBuiltinSymbolNode(node)) {
|
|
5246
|
+
var type = node[1];
|
|
5247
|
+
return _a = {},
|
|
5248
|
+
_a[FUNCTION_SYMBOL] = true,
|
|
5249
|
+
_a.functionType = 'Builtin',
|
|
5250
|
+
_a.normalBuitinSymbolType = type,
|
|
5251
|
+
_a.sourceCodeInfo = node[2],
|
|
5252
|
+
_a;
|
|
5253
|
+
}
|
|
5125
5254
|
var lookUpResult = this.lookUp(node);
|
|
5126
5255
|
if (isContextEntry(lookUpResult))
|
|
5127
5256
|
return lookUpResult.value;
|
|
5128
|
-
|
|
5129
|
-
return lookUpResult;
|
|
5130
|
-
throw new UndefinedSymbolError(node.value, node.sourceCodeInfo);
|
|
5257
|
+
throw new UndefinedSymbolError(node[1], node[2]);
|
|
5131
5258
|
};
|
|
5132
5259
|
return ContextStackImpl;
|
|
5133
5260
|
}());
|
|
@@ -5210,10 +5337,10 @@ var nonFunctionOperators = [
|
|
|
5210
5337
|
'cond',
|
|
5211
5338
|
'def',
|
|
5212
5339
|
'defined?',
|
|
5213
|
-
'defn',
|
|
5340
|
+
// 'defn',
|
|
5214
5341
|
'do',
|
|
5215
5342
|
'doseq',
|
|
5216
|
-
'fn',
|
|
5343
|
+
// 'fn',
|
|
5217
5344
|
'if',
|
|
5218
5345
|
'let',
|
|
5219
5346
|
'loop',
|
|
@@ -5662,6 +5789,10 @@ function assertReservedSymbolToken(token, symbolName) {
|
|
|
5662
5789
|
throwUnexpectedToken('ReservedSymbol', symbolName, token);
|
|
5663
5790
|
}
|
|
5664
5791
|
}
|
|
5792
|
+
function asReservedSymbolToken(token, symbolName) {
|
|
5793
|
+
assertReservedSymbolToken(token, symbolName);
|
|
5794
|
+
return token;
|
|
5795
|
+
}
|
|
5665
5796
|
function isSingleLineCommentToken(token) {
|
|
5666
5797
|
return (token === null || token === void 0 ? void 0 : token[0]) === 'SingleLineComment';
|
|
5667
5798
|
}
|
|
@@ -5744,6 +5875,9 @@ function assertRBraceToken(token) {
|
|
|
5744
5875
|
throwUnexpectedToken('RBrace', undefined, token);
|
|
5745
5876
|
}
|
|
5746
5877
|
}
|
|
5878
|
+
function isStringToken(token) {
|
|
5879
|
+
return (token === null || token === void 0 ? void 0 : token[0]) === 'String';
|
|
5880
|
+
}
|
|
5747
5881
|
function isA_BinaryOperatorToken(token) {
|
|
5748
5882
|
return (token === null || token === void 0 ? void 0 : token[0]) === 'Operator' && isBinaryOperator(token[1]);
|
|
5749
5883
|
}
|
|
@@ -5781,6 +5915,12 @@ function untokenize(tokenStream) {
|
|
|
5781
5915
|
var exponentiationPrecedence = 10;
|
|
5782
5916
|
var binaryFunctionalOperatorPrecedence = 1;
|
|
5783
5917
|
var placeholderRegexp = /^\$([1-9]\d?)?$/;
|
|
5918
|
+
function withSourceCodeInfo(node, sourceCodeInfo) {
|
|
5919
|
+
if (sourceCodeInfo) {
|
|
5920
|
+
node[2] = sourceCodeInfo;
|
|
5921
|
+
}
|
|
5922
|
+
return node;
|
|
5923
|
+
}
|
|
5784
5924
|
function getPrecedence(operatorSign) {
|
|
5785
5925
|
switch (operatorSign) {
|
|
5786
5926
|
case '**': // exponentiation
|
|
@@ -5823,29 +5963,18 @@ function getPrecedence(operatorSign) {
|
|
|
5823
5963
|
throw new Error("Unknown binary operator: ".concat(operatorSign));
|
|
5824
5964
|
}
|
|
5825
5965
|
}
|
|
5826
|
-
function createNamedNormalExpressionNode(
|
|
5827
|
-
var node =
|
|
5828
|
-
|
|
5829
|
-
|
|
5830
|
-
params: params,
|
|
5831
|
-
sourceCodeInfo: sourceCodeInfo,
|
|
5832
|
-
};
|
|
5833
|
-
var builtinExpression = builtin.normalExpressions[node.name];
|
|
5834
|
-
if (builtinExpression) {
|
|
5835
|
-
assertNumberOfParams(builtinExpression.paramCount, node);
|
|
5966
|
+
function createNamedNormalExpressionNode(symbolNode, params, sourceCodeInfo) {
|
|
5967
|
+
var node = withSourceCodeInfo([NodeTypes.NormalExpression, [symbolNode, params]], sourceCodeInfo);
|
|
5968
|
+
if (isNormalBuiltinSymbolNode(symbolNode)) {
|
|
5969
|
+
assertNumberOfParams(allNormalExpressions[symbolNode[1]].paramCount, node);
|
|
5836
5970
|
}
|
|
5837
5971
|
return node;
|
|
5838
5972
|
}
|
|
5839
5973
|
function createAccessorNode(left, right, sourceCodeInfo) {
|
|
5840
5974
|
// Unnamed normal expression
|
|
5841
|
-
return
|
|
5842
|
-
type: 'NormalExpression',
|
|
5843
|
-
params: [left, right],
|
|
5844
|
-
name: undefined,
|
|
5845
|
-
sourceCodeInfo: sourceCodeInfo,
|
|
5846
|
-
};
|
|
5975
|
+
return withSourceCodeInfo([NodeTypes.NormalExpression, [left, [right]]], sourceCodeInfo);
|
|
5847
5976
|
}
|
|
5848
|
-
function
|
|
5977
|
+
function fromBinaryOperatorToNode(operator, symbolNode, left, right, sourceCodeInfo) {
|
|
5849
5978
|
var operatorName = operator[1];
|
|
5850
5979
|
switch (operatorName) {
|
|
5851
5980
|
case '**': // exponentiation
|
|
@@ -5870,16 +5999,11 @@ function fromBinaryOperatorToAstNode(operator, left, right, sourceCodeInfo) {
|
|
|
5870
5999
|
case '&':
|
|
5871
6000
|
case '^':
|
|
5872
6001
|
case '|':
|
|
5873
|
-
return createNamedNormalExpressionNode(
|
|
6002
|
+
return createNamedNormalExpressionNode(symbolNode, [left, right], sourceCodeInfo);
|
|
5874
6003
|
case '&&':
|
|
5875
6004
|
case '||':
|
|
5876
6005
|
case '??':
|
|
5877
|
-
return
|
|
5878
|
-
type: 'SpecialExpression',
|
|
5879
|
-
name: operatorName,
|
|
5880
|
-
params: [left, right],
|
|
5881
|
-
sourceCodeInfo: sourceCodeInfo,
|
|
5882
|
-
};
|
|
6006
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes[operatorName], [left, right]]], sourceCodeInfo);
|
|
5883
6007
|
/* v8 ignore next 10 */
|
|
5884
6008
|
case '.':
|
|
5885
6009
|
case ';':
|
|
@@ -5975,9 +6099,12 @@ var Parser = /** @class */ (function () {
|
|
|
5975
6099
|
&& !(newPrecedece === exponentiationPrecedence && precedence === exponentiationPrecedence)) {
|
|
5976
6100
|
break;
|
|
5977
6101
|
}
|
|
6102
|
+
var symbol = specialExpressionTypes[name_1]
|
|
6103
|
+
? withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[name_1]], operator[2])
|
|
6104
|
+
: withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[name_1]], operator[2]);
|
|
5978
6105
|
this.advance();
|
|
5979
6106
|
var right = this.parseExpression(newPrecedece);
|
|
5980
|
-
left =
|
|
6107
|
+
left = fromBinaryOperatorToNode(operator, symbol, left, right, operator[2]);
|
|
5981
6108
|
}
|
|
5982
6109
|
else if (isSymbolToken(operator)) {
|
|
5983
6110
|
if (!isFunctionOperator(operator[1])) {
|
|
@@ -5987,9 +6114,12 @@ var Parser = /** @class */ (function () {
|
|
|
5987
6114
|
if (newPrecedece <= precedence) {
|
|
5988
6115
|
break;
|
|
5989
6116
|
}
|
|
5990
|
-
this.
|
|
6117
|
+
var operatorSymbol = this.parseSymbol();
|
|
5991
6118
|
var right = this.parseExpression(newPrecedece);
|
|
5992
|
-
|
|
6119
|
+
if (isSpecialBuiltinSymbolNode(operatorSymbol)) {
|
|
6120
|
+
throw new LitsError('Special expressions are not allowed in binary functional operators', operatorSymbol[2]);
|
|
6121
|
+
}
|
|
6122
|
+
left = createNamedNormalExpressionNode(operatorSymbol, [left, right], operator[2]);
|
|
5993
6123
|
}
|
|
5994
6124
|
else {
|
|
5995
6125
|
break;
|
|
@@ -6008,11 +6138,7 @@ var Parser = /** @class */ (function () {
|
|
|
6008
6138
|
if (!isSymbolToken(symbolToken)) {
|
|
6009
6139
|
throw new LitsError('Expected symbol', this.peek()[2]);
|
|
6010
6140
|
}
|
|
6011
|
-
var stringNode =
|
|
6012
|
-
type: 'String',
|
|
6013
|
-
value: symbolToken[1],
|
|
6014
|
-
sourceCodeInfo: symbolToken[2],
|
|
6015
|
-
};
|
|
6141
|
+
var stringNode = withSourceCodeInfo([NodeTypes.String, symbolToken[1]], symbolToken[2]);
|
|
6016
6142
|
operand = createAccessorNode(operand, stringNode, token[2]);
|
|
6017
6143
|
this.advance();
|
|
6018
6144
|
token = this.peek();
|
|
@@ -6052,16 +6178,14 @@ var Parser = /** @class */ (function () {
|
|
|
6052
6178
|
this.advance();
|
|
6053
6179
|
return expression;
|
|
6054
6180
|
}
|
|
6055
|
-
// Unary operators
|
|
6056
6181
|
else if (isOperatorToken(token)) {
|
|
6057
6182
|
var operatorName = token[1];
|
|
6058
6183
|
if (isBinaryOperator(operatorName)) {
|
|
6059
6184
|
this.advance();
|
|
6060
|
-
|
|
6061
|
-
|
|
6062
|
-
|
|
6063
|
-
|
|
6064
|
-
};
|
|
6185
|
+
if (specialExpressionTypes[operatorName] !== undefined) {
|
|
6186
|
+
return withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[operatorName]], token[2]);
|
|
6187
|
+
}
|
|
6188
|
+
return withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[operatorName]], token[2]);
|
|
6065
6189
|
}
|
|
6066
6190
|
if (operatorName === '->') {
|
|
6067
6191
|
return this.parseShorthandLamdaFunction();
|
|
@@ -6109,22 +6233,24 @@ var Parser = /** @class */ (function () {
|
|
|
6109
6233
|
while (!this.isAtEnd() && !isRBraceToken(this.peek())) {
|
|
6110
6234
|
if (isOperatorToken(this.peek(), '...')) {
|
|
6111
6235
|
this.advance();
|
|
6112
|
-
params.push(
|
|
6113
|
-
type: 'Spread',
|
|
6114
|
-
value: this.parseExpression(),
|
|
6115
|
-
sourceCodeInfo: this.peek()[2],
|
|
6116
|
-
});
|
|
6236
|
+
params.push(withSourceCodeInfo([NodeTypes.Spread, this.parseExpression()], this.peek()[2]));
|
|
6117
6237
|
}
|
|
6118
6238
|
else {
|
|
6119
|
-
var
|
|
6120
|
-
if (
|
|
6239
|
+
var token = this.peek();
|
|
6240
|
+
if (isStringToken(token)) {
|
|
6241
|
+
var stringNode = this.parseString();
|
|
6242
|
+
params.push(withSourceCodeInfo([NodeTypes.String, stringNode[1]], token[2]));
|
|
6243
|
+
}
|
|
6244
|
+
else if (isSymbolToken(token)) {
|
|
6245
|
+
var value = token[1].startsWith('\'')
|
|
6246
|
+
? this.stringFromQuotedSymbol(token[1])
|
|
6247
|
+
: token[1];
|
|
6248
|
+
params.push(withSourceCodeInfo([NodeTypes.String, value], token[2]));
|
|
6249
|
+
this.advance();
|
|
6250
|
+
}
|
|
6251
|
+
else {
|
|
6121
6252
|
throw new LitsError('Expected key to be a symbol or a string', this.peek()[2]);
|
|
6122
6253
|
}
|
|
6123
|
-
params.push({
|
|
6124
|
-
type: 'String',
|
|
6125
|
-
value: key.value,
|
|
6126
|
-
sourceCodeInfo: key.sourceCodeInfo,
|
|
6127
|
-
});
|
|
6128
6254
|
assertOperatorToken(this.peek(), ':=');
|
|
6129
6255
|
this.advance();
|
|
6130
6256
|
params.push(this.parseExpression());
|
|
@@ -6139,12 +6265,7 @@ var Parser = /** @class */ (function () {
|
|
|
6139
6265
|
}
|
|
6140
6266
|
assertRBraceToken(this.peek());
|
|
6141
6267
|
this.advance();
|
|
6142
|
-
return
|
|
6143
|
-
type: 'SpecialExpression',
|
|
6144
|
-
name: 'object',
|
|
6145
|
-
params: params,
|
|
6146
|
-
sourceCodeInfo: firstToken[2],
|
|
6147
|
-
};
|
|
6268
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.object, params]], firstToken[2]);
|
|
6148
6269
|
};
|
|
6149
6270
|
Parser.prototype.parseArray = function () {
|
|
6150
6271
|
var firstToken = asLBracketToken(this.peek());
|
|
@@ -6153,11 +6274,7 @@ var Parser = /** @class */ (function () {
|
|
|
6153
6274
|
while (!this.isAtEnd() && !isRBracketToken(this.peek())) {
|
|
6154
6275
|
if (isOperatorToken(this.peek(), '...')) {
|
|
6155
6276
|
this.advance();
|
|
6156
|
-
params.push(
|
|
6157
|
-
type: 'Spread',
|
|
6158
|
-
value: this.parseExpression(),
|
|
6159
|
-
sourceCodeInfo: this.peek()[2],
|
|
6160
|
-
});
|
|
6277
|
+
params.push(withSourceCodeInfo([NodeTypes.Spread, this.parseExpression()], this.peek()[2]));
|
|
6161
6278
|
}
|
|
6162
6279
|
else {
|
|
6163
6280
|
params.push(this.parseExpression());
|
|
@@ -6172,15 +6289,9 @@ var Parser = /** @class */ (function () {
|
|
|
6172
6289
|
}
|
|
6173
6290
|
assertRBracketToken(this.peek());
|
|
6174
6291
|
this.advance();
|
|
6175
|
-
return
|
|
6176
|
-
type: 'SpecialExpression',
|
|
6177
|
-
name: 'array',
|
|
6178
|
-
params: params,
|
|
6179
|
-
sourceCodeInfo: firstToken[2],
|
|
6180
|
-
};
|
|
6292
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.array, params]], firstToken[2]);
|
|
6181
6293
|
};
|
|
6182
6294
|
Parser.prototype.parseFunctionCall = function (symbol) {
|
|
6183
|
-
var isNamedFunction = symbol.type === 'Symbol';
|
|
6184
6295
|
this.advance();
|
|
6185
6296
|
var params = [];
|
|
6186
6297
|
while (!this.isAtEnd() && !isRParenToken(this.peek())) {
|
|
@@ -6197,45 +6308,57 @@ var Parser = /** @class */ (function () {
|
|
|
6197
6308
|
throw new LitsError('Expected closing parenthesis', this.peek()[2]);
|
|
6198
6309
|
}
|
|
6199
6310
|
this.advance();
|
|
6200
|
-
if (
|
|
6201
|
-
|
|
6202
|
-
|
|
6203
|
-
|
|
6204
|
-
|
|
6205
|
-
|
|
6206
|
-
|
|
6207
|
-
|
|
6208
|
-
|
|
6209
|
-
|
|
6210
|
-
|
|
6211
|
-
|
|
6212
|
-
|
|
6213
|
-
|
|
6214
|
-
|
|
6215
|
-
|
|
6216
|
-
|
|
6217
|
-
};
|
|
6218
|
-
assertNumberOfParams(builtin.specialExpressions[node.name].paramCount, node);
|
|
6219
|
-
return node;
|
|
6311
|
+
if (isSpecialBuiltinSymbolNode(symbol)) { // Named function
|
|
6312
|
+
var specialExpressionType = symbol[1];
|
|
6313
|
+
var type = specialExpressionType;
|
|
6314
|
+
switch (type) {
|
|
6315
|
+
case specialExpressionTypes['||']:
|
|
6316
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6317
|
+
case specialExpressionTypes['&&']:
|
|
6318
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6319
|
+
case specialExpressionTypes.recur:
|
|
6320
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6321
|
+
case specialExpressionTypes.array:
|
|
6322
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6323
|
+
case specialExpressionTypes.object:
|
|
6324
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6325
|
+
case specialExpressionTypes['??']: {
|
|
6326
|
+
if (params.length === 1) {
|
|
6327
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, [params[0], undefined]]], symbol[2]);
|
|
6220
6328
|
}
|
|
6221
|
-
|
|
6222
|
-
|
|
6223
|
-
|
|
6224
|
-
|
|
6225
|
-
/* v8 ignore next 2 */
|
|
6226
|
-
default:
|
|
6227
|
-
throw new Error("Unknown special expression: ".concat(name_2));
|
|
6329
|
+
if (params.length === 2) {
|
|
6330
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, [params[0], params[1]]]], symbol[2]);
|
|
6331
|
+
}
|
|
6332
|
+
throw new LitsError('Expected exactly two parameters', symbol[2]);
|
|
6228
6333
|
}
|
|
6334
|
+
case specialExpressionTypes['defined?']: {
|
|
6335
|
+
if (params.length !== 1) {
|
|
6336
|
+
throw new LitsError('Expected exactly one parameter', symbol[2]);
|
|
6337
|
+
}
|
|
6338
|
+
var _a = __read(params, 1), param = _a[0];
|
|
6339
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, param]], symbol[2]);
|
|
6340
|
+
}
|
|
6341
|
+
case specialExpressionTypes.throw: {
|
|
6342
|
+
if (params.length !== 1) {
|
|
6343
|
+
throw new LitsError('Expected exactly one parameter', symbol[2]);
|
|
6344
|
+
}
|
|
6345
|
+
var _b = __read(params, 1), param = _b[0];
|
|
6346
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, param]], symbol[2]);
|
|
6347
|
+
}
|
|
6348
|
+
case specialExpressionTypes['0_fn']:
|
|
6349
|
+
case specialExpressionTypes['0_def']:
|
|
6350
|
+
case specialExpressionTypes['0_defn']:
|
|
6351
|
+
throw new LitsError("".concat(type, " is not allowed"), symbol[2]);
|
|
6352
|
+
/* v8 ignore next 2 */
|
|
6353
|
+
default:
|
|
6354
|
+
throw new Error("Unknown special expression: ".concat(type));
|
|
6229
6355
|
}
|
|
6230
|
-
|
|
6356
|
+
}
|
|
6357
|
+
else if (isNormalBuiltinSymbolNode(symbol) || isNormalBuiltinSymbolNode(symbol)) {
|
|
6358
|
+
return createNamedNormalExpressionNode(symbol, params, symbol[2]);
|
|
6231
6359
|
}
|
|
6232
6360
|
else {
|
|
6233
|
-
return
|
|
6234
|
-
type: 'NormalExpression',
|
|
6235
|
-
name: undefined,
|
|
6236
|
-
params: __spreadArray([symbol], __read(params), false),
|
|
6237
|
-
sourceCodeInfo: symbol.sourceCodeInfo,
|
|
6238
|
-
};
|
|
6361
|
+
return withSourceCodeInfo([NodeTypes.NormalExpression, [symbol, params]], symbol[2]);
|
|
6239
6362
|
}
|
|
6240
6363
|
};
|
|
6241
6364
|
Parser.prototype.parseLambdaFunction = function () {
|
|
@@ -6252,16 +6375,10 @@ var Parser = /** @class */ (function () {
|
|
|
6252
6375
|
}
|
|
6253
6376
|
this.advance();
|
|
6254
6377
|
var body = this.parseExpression();
|
|
6255
|
-
return
|
|
6256
|
-
|
|
6257
|
-
|
|
6258
|
-
|
|
6259
|
-
function: {
|
|
6260
|
-
arguments: functionArguments,
|
|
6261
|
-
body: [body],
|
|
6262
|
-
},
|
|
6263
|
-
sourceCodeInfo: firstToken[2],
|
|
6264
|
-
};
|
|
6378
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes['0_fn'], [
|
|
6379
|
+
functionArguments,
|
|
6380
|
+
[body],
|
|
6381
|
+
]]], firstToken[2]);
|
|
6265
6382
|
}
|
|
6266
6383
|
catch (_a) {
|
|
6267
6384
|
return null;
|
|
@@ -6270,11 +6387,7 @@ var Parser = /** @class */ (function () {
|
|
|
6270
6387
|
Parser.prototype.parseFunctionArguments = function () {
|
|
6271
6388
|
var firstToken = this.peek();
|
|
6272
6389
|
if (isSymbolToken(firstToken)) {
|
|
6273
|
-
return [
|
|
6274
|
-
type: 'symbol',
|
|
6275
|
-
name: this.parseSymbol().value,
|
|
6276
|
-
sourceCodeInfo: firstToken[2],
|
|
6277
|
-
}];
|
|
6390
|
+
return [withSourceCodeInfo([bindingTargetTypes.symbol, [this.parseSymbol(), undefined]], firstToken[2])];
|
|
6278
6391
|
}
|
|
6279
6392
|
assertLParenToken(firstToken);
|
|
6280
6393
|
this.advance();
|
|
@@ -6286,13 +6399,13 @@ var Parser = /** @class */ (function () {
|
|
|
6286
6399
|
throw new LitsError('Rest argument must be last', this.peek()[2]);
|
|
6287
6400
|
}
|
|
6288
6401
|
var bindingTarget = this.parseBindingTarget();
|
|
6289
|
-
if (bindingTarget
|
|
6402
|
+
if (bindingTarget[1][1] !== undefined) {
|
|
6290
6403
|
defaults = true;
|
|
6291
6404
|
}
|
|
6292
|
-
if (bindingTarget
|
|
6405
|
+
if (bindingTarget[0] === bindingTargetTypes.rest) {
|
|
6293
6406
|
rest = true;
|
|
6294
6407
|
}
|
|
6295
|
-
if (defaults && !bindingTarget
|
|
6408
|
+
if (defaults && !bindingTarget[1][1]) {
|
|
6296
6409
|
throw new LitsError('Default arguments must be last', this.peek()[2]);
|
|
6297
6410
|
}
|
|
6298
6411
|
functionArguments.push(bindingTarget);
|
|
@@ -6339,22 +6452,16 @@ var Parser = /** @class */ (function () {
|
|
|
6339
6452
|
var functionArguments = [];
|
|
6340
6453
|
for (var i = 1; i <= arity; i += 1) {
|
|
6341
6454
|
if (i === 1 && dollar1 === 'NAKED') {
|
|
6342
|
-
functionArguments.push(
|
|
6455
|
+
functionArguments.push(withSourceCodeInfo([bindingTargetTypes.symbol, [[NodeTypes.UserDefinedSymbol, '$'], undefined]], firstToken[2]));
|
|
6343
6456
|
}
|
|
6344
6457
|
else {
|
|
6345
|
-
functionArguments.push(
|
|
6346
|
-
}
|
|
6347
|
-
}
|
|
6348
|
-
var node =
|
|
6349
|
-
|
|
6350
|
-
|
|
6351
|
-
|
|
6352
|
-
function: {
|
|
6353
|
-
arguments: functionArguments,
|
|
6354
|
-
body: [exprNode],
|
|
6355
|
-
},
|
|
6356
|
-
sourceCodeInfo: firstToken[2],
|
|
6357
|
-
};
|
|
6458
|
+
functionArguments.push(withSourceCodeInfo([bindingTargetTypes.symbol, [[NodeTypes.UserDefinedSymbol, "$".concat(i)], undefined]], firstToken[2]));
|
|
6459
|
+
}
|
|
6460
|
+
}
|
|
6461
|
+
var node = withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes['0_fn'], [
|
|
6462
|
+
functionArguments,
|
|
6463
|
+
[exprNode],
|
|
6464
|
+
]]], firstToken[2]);
|
|
6358
6465
|
return node;
|
|
6359
6466
|
};
|
|
6360
6467
|
Parser.prototype.parseOptionalDefaulValue = function () {
|
|
@@ -6370,16 +6477,14 @@ var Parser = /** @class */ (function () {
|
|
|
6370
6477
|
// Symbol
|
|
6371
6478
|
if (isSymbolToken(firstToken)) {
|
|
6372
6479
|
var symbol = this.parseSymbol();
|
|
6480
|
+
if (!isUserDefinedSymbolNode(symbol)) {
|
|
6481
|
+
throw new LitsError('Expected user defined symbol', firstToken[2]);
|
|
6482
|
+
}
|
|
6373
6483
|
var defaultValue = this.parseOptionalDefaulValue();
|
|
6374
6484
|
if (requireDefaultValue && !defaultValue) {
|
|
6375
6485
|
throw new LitsError('Expected assignment', this.peek()[2]);
|
|
6376
6486
|
}
|
|
6377
|
-
return
|
|
6378
|
-
type: 'symbol',
|
|
6379
|
-
name: symbol.value,
|
|
6380
|
-
default: defaultValue,
|
|
6381
|
-
sourceCodeInfo: firstToken[2],
|
|
6382
|
-
};
|
|
6487
|
+
return withSourceCodeInfo([bindingTargetTypes.symbol, [symbol, defaultValue]], firstToken[2]);
|
|
6383
6488
|
}
|
|
6384
6489
|
// Rest
|
|
6385
6490
|
if (isOperatorToken(firstToken, '...')) {
|
|
@@ -6387,15 +6492,11 @@ var Parser = /** @class */ (function () {
|
|
|
6387
6492
|
throw new LitsError('Rest element not allowed', firstToken[2]);
|
|
6388
6493
|
}
|
|
6389
6494
|
this.advance();
|
|
6390
|
-
var symbol = this.parseSymbol();
|
|
6495
|
+
var symbol = asUserDefinedSymbolNode(this.parseSymbol());
|
|
6391
6496
|
if (isOperatorToken(this.peek(), ':=')) {
|
|
6392
6497
|
throw new LitsError('Rest argument can not have default value', this.peek()[2]);
|
|
6393
6498
|
}
|
|
6394
|
-
return
|
|
6395
|
-
type: 'rest',
|
|
6396
|
-
name: symbol.value,
|
|
6397
|
-
sourceCodeInfo: firstToken[2],
|
|
6398
|
-
};
|
|
6499
|
+
return withSourceCodeInfo([bindingTargetTypes.rest, [symbol[1], undefined]], firstToken[2]);
|
|
6399
6500
|
}
|
|
6400
6501
|
// Array
|
|
6401
6502
|
if (isLBracketToken(firstToken)) {
|
|
@@ -6414,7 +6515,7 @@ var Parser = /** @class */ (function () {
|
|
|
6414
6515
|
continue;
|
|
6415
6516
|
}
|
|
6416
6517
|
var target = this.parseBindingTarget();
|
|
6417
|
-
if (target
|
|
6518
|
+
if (target[0] === bindingTargetTypes.rest) {
|
|
6418
6519
|
rest = true;
|
|
6419
6520
|
}
|
|
6420
6521
|
elements.push(target);
|
|
@@ -6430,12 +6531,7 @@ var Parser = /** @class */ (function () {
|
|
|
6430
6531
|
if (requireDefaultValue && !defaultValue) {
|
|
6431
6532
|
throw new LitsError('Expected assignment', this.peek()[2]);
|
|
6432
6533
|
}
|
|
6433
|
-
return
|
|
6434
|
-
type: 'array',
|
|
6435
|
-
elements: elements,
|
|
6436
|
-
default: defaultValue,
|
|
6437
|
-
sourceCodeInfo: firstToken[2],
|
|
6438
|
-
};
|
|
6534
|
+
return withSourceCodeInfo([bindingTargetTypes.array, [elements, defaultValue]], firstToken[2]);
|
|
6439
6535
|
}
|
|
6440
6536
|
// Object
|
|
6441
6537
|
if (isLBraceToken(firstToken)) {
|
|
@@ -6451,40 +6547,32 @@ var Parser = /** @class */ (function () {
|
|
|
6451
6547
|
rest = true;
|
|
6452
6548
|
this.advance();
|
|
6453
6549
|
}
|
|
6454
|
-
var key = this.parseSymbol()
|
|
6550
|
+
var key = asUserDefinedSymbolNode(this.parseSymbol());
|
|
6455
6551
|
token = this.peek();
|
|
6456
6552
|
if (isReservedSymbolToken(token, 'as')) {
|
|
6457
6553
|
if (rest) {
|
|
6458
6554
|
throw new LitsError('Rest argument can not have alias', token[2]);
|
|
6459
6555
|
}
|
|
6460
6556
|
this.advance();
|
|
6461
|
-
var
|
|
6462
|
-
if (elements[
|
|
6463
|
-
throw new LitsError("Duplicate binding name: ".concat(
|
|
6557
|
+
var name_2 = asUserDefinedSymbolNode(this.parseSymbol());
|
|
6558
|
+
if (elements[name_2[1]]) {
|
|
6559
|
+
throw new LitsError("Duplicate binding name: ".concat(name_2), token[2]);
|
|
6464
6560
|
}
|
|
6465
|
-
elements[key] =
|
|
6466
|
-
type: 'symbol',
|
|
6467
|
-
name: name_3,
|
|
6468
|
-
default: this.parseOptionalDefaulValue(),
|
|
6469
|
-
sourceCodeInfo: firstToken[2],
|
|
6470
|
-
};
|
|
6561
|
+
elements[key[1]] = withSourceCodeInfo([bindingTargetTypes.symbol, [name_2, this.parseOptionalDefaulValue()]], firstToken[2]);
|
|
6471
6562
|
}
|
|
6472
6563
|
else if (isRBraceToken(token) || isOperatorToken(token, ',') || isOperatorToken(token, ':=')) {
|
|
6473
|
-
if (elements[key]) {
|
|
6564
|
+
if (elements[key[1]]) {
|
|
6474
6565
|
throw new LitsError("Duplicate binding name: ".concat(key), token[2]);
|
|
6475
6566
|
}
|
|
6476
6567
|
if (rest && isOperatorToken(this.peek(), ':=')) {
|
|
6477
6568
|
throw new LitsError('Rest argument can not have default value', this.peek()[2]);
|
|
6478
6569
|
}
|
|
6479
|
-
elements[key] =
|
|
6480
|
-
|
|
6481
|
-
|
|
6482
|
-
default: this.parseOptionalDefaulValue(),
|
|
6483
|
-
sourceCodeInfo: firstToken[2],
|
|
6484
|
-
};
|
|
6570
|
+
elements[key[1]] = rest
|
|
6571
|
+
? withSourceCodeInfo([bindingTargetTypes.rest, [key[1], this.parseOptionalDefaulValue()]], firstToken[2])
|
|
6572
|
+
: withSourceCodeInfo([bindingTargetTypes.symbol, [key, this.parseOptionalDefaulValue()]], firstToken[2]);
|
|
6485
6573
|
}
|
|
6486
6574
|
else if (isLBraceToken(token) || isLBracketToken(token)) {
|
|
6487
|
-
elements[key] = this.parseBindingTarget();
|
|
6575
|
+
elements[key[1]] = this.parseBindingTarget();
|
|
6488
6576
|
}
|
|
6489
6577
|
if (!isRBraceToken(this.peek())) {
|
|
6490
6578
|
assertOperatorToken(this.peek(), ',');
|
|
@@ -6498,12 +6586,7 @@ var Parser = /** @class */ (function () {
|
|
|
6498
6586
|
if (requireDefaultValue && !defaultValue) {
|
|
6499
6587
|
throw new LitsError('Expected assignment', token[2]);
|
|
6500
6588
|
}
|
|
6501
|
-
return
|
|
6502
|
-
type: 'object',
|
|
6503
|
-
elements: elements,
|
|
6504
|
-
default: defaultValue,
|
|
6505
|
-
sourceCodeInfo: firstToken[2],
|
|
6506
|
-
};
|
|
6589
|
+
return withSourceCodeInfo([bindingTargetTypes.object, [elements, defaultValue]], firstToken[2]);
|
|
6507
6590
|
}
|
|
6508
6591
|
throw new LitsError('Expected symbol', this.peek()[2]);
|
|
6509
6592
|
};
|
|
@@ -6511,22 +6594,13 @@ var Parser = /** @class */ (function () {
|
|
|
6511
6594
|
if (optionalSemicolon === void 0) { optionalSemicolon = false; }
|
|
6512
6595
|
this.advance();
|
|
6513
6596
|
var target = this.parseBindingTarget({ requireDefaultValue: true, noRest: true });
|
|
6514
|
-
var value = target
|
|
6515
|
-
|
|
6597
|
+
var value = target[1][1];
|
|
6598
|
+
target[1][1] = undefined;
|
|
6516
6599
|
if (!optionalSemicolon) {
|
|
6517
6600
|
assertOperatorToken(this.peek(), ';');
|
|
6518
6601
|
}
|
|
6519
|
-
|
|
6520
|
-
|
|
6521
|
-
name: 'let',
|
|
6522
|
-
bindingNode: {
|
|
6523
|
-
type: 'Binding',
|
|
6524
|
-
target: target,
|
|
6525
|
-
value: value,
|
|
6526
|
-
sourceCodeInfo: token[2],
|
|
6527
|
-
},
|
|
6528
|
-
sourceCodeInfo: token[2],
|
|
6529
|
-
};
|
|
6602
|
+
var bindingTarget = withSourceCodeInfo([NodeTypes.Binding, [target, value]], token[2]);
|
|
6603
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.let, bindingTarget]], token[2]);
|
|
6530
6604
|
};
|
|
6531
6605
|
Parser.prototype.parseDo = function (token) {
|
|
6532
6606
|
this.advance();
|
|
@@ -6542,12 +6616,7 @@ var Parser = /** @class */ (function () {
|
|
|
6542
6616
|
}
|
|
6543
6617
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6544
6618
|
this.advance();
|
|
6545
|
-
return
|
|
6546
|
-
type: 'SpecialExpression',
|
|
6547
|
-
name: 'do',
|
|
6548
|
-
params: expressions,
|
|
6549
|
-
sourceCodeInfo: token[2],
|
|
6550
|
-
};
|
|
6619
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
|
|
6551
6620
|
};
|
|
6552
6621
|
Parser.prototype.parseLoop = function (firstToken) {
|
|
6553
6622
|
this.advance();
|
|
@@ -6557,14 +6626,9 @@ var Parser = /** @class */ (function () {
|
|
|
6557
6626
|
assertSymbolToken(token, 'let');
|
|
6558
6627
|
this.advance();
|
|
6559
6628
|
var target = this.parseBindingTarget({ requireDefaultValue: true, noRest: true });
|
|
6560
|
-
var value = target
|
|
6561
|
-
|
|
6562
|
-
bindingNodes.push(
|
|
6563
|
-
type: 'Binding',
|
|
6564
|
-
target: target,
|
|
6565
|
-
value: value,
|
|
6566
|
-
sourceCodeInfo: token[2],
|
|
6567
|
-
});
|
|
6629
|
+
var value = target[1][1];
|
|
6630
|
+
target[1][1] = undefined;
|
|
6631
|
+
bindingNodes.push(withSourceCodeInfo([NodeTypes.Binding, [target, value]], token[2]));
|
|
6568
6632
|
if (isOperatorToken(this.peek(), ',')) {
|
|
6569
6633
|
this.advance();
|
|
6570
6634
|
}
|
|
@@ -6587,13 +6651,7 @@ var Parser = /** @class */ (function () {
|
|
|
6587
6651
|
}
|
|
6588
6652
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6589
6653
|
this.advance();
|
|
6590
|
-
return
|
|
6591
|
-
type: 'SpecialExpression',
|
|
6592
|
-
name: 'loop',
|
|
6593
|
-
params: params,
|
|
6594
|
-
bindingNodes: bindingNodes,
|
|
6595
|
-
sourceCodeInfo: firstToken[2],
|
|
6596
|
-
};
|
|
6654
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.loop, bindingNodes, params]], firstToken[2]);
|
|
6597
6655
|
};
|
|
6598
6656
|
Parser.prototype.parseTry = function (token) {
|
|
6599
6657
|
this.advance();
|
|
@@ -6609,12 +6667,7 @@ var Parser = /** @class */ (function () {
|
|
|
6609
6667
|
}
|
|
6610
6668
|
var tryExpression = tryExpressions.length === 1
|
|
6611
6669
|
? tryExpressions[0]
|
|
6612
|
-
:
|
|
6613
|
-
type: 'SpecialExpression',
|
|
6614
|
-
name: 'do',
|
|
6615
|
-
params: tryExpressions,
|
|
6616
|
-
sourceCodeInfo: token[2],
|
|
6617
|
-
};
|
|
6670
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, tryExpressions]], token[2]);
|
|
6618
6671
|
assertReservedSymbolToken(this.peek(), 'catch');
|
|
6619
6672
|
this.advance();
|
|
6620
6673
|
var errorSymbol;
|
|
@@ -6638,20 +6691,8 @@ var Parser = /** @class */ (function () {
|
|
|
6638
6691
|
this.advance();
|
|
6639
6692
|
var catchExpression = catchExpressions.length === 1
|
|
6640
6693
|
? catchExpressions[0]
|
|
6641
|
-
:
|
|
6642
|
-
|
|
6643
|
-
name: 'do',
|
|
6644
|
-
params: catchExpressions,
|
|
6645
|
-
sourceCodeInfo: token[2],
|
|
6646
|
-
};
|
|
6647
|
-
return {
|
|
6648
|
-
type: 'SpecialExpression',
|
|
6649
|
-
name: 'try',
|
|
6650
|
-
params: [tryExpression],
|
|
6651
|
-
ce: catchExpression,
|
|
6652
|
-
e: errorSymbol,
|
|
6653
|
-
sourceCodeInfo: token[2],
|
|
6654
|
-
};
|
|
6694
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, catchExpressions]], token[2]);
|
|
6695
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.try, tryExpression, errorSymbol, catchExpression]], token[2]);
|
|
6655
6696
|
};
|
|
6656
6697
|
Parser.prototype.parseForOrDoseq = function (firstToken) {
|
|
6657
6698
|
var isDoseq = firstToken[1] === 'doseq';
|
|
@@ -6659,10 +6700,10 @@ var Parser = /** @class */ (function () {
|
|
|
6659
6700
|
var forLoopBindings = [];
|
|
6660
6701
|
var _loop_1 = function () {
|
|
6661
6702
|
var loopBinding = this_1.parseForLoopBinding();
|
|
6662
|
-
var existingBoundNames = forLoopBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b
|
|
6663
|
-
var newBoundNames = getAllBindingTargetNames(loopBinding
|
|
6703
|
+
var existingBoundNames = forLoopBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b[0][1][0])); });
|
|
6704
|
+
var newBoundNames = getAllBindingTargetNames(loopBinding[0][1][0]);
|
|
6664
6705
|
if (Object.keys(newBoundNames).some(function (n) { return existingBoundNames.includes(n); })) {
|
|
6665
|
-
throw new LitsError('Duplicate binding', loopBinding
|
|
6706
|
+
throw new LitsError('Duplicate binding', loopBinding[0][2]);
|
|
6666
6707
|
}
|
|
6667
6708
|
forLoopBindings.push(loopBinding);
|
|
6668
6709
|
};
|
|
@@ -6684,13 +6725,9 @@ var Parser = /** @class */ (function () {
|
|
|
6684
6725
|
}
|
|
6685
6726
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6686
6727
|
this.advance();
|
|
6687
|
-
return
|
|
6688
|
-
|
|
6689
|
-
|
|
6690
|
-
params: expressions,
|
|
6691
|
-
sourceCodeInfo: firstToken[2],
|
|
6692
|
-
l: forLoopBindings,
|
|
6693
|
-
};
|
|
6728
|
+
return isDoseq
|
|
6729
|
+
? withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.doseq, forLoopBindings, expressions]], firstToken[2])
|
|
6730
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.for, forLoopBindings, expressions]], firstToken[2]);
|
|
6694
6731
|
};
|
|
6695
6732
|
Parser.prototype.parseForLoopBinding = function () {
|
|
6696
6733
|
assertReservedSymbolToken(this.peek(), 'each');
|
|
@@ -6712,18 +6749,17 @@ var Parser = /** @class */ (function () {
|
|
|
6712
6749
|
&& !isReservedSymbolToken(token, 'each')) {
|
|
6713
6750
|
throw new LitsError('Expected symbol each, do, let, when or while', token[2]);
|
|
6714
6751
|
}
|
|
6715
|
-
var letBindings;
|
|
6752
|
+
var letBindings = [];
|
|
6716
6753
|
if (token[1] === 'let') {
|
|
6717
6754
|
modifiers.push('&let');
|
|
6718
|
-
letBindings = [];
|
|
6719
6755
|
var _loop_2 = function () {
|
|
6720
6756
|
var letNode = this_2.parseLet(token, true);
|
|
6721
|
-
var existingBoundNames = letBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b
|
|
6722
|
-
var newBoundNames = Object.keys(getAllBindingTargetNames(letNode
|
|
6757
|
+
var existingBoundNames = letBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b[1][0])); });
|
|
6758
|
+
var newBoundNames = Object.keys(getAllBindingTargetNames(letNode[1][1][1][0]));
|
|
6723
6759
|
if (newBoundNames.some(function (n) { return existingBoundNames.includes(n); })) {
|
|
6724
|
-
throw new LitsError('Duplicate binding', letNode
|
|
6760
|
+
throw new LitsError('Duplicate binding', letNode[1][1][2]);
|
|
6725
6761
|
}
|
|
6726
|
-
letBindings.push(letNode
|
|
6762
|
+
letBindings.push(letNode[1][1]);
|
|
6727
6763
|
token = this_2.peek();
|
|
6728
6764
|
if (!isSymbolToken(token, 'do') && !isReservedSymbolToken(this_2.peek(), 'each') && !isOperatorToken(token, ',')) {
|
|
6729
6765
|
throw new LitsError('Expected do, each or comma', token[2]);
|
|
@@ -6769,31 +6805,21 @@ var Parser = /** @class */ (function () {
|
|
|
6769
6805
|
if (!isSymbolToken(token, 'do') && !isReservedSymbolToken(this.peek(), 'each')) {
|
|
6770
6806
|
throw new LitsError('Expected do or each', token[2]);
|
|
6771
6807
|
}
|
|
6772
|
-
return
|
|
6773
|
-
b: bindingNode,
|
|
6774
|
-
m: modifiers,
|
|
6775
|
-
l: letBindings,
|
|
6776
|
-
wn: whenNode,
|
|
6777
|
-
we: whileNode,
|
|
6778
|
-
};
|
|
6808
|
+
return [bindingNode, letBindings, whenNode, whileNode];
|
|
6779
6809
|
};
|
|
6780
6810
|
Parser.prototype.parseBinding = function () {
|
|
6781
6811
|
var firstToken = asSymbolToken(this.peek());
|
|
6782
|
-
var name =
|
|
6783
|
-
this.advance();
|
|
6812
|
+
var name = asUserDefinedSymbolNode(this.parseSymbol());
|
|
6784
6813
|
assertReservedSymbolToken(this.peek(), 'in');
|
|
6785
6814
|
this.advance();
|
|
6786
6815
|
var value = this.parseExpression();
|
|
6787
|
-
var node =
|
|
6788
|
-
|
|
6789
|
-
|
|
6790
|
-
|
|
6791
|
-
|
|
6792
|
-
|
|
6793
|
-
|
|
6794
|
-
value: value,
|
|
6795
|
-
sourceCodeInfo: firstToken[2],
|
|
6796
|
-
};
|
|
6816
|
+
var node = withSourceCodeInfo([
|
|
6817
|
+
NodeTypes.Binding,
|
|
6818
|
+
[
|
|
6819
|
+
withSourceCodeInfo([bindingTargetTypes.symbol, [name, undefined]], firstToken[2]),
|
|
6820
|
+
value,
|
|
6821
|
+
],
|
|
6822
|
+
], firstToken[2]);
|
|
6797
6823
|
return node;
|
|
6798
6824
|
};
|
|
6799
6825
|
Parser.prototype.parseIfOrUnless = function (token) {
|
|
@@ -6816,12 +6842,7 @@ var Parser = /** @class */ (function () {
|
|
|
6816
6842
|
}
|
|
6817
6843
|
var thenExpression = thenExpressions.length === 1
|
|
6818
6844
|
? thenExpressions[0]
|
|
6819
|
-
:
|
|
6820
|
-
type: 'SpecialExpression',
|
|
6821
|
-
name: 'do',
|
|
6822
|
-
params: thenExpressions,
|
|
6823
|
-
sourceCodeInfo: token[2],
|
|
6824
|
-
};
|
|
6845
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, thenExpressions]], token[2]);
|
|
6825
6846
|
var elseExpression;
|
|
6826
6847
|
if (isReservedSymbolToken(this.peek(), 'else')) {
|
|
6827
6848
|
this.advance();
|
|
@@ -6837,25 +6858,13 @@ var Parser = /** @class */ (function () {
|
|
|
6837
6858
|
}
|
|
6838
6859
|
elseExpression = elseExpressions.length === 1
|
|
6839
6860
|
? elseExpressions[0]
|
|
6840
|
-
:
|
|
6841
|
-
type: 'SpecialExpression',
|
|
6842
|
-
name: 'do',
|
|
6843
|
-
params: elseExpressions,
|
|
6844
|
-
sourceCodeInfo: token[2],
|
|
6845
|
-
};
|
|
6861
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, elseExpressions]], token[2]);
|
|
6846
6862
|
}
|
|
6847
6863
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6848
6864
|
this.advance();
|
|
6849
|
-
|
|
6850
|
-
|
|
6851
|
-
|
|
6852
|
-
}
|
|
6853
|
-
return {
|
|
6854
|
-
type: 'SpecialExpression',
|
|
6855
|
-
name: isUnless ? 'unless' : 'if',
|
|
6856
|
-
params: params,
|
|
6857
|
-
sourceCodeInfo: token[2],
|
|
6858
|
-
};
|
|
6865
|
+
return isUnless
|
|
6866
|
+
? withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.unless, [condition, thenExpression, elseExpression]]], token[2])
|
|
6867
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.if, [condition, thenExpression, elseExpression]]], token[2]);
|
|
6859
6868
|
};
|
|
6860
6869
|
Parser.prototype.parseCond = function (token) {
|
|
6861
6870
|
this.advance();
|
|
@@ -6863,7 +6872,7 @@ var Parser = /** @class */ (function () {
|
|
|
6863
6872
|
while (!this.isAtEnd() && !isReservedSymbolToken(this.peek(), 'end')) {
|
|
6864
6873
|
assertReservedSymbolToken(this.peek(), 'case');
|
|
6865
6874
|
this.advance();
|
|
6866
|
-
|
|
6875
|
+
var caseExpression = this.parseExpression();
|
|
6867
6876
|
assertReservedSymbolToken(this.peek(), 'then');
|
|
6868
6877
|
this.advance();
|
|
6869
6878
|
var expressions = [];
|
|
@@ -6878,14 +6887,10 @@ var Parser = /** @class */ (function () {
|
|
|
6878
6887
|
throw new LitsError('Expected ;', this.peek()[2]);
|
|
6879
6888
|
}
|
|
6880
6889
|
}
|
|
6881
|
-
|
|
6890
|
+
var thenExpression = expressions.length === 1
|
|
6882
6891
|
? expressions[0]
|
|
6883
|
-
:
|
|
6884
|
-
|
|
6885
|
-
name: 'do',
|
|
6886
|
-
params: expressions,
|
|
6887
|
-
sourceCodeInfo: token[2],
|
|
6888
|
-
});
|
|
6892
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
|
|
6893
|
+
params.push([caseExpression, thenExpression]);
|
|
6889
6894
|
if (isReservedSymbolToken(this.peek(), 'end')) {
|
|
6890
6895
|
break;
|
|
6891
6896
|
}
|
|
@@ -6893,20 +6898,16 @@ var Parser = /** @class */ (function () {
|
|
|
6893
6898
|
}
|
|
6894
6899
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6895
6900
|
this.advance();
|
|
6896
|
-
return
|
|
6897
|
-
type: 'SpecialExpression',
|
|
6898
|
-
name: 'cond',
|
|
6899
|
-
params: params,
|
|
6900
|
-
sourceCodeInfo: token[2],
|
|
6901
|
-
};
|
|
6901
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.cond, params]], token[2]);
|
|
6902
6902
|
};
|
|
6903
6903
|
Parser.prototype.parseSwitch = function (token) {
|
|
6904
6904
|
this.advance();
|
|
6905
|
-
var
|
|
6905
|
+
var valueExpression = this.parseExpression();
|
|
6906
|
+
var params = [];
|
|
6906
6907
|
while (!this.isAtEnd() && !isReservedSymbolToken(this.peek(), 'end')) {
|
|
6907
6908
|
assertReservedSymbolToken(this.peek(), 'case');
|
|
6908
6909
|
this.advance();
|
|
6909
|
-
|
|
6910
|
+
var caseExpression = this.parseExpression();
|
|
6910
6911
|
assertReservedSymbolToken(this.peek(), 'then');
|
|
6911
6912
|
this.advance();
|
|
6912
6913
|
var expressions = [];
|
|
@@ -6921,14 +6922,10 @@ var Parser = /** @class */ (function () {
|
|
|
6921
6922
|
throw new LitsError('Expected ;', this.peek()[2]);
|
|
6922
6923
|
}
|
|
6923
6924
|
}
|
|
6924
|
-
|
|
6925
|
+
var thenExpression = expressions.length === 1
|
|
6925
6926
|
? expressions[0]
|
|
6926
|
-
:
|
|
6927
|
-
|
|
6928
|
-
name: 'do',
|
|
6929
|
-
params: expressions,
|
|
6930
|
-
sourceCodeInfo: token[2],
|
|
6931
|
-
});
|
|
6927
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
|
|
6928
|
+
params.push([caseExpression, thenExpression]);
|
|
6932
6929
|
if (isReservedSymbolToken(this.peek(), 'end')) {
|
|
6933
6930
|
break;
|
|
6934
6931
|
}
|
|
@@ -6936,12 +6933,7 @@ var Parser = /** @class */ (function () {
|
|
|
6936
6933
|
}
|
|
6937
6934
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6938
6935
|
this.advance();
|
|
6939
|
-
return
|
|
6940
|
-
type: 'SpecialExpression',
|
|
6941
|
-
name: 'switch',
|
|
6942
|
-
params: params,
|
|
6943
|
-
sourceCodeInfo: token[2],
|
|
6944
|
-
};
|
|
6936
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.switch, valueExpression, params]], token[2]);
|
|
6945
6937
|
};
|
|
6946
6938
|
Parser.prototype.parseFunction = function (token) {
|
|
6947
6939
|
this.advance();
|
|
@@ -6960,17 +6952,10 @@ var Parser = /** @class */ (function () {
|
|
|
6960
6952
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6961
6953
|
this.advance();
|
|
6962
6954
|
assertOperatorToken(this.peek(), ';');
|
|
6963
|
-
return
|
|
6964
|
-
|
|
6965
|
-
|
|
6966
|
-
|
|
6967
|
-
params: [],
|
|
6968
|
-
function: {
|
|
6969
|
-
arguments: functionArguments,
|
|
6970
|
-
body: body,
|
|
6971
|
-
},
|
|
6972
|
-
sourceCodeInfo: token[2],
|
|
6973
|
-
};
|
|
6955
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.function, symbol, [
|
|
6956
|
+
functionArguments,
|
|
6957
|
+
body,
|
|
6958
|
+
]]], token[2]);
|
|
6974
6959
|
};
|
|
6975
6960
|
Parser.prototype.isAtEnd = function () {
|
|
6976
6961
|
return this.parseState.position >= this.tokenStream.tokens.length;
|
|
@@ -6992,7 +6977,7 @@ var Parser = /** @class */ (function () {
|
|
|
6992
6977
|
this.advance();
|
|
6993
6978
|
if (isSymbolToken(this.peek(), 'let')) {
|
|
6994
6979
|
var letNode = this.parseLet(asSymbolToken(this.peek()));
|
|
6995
|
-
return
|
|
6980
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes['0_def'], letNode[1][1]]], token[2]);
|
|
6996
6981
|
}
|
|
6997
6982
|
else if (isReservedSymbolToken(this.peek(), 'function')) {
|
|
6998
6983
|
this.advance();
|
|
@@ -7010,71 +6995,57 @@ var Parser = /** @class */ (function () {
|
|
|
7010
6995
|
}
|
|
7011
6996
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
7012
6997
|
this.advance();
|
|
7013
|
-
return
|
|
7014
|
-
|
|
7015
|
-
|
|
7016
|
-
|
|
7017
|
-
params: [],
|
|
7018
|
-
function: {
|
|
7019
|
-
arguments: functionArguments,
|
|
7020
|
-
body: body,
|
|
7021
|
-
},
|
|
7022
|
-
sourceCodeInfo: token[2],
|
|
7023
|
-
};
|
|
6998
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes['0_defn'], symbol, [
|
|
6999
|
+
functionArguments,
|
|
7000
|
+
body,
|
|
7001
|
+
]]], token[2]);
|
|
7024
7002
|
}
|
|
7025
7003
|
else {
|
|
7026
7004
|
throw new LitsError('Expected let or function', this.peek()[2]);
|
|
7027
7005
|
}
|
|
7028
7006
|
};
|
|
7007
|
+
Parser.prototype.stringToSymbolNode = function (value, sourceCodeInfo) {
|
|
7008
|
+
if (specialExpressionTypes[value] !== undefined && value !== 'fn' && value !== 'def' && value !== 'defn') {
|
|
7009
|
+
return withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[value]], sourceCodeInfo);
|
|
7010
|
+
}
|
|
7011
|
+
if (normalExpressionTypes[value] !== undefined) {
|
|
7012
|
+
return withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[value]], sourceCodeInfo);
|
|
7013
|
+
}
|
|
7014
|
+
return withSourceCodeInfo([NodeTypes.UserDefinedSymbol, value], sourceCodeInfo);
|
|
7015
|
+
};
|
|
7016
|
+
Parser.prototype.stringFromQuotedSymbol = function (value) {
|
|
7017
|
+
return value.substring(1, value.length - 1)
|
|
7018
|
+
.replace(/(\\{2})|(\\')|\\(.)/g, function (_, backslash, singleQuote, normalChar) {
|
|
7019
|
+
if (backslash) {
|
|
7020
|
+
return '\\';
|
|
7021
|
+
}
|
|
7022
|
+
if (singleQuote) {
|
|
7023
|
+
return '\'';
|
|
7024
|
+
}
|
|
7025
|
+
return "\\".concat(normalChar);
|
|
7026
|
+
});
|
|
7027
|
+
};
|
|
7029
7028
|
Parser.prototype.parseSymbol = function () {
|
|
7030
7029
|
var token = this.peek();
|
|
7031
7030
|
this.advance();
|
|
7032
7031
|
if (!isSymbolToken(token)) {
|
|
7033
7032
|
throw new LitsError("Expected symbol token, got ".concat(token[0]), token[2]);
|
|
7034
7033
|
}
|
|
7035
|
-
if (token[1][0]
|
|
7036
|
-
return
|
|
7037
|
-
type: 'Symbol',
|
|
7038
|
-
value: token[1],
|
|
7039
|
-
sourceCodeInfo: token[2],
|
|
7040
|
-
};
|
|
7034
|
+
if (token[1][0] === '\'') {
|
|
7035
|
+
return this.stringToSymbolNode(this.stringFromQuotedSymbol(token[1]), token[2]);
|
|
7041
7036
|
}
|
|
7042
7037
|
else {
|
|
7043
|
-
|
|
7044
|
-
.replace(/(\\{2})|(\\')|\\(.)/g, function (_, backslash, singleQuote, normalChar) {
|
|
7045
|
-
if (backslash) {
|
|
7046
|
-
return '\\';
|
|
7047
|
-
}
|
|
7048
|
-
if (singleQuote) {
|
|
7049
|
-
return '\'';
|
|
7050
|
-
}
|
|
7051
|
-
return "\\".concat(normalChar);
|
|
7052
|
-
});
|
|
7053
|
-
return {
|
|
7054
|
-
type: 'Symbol',
|
|
7055
|
-
value: value,
|
|
7056
|
-
sourceCodeInfo: token[2],
|
|
7057
|
-
};
|
|
7038
|
+
return this.stringToSymbolNode(token[1], token[2]);
|
|
7058
7039
|
}
|
|
7059
7040
|
};
|
|
7060
7041
|
Parser.prototype.parseReservedSymbol = function () {
|
|
7061
|
-
var token = this.peek();
|
|
7042
|
+
var token = asReservedSymbolToken(this.peek());
|
|
7062
7043
|
this.advance();
|
|
7063
|
-
|
|
7064
|
-
|
|
7065
|
-
|
|
7066
|
-
return {
|
|
7067
|
-
type: 'Number',
|
|
7068
|
-
value: numberReservedSymbolRecord[symbol],
|
|
7069
|
-
sourceCodeInfo: token[2],
|
|
7070
|
-
};
|
|
7071
|
-
}
|
|
7044
|
+
var symbol = token[1];
|
|
7045
|
+
if (isNumberReservedSymbol(symbol)) {
|
|
7046
|
+
return withSourceCodeInfo([NodeTypes.Number, numberReservedSymbolRecord[symbol]], token[2]);
|
|
7072
7047
|
}
|
|
7073
|
-
return
|
|
7074
|
-
type: 'ReservedSymbol',
|
|
7075
|
-
value: token[1],
|
|
7076
|
-
sourceCodeInfo: token[2],
|
|
7077
|
-
};
|
|
7048
|
+
return withSourceCodeInfo([NodeTypes.ReservedSymbol, token[1]], token[2]);
|
|
7078
7049
|
};
|
|
7079
7050
|
Parser.prototype.parseNumber = function () {
|
|
7080
7051
|
var token = this.peek();
|
|
@@ -7082,11 +7053,7 @@ var Parser = /** @class */ (function () {
|
|
|
7082
7053
|
var value = token[1];
|
|
7083
7054
|
var negative = value[0] === '-';
|
|
7084
7055
|
var numberString = (negative ? value.substring(1) : value).replace(/_/g, '');
|
|
7085
|
-
return
|
|
7086
|
-
type: 'Number',
|
|
7087
|
-
value: negative ? -Number(numberString) : Number(numberString),
|
|
7088
|
-
sourceCodeInfo: token[2],
|
|
7089
|
-
};
|
|
7056
|
+
return withSourceCodeInfo([NodeTypes.Number, negative ? -Number(numberString) : Number(numberString)], token[2]);
|
|
7090
7057
|
};
|
|
7091
7058
|
Parser.prototype.parseString = function () {
|
|
7092
7059
|
var token = this.peek();
|
|
@@ -7118,11 +7085,7 @@ var Parser = /** @class */ (function () {
|
|
|
7118
7085
|
}
|
|
7119
7086
|
return normalChar;
|
|
7120
7087
|
});
|
|
7121
|
-
return
|
|
7122
|
-
type: 'String',
|
|
7123
|
-
value: value,
|
|
7124
|
-
sourceCodeInfo: token[2],
|
|
7125
|
-
};
|
|
7088
|
+
return withSourceCodeInfo([NodeTypes.String, value], token[2]);
|
|
7126
7089
|
};
|
|
7127
7090
|
Parser.prototype.parseRegexpShorthand = function () {
|
|
7128
7091
|
var token = this.peek();
|
|
@@ -7130,22 +7093,15 @@ var Parser = /** @class */ (function () {
|
|
|
7130
7093
|
var endStringPosition = token[1].lastIndexOf('"');
|
|
7131
7094
|
var regexpString = token[1].substring(2, endStringPosition);
|
|
7132
7095
|
var optionsString = token[1].substring(endStringPosition + 1);
|
|
7133
|
-
var stringNode =
|
|
7134
|
-
|
|
7135
|
-
|
|
7136
|
-
|
|
7137
|
-
|
|
7138
|
-
|
|
7139
|
-
|
|
7140
|
-
|
|
7141
|
-
|
|
7142
|
-
};
|
|
7143
|
-
var node = {
|
|
7144
|
-
type: 'NormalExpression',
|
|
7145
|
-
name: 'regexp',
|
|
7146
|
-
params: [stringNode, optionsNode],
|
|
7147
|
-
sourceCodeInfo: token[2],
|
|
7148
|
-
};
|
|
7096
|
+
var stringNode = withSourceCodeInfo([NodeTypes.String, regexpString], token[2]);
|
|
7097
|
+
var optionsNode = withSourceCodeInfo([NodeTypes.String, optionsString], token[2]);
|
|
7098
|
+
var node = withSourceCodeInfo([
|
|
7099
|
+
NodeTypes.NormalExpression,
|
|
7100
|
+
[
|
|
7101
|
+
withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes.regexp], token[2]),
|
|
7102
|
+
[stringNode, optionsNode],
|
|
7103
|
+
],
|
|
7104
|
+
], token[2]);
|
|
7149
7105
|
return node;
|
|
7150
7106
|
};
|
|
7151
7107
|
return Parser;
|
|
@@ -7262,7 +7218,7 @@ var Lits = /** @class */ (function () {
|
|
|
7262
7218
|
if (params === void 0) { params = {}; }
|
|
7263
7219
|
var ast = typeof programOrAst === 'string' ? this.generateAst(programOrAst, params) : programOrAst;
|
|
7264
7220
|
var contextStack = createContextStack(params);
|
|
7265
|
-
return getUndefinedSymbols(ast, contextStack, builtin,
|
|
7221
|
+
return getUndefinedSymbols(ast, contextStack, builtin, evaluateNode);
|
|
7266
7222
|
};
|
|
7267
7223
|
Lits.prototype.tokenize = function (program, tokenizeParams) {
|
|
7268
7224
|
if (tokenizeParams === void 0) { tokenizeParams = {}; }
|