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