@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/index.js
CHANGED
|
@@ -179,23 +179,25 @@ function isLitsError(error) {
|
|
|
179
179
|
return error instanceof LitsError;
|
|
180
180
|
}
|
|
181
181
|
|
|
182
|
-
var
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
182
|
+
var NodeTypes = {
|
|
183
|
+
Number: 1,
|
|
184
|
+
String: 2,
|
|
185
|
+
NormalExpression: 3,
|
|
186
|
+
SpecialExpression: 4,
|
|
187
|
+
UserDefinedSymbol: 5,
|
|
188
|
+
NormalBuiltinSymbol: 6,
|
|
189
|
+
SpecialBuiltinSymbol: 7,
|
|
190
|
+
ReservedSymbol: 8,
|
|
191
|
+
Binding: 9,
|
|
192
|
+
Spread: 10,
|
|
193
|
+
};
|
|
194
|
+
var NodeTypesSet = new Set(Object.values(NodeTypes));
|
|
195
|
+
function getNodeTypeName(type) {
|
|
196
|
+
return Object.keys(NodeTypes).find(function (key) { return NodeTypes[key] === type; });
|
|
197
|
+
}
|
|
198
|
+
// TODO, is this needed?
|
|
199
|
+
function isNodeType(type) {
|
|
200
|
+
return typeof type === 'number' && NodeTypesSet.has(type);
|
|
199
201
|
}
|
|
200
202
|
var functionTypes = [
|
|
201
203
|
'UserDefined',
|
|
@@ -223,17 +225,17 @@ function isLitsFunction$1(func) {
|
|
|
223
225
|
return false;
|
|
224
226
|
return FUNCTION_SYMBOL in func && 'functionType' in func && isFunctionType(func.functionType);
|
|
225
227
|
}
|
|
226
|
-
function
|
|
227
|
-
if (value
|
|
228
|
+
function isNode(value) {
|
|
229
|
+
if (!Array.isArray(value) || value.length < 2)
|
|
228
230
|
return false;
|
|
229
|
-
return
|
|
231
|
+
return isNodeType(value[0]);
|
|
230
232
|
}
|
|
231
233
|
function valueToString(value) {
|
|
232
234
|
if (isLitsFunction$1(value))
|
|
233
235
|
// eslint-disable-next-line ts/no-unsafe-member-access
|
|
234
236
|
return "<function ".concat(value.name || '\u03BB', ">");
|
|
235
|
-
if (
|
|
236
|
-
return "".concat(value
|
|
237
|
+
if (isNode(value))
|
|
238
|
+
return "".concat(getNodeTypeName(value[0]), "-node");
|
|
237
239
|
if (value === null)
|
|
238
240
|
return 'null';
|
|
239
241
|
if (typeof value === 'object' && value instanceof RegExp)
|
|
@@ -254,59 +256,56 @@ function getAssertionError(typeName, value, sourceCodeInfo) {
|
|
|
254
256
|
}
|
|
255
257
|
|
|
256
258
|
function assertNumberOfParams(count, node) {
|
|
257
|
-
|
|
258
|
-
count: count,
|
|
259
|
-
length: node.params.length,
|
|
260
|
-
name: node.name,
|
|
261
|
-
sourceCodeInfo: node.sourceCodeInfo,
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
function isNonUndefined(value) {
|
|
265
|
-
return value !== undefined;
|
|
266
|
-
}
|
|
267
|
-
function asNonUndefined(value, sourceCodeInfo) {
|
|
268
|
-
assertNonUndefined(value, sourceCodeInfo);
|
|
269
|
-
return value;
|
|
270
|
-
}
|
|
271
|
-
function assertNonUndefined(value, sourceCodeInfo) {
|
|
272
|
-
if (!isNonUndefined(value))
|
|
273
|
-
throw new LitsError('Unexpected undefined', getSourceCodeInfo(value, sourceCodeInfo));
|
|
274
|
-
}
|
|
275
|
-
function isUnknownRecord(value) {
|
|
276
|
-
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
277
|
-
}
|
|
278
|
-
function assertUnknownRecord(value, sourceCodeInfo) {
|
|
279
|
-
if (!isUnknownRecord(value)) {
|
|
280
|
-
throw new LitsError("Expected ".concat('UnknownRecord', ", got ").concat(valueToString(value), "."), getSourceCodeInfo(value, sourceCodeInfo));
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
function assertCount(_a) {
|
|
284
|
-
var count = _a.count, length = _a.length, name = _a.name, sourceCodeInfo = _a.sourceCodeInfo;
|
|
259
|
+
var length = node[1][1].length;
|
|
285
260
|
if (typeof count === 'number') {
|
|
286
261
|
if (length !== count) {
|
|
287
|
-
|
|
262
|
+
var name_1 = getNodeTypeName(node[0]);
|
|
263
|
+
throw new LitsError("Wrong number of arguments to \"".concat(name_1, "\", expected ").concat(count, ", got ").concat(valueToString(length), "."), node[2]);
|
|
288
264
|
}
|
|
289
265
|
}
|
|
290
266
|
else {
|
|
291
267
|
var min = count.min, max = count.max, even = count.even, odd = count.odd;
|
|
292
268
|
if (even) {
|
|
269
|
+
var name_2 = getNodeTypeName(node[0]);
|
|
293
270
|
if (length % 2 !== 0) {
|
|
294
|
-
throw new LitsError("Wrong number of arguments to \"".concat(
|
|
271
|
+
throw new LitsError("Wrong number of arguments to \"".concat(name_2, "\",, expected an even number, got ").concat(valueToString(length), "."), node[2]);
|
|
295
272
|
}
|
|
296
273
|
}
|
|
297
274
|
if (odd) {
|
|
298
275
|
if (length % 2 !== 1) {
|
|
299
|
-
|
|
276
|
+
var name_3 = getNodeTypeName(node[0]);
|
|
277
|
+
throw new LitsError("Wrong number of arguments to \"".concat(name_3, "\",, expected an odd number, got ").concat(valueToString(length), "."), node[2]);
|
|
300
278
|
}
|
|
301
279
|
}
|
|
302
280
|
if (typeof min === 'number' && length < min) {
|
|
303
|
-
|
|
281
|
+
var name_4 = getNodeTypeName(node[0]);
|
|
282
|
+
throw new LitsError("Wrong number of arguments to \"".concat(name_4, "\", expected at least ").concat(min, ", got ").concat(valueToString(length), "."), node[2]);
|
|
304
283
|
}
|
|
305
284
|
if (typeof max === 'number' && length > max) {
|
|
306
|
-
|
|
285
|
+
var name_5 = getNodeTypeName(node[0]);
|
|
286
|
+
throw new LitsError("Wrong number of arguments to \"".concat(name_5, "\", expected at most ").concat(max, ", got ").concat(valueToString(length), "."), node[2]);
|
|
307
287
|
}
|
|
308
288
|
}
|
|
309
289
|
}
|
|
290
|
+
function isNonUndefined(value) {
|
|
291
|
+
return value !== undefined;
|
|
292
|
+
}
|
|
293
|
+
function asNonUndefined(value, sourceCodeInfo) {
|
|
294
|
+
assertNonUndefined(value, sourceCodeInfo);
|
|
295
|
+
return value;
|
|
296
|
+
}
|
|
297
|
+
function assertNonUndefined(value, sourceCodeInfo) {
|
|
298
|
+
if (!isNonUndefined(value))
|
|
299
|
+
throw new LitsError('Unexpected undefined', getSourceCodeInfo(value, sourceCodeInfo));
|
|
300
|
+
}
|
|
301
|
+
function isUnknownRecord(value) {
|
|
302
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
303
|
+
}
|
|
304
|
+
function assertUnknownRecord(value, sourceCodeInfo) {
|
|
305
|
+
if (!isUnknownRecord(value)) {
|
|
306
|
+
throw new LitsError("Expected ".concat('UnknownRecord', ", got ").concat(valueToString(value), "."), getSourceCodeInfo(value, sourceCodeInfo));
|
|
307
|
+
}
|
|
308
|
+
}
|
|
310
309
|
function canBeOperator(count) {
|
|
311
310
|
if (typeof count === 'number') {
|
|
312
311
|
return count === 2;
|
|
@@ -744,12 +743,6 @@ function createNativeJsFunction(fn, name) {
|
|
|
744
743
|
_a.functionType = 'NativeJsFunction',
|
|
745
744
|
_a;
|
|
746
745
|
}
|
|
747
|
-
function arrayToPairs(arr) {
|
|
748
|
-
var pairs = [];
|
|
749
|
-
for (var i = 0; i < arr.length; i += 2)
|
|
750
|
-
pairs.push([arr[i], arr[i + 1]]);
|
|
751
|
-
return pairs;
|
|
752
|
-
}
|
|
753
746
|
function joinSets() {
|
|
754
747
|
var e_1, _a;
|
|
755
748
|
var results = [];
|
|
@@ -3647,17 +3640,24 @@ Object.values(expressions).forEach(function (normalExpression) {
|
|
|
3647
3640
|
});
|
|
3648
3641
|
});
|
|
3649
3642
|
var normalExpressions = __assign(__assign({}, expressions), aliases);
|
|
3643
|
+
var normalExpressionTypes = {};
|
|
3644
|
+
var allNormalExpressions = [];
|
|
3645
|
+
Object.entries(normalExpressions).forEach(function (_a, index) {
|
|
3646
|
+
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
3647
|
+
normalExpressionTypes[key] = index;
|
|
3648
|
+
allNormalExpressions.push(value);
|
|
3649
|
+
});
|
|
3650
3650
|
|
|
3651
3651
|
var andSpecialExpression = {
|
|
3652
3652
|
paramCount: {},
|
|
3653
3653
|
evaluate: function (node, contextStack, _a) {
|
|
3654
3654
|
var e_1, _b;
|
|
3655
|
-
var
|
|
3655
|
+
var evaluateNode = _a.evaluateNode;
|
|
3656
3656
|
var value = true;
|
|
3657
3657
|
try {
|
|
3658
|
-
for (var _c = __values(node
|
|
3658
|
+
for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
3659
3659
|
var param = _d.value;
|
|
3660
|
-
value =
|
|
3660
|
+
value = evaluateNode(param, contextStack);
|
|
3661
3661
|
if (!value)
|
|
3662
3662
|
break;
|
|
3663
3663
|
}
|
|
@@ -3672,8 +3672,8 @@ var andSpecialExpression = {
|
|
|
3672
3672
|
return value;
|
|
3673
3673
|
},
|
|
3674
3674
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3675
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3676
|
-
return getUndefinedSymbols(node
|
|
3675
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
3676
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
3677
3677
|
},
|
|
3678
3678
|
};
|
|
3679
3679
|
|
|
@@ -3681,28 +3681,29 @@ var condSpecialExpression = {
|
|
|
3681
3681
|
paramCount: { even: true },
|
|
3682
3682
|
evaluate: function (node, contextStack, _a) {
|
|
3683
3683
|
var e_1, _b;
|
|
3684
|
-
var
|
|
3684
|
+
var evaluateNode = _a.evaluateNode;
|
|
3685
|
+
var params = node[1][1];
|
|
3685
3686
|
try {
|
|
3686
|
-
for (var
|
|
3687
|
-
var
|
|
3688
|
-
var value =
|
|
3687
|
+
for (var params_1 = __values(params), params_1_1 = params_1.next(); !params_1_1.done; params_1_1 = params_1.next()) {
|
|
3688
|
+
var _c = __read(params_1_1.value, 2), test = _c[0], form = _c[1];
|
|
3689
|
+
var value = evaluateNode(test, contextStack);
|
|
3689
3690
|
if (!value)
|
|
3690
3691
|
continue;
|
|
3691
|
-
return
|
|
3692
|
+
return evaluateNode(form, contextStack);
|
|
3692
3693
|
}
|
|
3693
3694
|
}
|
|
3694
3695
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
3695
3696
|
finally {
|
|
3696
3697
|
try {
|
|
3697
|
-
if (
|
|
3698
|
+
if (params_1_1 && !params_1_1.done && (_b = params_1.return)) _b.call(params_1);
|
|
3698
3699
|
}
|
|
3699
3700
|
finally { if (e_1) throw e_1.error; }
|
|
3700
3701
|
}
|
|
3701
3702
|
return null;
|
|
3702
3703
|
},
|
|
3703
3704
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3704
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3705
|
-
return getUndefinedSymbols(node.
|
|
3705
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
3706
|
+
return getUndefinedSymbols(node[1][1].flat(), contextStack, builtin, evaluateNode);
|
|
3706
3707
|
},
|
|
3707
3708
|
};
|
|
3708
3709
|
|
|
@@ -3710,66 +3711,141 @@ var switchSpecialExpression = {
|
|
|
3710
3711
|
paramCount: { odd: true },
|
|
3711
3712
|
evaluate: function (node, contextStack, _a) {
|
|
3712
3713
|
var e_1, _b;
|
|
3713
|
-
var
|
|
3714
|
-
var
|
|
3714
|
+
var evaluateNode = _a.evaluateNode;
|
|
3715
|
+
var _c = __read(node[1], 3), switchValueNode = _c[1], cases = _c[2];
|
|
3716
|
+
var switchValue = evaluateNode(switchValueNode, contextStack);
|
|
3715
3717
|
try {
|
|
3716
|
-
for (var
|
|
3717
|
-
var
|
|
3718
|
-
var value =
|
|
3718
|
+
for (var cases_1 = __values(cases), cases_1_1 = cases_1.next(); !cases_1_1.done; cases_1_1 = cases_1.next()) {
|
|
3719
|
+
var _d = __read(cases_1_1.value, 2), test = _d[0], form = _d[1];
|
|
3720
|
+
var value = evaluateNode(test, contextStack);
|
|
3719
3721
|
if (value === switchValue) {
|
|
3720
|
-
return
|
|
3722
|
+
return evaluateNode(form, contextStack);
|
|
3721
3723
|
}
|
|
3722
3724
|
}
|
|
3723
3725
|
}
|
|
3724
3726
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
3725
3727
|
finally {
|
|
3726
3728
|
try {
|
|
3727
|
-
if (
|
|
3729
|
+
if (cases_1_1 && !cases_1_1.done && (_b = cases_1.return)) _b.call(cases_1);
|
|
3728
3730
|
}
|
|
3729
3731
|
finally { if (e_1) throw e_1.error; }
|
|
3730
3732
|
}
|
|
3731
3733
|
return null;
|
|
3732
3734
|
},
|
|
3733
3735
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3734
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3735
|
-
return getUndefinedSymbols(node.
|
|
3736
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
3737
|
+
return getUndefinedSymbols(__spreadArray([node[1][1]], __read(node[1][2].flat()), false), contextStack, builtin, evaluateNode);
|
|
3736
3738
|
},
|
|
3737
3739
|
};
|
|
3738
3740
|
|
|
3739
|
-
|
|
3741
|
+
function isSymbolNode(node) {
|
|
3742
|
+
var nodeType = node[0];
|
|
3743
|
+
return NodeTypes.UserDefinedSymbol === nodeType
|
|
3744
|
+
|| NodeTypes.NormalBuiltinSymbol === nodeType
|
|
3745
|
+
|| NodeTypes.SpecialBuiltinSymbol === nodeType;
|
|
3746
|
+
}
|
|
3747
|
+
function assertSymbolNode(node, sourceCodeInfo) {
|
|
3748
|
+
if (!isSymbolNode(node))
|
|
3749
|
+
throw getAssertionError('SymbolNode', node, sourceCodeInfo);
|
|
3750
|
+
}
|
|
3751
|
+
function isUserDefinedSymbolNode(node) {
|
|
3752
|
+
return NodeTypes.UserDefinedSymbol === node[0];
|
|
3753
|
+
}
|
|
3754
|
+
function asUserDefinedSymbolNode(node, sourceCodeInfo) {
|
|
3755
|
+
assertUserDefinedSymbolNode(node, sourceCodeInfo);
|
|
3756
|
+
return node;
|
|
3757
|
+
}
|
|
3758
|
+
function assertUserDefinedSymbolNode(node, sourceCodeInfo) {
|
|
3759
|
+
if (!isUserDefinedSymbolNode(node))
|
|
3760
|
+
throw getAssertionError('UserDefinedSymbolNode', node, sourceCodeInfo);
|
|
3761
|
+
}
|
|
3762
|
+
function isNormalBuiltinSymbolNode(node) {
|
|
3763
|
+
return NodeTypes.NormalBuiltinSymbol === node[0];
|
|
3764
|
+
}
|
|
3765
|
+
function isSpecialBuiltinSymbolNode(node) {
|
|
3766
|
+
return NodeTypes.SpecialBuiltinSymbol === node[0];
|
|
3767
|
+
}
|
|
3768
|
+
function isNormalExpressionNode(node) {
|
|
3769
|
+
return node[0] === NodeTypes.NormalExpression;
|
|
3770
|
+
}
|
|
3771
|
+
function isNormalExpressionNodeWithName(node) {
|
|
3772
|
+
if (!isNormalExpressionNode(node)) {
|
|
3773
|
+
return false;
|
|
3774
|
+
}
|
|
3775
|
+
return isSymbolNode(node[1][0]);
|
|
3776
|
+
}
|
|
3777
|
+
function isSpreadNode(node) {
|
|
3778
|
+
return node[0] === NodeTypes.Spread;
|
|
3779
|
+
}
|
|
3780
|
+
|
|
3781
|
+
var definedSpecialExpression = {
|
|
3740
3782
|
paramCount: 1,
|
|
3741
3783
|
evaluate: function (node, contextStack) {
|
|
3742
|
-
var
|
|
3784
|
+
var symbolNode = node[1][1];
|
|
3785
|
+
assertSymbolNode(symbolNode);
|
|
3786
|
+
if (!isUserDefinedSymbolNode(symbolNode)) {
|
|
3787
|
+
return true; // If the symbol is not a user defined symbol, it is defined. normal or special builtin
|
|
3788
|
+
}
|
|
3789
|
+
var lookUpResult = contextStack.lookUp(symbolNode);
|
|
3743
3790
|
return lookUpResult !== null;
|
|
3744
3791
|
},
|
|
3745
3792
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3746
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3747
|
-
return getUndefinedSymbols(node
|
|
3793
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
3794
|
+
return getUndefinedSymbols([node[1][1]], contextStack, builtin, evaluateNode);
|
|
3748
3795
|
},
|
|
3749
3796
|
};
|
|
3750
3797
|
|
|
3751
|
-
|
|
3752
|
-
|
|
3753
|
-
|
|
3798
|
+
var bindingTargetTypes = {
|
|
3799
|
+
symbol: 11,
|
|
3800
|
+
rest: 12,
|
|
3801
|
+
object: 13,
|
|
3802
|
+
array: 14,
|
|
3803
|
+
};
|
|
3804
|
+
|
|
3805
|
+
function walkDefaults(bindingTarget, onDefault) {
|
|
3806
|
+
var _a;
|
|
3807
|
+
if (bindingTarget[0] === bindingTargetTypes.object) {
|
|
3808
|
+
Object.values(bindingTarget[1][0]).forEach(function (element) {
|
|
3809
|
+
if (element[1][1]) {
|
|
3810
|
+
onDefault(element[1][1]);
|
|
3811
|
+
}
|
|
3812
|
+
walkDefaults(element, onDefault);
|
|
3813
|
+
});
|
|
3814
|
+
}
|
|
3815
|
+
else if (bindingTarget[0] === bindingTargetTypes.array) {
|
|
3816
|
+
for (var index = 0; index < bindingTarget[1][0].length; index += 1) {
|
|
3817
|
+
var element = (_a = bindingTarget[1][0][index]) !== null && _a !== void 0 ? _a : null;
|
|
3818
|
+
if (element === null) {
|
|
3819
|
+
continue;
|
|
3820
|
+
}
|
|
3821
|
+
if (element[1][1]) {
|
|
3822
|
+
onDefault(element[1][1]);
|
|
3823
|
+
}
|
|
3824
|
+
walkDefaults(element, onDefault);
|
|
3825
|
+
}
|
|
3826
|
+
}
|
|
3827
|
+
}
|
|
3828
|
+
function evalueateBindingNodeValues(target, value, evaluate) {
|
|
3829
|
+
var sourceCodeInfo = target[2];
|
|
3754
3830
|
var record = {};
|
|
3755
3831
|
createRecord(target, value, evaluate, sourceCodeInfo, record);
|
|
3756
3832
|
return record;
|
|
3757
3833
|
}
|
|
3758
3834
|
function createRecord(bindingTarget, value, evaluate, sourceCodeInfo, record) {
|
|
3759
3835
|
var _a, _b;
|
|
3760
|
-
if (bindingTarget
|
|
3836
|
+
if (bindingTarget[0] === bindingTargetTypes.object) {
|
|
3761
3837
|
assertUnknownRecord(value, sourceCodeInfo);
|
|
3762
3838
|
var capturedKeys_1 = new Set();
|
|
3763
3839
|
var restElement_1;
|
|
3764
|
-
Object.entries(bindingTarget
|
|
3840
|
+
Object.entries(bindingTarget[1][0]).forEach(function (_a) {
|
|
3765
3841
|
var _b;
|
|
3766
3842
|
var _c = __read(_a, 2), key = _c[0], element = _c[1];
|
|
3767
|
-
if (element
|
|
3843
|
+
if (element[0] === bindingTargetTypes.rest) {
|
|
3768
3844
|
restElement_1 = element;
|
|
3769
3845
|
return;
|
|
3770
3846
|
}
|
|
3771
3847
|
capturedKeys_1.add(key);
|
|
3772
|
-
var val = (_b = (value[key] !== undefined ? value[key] : element
|
|
3848
|
+
var val = (_b = (value[key] !== undefined ? value[key] : element[1][1] && evaluate(element[1][1]))) !== null && _b !== void 0 ? _b : null;
|
|
3773
3849
|
assertAny(val, sourceCodeInfo);
|
|
3774
3850
|
createRecord(element, val, evaluate, sourceCodeInfo, record);
|
|
3775
3851
|
});
|
|
@@ -3784,33 +3860,36 @@ function createRecord(bindingTarget, value, evaluate, sourceCodeInfo, record) {
|
|
|
3784
3860
|
acc[key] = asAny(val);
|
|
3785
3861
|
return acc;
|
|
3786
3862
|
}, {});
|
|
3787
|
-
record[restElement_1
|
|
3863
|
+
record[restElement_1[1][0]] = restValues;
|
|
3788
3864
|
}
|
|
3789
3865
|
}
|
|
3790
|
-
else if (bindingTarget
|
|
3866
|
+
else if (bindingTarget[0] === bindingTargetTypes.array) {
|
|
3791
3867
|
var restIndex = null;
|
|
3792
3868
|
assertArray(value, sourceCodeInfo);
|
|
3793
|
-
for (var index = 0; index < bindingTarget.
|
|
3794
|
-
var element = (_a = bindingTarget
|
|
3869
|
+
for (var index = 0; index < bindingTarget[1][0].length; index += 1) {
|
|
3870
|
+
var element = (_a = bindingTarget[1][0][index]) !== null && _a !== void 0 ? _a : null;
|
|
3795
3871
|
if (element === null) {
|
|
3796
3872
|
continue;
|
|
3797
3873
|
}
|
|
3798
|
-
if (element
|
|
3874
|
+
if (element[0] === bindingTargetTypes.rest) {
|
|
3799
3875
|
restIndex = index;
|
|
3800
3876
|
break;
|
|
3801
3877
|
}
|
|
3802
|
-
var val = (_b = (value[index] !== undefined ? value[index] : element
|
|
3878
|
+
var val = (_b = (value[index] !== undefined ? value[index] : element[1][1] && evaluate(element[1][1]))) !== null && _b !== void 0 ? _b : null;
|
|
3803
3879
|
assertAny(val, sourceCodeInfo);
|
|
3804
3880
|
createRecord(element, val, evaluate, sourceCodeInfo, record);
|
|
3805
3881
|
}
|
|
3806
3882
|
if (restIndex !== null) {
|
|
3807
3883
|
var restValues = value.slice(restIndex);
|
|
3808
|
-
var restElement = bindingTarget
|
|
3809
|
-
record[restElement
|
|
3884
|
+
var restElement = bindingTarget[1][0][restIndex];
|
|
3885
|
+
record[restElement[1][0]] = restValues;
|
|
3810
3886
|
}
|
|
3811
3887
|
}
|
|
3888
|
+
else if (bindingTarget[0] === bindingTargetTypes.rest) {
|
|
3889
|
+
record[bindingTarget[1][0]] = asAny(value);
|
|
3890
|
+
}
|
|
3812
3891
|
else {
|
|
3813
|
-
record[bindingTarget
|
|
3892
|
+
record[bindingTarget[1][0][1]] = asAny(value);
|
|
3814
3893
|
}
|
|
3815
3894
|
}
|
|
3816
3895
|
function getAllBindingTargetNames(bindingTarget) {
|
|
@@ -3823,9 +3902,9 @@ function getNamesFromBindingTarget(target, names) {
|
|
|
3823
3902
|
if (target === null) {
|
|
3824
3903
|
return;
|
|
3825
3904
|
}
|
|
3826
|
-
if (target
|
|
3905
|
+
if (target[0] === bindingTargetTypes.array) {
|
|
3827
3906
|
try {
|
|
3828
|
-
for (var _c = __values(target
|
|
3907
|
+
for (var _c = __values(target[1][0]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
3829
3908
|
var element = _d.value;
|
|
3830
3909
|
getNamesFromBindingTarget(element, names);
|
|
3831
3910
|
}
|
|
@@ -3838,9 +3917,9 @@ function getNamesFromBindingTarget(target, names) {
|
|
|
3838
3917
|
finally { if (e_1) throw e_1.error; }
|
|
3839
3918
|
}
|
|
3840
3919
|
}
|
|
3841
|
-
else if (target
|
|
3920
|
+
else if (target[0] === bindingTargetTypes.object) {
|
|
3842
3921
|
try {
|
|
3843
|
-
for (var _e = __values(Object.values(target
|
|
3922
|
+
for (var _e = __values(Object.values(target[1][0])), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
3844
3923
|
var element = _f.value;
|
|
3845
3924
|
getNamesFromBindingTarget(element, names);
|
|
3846
3925
|
}
|
|
@@ -3853,27 +3932,42 @@ function getNamesFromBindingTarget(target, names) {
|
|
|
3853
3932
|
finally { if (e_2) throw e_2.error; }
|
|
3854
3933
|
}
|
|
3855
3934
|
}
|
|
3935
|
+
else if (target[0] === bindingTargetTypes.rest) {
|
|
3936
|
+
if (names[target[1][0]]) {
|
|
3937
|
+
throw new LitsError("Duplicate binding name: ".concat(target[1][0]), target[2]);
|
|
3938
|
+
}
|
|
3939
|
+
names[target[1][0]] = true;
|
|
3940
|
+
}
|
|
3856
3941
|
else {
|
|
3857
|
-
if (names[target
|
|
3858
|
-
throw new LitsError("Duplicate binding name: ".concat(target
|
|
3942
|
+
if (names[target[1][0][1]]) {
|
|
3943
|
+
throw new LitsError("Duplicate binding name: ".concat(target[1][0]), target[2]);
|
|
3859
3944
|
}
|
|
3860
|
-
names[target
|
|
3945
|
+
names[target[1][0][1]] = true;
|
|
3861
3946
|
}
|
|
3862
3947
|
}
|
|
3863
3948
|
|
|
3864
3949
|
var defSpecialExpression = {
|
|
3865
3950
|
paramCount: 2,
|
|
3866
3951
|
evaluate: function (node, contextStack, _a) {
|
|
3867
|
-
var
|
|
3868
|
-
var
|
|
3869
|
-
var
|
|
3952
|
+
var evaluateNode = _a.evaluateNode;
|
|
3953
|
+
var bindingNode = node[1][1];
|
|
3954
|
+
var target = bindingNode[1][0];
|
|
3955
|
+
var value = bindingNode[1][1];
|
|
3956
|
+
var bindingValue = evaluateNode(value, contextStack);
|
|
3957
|
+
var values = evalueateBindingNodeValues(target, bindingValue, function (Node) { return evaluateNode(Node, contextStack); });
|
|
3870
3958
|
contextStack.exportValues(values);
|
|
3871
3959
|
return null;
|
|
3872
3960
|
},
|
|
3873
3961
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3874
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3875
|
-
var
|
|
3876
|
-
|
|
3962
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
3963
|
+
var bindingNode = node[1][1];
|
|
3964
|
+
var target = bindingNode[1][0];
|
|
3965
|
+
var value = bindingNode[1][1];
|
|
3966
|
+
var bindingResult = getUndefinedSymbols([value], contextStack, builtin, evaluateNode);
|
|
3967
|
+
walkDefaults(target, function (defaultNode) {
|
|
3968
|
+
addToSet(bindingResult, getUndefinedSymbols([defaultNode], contextStack, builtin, evaluateNode));
|
|
3969
|
+
});
|
|
3970
|
+
contextStack.addValues(getAllBindingTargetNames(target));
|
|
3877
3971
|
return bindingResult;
|
|
3878
3972
|
},
|
|
3879
3973
|
};
|
|
@@ -3882,14 +3976,14 @@ var doSpecialExpression = {
|
|
|
3882
3976
|
paramCount: {},
|
|
3883
3977
|
evaluate: function (node, contextStack, _a) {
|
|
3884
3978
|
var e_1, _b;
|
|
3885
|
-
var
|
|
3979
|
+
var evaluateNode = _a.evaluateNode;
|
|
3886
3980
|
var newContext = {};
|
|
3887
3981
|
var newContextStack = contextStack.create(newContext);
|
|
3888
3982
|
var result = null;
|
|
3889
3983
|
try {
|
|
3890
|
-
for (var _c = __values(node
|
|
3984
|
+
for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
3891
3985
|
var form = _d.value;
|
|
3892
|
-
result =
|
|
3986
|
+
result = evaluateNode(form, newContextStack);
|
|
3893
3987
|
}
|
|
3894
3988
|
}
|
|
3895
3989
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
@@ -3902,8 +3996,8 @@ var doSpecialExpression = {
|
|
|
3902
3996
|
return result;
|
|
3903
3997
|
},
|
|
3904
3998
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3905
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3906
|
-
return getUndefinedSymbols(node
|
|
3999
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4000
|
+
return getUndefinedSymbols(node[1][1], contextStack.create({}), builtin, evaluateNode);
|
|
3907
4001
|
},
|
|
3908
4002
|
};
|
|
3909
4003
|
|
|
@@ -3961,10 +4055,36 @@ function isNumberReservedSymbol(symbol) {
|
|
|
3961
4055
|
return symbol in numberReservedSymbolRecord;
|
|
3962
4056
|
}
|
|
3963
4057
|
|
|
4058
|
+
var specialExpressionTypes = {
|
|
4059
|
+
'??': 0,
|
|
4060
|
+
'&&': 1,
|
|
4061
|
+
'||': 2,
|
|
4062
|
+
'array': 3,
|
|
4063
|
+
'cond': 4,
|
|
4064
|
+
'0_def': 5,
|
|
4065
|
+
'defined?': 6,
|
|
4066
|
+
'0_defn': 7,
|
|
4067
|
+
'do': 8,
|
|
4068
|
+
'doseq': 9,
|
|
4069
|
+
'0_fn': 10,
|
|
4070
|
+
'for': 11,
|
|
4071
|
+
'function': 12,
|
|
4072
|
+
'if': 13,
|
|
4073
|
+
'let': 14,
|
|
4074
|
+
'loop': 15,
|
|
4075
|
+
'object': 16,
|
|
4076
|
+
'recur': 17,
|
|
4077
|
+
'switch': 18,
|
|
4078
|
+
'throw': 19,
|
|
4079
|
+
'try': 20,
|
|
4080
|
+
'unless': 21,
|
|
4081
|
+
};
|
|
4082
|
+
|
|
3964
4083
|
function assertNameNotDefined(name, contextStack, builtin, sourceCodeInfo) {
|
|
3965
4084
|
if (typeof name !== 'string')
|
|
3966
4085
|
return;
|
|
3967
|
-
|
|
4086
|
+
// TODO only subset of special expressions are necessary to check (CommonSpecialExpressionType)
|
|
4087
|
+
if (specialExpressionTypes[name])
|
|
3968
4088
|
throw new LitsError("Cannot define variable ".concat(name, ", it's a special expression."), sourceCodeInfo);
|
|
3969
4089
|
if (builtin.normalExpressions[name])
|
|
3970
4090
|
throw new LitsError("Cannot define variable ".concat(name, ", it's a builtin function."), sourceCodeInfo);
|
|
@@ -3978,63 +4098,69 @@ var functionSpecialExpression = {
|
|
|
3978
4098
|
paramCount: {},
|
|
3979
4099
|
evaluate: function (node, contextStack, _a) {
|
|
3980
4100
|
var _b, _c;
|
|
3981
|
-
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols,
|
|
3982
|
-
var
|
|
3983
|
-
|
|
3984
|
-
|
|
4101
|
+
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
|
|
4102
|
+
var _d = __read(node[1], 3), functionSymbol = _d[1], fn = _d[2];
|
|
4103
|
+
assertUserDefinedSymbolNode(functionSymbol, node[2]);
|
|
4104
|
+
assertNameNotDefined(functionSymbol[1], contextStack, builtin, node[2]);
|
|
4105
|
+
var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
|
|
3985
4106
|
var litsFunction = (_b = {},
|
|
3986
4107
|
_b[FUNCTION_SYMBOL] = true,
|
|
3987
|
-
_b.sourceCodeInfo = node
|
|
4108
|
+
_b.sourceCodeInfo = node[2],
|
|
3988
4109
|
_b.functionType = 'UserDefined',
|
|
3989
|
-
_b.name =
|
|
4110
|
+
_b.name = functionSymbol[1],
|
|
3990
4111
|
_b.evaluatedfunction = evaluatedFunction,
|
|
3991
4112
|
_b);
|
|
3992
|
-
contextStack.addValues((_c = {}, _c[
|
|
4113
|
+
contextStack.addValues((_c = {}, _c[functionSymbol[1]] = litsFunction, _c));
|
|
3993
4114
|
return null;
|
|
3994
4115
|
},
|
|
3995
4116
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3996
4117
|
var _b, _c;
|
|
3997
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3998
|
-
|
|
3999
|
-
|
|
4000
|
-
|
|
4118
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4119
|
+
var functionName = node[1][1][1];
|
|
4120
|
+
contextStack.addValues((_b = {}, _b[functionName] = true, _b));
|
|
4121
|
+
var newContext = (_c = {}, _c[functionName] = { value: true }, _c);
|
|
4122
|
+
return getFunctionUnresolvedSymbols(node[1][2], contextStack, getUndefinedSymbols, builtin, evaluateNode, newContext);
|
|
4001
4123
|
},
|
|
4002
4124
|
};
|
|
4003
4125
|
var defnSpecialExpression = {
|
|
4004
4126
|
paramCount: {},
|
|
4005
4127
|
evaluate: function (node, contextStack, _a) {
|
|
4006
4128
|
var _b, _c;
|
|
4007
|
-
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols,
|
|
4008
|
-
var
|
|
4009
|
-
|
|
4010
|
-
|
|
4129
|
+
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
|
|
4130
|
+
var _d = __read(node[1], 3), functionSymbol = _d[1], fn = _d[2];
|
|
4131
|
+
assertUserDefinedSymbolNode(functionSymbol, node[2]);
|
|
4132
|
+
assertNameNotDefined(functionSymbol[1], contextStack, builtin, node[2]);
|
|
4133
|
+
var evaluatedFunctionOverloades = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
|
|
4011
4134
|
var litsFunction = (_b = {},
|
|
4012
4135
|
_b[FUNCTION_SYMBOL] = true,
|
|
4013
|
-
_b.sourceCodeInfo = node
|
|
4136
|
+
_b.sourceCodeInfo = node[2],
|
|
4014
4137
|
_b.functionType = 'UserDefined',
|
|
4015
|
-
_b.name =
|
|
4138
|
+
_b.name = functionSymbol[1],
|
|
4016
4139
|
_b.evaluatedfunction = evaluatedFunctionOverloades,
|
|
4017
4140
|
_b);
|
|
4018
|
-
contextStack.exportValues((_c = {}, _c[
|
|
4141
|
+
contextStack.exportValues((_c = {}, _c[functionSymbol[1]] = litsFunction, _c));
|
|
4019
4142
|
return null;
|
|
4020
4143
|
},
|
|
4021
4144
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4022
4145
|
var _b, _c;
|
|
4023
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4024
|
-
|
|
4025
|
-
var
|
|
4026
|
-
|
|
4146
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4147
|
+
var functionName = node[1][1][1];
|
|
4148
|
+
var fn = node[1][2];
|
|
4149
|
+
contextStack.exportValues((_b = {}, _b[functionName] = true, _b));
|
|
4150
|
+
var newContext = (_c = {}, _c[functionName] = { value: true }, _c);
|
|
4151
|
+
return getFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode, newContext);
|
|
4027
4152
|
},
|
|
4028
4153
|
};
|
|
4029
4154
|
var fnSpecialExpression = {
|
|
4030
4155
|
paramCount: {},
|
|
4031
4156
|
evaluate: function (node, contextStack, _a) {
|
|
4032
4157
|
var _b;
|
|
4033
|
-
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols,
|
|
4034
|
-
var
|
|
4158
|
+
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
|
|
4159
|
+
var fn = node[1][1];
|
|
4160
|
+
var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
|
|
4035
4161
|
var litsFunction = (_b = {},
|
|
4036
4162
|
_b[FUNCTION_SYMBOL] = true,
|
|
4037
|
-
_b.sourceCodeInfo = node
|
|
4163
|
+
_b.sourceCodeInfo = node[2],
|
|
4038
4164
|
_b.functionType = 'UserDefined',
|
|
4039
4165
|
_b.name = undefined,
|
|
4040
4166
|
_b.evaluatedfunction = evaluatedFunction,
|
|
@@ -4042,129 +4168,109 @@ var fnSpecialExpression = {
|
|
|
4042
4168
|
return litsFunction;
|
|
4043
4169
|
},
|
|
4044
4170
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4045
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4046
|
-
|
|
4171
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4172
|
+
var fn = node[1][1];
|
|
4173
|
+
return getFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode);
|
|
4047
4174
|
},
|
|
4048
4175
|
};
|
|
4049
|
-
function evaluateFunction(
|
|
4050
|
-
var fn = node.function;
|
|
4176
|
+
function evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode) {
|
|
4051
4177
|
var functionContext = {};
|
|
4052
|
-
var context = fn.
|
|
4178
|
+
var context = fn[0].reduce(function (ctx, arg) {
|
|
4053
4179
|
Object.keys(getAllBindingTargetNames(arg)).forEach(function (name) {
|
|
4054
4180
|
ctx[name] = { value: null };
|
|
4055
4181
|
});
|
|
4056
4182
|
return ctx;
|
|
4057
4183
|
}, {});
|
|
4058
|
-
var undefinedSymbols = getUndefinedSymbols(fn
|
|
4184
|
+
var undefinedSymbols = getUndefinedSymbols(fn[1], contextStack.new(context), builtin, evaluateNode);
|
|
4059
4185
|
undefinedSymbols.forEach(function (name) {
|
|
4060
4186
|
var value = contextStack.getValue(name);
|
|
4061
4187
|
if (isAny(value)) {
|
|
4062
4188
|
functionContext[name] = { value: value };
|
|
4063
4189
|
}
|
|
4064
4190
|
});
|
|
4065
|
-
var evaluatedFunction =
|
|
4066
|
-
|
|
4067
|
-
|
|
4068
|
-
|
|
4069
|
-
|
|
4191
|
+
var evaluatedFunction = [
|
|
4192
|
+
fn[0],
|
|
4193
|
+
fn[1],
|
|
4194
|
+
functionContext,
|
|
4195
|
+
];
|
|
4070
4196
|
return evaluatedFunction;
|
|
4071
4197
|
}
|
|
4072
|
-
function
|
|
4198
|
+
function getFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode, functionNameContext) {
|
|
4073
4199
|
var result = new Set();
|
|
4074
4200
|
var contextStackWithFunctionName = functionNameContext ? contextStack.create(functionNameContext) : contextStack;
|
|
4075
4201
|
var newContext = {};
|
|
4076
|
-
fn.
|
|
4202
|
+
fn[0].forEach(function (arg) {
|
|
4077
4203
|
Object.assign(newContext, getAllBindingTargetNames(arg));
|
|
4204
|
+
walkDefaults(arg, function (defaultNode) {
|
|
4205
|
+
addToSet(result, getUndefinedSymbols([defaultNode], contextStack, builtin, evaluateNode));
|
|
4206
|
+
});
|
|
4078
4207
|
});
|
|
4079
4208
|
var newContextStack = contextStackWithFunctionName.create(newContext);
|
|
4080
|
-
var overloadResult = getUndefinedSymbols(fn
|
|
4209
|
+
var overloadResult = getUndefinedSymbols(fn[1], newContextStack, builtin, evaluateNode);
|
|
4081
4210
|
addToSet(result, overloadResult);
|
|
4082
4211
|
return result;
|
|
4083
4212
|
}
|
|
4084
4213
|
|
|
4085
|
-
function isAstNode(value) {
|
|
4086
|
-
if (value === null || typeof value !== 'object')
|
|
4087
|
-
return false;
|
|
4088
|
-
if (!isAstNodeType(value.type))
|
|
4089
|
-
return false;
|
|
4090
|
-
return true;
|
|
4091
|
-
}
|
|
4092
|
-
function asAstNode(value, sourceCodeInfo) {
|
|
4093
|
-
assertAstNode(value, sourceCodeInfo);
|
|
4094
|
-
return value;
|
|
4095
|
-
}
|
|
4096
|
-
function assertAstNode(value, sourceCodeInfo) {
|
|
4097
|
-
if (!isAstNode(value))
|
|
4098
|
-
throw getAssertionError('AstNode', value, sourceCodeInfo);
|
|
4099
|
-
}
|
|
4100
|
-
function isSymbolNode(value) {
|
|
4101
|
-
if (!isAstNode(value))
|
|
4102
|
-
return false;
|
|
4103
|
-
return value.type === 'Symbol';
|
|
4104
|
-
}
|
|
4105
|
-
function isNormalExpressionNodeWithName(value) {
|
|
4106
|
-
if (!isAstNode(value))
|
|
4107
|
-
return false;
|
|
4108
|
-
return value.type === 'NormalExpression' && typeof value.name === 'string';
|
|
4109
|
-
}
|
|
4110
|
-
|
|
4111
4214
|
var ifSpecialExpression = {
|
|
4112
4215
|
paramCount: { min: 2, max: 3 },
|
|
4113
4216
|
evaluate: function (node, contextStack, _a) {
|
|
4114
|
-
var
|
|
4115
|
-
var
|
|
4116
|
-
|
|
4117
|
-
|
|
4118
|
-
return evaluateAstNode(asAstNode(trueNode, sourceCodeInfo), contextStack);
|
|
4217
|
+
var evaluateNode = _a.evaluateNode;
|
|
4218
|
+
var _b = __read(node[1][1], 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
|
|
4219
|
+
if (evaluateNode(conditionNode, contextStack)) {
|
|
4220
|
+
return evaluateNode(trueNode, contextStack);
|
|
4119
4221
|
}
|
|
4120
|
-
else {
|
|
4121
|
-
|
|
4122
|
-
return evaluateAstNode(asAstNode(falseNode, sourceCodeInfo), contextStack);
|
|
4123
|
-
else
|
|
4124
|
-
return null;
|
|
4222
|
+
else if (falseNode) {
|
|
4223
|
+
return evaluateNode(falseNode, contextStack);
|
|
4125
4224
|
}
|
|
4225
|
+
return null;
|
|
4126
4226
|
},
|
|
4127
4227
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4128
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4129
|
-
return getUndefinedSymbols(node.
|
|
4228
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4229
|
+
return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
|
|
4130
4230
|
},
|
|
4131
4231
|
};
|
|
4132
4232
|
|
|
4133
4233
|
var unlessSpecialExpression = {
|
|
4134
4234
|
paramCount: { min: 2, max: 3 },
|
|
4135
4235
|
evaluate: function (node, contextStack, _a) {
|
|
4136
|
-
var
|
|
4137
|
-
var
|
|
4138
|
-
|
|
4139
|
-
|
|
4140
|
-
return evaluateAstNode(asAstNode(trueNode, sourceCodeInfo), contextStack);
|
|
4236
|
+
var evaluateNode = _a.evaluateNode;
|
|
4237
|
+
var _b = __read(node[1][1], 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
|
|
4238
|
+
if (!evaluateNode(conditionNode, contextStack)) {
|
|
4239
|
+
return evaluateNode(trueNode, contextStack);
|
|
4141
4240
|
}
|
|
4142
|
-
else {
|
|
4143
|
-
|
|
4144
|
-
return evaluateAstNode(asAstNode(falseNode, sourceCodeInfo), contextStack);
|
|
4145
|
-
else
|
|
4146
|
-
return null;
|
|
4241
|
+
else if (falseNode) {
|
|
4242
|
+
return evaluateNode(falseNode, contextStack);
|
|
4147
4243
|
}
|
|
4244
|
+
return null;
|
|
4148
4245
|
},
|
|
4149
4246
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4150
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4151
|
-
return getUndefinedSymbols(node.
|
|
4247
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4248
|
+
return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
|
|
4152
4249
|
},
|
|
4153
4250
|
};
|
|
4154
4251
|
|
|
4155
4252
|
var letSpecialExpression = {
|
|
4156
4253
|
paramCount: 0,
|
|
4157
4254
|
evaluate: function (node, contextStack, _a) {
|
|
4158
|
-
var
|
|
4159
|
-
var
|
|
4160
|
-
var
|
|
4255
|
+
var evaluateNode = _a.evaluateNode;
|
|
4256
|
+
var bindingNode = node[1][1];
|
|
4257
|
+
var target = bindingNode[1][0];
|
|
4258
|
+
var value = bindingNode[1][1];
|
|
4259
|
+
var bindingValue = evaluateNode(value, contextStack);
|
|
4260
|
+
var values = evalueateBindingNodeValues(target, bindingValue, function (Node) { return evaluateNode(Node, contextStack); });
|
|
4161
4261
|
contextStack.addValues(values);
|
|
4162
4262
|
return null;
|
|
4163
4263
|
},
|
|
4164
4264
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4165
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4166
|
-
var
|
|
4167
|
-
|
|
4265
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4266
|
+
var bindingNode = node[1][1];
|
|
4267
|
+
var target = bindingNode[1][0];
|
|
4268
|
+
var value = bindingNode[1][1];
|
|
4269
|
+
var bindingResult = getUndefinedSymbols([value], contextStack, builtin, evaluateNode);
|
|
4270
|
+
walkDefaults(target, function (defaultNode) {
|
|
4271
|
+
addToSet(bindingResult, getUndefinedSymbols([defaultNode], contextStack, builtin, evaluateNode));
|
|
4272
|
+
});
|
|
4273
|
+
contextStack.addValues(getAllBindingTargetNames(target));
|
|
4168
4274
|
return bindingResult;
|
|
4169
4275
|
},
|
|
4170
4276
|
};
|
|
@@ -4172,11 +4278,11 @@ var letSpecialExpression = {
|
|
|
4172
4278
|
var loopSpecialExpression = {
|
|
4173
4279
|
paramCount: {},
|
|
4174
4280
|
evaluate: function (node, contextStack, _a) {
|
|
4175
|
-
var
|
|
4176
|
-
var
|
|
4177
|
-
var bindingContext =
|
|
4178
|
-
var val =
|
|
4179
|
-
var valueRecord = evalueateBindingNodeValues(
|
|
4281
|
+
var evaluateNode = _a.evaluateNode;
|
|
4282
|
+
var bindingNodes = node[1][1];
|
|
4283
|
+
var bindingContext = bindingNodes.reduce(function (result, bindingNode) {
|
|
4284
|
+
var val = evaluateNode(bindingNode[1][1], contextStack.create(result));
|
|
4285
|
+
var valueRecord = evalueateBindingNodeValues(bindingNode[1][0], val, function (Node) { return evaluateNode(Node, contextStack); });
|
|
4180
4286
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4181
4287
|
var _b = __read(_a, 2), name = _b[0], value = _b[1];
|
|
4182
4288
|
result[name] = { value: value };
|
|
@@ -4184,20 +4290,21 @@ var loopSpecialExpression = {
|
|
|
4184
4290
|
return result;
|
|
4185
4291
|
}, {});
|
|
4186
4292
|
var newContextStack = contextStack.create(bindingContext);
|
|
4293
|
+
var body = node[1][2];
|
|
4187
4294
|
var _loop_1 = function () {
|
|
4188
4295
|
var e_1, _b;
|
|
4189
4296
|
var result = null;
|
|
4190
4297
|
try {
|
|
4191
4298
|
try {
|
|
4192
|
-
for (var
|
|
4193
|
-
var form =
|
|
4194
|
-
result =
|
|
4299
|
+
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()) {
|
|
4300
|
+
var form = body_1_1.value;
|
|
4301
|
+
result = evaluateNode(form, newContextStack);
|
|
4195
4302
|
}
|
|
4196
4303
|
}
|
|
4197
4304
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
4198
4305
|
finally {
|
|
4199
4306
|
try {
|
|
4200
|
-
if (
|
|
4307
|
+
if (body_1_1 && !body_1_1.done && (_b = body_1.return)) _b.call(body_1);
|
|
4201
4308
|
}
|
|
4202
4309
|
finally { if (e_1) throw e_1.error; }
|
|
4203
4310
|
}
|
|
@@ -4205,16 +4312,16 @@ var loopSpecialExpression = {
|
|
|
4205
4312
|
catch (error) {
|
|
4206
4313
|
if (error instanceof RecurSignal) {
|
|
4207
4314
|
var params_1 = error.params;
|
|
4208
|
-
if (params_1.length !==
|
|
4209
|
-
throw new LitsError("recur expected ".concat(
|
|
4315
|
+
if (params_1.length !== bindingNodes.length) {
|
|
4316
|
+
throw new LitsError("recur expected ".concat(bindingNodes.length, " parameters, got ").concat(valueToString(params_1.length)), node[2]);
|
|
4210
4317
|
}
|
|
4211
|
-
|
|
4318
|
+
bindingNodes.forEach(function (bindingNode, index) {
|
|
4212
4319
|
var e_2, _a;
|
|
4213
|
-
var valueRecord = evalueateBindingNodeValues(
|
|
4320
|
+
var valueRecord = evalueateBindingNodeValues(bindingNode[1][0], asAny(params_1[index]), function (Node) { return evaluateNode(Node, contextStack); });
|
|
4214
4321
|
try {
|
|
4215
4322
|
for (var _b = (e_2 = void 0, __values(Object.entries(valueRecord))), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
4216
4323
|
var _d = __read(_c.value, 2), name_1 = _d[0], value = _d[1];
|
|
4217
|
-
|
|
4324
|
+
bindingContext[name_1].value = value;
|
|
4218
4325
|
}
|
|
4219
4326
|
}
|
|
4220
4327
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
@@ -4238,29 +4345,31 @@ var loopSpecialExpression = {
|
|
|
4238
4345
|
}
|
|
4239
4346
|
},
|
|
4240
4347
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4241
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4242
|
-
var
|
|
4348
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4349
|
+
var bindingNodes = node[1][1];
|
|
4350
|
+
var newContext = bindingNodes
|
|
4243
4351
|
.reduce(function (context, bindingNode) {
|
|
4244
|
-
var names = getAllBindingTargetNames(bindingNode
|
|
4352
|
+
var names = getAllBindingTargetNames(bindingNode[1][0]);
|
|
4245
4353
|
Object.keys(names).forEach(function (name) {
|
|
4246
4354
|
context[name] = { value: true };
|
|
4247
4355
|
});
|
|
4248
4356
|
return context;
|
|
4249
4357
|
}, {});
|
|
4250
|
-
var bindingValueNodes =
|
|
4251
|
-
var bindingsResult = getUndefinedSymbols(bindingValueNodes, contextStack, builtin,
|
|
4252
|
-
var paramsResult = getUndefinedSymbols(node
|
|
4358
|
+
var bindingValueNodes = bindingNodes.map(function (bindingNode) { return bindingNode[1][1]; });
|
|
4359
|
+
var bindingsResult = getUndefinedSymbols(bindingValueNodes, contextStack, builtin, evaluateNode);
|
|
4360
|
+
var paramsResult = getUndefinedSymbols(node[1][2], contextStack.create(newContext), builtin, evaluateNode);
|
|
4253
4361
|
return joinSets(bindingsResult, paramsResult);
|
|
4254
4362
|
},
|
|
4255
4363
|
};
|
|
4256
4364
|
|
|
4257
|
-
function addToContext(bindings, context, contextStack,
|
|
4365
|
+
function addToContext(bindings, context, contextStack, evaluateNode) {
|
|
4258
4366
|
var e_1, _a;
|
|
4259
4367
|
try {
|
|
4260
4368
|
for (var bindings_1 = __values(bindings), bindings_1_1 = bindings_1.next(); !bindings_1_1.done; bindings_1_1 = bindings_1.next()) {
|
|
4261
|
-
var
|
|
4262
|
-
var
|
|
4263
|
-
var
|
|
4369
|
+
var bindingNode = bindings_1_1.value;
|
|
4370
|
+
var _b = __read(bindingNode[1], 2), target = _b[0], bindingValue = _b[1];
|
|
4371
|
+
var val = evaluateNode(bindingValue, contextStack);
|
|
4372
|
+
var valueRecord = evalueateBindingNodeValues(target, val, function (Node) { return evaluateNode(Node, contextStack); });
|
|
4264
4373
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4265
4374
|
var _b = __read(_a, 2), name = _b[0], value = _b[1];
|
|
4266
4375
|
context[name] = { value: value };
|
|
@@ -4275,9 +4384,9 @@ function addToContext(bindings, context, contextStack, evaluateAstNode) {
|
|
|
4275
4384
|
finally { if (e_1) throw e_1.error; }
|
|
4276
4385
|
}
|
|
4277
4386
|
}
|
|
4278
|
-
function evaluateLoop(returnResult,
|
|
4279
|
-
var sourceCodeInfo =
|
|
4280
|
-
var _a =
|
|
4387
|
+
function evaluateLoop(returnResult, loopNode, contextStack, evaluateNode) {
|
|
4388
|
+
var sourceCodeInfo = loopNode[2];
|
|
4389
|
+
var _a = __read(loopNode[1], 3), loopBindings = _a[1], body = _a[2];
|
|
4281
4390
|
var result = [];
|
|
4282
4391
|
var bindingIndices = loopBindings.map(function () { return 0; });
|
|
4283
4392
|
var abort = false;
|
|
@@ -4287,8 +4396,9 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
|
|
|
4287
4396
|
var newContextStack = contextStack.create(context);
|
|
4288
4397
|
var skip = false;
|
|
4289
4398
|
bindingsLoop: for (var bindingIndex = 0; bindingIndex < loopBindings.length; bindingIndex += 1) {
|
|
4290
|
-
var _c =
|
|
4291
|
-
var
|
|
4399
|
+
var _c = __read(loopBindings[bindingIndex], 4), bindingNode = _c[0], letBindings = _c[1], whenNode = _c[2], whileNode = _c[3];
|
|
4400
|
+
var _d = __read(bindingNode[1], 2), targetNode = _d[0], valueNode = _d[1];
|
|
4401
|
+
var coll = asColl(evaluateNode(valueNode, newContextStack), sourceCodeInfo);
|
|
4292
4402
|
var seq = isSeq(coll) ? coll : Object.entries(coll);
|
|
4293
4403
|
if (seq.length === 0) {
|
|
4294
4404
|
skip = true;
|
|
@@ -4307,45 +4417,40 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
|
|
|
4307
4417
|
break;
|
|
4308
4418
|
}
|
|
4309
4419
|
var val = asAny(seq[index], sourceCodeInfo);
|
|
4310
|
-
var valueRecord = evalueateBindingNodeValues(
|
|
4420
|
+
var valueRecord = evalueateBindingNodeValues(targetNode, val, function (Node) { return evaluateNode(Node, newContextStack); });
|
|
4311
4421
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4312
4422
|
var _b = __read(_a, 2), name = _b[0], value = _b[1];
|
|
4313
4423
|
context[name] = { value: value };
|
|
4314
4424
|
});
|
|
4425
|
+
if (letBindings) {
|
|
4426
|
+
addToContext(letBindings, context, newContextStack, evaluateNode);
|
|
4427
|
+
}
|
|
4428
|
+
if (whenNode && !evaluateNode(whenNode, newContextStack)) {
|
|
4429
|
+
bindingIndices[bindingIndex] = asNonUndefined(bindingIndices[bindingIndex], sourceCodeInfo) + 1;
|
|
4430
|
+
skip = true;
|
|
4431
|
+
break bindingsLoop;
|
|
4432
|
+
}
|
|
4433
|
+
if (whileNode && !evaluateNode(whileNode, newContextStack)) {
|
|
4434
|
+
bindingIndices[bindingIndex] = Number.POSITIVE_INFINITY;
|
|
4435
|
+
skip = true;
|
|
4436
|
+
break bindingsLoop;
|
|
4437
|
+
}
|
|
4438
|
+
}
|
|
4439
|
+
if (!skip) {
|
|
4440
|
+
var value = null;
|
|
4315
4441
|
try {
|
|
4316
|
-
for (var
|
|
4317
|
-
var
|
|
4318
|
-
|
|
4319
|
-
case '&let':
|
|
4320
|
-
addToContext(asNonUndefined(letBindings, sourceCodeInfo), context, newContextStack, evaluateAstNode);
|
|
4321
|
-
break;
|
|
4322
|
-
case '&when':
|
|
4323
|
-
if (!evaluateAstNode(asAstNode(whenNode, sourceCodeInfo), newContextStack)) {
|
|
4324
|
-
bindingIndices[bindingIndex] = asNonUndefined(bindingIndices[bindingIndex], sourceCodeInfo) + 1;
|
|
4325
|
-
skip = true;
|
|
4326
|
-
break bindingsLoop;
|
|
4327
|
-
}
|
|
4328
|
-
break;
|
|
4329
|
-
case '&while':
|
|
4330
|
-
if (!evaluateAstNode(asAstNode(whileNode, sourceCodeInfo), newContextStack)) {
|
|
4331
|
-
bindingIndices[bindingIndex] = Number.POSITIVE_INFINITY;
|
|
4332
|
-
skip = true;
|
|
4333
|
-
break bindingsLoop;
|
|
4334
|
-
}
|
|
4335
|
-
break;
|
|
4336
|
-
}
|
|
4442
|
+
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()) {
|
|
4443
|
+
var form = body_1_1.value;
|
|
4444
|
+
value = evaluateNode(form, newContextStack);
|
|
4337
4445
|
}
|
|
4338
4446
|
}
|
|
4339
4447
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
4340
4448
|
finally {
|
|
4341
4449
|
try {
|
|
4342
|
-
if (
|
|
4450
|
+
if (body_1_1 && !body_1_1.done && (_b = body_1.return)) _b.call(body_1);
|
|
4343
4451
|
}
|
|
4344
4452
|
finally { if (e_2) throw e_2.error; }
|
|
4345
4453
|
}
|
|
4346
|
-
}
|
|
4347
|
-
if (!skip) {
|
|
4348
|
-
var value = evaluateAstNode(params[0], newContextStack);
|
|
4349
4454
|
if (returnResult)
|
|
4350
4455
|
result.push(value);
|
|
4351
4456
|
if (bindingIndices.length > 0)
|
|
@@ -4357,57 +4462,59 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
|
|
|
4357
4462
|
}
|
|
4358
4463
|
return returnResult ? result : null;
|
|
4359
4464
|
}
|
|
4360
|
-
function analyze(
|
|
4465
|
+
function analyze(loopNode, contextStack, getUndefinedSymbols, builtin, evaluateNode) {
|
|
4361
4466
|
var result = new Set();
|
|
4362
4467
|
var newContext = {};
|
|
4363
|
-
var loopBindings =
|
|
4364
|
-
loopBindings.forEach(function (
|
|
4365
|
-
var
|
|
4366
|
-
|
|
4468
|
+
var _a = __read(loopNode[1], 3), loopBindings = _a[1], body = _a[2];
|
|
4469
|
+
loopBindings.forEach(function (loopBindingNode) {
|
|
4470
|
+
var _a = __read(loopBindingNode, 4), bindingNode = _a[0], letBindings = _a[1], whenNode = _a[2], whileNode = _a[3];
|
|
4471
|
+
var _b = __read(bindingNode[1], 2), target = _b[0], value = _b[1];
|
|
4472
|
+
getUndefinedSymbols([value], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4367
4473
|
return result.add(symbol);
|
|
4368
4474
|
});
|
|
4369
|
-
Object.assign(newContext, getAllBindingTargetNames(
|
|
4475
|
+
Object.assign(newContext, getAllBindingTargetNames(target));
|
|
4370
4476
|
if (letBindings) {
|
|
4371
|
-
letBindings.forEach(function (
|
|
4372
|
-
|
|
4477
|
+
letBindings.forEach(function (letBindingNode) {
|
|
4478
|
+
var _a = __read(letBindingNode[1], 2), letTarget = _a[0], letValue = _a[1];
|
|
4479
|
+
getUndefinedSymbols([letValue], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4373
4480
|
return result.add(symbol);
|
|
4374
4481
|
});
|
|
4375
|
-
Object.assign(newContext, getAllBindingTargetNames(
|
|
4482
|
+
Object.assign(newContext, getAllBindingTargetNames(letTarget));
|
|
4376
4483
|
});
|
|
4377
4484
|
}
|
|
4378
4485
|
if (whenNode) {
|
|
4379
|
-
getUndefinedSymbols([whenNode], contextStack.create(newContext), builtin,
|
|
4486
|
+
getUndefinedSymbols([whenNode], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4380
4487
|
return result.add(symbol);
|
|
4381
4488
|
});
|
|
4382
4489
|
}
|
|
4383
4490
|
if (whileNode) {
|
|
4384
|
-
getUndefinedSymbols([whileNode], contextStack.create(newContext), builtin,
|
|
4491
|
+
getUndefinedSymbols([whileNode], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4385
4492
|
return result.add(symbol);
|
|
4386
4493
|
});
|
|
4387
4494
|
}
|
|
4388
4495
|
});
|
|
4389
|
-
getUndefinedSymbols(
|
|
4496
|
+
getUndefinedSymbols(body, contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4390
4497
|
return result.add(symbol);
|
|
4391
4498
|
});
|
|
4392
4499
|
return result;
|
|
4393
4500
|
}
|
|
4394
4501
|
var forSpecialExpression = {
|
|
4395
4502
|
paramCount: 1,
|
|
4396
|
-
evaluate: function (node, contextStack, helpers) { return evaluateLoop(true, node, contextStack, helpers.
|
|
4503
|
+
evaluate: function (node, contextStack, helpers) { return evaluateLoop(true, node, contextStack, helpers.evaluateNode); },
|
|
4397
4504
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4398
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4399
|
-
return analyze(node, contextStack, getUndefinedSymbols, builtin,
|
|
4505
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4506
|
+
return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateNode);
|
|
4400
4507
|
},
|
|
4401
4508
|
};
|
|
4402
4509
|
var doseqSpecialExpression = {
|
|
4403
4510
|
paramCount: 1,
|
|
4404
4511
|
evaluate: function (node, contextStack, helpers) {
|
|
4405
|
-
evaluateLoop(false, node, contextStack, helpers.
|
|
4512
|
+
evaluateLoop(false, node, contextStack, helpers.evaluateNode);
|
|
4406
4513
|
return null;
|
|
4407
4514
|
},
|
|
4408
4515
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4409
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4410
|
-
return analyze(node, contextStack, getUndefinedSymbols, builtin,
|
|
4516
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4517
|
+
return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateNode);
|
|
4411
4518
|
},
|
|
4412
4519
|
};
|
|
4413
4520
|
|
|
@@ -4415,12 +4522,12 @@ var orSpecialExpression = {
|
|
|
4415
4522
|
paramCount: {},
|
|
4416
4523
|
evaluate: function (node, contextStack, _a) {
|
|
4417
4524
|
var e_1, _b;
|
|
4418
|
-
var
|
|
4525
|
+
var evaluateNode = _a.evaluateNode;
|
|
4419
4526
|
var value = false;
|
|
4420
4527
|
try {
|
|
4421
|
-
for (var _c = __values(node
|
|
4528
|
+
for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
4422
4529
|
var param = _d.value;
|
|
4423
|
-
value =
|
|
4530
|
+
value = evaluateNode(param, contextStack);
|
|
4424
4531
|
if (value)
|
|
4425
4532
|
break;
|
|
4426
4533
|
}
|
|
@@ -4435,55 +4542,55 @@ var orSpecialExpression = {
|
|
|
4435
4542
|
return value;
|
|
4436
4543
|
},
|
|
4437
4544
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4438
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4439
|
-
return getUndefinedSymbols(node
|
|
4545
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4546
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
4440
4547
|
},
|
|
4441
4548
|
};
|
|
4442
4549
|
|
|
4443
4550
|
var qqSpecialExpression = {
|
|
4444
4551
|
paramCount: { min: 1, max: 2 },
|
|
4445
4552
|
evaluate: function (node, contextStack, _a) {
|
|
4446
|
-
var
|
|
4447
|
-
var _b = __read(node
|
|
4448
|
-
if (
|
|
4449
|
-
|
|
4450
|
-
return secondNode ? evaluateAstNode(secondNode, contextStack) : null;
|
|
4553
|
+
var evaluateNode = _a.evaluateNode;
|
|
4554
|
+
var _b = __read(node[1][1], 2), firstNode = _b[0], secondNode = _b[1];
|
|
4555
|
+
if (isUserDefinedSymbolNode(firstNode) && contextStack.lookUp(firstNode) === null) {
|
|
4556
|
+
return secondNode ? evaluateNode(secondNode, contextStack) : null;
|
|
4451
4557
|
}
|
|
4452
|
-
assertAny(firstNode, node
|
|
4453
|
-
var firstResult =
|
|
4454
|
-
return firstResult !== null && firstResult !== void 0 ? firstResult : (secondNode ?
|
|
4558
|
+
assertAny(firstNode, node[2]);
|
|
4559
|
+
var firstResult = evaluateNode(firstNode, contextStack);
|
|
4560
|
+
return firstResult !== null && firstResult !== void 0 ? firstResult : (secondNode ? evaluateNode(secondNode, contextStack) : null);
|
|
4455
4561
|
},
|
|
4456
4562
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4457
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4458
|
-
return getUndefinedSymbols(node.
|
|
4563
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4564
|
+
return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
|
|
4459
4565
|
},
|
|
4460
4566
|
};
|
|
4461
4567
|
|
|
4462
4568
|
var recurSpecialExpression = {
|
|
4463
4569
|
paramCount: {},
|
|
4464
4570
|
evaluate: function (node, contextStack, _a) {
|
|
4465
|
-
var
|
|
4466
|
-
var params = node
|
|
4467
|
-
|
|
4571
|
+
var evaluateNode = _a.evaluateNode;
|
|
4572
|
+
var params = node[1][1];
|
|
4573
|
+
var evaluatedParams = params.map(function (paramNode) { return evaluateNode(paramNode, contextStack); });
|
|
4574
|
+
throw new RecurSignal(evaluatedParams);
|
|
4468
4575
|
},
|
|
4469
4576
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4470
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4471
|
-
return getUndefinedSymbols(node
|
|
4577
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4578
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
4472
4579
|
},
|
|
4473
4580
|
};
|
|
4474
4581
|
|
|
4475
4582
|
var throwSpecialExpression = {
|
|
4476
4583
|
paramCount: 1,
|
|
4477
4584
|
evaluate: function (node, contextStack, _a) {
|
|
4478
|
-
var
|
|
4479
|
-
var message = asString(
|
|
4585
|
+
var evaluateNode = _a.evaluateNode;
|
|
4586
|
+
var message = asString(evaluateNode(node[1][1], contextStack), node[2], {
|
|
4480
4587
|
nonEmpty: true,
|
|
4481
4588
|
});
|
|
4482
|
-
throw new UserDefinedError(message, node
|
|
4589
|
+
throw new UserDefinedError(message, node[2]);
|
|
4483
4590
|
},
|
|
4484
4591
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4485
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4486
|
-
return getUndefinedSymbols(node
|
|
4592
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4593
|
+
return getUndefinedSymbols([node[1][1]], contextStack, builtin, evaluateNode);
|
|
4487
4594
|
},
|
|
4488
4595
|
};
|
|
4489
4596
|
|
|
@@ -4491,29 +4598,29 @@ var trySpecialExpression = {
|
|
|
4491
4598
|
paramCount: 1,
|
|
4492
4599
|
evaluate: function (node, contextStack, _a) {
|
|
4493
4600
|
var _b;
|
|
4494
|
-
var
|
|
4495
|
-
var
|
|
4601
|
+
var evaluateNode = _a.evaluateNode;
|
|
4602
|
+
var _c = __read(node[1], 4), tryExpression = _c[1], errorSymbol = _c[2], catchExpression = _c[3];
|
|
4496
4603
|
try {
|
|
4497
|
-
return
|
|
4604
|
+
return evaluateNode(tryExpression, contextStack);
|
|
4498
4605
|
}
|
|
4499
4606
|
catch (error) {
|
|
4500
|
-
var newContext =
|
|
4607
|
+
var newContext = errorSymbol
|
|
4501
4608
|
? (_b = {},
|
|
4502
|
-
_b[
|
|
4609
|
+
_b[errorSymbol[1]] = { value: error },
|
|
4503
4610
|
_b) : {};
|
|
4504
|
-
return
|
|
4611
|
+
return evaluateNode(catchExpression, contextStack.create(newContext));
|
|
4505
4612
|
}
|
|
4506
4613
|
},
|
|
4507
4614
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4508
4615
|
var _b;
|
|
4509
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4510
|
-
var
|
|
4511
|
-
var tryResult = getUndefinedSymbols(
|
|
4512
|
-
var newContext =
|
|
4616
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4617
|
+
var _c = __read(node[1], 4), tryExpression = _c[1], errorSymbol = _c[2], catchExpression = _c[3];
|
|
4618
|
+
var tryResult = getUndefinedSymbols([tryExpression], contextStack, builtin, evaluateNode);
|
|
4619
|
+
var newContext = errorSymbol
|
|
4513
4620
|
? (_b = {},
|
|
4514
|
-
_b[
|
|
4621
|
+
_b[errorSymbol[1]] = { value: true },
|
|
4515
4622
|
_b) : {};
|
|
4516
|
-
var catchResult = getUndefinedSymbols([catchExpression], contextStack.create(newContext), builtin,
|
|
4623
|
+
var catchResult = getUndefinedSymbols([catchExpression], contextStack.create(newContext), builtin, evaluateNode);
|
|
4517
4624
|
return joinSets(tryResult, catchResult);
|
|
4518
4625
|
},
|
|
4519
4626
|
};
|
|
@@ -4522,20 +4629,20 @@ var arraySpecialExpression = {
|
|
|
4522
4629
|
paramCount: {},
|
|
4523
4630
|
evaluate: function (node, contextStack, _a) {
|
|
4524
4631
|
var e_1, _b;
|
|
4525
|
-
var
|
|
4632
|
+
var evaluateNode = _a.evaluateNode;
|
|
4526
4633
|
var result = [];
|
|
4527
4634
|
try {
|
|
4528
|
-
for (var _c = __values(node
|
|
4635
|
+
for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
4529
4636
|
var param = _d.value;
|
|
4530
|
-
if (param
|
|
4531
|
-
var spreadValue =
|
|
4637
|
+
if (isSpreadNode(param)) {
|
|
4638
|
+
var spreadValue = evaluateNode(param[1], contextStack);
|
|
4532
4639
|
if (!Array.isArray(spreadValue)) {
|
|
4533
|
-
throw new LitsError('Spread value is not an array', param
|
|
4640
|
+
throw new LitsError('Spread value is not an array', param[2]);
|
|
4534
4641
|
}
|
|
4535
4642
|
result.push.apply(result, __spreadArray([], __read(spreadValue), false));
|
|
4536
4643
|
}
|
|
4537
4644
|
else {
|
|
4538
|
-
result.push(
|
|
4645
|
+
result.push(evaluateNode(param, contextStack));
|
|
4539
4646
|
}
|
|
4540
4647
|
}
|
|
4541
4648
|
}
|
|
@@ -4549,156 +4656,169 @@ var arraySpecialExpression = {
|
|
|
4549
4656
|
return result;
|
|
4550
4657
|
},
|
|
4551
4658
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4552
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4553
|
-
return getUndefinedSymbols(node
|
|
4659
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4660
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
4554
4661
|
},
|
|
4555
4662
|
};
|
|
4556
4663
|
|
|
4557
4664
|
var objectSpecialExpression = {
|
|
4558
4665
|
paramCount: {},
|
|
4559
4666
|
evaluate: function (node, contextStack, _a) {
|
|
4560
|
-
var
|
|
4667
|
+
var evaluateNode = _a.evaluateNode;
|
|
4561
4668
|
var result = {};
|
|
4562
|
-
|
|
4563
|
-
|
|
4564
|
-
|
|
4565
|
-
|
|
4669
|
+
var params = node[1][1];
|
|
4670
|
+
for (var i = 0; i < params.length; i += 2) {
|
|
4671
|
+
var keyNode = params[i];
|
|
4672
|
+
if (isSpreadNode(keyNode)) {
|
|
4673
|
+
var spreadObject = evaluateNode(keyNode[1], contextStack);
|
|
4566
4674
|
if (!isUnknownRecord(spreadObject)) {
|
|
4567
|
-
throw new LitsError('Spread value is not an object', keyNode
|
|
4675
|
+
throw new LitsError('Spread value is not an object', keyNode[2]);
|
|
4568
4676
|
}
|
|
4569
4677
|
Object.assign(result, spreadObject);
|
|
4570
4678
|
i -= 1;
|
|
4571
4679
|
}
|
|
4572
4680
|
else {
|
|
4573
|
-
var key =
|
|
4574
|
-
var value =
|
|
4575
|
-
assertString(key, keyNode
|
|
4681
|
+
var key = evaluateNode(keyNode, contextStack);
|
|
4682
|
+
var value = evaluateNode(params[i + 1], contextStack);
|
|
4683
|
+
assertString(key, keyNode[2]);
|
|
4576
4684
|
result[key] = value;
|
|
4577
4685
|
}
|
|
4578
4686
|
}
|
|
4579
4687
|
return result;
|
|
4580
4688
|
},
|
|
4581
4689
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4582
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4583
|
-
return getUndefinedSymbols(node
|
|
4690
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4691
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
4584
4692
|
},
|
|
4585
4693
|
};
|
|
4586
4694
|
|
|
4587
|
-
var specialExpressions =
|
|
4588
|
-
|
|
4589
|
-
|
|
4590
|
-
|
|
4591
|
-
|
|
4592
|
-
|
|
4593
|
-
|
|
4594
|
-
|
|
4595
|
-
|
|
4596
|
-
|
|
4597
|
-
|
|
4598
|
-
|
|
4599
|
-
|
|
4600
|
-
|
|
4601
|
-
|
|
4602
|
-
|
|
4603
|
-
|
|
4604
|
-
|
|
4605
|
-
|
|
4606
|
-
|
|
4607
|
-
|
|
4608
|
-
|
|
4609
|
-
|
|
4610
|
-
|
|
4695
|
+
var specialExpressions = [
|
|
4696
|
+
qqSpecialExpression,
|
|
4697
|
+
andSpecialExpression,
|
|
4698
|
+
orSpecialExpression,
|
|
4699
|
+
arraySpecialExpression,
|
|
4700
|
+
condSpecialExpression,
|
|
4701
|
+
defSpecialExpression,
|
|
4702
|
+
definedSpecialExpression,
|
|
4703
|
+
defnSpecialExpression,
|
|
4704
|
+
doSpecialExpression,
|
|
4705
|
+
doseqSpecialExpression,
|
|
4706
|
+
fnSpecialExpression,
|
|
4707
|
+
forSpecialExpression,
|
|
4708
|
+
functionSpecialExpression,
|
|
4709
|
+
ifSpecialExpression,
|
|
4710
|
+
letSpecialExpression,
|
|
4711
|
+
loopSpecialExpression,
|
|
4712
|
+
objectSpecialExpression,
|
|
4713
|
+
recurSpecialExpression,
|
|
4714
|
+
switchSpecialExpression,
|
|
4715
|
+
throwSpecialExpression,
|
|
4716
|
+
trySpecialExpression,
|
|
4717
|
+
unlessSpecialExpression,
|
|
4718
|
+
];
|
|
4611
4719
|
var builtin = {
|
|
4612
4720
|
normalExpressions: normalExpressions,
|
|
4613
4721
|
specialExpressions: specialExpressions,
|
|
4722
|
+
allNormalExpressions: allNormalExpressions,
|
|
4614
4723
|
};
|
|
4615
4724
|
var normalExpressionKeys = Object.keys(normalExpressions);
|
|
4616
|
-
var specialExpressionKeys = Object.keys(
|
|
4725
|
+
var specialExpressionKeys = Object.keys(specialExpressionTypes);
|
|
4726
|
+
new Set(specialExpressionKeys);
|
|
4617
4727
|
|
|
4618
|
-
var getUndefinedSymbols = function (ast, contextStack, builtin,
|
|
4728
|
+
var getUndefinedSymbols = function (ast, contextStack, builtin, evaluateNode) {
|
|
4619
4729
|
var e_1, _a;
|
|
4620
4730
|
var _b;
|
|
4621
|
-
var
|
|
4731
|
+
var nodes = Array.isArray(ast)
|
|
4622
4732
|
? ast
|
|
4623
|
-
: [
|
|
4624
|
-
type: 'SpecialExpression',
|
|
4625
|
-
name: 'do',
|
|
4626
|
-
params: ast.body,
|
|
4627
|
-
sourceCodeInfo: undefined,
|
|
4628
|
-
}];
|
|
4733
|
+
: [[NodeTypes.SpecialExpression, [specialExpressionTypes.do, ast.body]]];
|
|
4629
4734
|
var unresolvedSymbols = new Set();
|
|
4630
4735
|
try {
|
|
4631
|
-
for (var
|
|
4632
|
-
var subNode =
|
|
4633
|
-
(_b =
|
|
4736
|
+
for (var nodes_1 = __values(nodes), nodes_1_1 = nodes_1.next(); !nodes_1_1.done; nodes_1_1 = nodes_1.next()) {
|
|
4737
|
+
var subNode = nodes_1_1.value;
|
|
4738
|
+
(_b = findUnresolvedSymbolsInNode(subNode, contextStack, builtin, evaluateNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols.add(symbol); });
|
|
4634
4739
|
}
|
|
4635
4740
|
}
|
|
4636
4741
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
4637
4742
|
finally {
|
|
4638
4743
|
try {
|
|
4639
|
-
if (
|
|
4744
|
+
if (nodes_1_1 && !nodes_1_1.done && (_a = nodes_1.return)) _a.call(nodes_1);
|
|
4640
4745
|
}
|
|
4641
4746
|
finally { if (e_1) throw e_1.error; }
|
|
4642
4747
|
}
|
|
4643
4748
|
return unresolvedSymbols;
|
|
4644
4749
|
};
|
|
4645
|
-
function
|
|
4750
|
+
function findUnresolvedSymbolsInNode(node, contextStack, builtin, evaluateNode) {
|
|
4646
4751
|
var e_2, _a;
|
|
4647
|
-
var _b;
|
|
4648
|
-
|
|
4649
|
-
|
|
4650
|
-
|
|
4752
|
+
var _b, _c;
|
|
4753
|
+
var nodeType = node[0];
|
|
4754
|
+
switch (nodeType) {
|
|
4755
|
+
case NodeTypes.UserDefinedSymbol: {
|
|
4756
|
+
var symbolNode = node;
|
|
4757
|
+
var lookUpResult = contextStack.lookUp(symbolNode);
|
|
4651
4758
|
if (lookUpResult === null)
|
|
4652
|
-
return new Set([
|
|
4759
|
+
return new Set([symbolNode[1]]);
|
|
4653
4760
|
return null;
|
|
4654
4761
|
}
|
|
4655
|
-
case
|
|
4656
|
-
case
|
|
4657
|
-
case
|
|
4658
|
-
case
|
|
4659
|
-
case
|
|
4762
|
+
case NodeTypes.NormalBuiltinSymbol:
|
|
4763
|
+
case NodeTypes.SpecialBuiltinSymbol:
|
|
4764
|
+
case NodeTypes.String:
|
|
4765
|
+
case NodeTypes.Number:
|
|
4766
|
+
case NodeTypes.ReservedSymbol:
|
|
4767
|
+
case NodeTypes.Binding:
|
|
4660
4768
|
return null;
|
|
4661
|
-
case
|
|
4769
|
+
case NodeTypes.NormalExpression: {
|
|
4770
|
+
var normalExpressionNode = node;
|
|
4662
4771
|
var unresolvedSymbols_1 = new Set();
|
|
4663
|
-
|
|
4664
|
-
|
|
4665
|
-
|
|
4666
|
-
|
|
4667
|
-
|
|
4772
|
+
if (isNormalExpressionNodeWithName(normalExpressionNode)) {
|
|
4773
|
+
var _d = __read(normalExpressionNode, 2), _e = __read(_d[1], 1), symbolNode = _e[0];
|
|
4774
|
+
if (isUserDefinedSymbolNode(symbolNode)) {
|
|
4775
|
+
var lookUpResult = contextStack.lookUp(symbolNode);
|
|
4776
|
+
if (lookUpResult === null)
|
|
4777
|
+
unresolvedSymbols_1.add(symbolNode[1]);
|
|
4778
|
+
}
|
|
4779
|
+
}
|
|
4780
|
+
else {
|
|
4781
|
+
var _f = __read(normalExpressionNode, 2), _g = __read(_f[1], 1), expressionNode = _g[0];
|
|
4782
|
+
(_b = findUnresolvedSymbolsInNode(expressionNode, contextStack, builtin, evaluateNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
|
|
4668
4783
|
}
|
|
4669
4784
|
try {
|
|
4670
|
-
for (var
|
|
4671
|
-
var subNode =
|
|
4672
|
-
(
|
|
4785
|
+
for (var _h = __values(normalExpressionNode[1][1]), _j = _h.next(); !_j.done; _j = _h.next()) {
|
|
4786
|
+
var subNode = _j.value;
|
|
4787
|
+
(_c = findUnresolvedSymbolsInNode(subNode, contextStack, builtin, evaluateNode)) === null || _c === void 0 ? void 0 : _c.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
|
|
4673
4788
|
}
|
|
4674
4789
|
}
|
|
4675
4790
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
4676
4791
|
finally {
|
|
4677
4792
|
try {
|
|
4678
|
-
if (
|
|
4793
|
+
if (_j && !_j.done && (_a = _h.return)) _a.call(_h);
|
|
4679
4794
|
}
|
|
4680
4795
|
finally { if (e_2) throw e_2.error; }
|
|
4681
4796
|
}
|
|
4682
4797
|
return unresolvedSymbols_1;
|
|
4683
4798
|
}
|
|
4684
|
-
case
|
|
4685
|
-
var
|
|
4686
|
-
|
|
4687
|
-
|
|
4799
|
+
case NodeTypes.SpecialExpression: {
|
|
4800
|
+
var specialExpressionNode = node;
|
|
4801
|
+
var specialExpressionType = specialExpressionNode[1][0];
|
|
4802
|
+
var specialExpression = builtin.specialExpressions[specialExpressionType];
|
|
4803
|
+
var castedGetUndefinedSymbols = specialExpression.getUndefinedSymbols;
|
|
4804
|
+
return castedGetUndefinedSymbols(specialExpressionNode, contextStack, {
|
|
4688
4805
|
getUndefinedSymbols: getUndefinedSymbols,
|
|
4689
4806
|
builtin: builtin,
|
|
4690
|
-
|
|
4807
|
+
evaluateNode: evaluateNode,
|
|
4691
4808
|
});
|
|
4692
4809
|
}
|
|
4693
|
-
case
|
|
4694
|
-
return
|
|
4810
|
+
case NodeTypes.Spread:
|
|
4811
|
+
return findUnresolvedSymbolsInNode(node[1], contextStack, builtin, evaluateNode);
|
|
4812
|
+
/* v8 ignore next 2 */
|
|
4813
|
+
default:
|
|
4814
|
+
throw new Error("Unhandled node type: ".concat(nodeType));
|
|
4695
4815
|
}
|
|
4696
4816
|
}
|
|
4697
4817
|
|
|
4698
4818
|
function checkParams(evaluatedFunction, nbrOfParams, sourceCodeInfo) {
|
|
4699
|
-
var hasRest = evaluatedFunction.
|
|
4700
|
-
var minArity = evaluatedFunction.
|
|
4701
|
-
var maxArity = hasRest ? Number.MAX_SAFE_INTEGER : evaluatedFunction.
|
|
4819
|
+
var hasRest = evaluatedFunction[0].some(function (arg) { return arg[0] === bindingTargetTypes.rest; });
|
|
4820
|
+
var minArity = evaluatedFunction[0].filter(function (arg) { return arg[0] !== bindingTargetTypes.rest && arg[1][1] === undefined; }).length;
|
|
4821
|
+
var maxArity = hasRest ? Number.MAX_SAFE_INTEGER : evaluatedFunction[0].length;
|
|
4702
4822
|
if (nbrOfParams < minArity || nbrOfParams > maxArity) {
|
|
4703
4823
|
throw new LitsError("Unexpected number of arguments, got ".concat(valueToString(nbrOfParams), "."), sourceCodeInfo);
|
|
4704
4824
|
}
|
|
@@ -4722,21 +4842,21 @@ var functionExecutors = {
|
|
|
4722
4842
|
}
|
|
4723
4843
|
},
|
|
4724
4844
|
UserDefined: function (fn, params, sourceCodeInfo, contextStack, _a) {
|
|
4725
|
-
var
|
|
4845
|
+
var evaluateNode = _a.evaluateNode;
|
|
4726
4846
|
var _loop_1 = function () {
|
|
4727
4847
|
var e_1, _b;
|
|
4728
4848
|
checkParams(fn.evaluatedfunction, params.length, sourceCodeInfo);
|
|
4729
4849
|
var evaluatedFunction = fn.evaluatedfunction;
|
|
4730
|
-
var args = evaluatedFunction
|
|
4731
|
-
var nbrOfNonRestArgs = args.filter(function (arg) { return arg
|
|
4732
|
-
var newContextStack = contextStack.create(fn.evaluatedfunction
|
|
4850
|
+
var args = evaluatedFunction[0];
|
|
4851
|
+
var nbrOfNonRestArgs = args.filter(function (arg) { return arg[0] !== bindingTargetTypes.rest; }).length;
|
|
4852
|
+
var newContextStack = contextStack.create(fn.evaluatedfunction[2]);
|
|
4733
4853
|
var newContext = {};
|
|
4734
4854
|
var rest = [];
|
|
4735
4855
|
for (var i = 0; i < params.length; i += 1) {
|
|
4736
4856
|
if (i < nbrOfNonRestArgs) {
|
|
4737
4857
|
var param = toAny(params[i]);
|
|
4738
|
-
var valueRecord = evalueateBindingNodeValues(args[i], param, function (
|
|
4739
|
-
return
|
|
4858
|
+
var valueRecord = evalueateBindingNodeValues(args[i], param, function (Node) {
|
|
4859
|
+
return evaluateNode(Node, newContextStack.create(newContext));
|
|
4740
4860
|
});
|
|
4741
4861
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4742
4862
|
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
@@ -4749,18 +4869,18 @@ var functionExecutors = {
|
|
|
4749
4869
|
}
|
|
4750
4870
|
for (var i = params.length; i < nbrOfNonRestArgs; i++) {
|
|
4751
4871
|
var arg = args[i];
|
|
4752
|
-
var defaultValue =
|
|
4753
|
-
var valueRecord = evalueateBindingNodeValues(arg, defaultValue, function (
|
|
4754
|
-
return
|
|
4872
|
+
var defaultValue = evaluateNode(arg[1][1], contextStack.create(newContext));
|
|
4873
|
+
var valueRecord = evalueateBindingNodeValues(arg, defaultValue, function (Node) {
|
|
4874
|
+
return evaluateNode(Node, contextStack.create(newContext));
|
|
4755
4875
|
});
|
|
4756
4876
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4757
4877
|
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
4758
4878
|
newContext[key] = { value: value };
|
|
4759
4879
|
});
|
|
4760
4880
|
}
|
|
4761
|
-
var restArgument = args.find(function (arg) { return arg
|
|
4881
|
+
var restArgument = args.find(function (arg) { return arg[0] === bindingTargetTypes.rest; });
|
|
4762
4882
|
if (restArgument !== undefined) {
|
|
4763
|
-
var valueRecord = evalueateBindingNodeValues(restArgument, rest, function (
|
|
4883
|
+
var valueRecord = evalueateBindingNodeValues(restArgument, rest, function (Node) { return evaluateNode(Node, contextStack.create(newContext)); });
|
|
4764
4884
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4765
4885
|
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
4766
4886
|
newContext[key] = { value: value };
|
|
@@ -4770,9 +4890,9 @@ var functionExecutors = {
|
|
|
4770
4890
|
var result = null;
|
|
4771
4891
|
var newContextStack2 = newContextStack.create(newContext);
|
|
4772
4892
|
try {
|
|
4773
|
-
for (var _c = (e_1 = void 0, __values(evaluatedFunction
|
|
4893
|
+
for (var _c = (e_1 = void 0, __values(evaluatedFunction[1])), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
4774
4894
|
var node = _d.value;
|
|
4775
|
-
result =
|
|
4895
|
+
result = evaluateNode(node, newContextStack2);
|
|
4776
4896
|
}
|
|
4777
4897
|
}
|
|
4778
4898
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
@@ -4896,7 +5016,7 @@ var functionExecutors = {
|
|
|
4896
5016
|
},
|
|
4897
5017
|
Builtin: function (fn, params, sourceCodeInfo, contextStack, _a) {
|
|
4898
5018
|
var executeFunction = _a.executeFunction;
|
|
4899
|
-
var normalExpression = asNonUndefined(
|
|
5019
|
+
var normalExpression = asNonUndefined(allNormalExpressions[fn.normalBuitinSymbolType], sourceCodeInfo);
|
|
4900
5020
|
return normalExpression.evaluate(params, sourceCodeInfo, contextStack, { executeFunction: executeFunction });
|
|
4901
5021
|
},
|
|
4902
5022
|
};
|
|
@@ -4907,7 +5027,7 @@ function evaluate(ast, contextStack) {
|
|
|
4907
5027
|
try {
|
|
4908
5028
|
for (var _b = __values(ast.body), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
4909
5029
|
var node = _c.value;
|
|
4910
|
-
result =
|
|
5030
|
+
result = evaluateNode(node, contextStack);
|
|
4911
5031
|
}
|
|
4912
5032
|
}
|
|
4913
5033
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
@@ -4919,53 +5039,66 @@ function evaluate(ast, contextStack) {
|
|
|
4919
5039
|
}
|
|
4920
5040
|
return result;
|
|
4921
5041
|
}
|
|
4922
|
-
function
|
|
4923
|
-
switch (node
|
|
4924
|
-
case
|
|
5042
|
+
function evaluateNode(node, contextStack) {
|
|
5043
|
+
switch (node[0]) {
|
|
5044
|
+
case NodeTypes.Number:
|
|
4925
5045
|
return evaluateNumber(node);
|
|
4926
|
-
case
|
|
5046
|
+
case NodeTypes.String:
|
|
4927
5047
|
return evaluateString(node);
|
|
4928
|
-
case
|
|
4929
|
-
|
|
4930
|
-
case
|
|
4931
|
-
return
|
|
4932
|
-
case
|
|
5048
|
+
case NodeTypes.NormalBuiltinSymbol:
|
|
5049
|
+
case NodeTypes.SpecialBuiltinSymbol:
|
|
5050
|
+
case NodeTypes.UserDefinedSymbol:
|
|
5051
|
+
return contextStack.evaluateSymbol(node);
|
|
5052
|
+
case NodeTypes.ReservedSymbol:
|
|
5053
|
+
return evaluateReservedSymbol(node);
|
|
5054
|
+
case NodeTypes.NormalExpression:
|
|
4933
5055
|
return evaluateNormalExpression(node, contextStack);
|
|
4934
|
-
case
|
|
5056
|
+
case NodeTypes.SpecialExpression:
|
|
4935
5057
|
return evaluateSpecialExpression(node, contextStack);
|
|
4936
5058
|
/* v8 ignore next 2 */
|
|
4937
5059
|
default:
|
|
4938
|
-
throw new LitsError("".concat(node
|
|
5060
|
+
throw new LitsError("".concat(getNodeTypeName(node[0]), "-node cannot be evaluated"), node[2]);
|
|
4939
5061
|
}
|
|
4940
5062
|
}
|
|
4941
5063
|
function evaluateNumber(node) {
|
|
4942
|
-
return node
|
|
5064
|
+
return node[1];
|
|
4943
5065
|
}
|
|
4944
5066
|
function evaluateString(node) {
|
|
4945
|
-
return node
|
|
5067
|
+
return node[1];
|
|
4946
5068
|
}
|
|
4947
|
-
function
|
|
4948
|
-
var reservedName = node
|
|
5069
|
+
function evaluateReservedSymbol(node) {
|
|
5070
|
+
var reservedName = node[1];
|
|
4949
5071
|
var value = reservedSymbolRecord[reservedName];
|
|
4950
|
-
return asNonUndefined(value, node
|
|
5072
|
+
return asNonUndefined(value, node[2]);
|
|
4951
5073
|
}
|
|
4952
5074
|
function evaluateNormalExpression(node, contextStack) {
|
|
4953
|
-
var
|
|
4954
|
-
var
|
|
5075
|
+
var sourceCodeInfo = node[2];
|
|
5076
|
+
var paramNodes = node[1][1];
|
|
5077
|
+
var params = paramNodes.map(function (paramNode) { return evaluateNode(paramNode, contextStack); });
|
|
4955
5078
|
if (isNormalExpressionNodeWithName(node)) {
|
|
4956
|
-
var
|
|
4957
|
-
if (
|
|
4958
|
-
|
|
4959
|
-
|
|
5079
|
+
var nameSymbol = node[1][0];
|
|
5080
|
+
if (isNormalBuiltinSymbolNode(nameSymbol)) {
|
|
5081
|
+
var type = nameSymbol[1];
|
|
5082
|
+
var normalExpression = builtin.allNormalExpressions[type];
|
|
5083
|
+
return normalExpression.evaluate(params, node[2], contextStack, { executeFunction: executeFunction });
|
|
5084
|
+
}
|
|
5085
|
+
else {
|
|
5086
|
+
var fn = contextStack.getValue(nameSymbol[1]);
|
|
5087
|
+
if (fn !== undefined) {
|
|
5088
|
+
return executeFunction(asAny(fn), params, contextStack, sourceCodeInfo);
|
|
5089
|
+
}
|
|
5090
|
+
throw new UndefinedSymbolError(nameSymbol[1], node[2]);
|
|
5091
|
+
}
|
|
4960
5092
|
}
|
|
4961
5093
|
else {
|
|
4962
|
-
var
|
|
4963
|
-
|
|
5094
|
+
var fnNode = node[1][0];
|
|
5095
|
+
var fn = evaluateNode(fnNode, contextStack);
|
|
5096
|
+
return executeFunction(fn, params, contextStack, sourceCodeInfo);
|
|
4964
5097
|
}
|
|
4965
5098
|
}
|
|
4966
5099
|
function executeFunction(fn, params, contextStack, sourceCodeInfo) {
|
|
4967
5100
|
if (isLitsFunction(fn))
|
|
4968
|
-
return functionExecutors[fn.functionType](fn, params, sourceCodeInfo, contextStack, {
|
|
5101
|
+
return functionExecutors[fn.functionType](fn, params, sourceCodeInfo, contextStack, { evaluateNode: evaluateNode, executeFunction: executeFunction });
|
|
4969
5102
|
if (Array.isArray(fn))
|
|
4970
5103
|
return evaluateArrayAsFunction(fn, params, sourceCodeInfo);
|
|
4971
5104
|
if (isObj(fn))
|
|
@@ -4976,16 +5109,11 @@ function executeFunction(fn, params, contextStack, sourceCodeInfo) {
|
|
|
4976
5109
|
return evaluateNumberAsFunction(fn, params, sourceCodeInfo);
|
|
4977
5110
|
throw new NotAFunctionError(fn, sourceCodeInfo);
|
|
4978
5111
|
}
|
|
4979
|
-
function evaluateBuiltinNormalExpression(node, params, contextStack) {
|
|
4980
|
-
var normalExpression = builtin.normalExpressions[node.name];
|
|
4981
|
-
if (!normalExpression)
|
|
4982
|
-
throw new UndefinedSymbolError(node.name, node.sourceCodeInfo);
|
|
4983
|
-
return normalExpression.evaluate(params, node.sourceCodeInfo, contextStack, { executeFunction: executeFunction });
|
|
4984
|
-
}
|
|
4985
5112
|
function evaluateSpecialExpression(node, contextStack) {
|
|
4986
|
-
var
|
|
4987
|
-
|
|
4988
|
-
|
|
5113
|
+
var specialExpressionType = node[1][0];
|
|
5114
|
+
var specialExpression = asNonUndefined(builtin.specialExpressions[specialExpressionType], node[2]);
|
|
5115
|
+
var castedEvaluate = specialExpression.evaluate;
|
|
5116
|
+
return castedEvaluate(node, contextStack, { evaluateNode: evaluateNode, builtin: builtin, getUndefinedSymbols: getUndefinedSymbols });
|
|
4989
5117
|
}
|
|
4990
5118
|
function evalueateObjectAsFunction(fn, params, sourceCodeInfo) {
|
|
4991
5119
|
if (params.length !== 1)
|
|
@@ -5127,13 +5255,13 @@ var ContextStackImpl = /** @class */ (function () {
|
|
|
5127
5255
|
return (_d = this.values) === null || _d === void 0 ? void 0 : _d[name];
|
|
5128
5256
|
};
|
|
5129
5257
|
ContextStackImpl.prototype.lookUp = function (node) {
|
|
5130
|
-
var e_4, _a
|
|
5131
|
-
var _c, _d
|
|
5132
|
-
var value = node
|
|
5133
|
-
var sourceCodeInfo = node.sourceCodeInfo;
|
|
5258
|
+
var e_4, _a;
|
|
5259
|
+
var _b, _c, _d;
|
|
5260
|
+
var value = node[1];
|
|
5134
5261
|
try {
|
|
5135
|
-
|
|
5136
|
-
|
|
5262
|
+
// const sourceCodeInfo = node[2]
|
|
5263
|
+
for (var _e = __values(this.contexts), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
5264
|
+
var context = _f.value;
|
|
5137
5265
|
var contextEntry = context[value];
|
|
5138
5266
|
if (contextEntry)
|
|
5139
5267
|
return contextEntry;
|
|
@@ -5142,32 +5270,23 @@ var ContextStackImpl = /** @class */ (function () {
|
|
|
5142
5270
|
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
5143
5271
|
finally {
|
|
5144
5272
|
try {
|
|
5145
|
-
if (
|
|
5273
|
+
if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
|
|
5146
5274
|
}
|
|
5147
5275
|
finally { if (e_4) throw e_4.error; }
|
|
5148
5276
|
}
|
|
5149
|
-
var lazyHostValue = (
|
|
5277
|
+
var lazyHostValue = (_b = this.lazyValues) === null || _b === void 0 ? void 0 : _b[value];
|
|
5150
5278
|
if (lazyHostValue !== undefined) {
|
|
5151
5279
|
return {
|
|
5152
5280
|
value: toAny(lazyHostValue.read()),
|
|
5153
5281
|
};
|
|
5154
5282
|
}
|
|
5155
|
-
var hostValue = (
|
|
5283
|
+
var hostValue = (_c = this.values) === null || _c === void 0 ? void 0 : _c[value];
|
|
5156
5284
|
if (hostValue !== undefined) {
|
|
5157
5285
|
return {
|
|
5158
5286
|
value: toAny(hostValue),
|
|
5159
5287
|
};
|
|
5160
5288
|
}
|
|
5161
|
-
|
|
5162
|
-
var builtinFunction = (_b = {},
|
|
5163
|
-
_b[FUNCTION_SYMBOL] = true,
|
|
5164
|
-
_b.sourceCodeInfo = sourceCodeInfo,
|
|
5165
|
-
_b.functionType = 'Builtin',
|
|
5166
|
-
_b.n = value,
|
|
5167
|
-
_b);
|
|
5168
|
-
return builtinFunction;
|
|
5169
|
-
}
|
|
5170
|
-
var nativeJsFunction = (_e = this.nativeJsFunctions) === null || _e === void 0 ? void 0 : _e[value];
|
|
5289
|
+
var nativeJsFunction = (_d = this.nativeJsFunctions) === null || _d === void 0 ? void 0 : _d[value];
|
|
5171
5290
|
if (nativeJsFunction) {
|
|
5172
5291
|
return {
|
|
5173
5292
|
value: nativeJsFunction,
|
|
@@ -5175,13 +5294,24 @@ var ContextStackImpl = /** @class */ (function () {
|
|
|
5175
5294
|
}
|
|
5176
5295
|
return null;
|
|
5177
5296
|
};
|
|
5178
|
-
ContextStackImpl.prototype.
|
|
5297
|
+
ContextStackImpl.prototype.evaluateSymbol = function (node) {
|
|
5298
|
+
var _a;
|
|
5299
|
+
if (isSpecialBuiltinSymbolNode(node)) {
|
|
5300
|
+
throw new Error('Special builtin symbols should not be evaluated');
|
|
5301
|
+
}
|
|
5302
|
+
if (isNormalBuiltinSymbolNode(node)) {
|
|
5303
|
+
var type = node[1];
|
|
5304
|
+
return _a = {},
|
|
5305
|
+
_a[FUNCTION_SYMBOL] = true,
|
|
5306
|
+
_a.functionType = 'Builtin',
|
|
5307
|
+
_a.normalBuitinSymbolType = type,
|
|
5308
|
+
_a.sourceCodeInfo = node[2],
|
|
5309
|
+
_a;
|
|
5310
|
+
}
|
|
5179
5311
|
var lookUpResult = this.lookUp(node);
|
|
5180
5312
|
if (isContextEntry(lookUpResult))
|
|
5181
5313
|
return lookUpResult.value;
|
|
5182
|
-
|
|
5183
|
-
return lookUpResult;
|
|
5184
|
-
throw new UndefinedSymbolError(node.value, node.sourceCodeInfo);
|
|
5314
|
+
throw new UndefinedSymbolError(node[1], node[2]);
|
|
5185
5315
|
};
|
|
5186
5316
|
return ContextStackImpl;
|
|
5187
5317
|
}());
|
|
@@ -5264,10 +5394,10 @@ var nonFunctionOperators = [
|
|
|
5264
5394
|
'cond',
|
|
5265
5395
|
'def',
|
|
5266
5396
|
'defined?',
|
|
5267
|
-
'defn',
|
|
5397
|
+
// 'defn',
|
|
5268
5398
|
'do',
|
|
5269
5399
|
'doseq',
|
|
5270
|
-
'fn',
|
|
5400
|
+
// 'fn',
|
|
5271
5401
|
'if',
|
|
5272
5402
|
'let',
|
|
5273
5403
|
'loop',
|
|
@@ -5716,6 +5846,10 @@ function assertReservedSymbolToken(token, symbolName) {
|
|
|
5716
5846
|
throwUnexpectedToken('ReservedSymbol', symbolName, token);
|
|
5717
5847
|
}
|
|
5718
5848
|
}
|
|
5849
|
+
function asReservedSymbolToken(token, symbolName) {
|
|
5850
|
+
assertReservedSymbolToken(token, symbolName);
|
|
5851
|
+
return token;
|
|
5852
|
+
}
|
|
5719
5853
|
function isSingleLineCommentToken(token) {
|
|
5720
5854
|
return (token === null || token === void 0 ? void 0 : token[0]) === 'SingleLineComment';
|
|
5721
5855
|
}
|
|
@@ -5798,6 +5932,9 @@ function assertRBraceToken(token) {
|
|
|
5798
5932
|
throwUnexpectedToken('RBrace', undefined, token);
|
|
5799
5933
|
}
|
|
5800
5934
|
}
|
|
5935
|
+
function isStringToken(token) {
|
|
5936
|
+
return (token === null || token === void 0 ? void 0 : token[0]) === 'String';
|
|
5937
|
+
}
|
|
5801
5938
|
function isA_BinaryOperatorToken(token) {
|
|
5802
5939
|
return (token === null || token === void 0 ? void 0 : token[0]) === 'Operator' && isBinaryOperator(token[1]);
|
|
5803
5940
|
}
|
|
@@ -5835,6 +5972,12 @@ function untokenize(tokenStream) {
|
|
|
5835
5972
|
var exponentiationPrecedence = 10;
|
|
5836
5973
|
var binaryFunctionalOperatorPrecedence = 1;
|
|
5837
5974
|
var placeholderRegexp = /^\$([1-9]\d?)?$/;
|
|
5975
|
+
function withSourceCodeInfo(node, sourceCodeInfo) {
|
|
5976
|
+
if (sourceCodeInfo) {
|
|
5977
|
+
node[2] = sourceCodeInfo;
|
|
5978
|
+
}
|
|
5979
|
+
return node;
|
|
5980
|
+
}
|
|
5838
5981
|
function getPrecedence(operatorSign) {
|
|
5839
5982
|
switch (operatorSign) {
|
|
5840
5983
|
case '**': // exponentiation
|
|
@@ -5877,29 +6020,18 @@ function getPrecedence(operatorSign) {
|
|
|
5877
6020
|
throw new Error("Unknown binary operator: ".concat(operatorSign));
|
|
5878
6021
|
}
|
|
5879
6022
|
}
|
|
5880
|
-
function createNamedNormalExpressionNode(
|
|
5881
|
-
var node =
|
|
5882
|
-
|
|
5883
|
-
|
|
5884
|
-
params: params,
|
|
5885
|
-
sourceCodeInfo: sourceCodeInfo,
|
|
5886
|
-
};
|
|
5887
|
-
var builtinExpression = builtin.normalExpressions[node.name];
|
|
5888
|
-
if (builtinExpression) {
|
|
5889
|
-
assertNumberOfParams(builtinExpression.paramCount, node);
|
|
6023
|
+
function createNamedNormalExpressionNode(symbolNode, params, sourceCodeInfo) {
|
|
6024
|
+
var node = withSourceCodeInfo([NodeTypes.NormalExpression, [symbolNode, params]], sourceCodeInfo);
|
|
6025
|
+
if (isNormalBuiltinSymbolNode(symbolNode)) {
|
|
6026
|
+
assertNumberOfParams(allNormalExpressions[symbolNode[1]].paramCount, node);
|
|
5890
6027
|
}
|
|
5891
6028
|
return node;
|
|
5892
6029
|
}
|
|
5893
6030
|
function createAccessorNode(left, right, sourceCodeInfo) {
|
|
5894
6031
|
// Unnamed normal expression
|
|
5895
|
-
return
|
|
5896
|
-
type: 'NormalExpression',
|
|
5897
|
-
params: [left, right],
|
|
5898
|
-
name: undefined,
|
|
5899
|
-
sourceCodeInfo: sourceCodeInfo,
|
|
5900
|
-
};
|
|
6032
|
+
return withSourceCodeInfo([NodeTypes.NormalExpression, [left, [right]]], sourceCodeInfo);
|
|
5901
6033
|
}
|
|
5902
|
-
function
|
|
6034
|
+
function fromBinaryOperatorToNode(operator, symbolNode, left, right, sourceCodeInfo) {
|
|
5903
6035
|
var operatorName = operator[1];
|
|
5904
6036
|
switch (operatorName) {
|
|
5905
6037
|
case '**': // exponentiation
|
|
@@ -5924,16 +6056,11 @@ function fromBinaryOperatorToAstNode(operator, left, right, sourceCodeInfo) {
|
|
|
5924
6056
|
case '&':
|
|
5925
6057
|
case '^':
|
|
5926
6058
|
case '|':
|
|
5927
|
-
return createNamedNormalExpressionNode(
|
|
6059
|
+
return createNamedNormalExpressionNode(symbolNode, [left, right], sourceCodeInfo);
|
|
5928
6060
|
case '&&':
|
|
5929
6061
|
case '||':
|
|
5930
6062
|
case '??':
|
|
5931
|
-
return
|
|
5932
|
-
type: 'SpecialExpression',
|
|
5933
|
-
name: operatorName,
|
|
5934
|
-
params: [left, right],
|
|
5935
|
-
sourceCodeInfo: sourceCodeInfo,
|
|
5936
|
-
};
|
|
6063
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes[operatorName], [left, right]]], sourceCodeInfo);
|
|
5937
6064
|
/* v8 ignore next 10 */
|
|
5938
6065
|
case '.':
|
|
5939
6066
|
case ';':
|
|
@@ -6029,9 +6156,12 @@ var Parser = /** @class */ (function () {
|
|
|
6029
6156
|
&& !(newPrecedece === exponentiationPrecedence && precedence === exponentiationPrecedence)) {
|
|
6030
6157
|
break;
|
|
6031
6158
|
}
|
|
6159
|
+
var symbol = specialExpressionTypes[name_1]
|
|
6160
|
+
? withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[name_1]], operator[2])
|
|
6161
|
+
: withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[name_1]], operator[2]);
|
|
6032
6162
|
this.advance();
|
|
6033
6163
|
var right = this.parseExpression(newPrecedece);
|
|
6034
|
-
left =
|
|
6164
|
+
left = fromBinaryOperatorToNode(operator, symbol, left, right, operator[2]);
|
|
6035
6165
|
}
|
|
6036
6166
|
else if (isSymbolToken(operator)) {
|
|
6037
6167
|
if (!isFunctionOperator(operator[1])) {
|
|
@@ -6041,9 +6171,12 @@ var Parser = /** @class */ (function () {
|
|
|
6041
6171
|
if (newPrecedece <= precedence) {
|
|
6042
6172
|
break;
|
|
6043
6173
|
}
|
|
6044
|
-
this.
|
|
6174
|
+
var operatorSymbol = this.parseSymbol();
|
|
6045
6175
|
var right = this.parseExpression(newPrecedece);
|
|
6046
|
-
|
|
6176
|
+
if (isSpecialBuiltinSymbolNode(operatorSymbol)) {
|
|
6177
|
+
throw new LitsError('Special expressions are not allowed in binary functional operators', operatorSymbol[2]);
|
|
6178
|
+
}
|
|
6179
|
+
left = createNamedNormalExpressionNode(operatorSymbol, [left, right], operator[2]);
|
|
6047
6180
|
}
|
|
6048
6181
|
else {
|
|
6049
6182
|
break;
|
|
@@ -6062,11 +6195,7 @@ var Parser = /** @class */ (function () {
|
|
|
6062
6195
|
if (!isSymbolToken(symbolToken)) {
|
|
6063
6196
|
throw new LitsError('Expected symbol', this.peek()[2]);
|
|
6064
6197
|
}
|
|
6065
|
-
var stringNode =
|
|
6066
|
-
type: 'String',
|
|
6067
|
-
value: symbolToken[1],
|
|
6068
|
-
sourceCodeInfo: symbolToken[2],
|
|
6069
|
-
};
|
|
6198
|
+
var stringNode = withSourceCodeInfo([NodeTypes.String, symbolToken[1]], symbolToken[2]);
|
|
6070
6199
|
operand = createAccessorNode(operand, stringNode, token[2]);
|
|
6071
6200
|
this.advance();
|
|
6072
6201
|
token = this.peek();
|
|
@@ -6106,16 +6235,14 @@ var Parser = /** @class */ (function () {
|
|
|
6106
6235
|
this.advance();
|
|
6107
6236
|
return expression;
|
|
6108
6237
|
}
|
|
6109
|
-
// Unary operators
|
|
6110
6238
|
else if (isOperatorToken(token)) {
|
|
6111
6239
|
var operatorName = token[1];
|
|
6112
6240
|
if (isBinaryOperator(operatorName)) {
|
|
6113
6241
|
this.advance();
|
|
6114
|
-
|
|
6115
|
-
|
|
6116
|
-
|
|
6117
|
-
|
|
6118
|
-
};
|
|
6242
|
+
if (specialExpressionTypes[operatorName] !== undefined) {
|
|
6243
|
+
return withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[operatorName]], token[2]);
|
|
6244
|
+
}
|
|
6245
|
+
return withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[operatorName]], token[2]);
|
|
6119
6246
|
}
|
|
6120
6247
|
if (operatorName === '->') {
|
|
6121
6248
|
return this.parseShorthandLamdaFunction();
|
|
@@ -6163,22 +6290,24 @@ var Parser = /** @class */ (function () {
|
|
|
6163
6290
|
while (!this.isAtEnd() && !isRBraceToken(this.peek())) {
|
|
6164
6291
|
if (isOperatorToken(this.peek(), '...')) {
|
|
6165
6292
|
this.advance();
|
|
6166
|
-
params.push(
|
|
6167
|
-
type: 'Spread',
|
|
6168
|
-
value: this.parseExpression(),
|
|
6169
|
-
sourceCodeInfo: this.peek()[2],
|
|
6170
|
-
});
|
|
6293
|
+
params.push(withSourceCodeInfo([NodeTypes.Spread, this.parseExpression()], this.peek()[2]));
|
|
6171
6294
|
}
|
|
6172
6295
|
else {
|
|
6173
|
-
var
|
|
6174
|
-
if (
|
|
6296
|
+
var token = this.peek();
|
|
6297
|
+
if (isStringToken(token)) {
|
|
6298
|
+
var stringNode = this.parseString();
|
|
6299
|
+
params.push(withSourceCodeInfo([NodeTypes.String, stringNode[1]], token[2]));
|
|
6300
|
+
}
|
|
6301
|
+
else if (isSymbolToken(token)) {
|
|
6302
|
+
var value = token[1].startsWith('\'')
|
|
6303
|
+
? this.stringFromQuotedSymbol(token[1])
|
|
6304
|
+
: token[1];
|
|
6305
|
+
params.push(withSourceCodeInfo([NodeTypes.String, value], token[2]));
|
|
6306
|
+
this.advance();
|
|
6307
|
+
}
|
|
6308
|
+
else {
|
|
6175
6309
|
throw new LitsError('Expected key to be a symbol or a string', this.peek()[2]);
|
|
6176
6310
|
}
|
|
6177
|
-
params.push({
|
|
6178
|
-
type: 'String',
|
|
6179
|
-
value: key.value,
|
|
6180
|
-
sourceCodeInfo: key.sourceCodeInfo,
|
|
6181
|
-
});
|
|
6182
6311
|
assertOperatorToken(this.peek(), ':=');
|
|
6183
6312
|
this.advance();
|
|
6184
6313
|
params.push(this.parseExpression());
|
|
@@ -6193,12 +6322,7 @@ var Parser = /** @class */ (function () {
|
|
|
6193
6322
|
}
|
|
6194
6323
|
assertRBraceToken(this.peek());
|
|
6195
6324
|
this.advance();
|
|
6196
|
-
return
|
|
6197
|
-
type: 'SpecialExpression',
|
|
6198
|
-
name: 'object',
|
|
6199
|
-
params: params,
|
|
6200
|
-
sourceCodeInfo: firstToken[2],
|
|
6201
|
-
};
|
|
6325
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.object, params]], firstToken[2]);
|
|
6202
6326
|
};
|
|
6203
6327
|
Parser.prototype.parseArray = function () {
|
|
6204
6328
|
var firstToken = asLBracketToken(this.peek());
|
|
@@ -6207,11 +6331,7 @@ var Parser = /** @class */ (function () {
|
|
|
6207
6331
|
while (!this.isAtEnd() && !isRBracketToken(this.peek())) {
|
|
6208
6332
|
if (isOperatorToken(this.peek(), '...')) {
|
|
6209
6333
|
this.advance();
|
|
6210
|
-
params.push(
|
|
6211
|
-
type: 'Spread',
|
|
6212
|
-
value: this.parseExpression(),
|
|
6213
|
-
sourceCodeInfo: this.peek()[2],
|
|
6214
|
-
});
|
|
6334
|
+
params.push(withSourceCodeInfo([NodeTypes.Spread, this.parseExpression()], this.peek()[2]));
|
|
6215
6335
|
}
|
|
6216
6336
|
else {
|
|
6217
6337
|
params.push(this.parseExpression());
|
|
@@ -6226,15 +6346,9 @@ var Parser = /** @class */ (function () {
|
|
|
6226
6346
|
}
|
|
6227
6347
|
assertRBracketToken(this.peek());
|
|
6228
6348
|
this.advance();
|
|
6229
|
-
return
|
|
6230
|
-
type: 'SpecialExpression',
|
|
6231
|
-
name: 'array',
|
|
6232
|
-
params: params,
|
|
6233
|
-
sourceCodeInfo: firstToken[2],
|
|
6234
|
-
};
|
|
6349
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.array, params]], firstToken[2]);
|
|
6235
6350
|
};
|
|
6236
6351
|
Parser.prototype.parseFunctionCall = function (symbol) {
|
|
6237
|
-
var isNamedFunction = symbol.type === 'Symbol';
|
|
6238
6352
|
this.advance();
|
|
6239
6353
|
var params = [];
|
|
6240
6354
|
while (!this.isAtEnd() && !isRParenToken(this.peek())) {
|
|
@@ -6251,45 +6365,57 @@ var Parser = /** @class */ (function () {
|
|
|
6251
6365
|
throw new LitsError('Expected closing parenthesis', this.peek()[2]);
|
|
6252
6366
|
}
|
|
6253
6367
|
this.advance();
|
|
6254
|
-
if (
|
|
6255
|
-
|
|
6256
|
-
|
|
6257
|
-
|
|
6258
|
-
|
|
6259
|
-
|
|
6260
|
-
|
|
6261
|
-
|
|
6262
|
-
|
|
6263
|
-
|
|
6264
|
-
|
|
6265
|
-
|
|
6266
|
-
|
|
6267
|
-
|
|
6268
|
-
|
|
6269
|
-
|
|
6270
|
-
|
|
6271
|
-
};
|
|
6272
|
-
assertNumberOfParams(builtin.specialExpressions[node.name].paramCount, node);
|
|
6273
|
-
return node;
|
|
6368
|
+
if (isSpecialBuiltinSymbolNode(symbol)) { // Named function
|
|
6369
|
+
var specialExpressionType = symbol[1];
|
|
6370
|
+
var type = specialExpressionType;
|
|
6371
|
+
switch (type) {
|
|
6372
|
+
case specialExpressionTypes['||']:
|
|
6373
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6374
|
+
case specialExpressionTypes['&&']:
|
|
6375
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6376
|
+
case specialExpressionTypes.recur:
|
|
6377
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6378
|
+
case specialExpressionTypes.array:
|
|
6379
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6380
|
+
case specialExpressionTypes.object:
|
|
6381
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6382
|
+
case specialExpressionTypes['??']: {
|
|
6383
|
+
if (params.length === 1) {
|
|
6384
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, [params[0], undefined]]], symbol[2]);
|
|
6274
6385
|
}
|
|
6275
|
-
|
|
6276
|
-
|
|
6277
|
-
|
|
6278
|
-
|
|
6279
|
-
|
|
6280
|
-
|
|
6281
|
-
|
|
6386
|
+
if (params.length === 2) {
|
|
6387
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, [params[0], params[1]]]], symbol[2]);
|
|
6388
|
+
}
|
|
6389
|
+
throw new LitsError('Expected exactly two parameters', symbol[2]);
|
|
6390
|
+
}
|
|
6391
|
+
case specialExpressionTypes['defined?']: {
|
|
6392
|
+
if (params.length !== 1) {
|
|
6393
|
+
throw new LitsError('Expected exactly one parameter', symbol[2]);
|
|
6394
|
+
}
|
|
6395
|
+
var _a = __read(params, 1), param = _a[0];
|
|
6396
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, param]], symbol[2]);
|
|
6397
|
+
}
|
|
6398
|
+
case specialExpressionTypes.throw: {
|
|
6399
|
+
if (params.length !== 1) {
|
|
6400
|
+
throw new LitsError('Expected exactly one parameter', symbol[2]);
|
|
6401
|
+
}
|
|
6402
|
+
var _b = __read(params, 1), param = _b[0];
|
|
6403
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, param]], symbol[2]);
|
|
6282
6404
|
}
|
|
6405
|
+
case specialExpressionTypes['0_fn']:
|
|
6406
|
+
case specialExpressionTypes['0_def']:
|
|
6407
|
+
case specialExpressionTypes['0_defn']:
|
|
6408
|
+
throw new LitsError("".concat(type, " is not allowed"), symbol[2]);
|
|
6409
|
+
/* v8 ignore next 2 */
|
|
6410
|
+
default:
|
|
6411
|
+
throw new Error("Unknown special expression: ".concat(type));
|
|
6283
6412
|
}
|
|
6284
|
-
|
|
6413
|
+
}
|
|
6414
|
+
else if (isNormalBuiltinSymbolNode(symbol) || isNormalBuiltinSymbolNode(symbol)) {
|
|
6415
|
+
return createNamedNormalExpressionNode(symbol, params, symbol[2]);
|
|
6285
6416
|
}
|
|
6286
6417
|
else {
|
|
6287
|
-
return
|
|
6288
|
-
type: 'NormalExpression',
|
|
6289
|
-
name: undefined,
|
|
6290
|
-
params: __spreadArray([symbol], __read(params), false),
|
|
6291
|
-
sourceCodeInfo: symbol.sourceCodeInfo,
|
|
6292
|
-
};
|
|
6418
|
+
return withSourceCodeInfo([NodeTypes.NormalExpression, [symbol, params]], symbol[2]);
|
|
6293
6419
|
}
|
|
6294
6420
|
};
|
|
6295
6421
|
Parser.prototype.parseLambdaFunction = function () {
|
|
@@ -6306,16 +6432,10 @@ var Parser = /** @class */ (function () {
|
|
|
6306
6432
|
}
|
|
6307
6433
|
this.advance();
|
|
6308
6434
|
var body = this.parseExpression();
|
|
6309
|
-
return
|
|
6310
|
-
|
|
6311
|
-
|
|
6312
|
-
|
|
6313
|
-
function: {
|
|
6314
|
-
arguments: functionArguments,
|
|
6315
|
-
body: [body],
|
|
6316
|
-
},
|
|
6317
|
-
sourceCodeInfo: firstToken[2],
|
|
6318
|
-
};
|
|
6435
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes['0_fn'], [
|
|
6436
|
+
functionArguments,
|
|
6437
|
+
[body],
|
|
6438
|
+
]]], firstToken[2]);
|
|
6319
6439
|
}
|
|
6320
6440
|
catch (_a) {
|
|
6321
6441
|
return null;
|
|
@@ -6324,11 +6444,7 @@ var Parser = /** @class */ (function () {
|
|
|
6324
6444
|
Parser.prototype.parseFunctionArguments = function () {
|
|
6325
6445
|
var firstToken = this.peek();
|
|
6326
6446
|
if (isSymbolToken(firstToken)) {
|
|
6327
|
-
return [
|
|
6328
|
-
type: 'symbol',
|
|
6329
|
-
name: this.parseSymbol().value,
|
|
6330
|
-
sourceCodeInfo: firstToken[2],
|
|
6331
|
-
}];
|
|
6447
|
+
return [withSourceCodeInfo([bindingTargetTypes.symbol, [this.parseSymbol(), undefined]], firstToken[2])];
|
|
6332
6448
|
}
|
|
6333
6449
|
assertLParenToken(firstToken);
|
|
6334
6450
|
this.advance();
|
|
@@ -6340,13 +6456,13 @@ var Parser = /** @class */ (function () {
|
|
|
6340
6456
|
throw new LitsError('Rest argument must be last', this.peek()[2]);
|
|
6341
6457
|
}
|
|
6342
6458
|
var bindingTarget = this.parseBindingTarget();
|
|
6343
|
-
if (bindingTarget
|
|
6459
|
+
if (bindingTarget[1][1] !== undefined) {
|
|
6344
6460
|
defaults = true;
|
|
6345
6461
|
}
|
|
6346
|
-
if (bindingTarget
|
|
6462
|
+
if (bindingTarget[0] === bindingTargetTypes.rest) {
|
|
6347
6463
|
rest = true;
|
|
6348
6464
|
}
|
|
6349
|
-
if (defaults && !bindingTarget
|
|
6465
|
+
if (defaults && !bindingTarget[1][1]) {
|
|
6350
6466
|
throw new LitsError('Default arguments must be last', this.peek()[2]);
|
|
6351
6467
|
}
|
|
6352
6468
|
functionArguments.push(bindingTarget);
|
|
@@ -6393,22 +6509,16 @@ var Parser = /** @class */ (function () {
|
|
|
6393
6509
|
var functionArguments = [];
|
|
6394
6510
|
for (var i = 1; i <= arity; i += 1) {
|
|
6395
6511
|
if (i === 1 && dollar1 === 'NAKED') {
|
|
6396
|
-
functionArguments.push(
|
|
6512
|
+
functionArguments.push(withSourceCodeInfo([bindingTargetTypes.symbol, [[NodeTypes.UserDefinedSymbol, '$'], undefined]], firstToken[2]));
|
|
6397
6513
|
}
|
|
6398
6514
|
else {
|
|
6399
|
-
functionArguments.push(
|
|
6515
|
+
functionArguments.push(withSourceCodeInfo([bindingTargetTypes.symbol, [[NodeTypes.UserDefinedSymbol, "$".concat(i)], undefined]], firstToken[2]));
|
|
6400
6516
|
}
|
|
6401
6517
|
}
|
|
6402
|
-
var node =
|
|
6403
|
-
|
|
6404
|
-
|
|
6405
|
-
|
|
6406
|
-
function: {
|
|
6407
|
-
arguments: functionArguments,
|
|
6408
|
-
body: [exprNode],
|
|
6409
|
-
},
|
|
6410
|
-
sourceCodeInfo: firstToken[2],
|
|
6411
|
-
};
|
|
6518
|
+
var node = withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes['0_fn'], [
|
|
6519
|
+
functionArguments,
|
|
6520
|
+
[exprNode],
|
|
6521
|
+
]]], firstToken[2]);
|
|
6412
6522
|
return node;
|
|
6413
6523
|
};
|
|
6414
6524
|
Parser.prototype.parseOptionalDefaulValue = function () {
|
|
@@ -6424,16 +6534,14 @@ var Parser = /** @class */ (function () {
|
|
|
6424
6534
|
// Symbol
|
|
6425
6535
|
if (isSymbolToken(firstToken)) {
|
|
6426
6536
|
var symbol = this.parseSymbol();
|
|
6537
|
+
if (!isUserDefinedSymbolNode(symbol)) {
|
|
6538
|
+
throw new LitsError('Expected user defined symbol', firstToken[2]);
|
|
6539
|
+
}
|
|
6427
6540
|
var defaultValue = this.parseOptionalDefaulValue();
|
|
6428
6541
|
if (requireDefaultValue && !defaultValue) {
|
|
6429
6542
|
throw new LitsError('Expected assignment', this.peek()[2]);
|
|
6430
6543
|
}
|
|
6431
|
-
return
|
|
6432
|
-
type: 'symbol',
|
|
6433
|
-
name: symbol.value,
|
|
6434
|
-
default: defaultValue,
|
|
6435
|
-
sourceCodeInfo: firstToken[2],
|
|
6436
|
-
};
|
|
6544
|
+
return withSourceCodeInfo([bindingTargetTypes.symbol, [symbol, defaultValue]], firstToken[2]);
|
|
6437
6545
|
}
|
|
6438
6546
|
// Rest
|
|
6439
6547
|
if (isOperatorToken(firstToken, '...')) {
|
|
@@ -6441,15 +6549,11 @@ var Parser = /** @class */ (function () {
|
|
|
6441
6549
|
throw new LitsError('Rest element not allowed', firstToken[2]);
|
|
6442
6550
|
}
|
|
6443
6551
|
this.advance();
|
|
6444
|
-
var symbol = this.parseSymbol();
|
|
6552
|
+
var symbol = asUserDefinedSymbolNode(this.parseSymbol());
|
|
6445
6553
|
if (isOperatorToken(this.peek(), ':=')) {
|
|
6446
6554
|
throw new LitsError('Rest argument can not have default value', this.peek()[2]);
|
|
6447
6555
|
}
|
|
6448
|
-
return
|
|
6449
|
-
type: 'rest',
|
|
6450
|
-
name: symbol.value,
|
|
6451
|
-
sourceCodeInfo: firstToken[2],
|
|
6452
|
-
};
|
|
6556
|
+
return withSourceCodeInfo([bindingTargetTypes.rest, [symbol[1], undefined]], firstToken[2]);
|
|
6453
6557
|
}
|
|
6454
6558
|
// Array
|
|
6455
6559
|
if (isLBracketToken(firstToken)) {
|
|
@@ -6468,7 +6572,7 @@ var Parser = /** @class */ (function () {
|
|
|
6468
6572
|
continue;
|
|
6469
6573
|
}
|
|
6470
6574
|
var target = this.parseBindingTarget();
|
|
6471
|
-
if (target
|
|
6575
|
+
if (target[0] === bindingTargetTypes.rest) {
|
|
6472
6576
|
rest = true;
|
|
6473
6577
|
}
|
|
6474
6578
|
elements.push(target);
|
|
@@ -6484,12 +6588,7 @@ var Parser = /** @class */ (function () {
|
|
|
6484
6588
|
if (requireDefaultValue && !defaultValue) {
|
|
6485
6589
|
throw new LitsError('Expected assignment', this.peek()[2]);
|
|
6486
6590
|
}
|
|
6487
|
-
return
|
|
6488
|
-
type: 'array',
|
|
6489
|
-
elements: elements,
|
|
6490
|
-
default: defaultValue,
|
|
6491
|
-
sourceCodeInfo: firstToken[2],
|
|
6492
|
-
};
|
|
6591
|
+
return withSourceCodeInfo([bindingTargetTypes.array, [elements, defaultValue]], firstToken[2]);
|
|
6493
6592
|
}
|
|
6494
6593
|
// Object
|
|
6495
6594
|
if (isLBraceToken(firstToken)) {
|
|
@@ -6505,40 +6604,32 @@ var Parser = /** @class */ (function () {
|
|
|
6505
6604
|
rest = true;
|
|
6506
6605
|
this.advance();
|
|
6507
6606
|
}
|
|
6508
|
-
var key = this.parseSymbol()
|
|
6607
|
+
var key = asUserDefinedSymbolNode(this.parseSymbol());
|
|
6509
6608
|
token = this.peek();
|
|
6510
6609
|
if (isReservedSymbolToken(token, 'as')) {
|
|
6511
6610
|
if (rest) {
|
|
6512
6611
|
throw new LitsError('Rest argument can not have alias', token[2]);
|
|
6513
6612
|
}
|
|
6514
6613
|
this.advance();
|
|
6515
|
-
var
|
|
6516
|
-
if (elements[
|
|
6517
|
-
throw new LitsError("Duplicate binding name: ".concat(
|
|
6614
|
+
var name_2 = asUserDefinedSymbolNode(this.parseSymbol());
|
|
6615
|
+
if (elements[name_2[1]]) {
|
|
6616
|
+
throw new LitsError("Duplicate binding name: ".concat(name_2), token[2]);
|
|
6518
6617
|
}
|
|
6519
|
-
elements[key] =
|
|
6520
|
-
type: 'symbol',
|
|
6521
|
-
name: name_3,
|
|
6522
|
-
default: this.parseOptionalDefaulValue(),
|
|
6523
|
-
sourceCodeInfo: firstToken[2],
|
|
6524
|
-
};
|
|
6618
|
+
elements[key[1]] = withSourceCodeInfo([bindingTargetTypes.symbol, [name_2, this.parseOptionalDefaulValue()]], firstToken[2]);
|
|
6525
6619
|
}
|
|
6526
6620
|
else if (isRBraceToken(token) || isOperatorToken(token, ',') || isOperatorToken(token, ':=')) {
|
|
6527
|
-
if (elements[key]) {
|
|
6621
|
+
if (elements[key[1]]) {
|
|
6528
6622
|
throw new LitsError("Duplicate binding name: ".concat(key), token[2]);
|
|
6529
6623
|
}
|
|
6530
6624
|
if (rest && isOperatorToken(this.peek(), ':=')) {
|
|
6531
6625
|
throw new LitsError('Rest argument can not have default value', this.peek()[2]);
|
|
6532
6626
|
}
|
|
6533
|
-
elements[key] =
|
|
6534
|
-
|
|
6535
|
-
|
|
6536
|
-
default: this.parseOptionalDefaulValue(),
|
|
6537
|
-
sourceCodeInfo: firstToken[2],
|
|
6538
|
-
};
|
|
6627
|
+
elements[key[1]] = rest
|
|
6628
|
+
? withSourceCodeInfo([bindingTargetTypes.rest, [key[1], this.parseOptionalDefaulValue()]], firstToken[2])
|
|
6629
|
+
: withSourceCodeInfo([bindingTargetTypes.symbol, [key, this.parseOptionalDefaulValue()]], firstToken[2]);
|
|
6539
6630
|
}
|
|
6540
6631
|
else if (isLBraceToken(token) || isLBracketToken(token)) {
|
|
6541
|
-
elements[key] = this.parseBindingTarget();
|
|
6632
|
+
elements[key[1]] = this.parseBindingTarget();
|
|
6542
6633
|
}
|
|
6543
6634
|
if (!isRBraceToken(this.peek())) {
|
|
6544
6635
|
assertOperatorToken(this.peek(), ',');
|
|
@@ -6552,12 +6643,7 @@ var Parser = /** @class */ (function () {
|
|
|
6552
6643
|
if (requireDefaultValue && !defaultValue) {
|
|
6553
6644
|
throw new LitsError('Expected assignment', token[2]);
|
|
6554
6645
|
}
|
|
6555
|
-
return
|
|
6556
|
-
type: 'object',
|
|
6557
|
-
elements: elements,
|
|
6558
|
-
default: defaultValue,
|
|
6559
|
-
sourceCodeInfo: firstToken[2],
|
|
6560
|
-
};
|
|
6646
|
+
return withSourceCodeInfo([bindingTargetTypes.object, [elements, defaultValue]], firstToken[2]);
|
|
6561
6647
|
}
|
|
6562
6648
|
throw new LitsError('Expected symbol', this.peek()[2]);
|
|
6563
6649
|
};
|
|
@@ -6565,22 +6651,13 @@ var Parser = /** @class */ (function () {
|
|
|
6565
6651
|
if (optionalSemicolon === void 0) { optionalSemicolon = false; }
|
|
6566
6652
|
this.advance();
|
|
6567
6653
|
var target = this.parseBindingTarget({ requireDefaultValue: true, noRest: true });
|
|
6568
|
-
var value = target
|
|
6569
|
-
|
|
6654
|
+
var value = target[1][1];
|
|
6655
|
+
target[1][1] = undefined;
|
|
6570
6656
|
if (!optionalSemicolon) {
|
|
6571
6657
|
assertOperatorToken(this.peek(), ';');
|
|
6572
6658
|
}
|
|
6573
|
-
|
|
6574
|
-
|
|
6575
|
-
name: 'let',
|
|
6576
|
-
bindingNode: {
|
|
6577
|
-
type: 'Binding',
|
|
6578
|
-
target: target,
|
|
6579
|
-
value: value,
|
|
6580
|
-
sourceCodeInfo: token[2],
|
|
6581
|
-
},
|
|
6582
|
-
sourceCodeInfo: token[2],
|
|
6583
|
-
};
|
|
6659
|
+
var bindingTarget = withSourceCodeInfo([NodeTypes.Binding, [target, value]], token[2]);
|
|
6660
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.let, bindingTarget]], token[2]);
|
|
6584
6661
|
};
|
|
6585
6662
|
Parser.prototype.parseDo = function (token) {
|
|
6586
6663
|
this.advance();
|
|
@@ -6596,12 +6673,7 @@ var Parser = /** @class */ (function () {
|
|
|
6596
6673
|
}
|
|
6597
6674
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6598
6675
|
this.advance();
|
|
6599
|
-
return
|
|
6600
|
-
type: 'SpecialExpression',
|
|
6601
|
-
name: 'do',
|
|
6602
|
-
params: expressions,
|
|
6603
|
-
sourceCodeInfo: token[2],
|
|
6604
|
-
};
|
|
6676
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
|
|
6605
6677
|
};
|
|
6606
6678
|
Parser.prototype.parseLoop = function (firstToken) {
|
|
6607
6679
|
this.advance();
|
|
@@ -6611,14 +6683,9 @@ var Parser = /** @class */ (function () {
|
|
|
6611
6683
|
assertSymbolToken(token, 'let');
|
|
6612
6684
|
this.advance();
|
|
6613
6685
|
var target = this.parseBindingTarget({ requireDefaultValue: true, noRest: true });
|
|
6614
|
-
var value = target
|
|
6615
|
-
|
|
6616
|
-
bindingNodes.push(
|
|
6617
|
-
type: 'Binding',
|
|
6618
|
-
target: target,
|
|
6619
|
-
value: value,
|
|
6620
|
-
sourceCodeInfo: token[2],
|
|
6621
|
-
});
|
|
6686
|
+
var value = target[1][1];
|
|
6687
|
+
target[1][1] = undefined;
|
|
6688
|
+
bindingNodes.push(withSourceCodeInfo([NodeTypes.Binding, [target, value]], token[2]));
|
|
6622
6689
|
if (isOperatorToken(this.peek(), ',')) {
|
|
6623
6690
|
this.advance();
|
|
6624
6691
|
}
|
|
@@ -6641,13 +6708,7 @@ var Parser = /** @class */ (function () {
|
|
|
6641
6708
|
}
|
|
6642
6709
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6643
6710
|
this.advance();
|
|
6644
|
-
return
|
|
6645
|
-
type: 'SpecialExpression',
|
|
6646
|
-
name: 'loop',
|
|
6647
|
-
params: params,
|
|
6648
|
-
bindingNodes: bindingNodes,
|
|
6649
|
-
sourceCodeInfo: firstToken[2],
|
|
6650
|
-
};
|
|
6711
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.loop, bindingNodes, params]], firstToken[2]);
|
|
6651
6712
|
};
|
|
6652
6713
|
Parser.prototype.parseTry = function (token) {
|
|
6653
6714
|
this.advance();
|
|
@@ -6663,12 +6724,7 @@ var Parser = /** @class */ (function () {
|
|
|
6663
6724
|
}
|
|
6664
6725
|
var tryExpression = tryExpressions.length === 1
|
|
6665
6726
|
? tryExpressions[0]
|
|
6666
|
-
:
|
|
6667
|
-
type: 'SpecialExpression',
|
|
6668
|
-
name: 'do',
|
|
6669
|
-
params: tryExpressions,
|
|
6670
|
-
sourceCodeInfo: token[2],
|
|
6671
|
-
};
|
|
6727
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, tryExpressions]], token[2]);
|
|
6672
6728
|
assertReservedSymbolToken(this.peek(), 'catch');
|
|
6673
6729
|
this.advance();
|
|
6674
6730
|
var errorSymbol;
|
|
@@ -6692,20 +6748,8 @@ var Parser = /** @class */ (function () {
|
|
|
6692
6748
|
this.advance();
|
|
6693
6749
|
var catchExpression = catchExpressions.length === 1
|
|
6694
6750
|
? catchExpressions[0]
|
|
6695
|
-
:
|
|
6696
|
-
|
|
6697
|
-
name: 'do',
|
|
6698
|
-
params: catchExpressions,
|
|
6699
|
-
sourceCodeInfo: token[2],
|
|
6700
|
-
};
|
|
6701
|
-
return {
|
|
6702
|
-
type: 'SpecialExpression',
|
|
6703
|
-
name: 'try',
|
|
6704
|
-
params: [tryExpression],
|
|
6705
|
-
ce: catchExpression,
|
|
6706
|
-
e: errorSymbol,
|
|
6707
|
-
sourceCodeInfo: token[2],
|
|
6708
|
-
};
|
|
6751
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, catchExpressions]], token[2]);
|
|
6752
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.try, tryExpression, errorSymbol, catchExpression]], token[2]);
|
|
6709
6753
|
};
|
|
6710
6754
|
Parser.prototype.parseForOrDoseq = function (firstToken) {
|
|
6711
6755
|
var isDoseq = firstToken[1] === 'doseq';
|
|
@@ -6713,10 +6757,10 @@ var Parser = /** @class */ (function () {
|
|
|
6713
6757
|
var forLoopBindings = [];
|
|
6714
6758
|
var _loop_1 = function () {
|
|
6715
6759
|
var loopBinding = this_1.parseForLoopBinding();
|
|
6716
|
-
var existingBoundNames = forLoopBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b
|
|
6717
|
-
var newBoundNames = getAllBindingTargetNames(loopBinding
|
|
6760
|
+
var existingBoundNames = forLoopBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b[0][1][0])); });
|
|
6761
|
+
var newBoundNames = getAllBindingTargetNames(loopBinding[0][1][0]);
|
|
6718
6762
|
if (Object.keys(newBoundNames).some(function (n) { return existingBoundNames.includes(n); })) {
|
|
6719
|
-
throw new LitsError('Duplicate binding', loopBinding
|
|
6763
|
+
throw new LitsError('Duplicate binding', loopBinding[0][2]);
|
|
6720
6764
|
}
|
|
6721
6765
|
forLoopBindings.push(loopBinding);
|
|
6722
6766
|
};
|
|
@@ -6738,13 +6782,9 @@ var Parser = /** @class */ (function () {
|
|
|
6738
6782
|
}
|
|
6739
6783
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6740
6784
|
this.advance();
|
|
6741
|
-
return
|
|
6742
|
-
|
|
6743
|
-
|
|
6744
|
-
params: expressions,
|
|
6745
|
-
sourceCodeInfo: firstToken[2],
|
|
6746
|
-
l: forLoopBindings,
|
|
6747
|
-
};
|
|
6785
|
+
return isDoseq
|
|
6786
|
+
? withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.doseq, forLoopBindings, expressions]], firstToken[2])
|
|
6787
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.for, forLoopBindings, expressions]], firstToken[2]);
|
|
6748
6788
|
};
|
|
6749
6789
|
Parser.prototype.parseForLoopBinding = function () {
|
|
6750
6790
|
assertReservedSymbolToken(this.peek(), 'each');
|
|
@@ -6766,18 +6806,17 @@ var Parser = /** @class */ (function () {
|
|
|
6766
6806
|
&& !isReservedSymbolToken(token, 'each')) {
|
|
6767
6807
|
throw new LitsError('Expected symbol each, do, let, when or while', token[2]);
|
|
6768
6808
|
}
|
|
6769
|
-
var letBindings;
|
|
6809
|
+
var letBindings = [];
|
|
6770
6810
|
if (token[1] === 'let') {
|
|
6771
6811
|
modifiers.push('&let');
|
|
6772
|
-
letBindings = [];
|
|
6773
6812
|
var _loop_2 = function () {
|
|
6774
6813
|
var letNode = this_2.parseLet(token, true);
|
|
6775
|
-
var existingBoundNames = letBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b
|
|
6776
|
-
var newBoundNames = Object.keys(getAllBindingTargetNames(letNode
|
|
6814
|
+
var existingBoundNames = letBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b[1][0])); });
|
|
6815
|
+
var newBoundNames = Object.keys(getAllBindingTargetNames(letNode[1][1][1][0]));
|
|
6777
6816
|
if (newBoundNames.some(function (n) { return existingBoundNames.includes(n); })) {
|
|
6778
|
-
throw new LitsError('Duplicate binding', letNode
|
|
6817
|
+
throw new LitsError('Duplicate binding', letNode[1][1][2]);
|
|
6779
6818
|
}
|
|
6780
|
-
letBindings.push(letNode
|
|
6819
|
+
letBindings.push(letNode[1][1]);
|
|
6781
6820
|
token = this_2.peek();
|
|
6782
6821
|
if (!isSymbolToken(token, 'do') && !isReservedSymbolToken(this_2.peek(), 'each') && !isOperatorToken(token, ',')) {
|
|
6783
6822
|
throw new LitsError('Expected do, each or comma', token[2]);
|
|
@@ -6823,31 +6862,21 @@ var Parser = /** @class */ (function () {
|
|
|
6823
6862
|
if (!isSymbolToken(token, 'do') && !isReservedSymbolToken(this.peek(), 'each')) {
|
|
6824
6863
|
throw new LitsError('Expected do or each', token[2]);
|
|
6825
6864
|
}
|
|
6826
|
-
return
|
|
6827
|
-
b: bindingNode,
|
|
6828
|
-
m: modifiers,
|
|
6829
|
-
l: letBindings,
|
|
6830
|
-
wn: whenNode,
|
|
6831
|
-
we: whileNode,
|
|
6832
|
-
};
|
|
6865
|
+
return [bindingNode, letBindings, whenNode, whileNode];
|
|
6833
6866
|
};
|
|
6834
6867
|
Parser.prototype.parseBinding = function () {
|
|
6835
6868
|
var firstToken = asSymbolToken(this.peek());
|
|
6836
|
-
var name =
|
|
6837
|
-
this.advance();
|
|
6869
|
+
var name = asUserDefinedSymbolNode(this.parseSymbol());
|
|
6838
6870
|
assertReservedSymbolToken(this.peek(), 'in');
|
|
6839
6871
|
this.advance();
|
|
6840
6872
|
var value = this.parseExpression();
|
|
6841
|
-
var node =
|
|
6842
|
-
|
|
6843
|
-
|
|
6844
|
-
|
|
6845
|
-
|
|
6846
|
-
|
|
6847
|
-
|
|
6848
|
-
value: value,
|
|
6849
|
-
sourceCodeInfo: firstToken[2],
|
|
6850
|
-
};
|
|
6873
|
+
var node = withSourceCodeInfo([
|
|
6874
|
+
NodeTypes.Binding,
|
|
6875
|
+
[
|
|
6876
|
+
withSourceCodeInfo([bindingTargetTypes.symbol, [name, undefined]], firstToken[2]),
|
|
6877
|
+
value,
|
|
6878
|
+
],
|
|
6879
|
+
], firstToken[2]);
|
|
6851
6880
|
return node;
|
|
6852
6881
|
};
|
|
6853
6882
|
Parser.prototype.parseIfOrUnless = function (token) {
|
|
@@ -6870,12 +6899,7 @@ var Parser = /** @class */ (function () {
|
|
|
6870
6899
|
}
|
|
6871
6900
|
var thenExpression = thenExpressions.length === 1
|
|
6872
6901
|
? thenExpressions[0]
|
|
6873
|
-
:
|
|
6874
|
-
type: 'SpecialExpression',
|
|
6875
|
-
name: 'do',
|
|
6876
|
-
params: thenExpressions,
|
|
6877
|
-
sourceCodeInfo: token[2],
|
|
6878
|
-
};
|
|
6902
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, thenExpressions]], token[2]);
|
|
6879
6903
|
var elseExpression;
|
|
6880
6904
|
if (isReservedSymbolToken(this.peek(), 'else')) {
|
|
6881
6905
|
this.advance();
|
|
@@ -6891,25 +6915,13 @@ var Parser = /** @class */ (function () {
|
|
|
6891
6915
|
}
|
|
6892
6916
|
elseExpression = elseExpressions.length === 1
|
|
6893
6917
|
? elseExpressions[0]
|
|
6894
|
-
:
|
|
6895
|
-
type: 'SpecialExpression',
|
|
6896
|
-
name: 'do',
|
|
6897
|
-
params: elseExpressions,
|
|
6898
|
-
sourceCodeInfo: token[2],
|
|
6899
|
-
};
|
|
6918
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, elseExpressions]], token[2]);
|
|
6900
6919
|
}
|
|
6901
6920
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6902
6921
|
this.advance();
|
|
6903
|
-
|
|
6904
|
-
|
|
6905
|
-
|
|
6906
|
-
}
|
|
6907
|
-
return {
|
|
6908
|
-
type: 'SpecialExpression',
|
|
6909
|
-
name: isUnless ? 'unless' : 'if',
|
|
6910
|
-
params: params,
|
|
6911
|
-
sourceCodeInfo: token[2],
|
|
6912
|
-
};
|
|
6922
|
+
return isUnless
|
|
6923
|
+
? withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.unless, [condition, thenExpression, elseExpression]]], token[2])
|
|
6924
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.if, [condition, thenExpression, elseExpression]]], token[2]);
|
|
6913
6925
|
};
|
|
6914
6926
|
Parser.prototype.parseCond = function (token) {
|
|
6915
6927
|
this.advance();
|
|
@@ -6917,7 +6929,7 @@ var Parser = /** @class */ (function () {
|
|
|
6917
6929
|
while (!this.isAtEnd() && !isReservedSymbolToken(this.peek(), 'end')) {
|
|
6918
6930
|
assertReservedSymbolToken(this.peek(), 'case');
|
|
6919
6931
|
this.advance();
|
|
6920
|
-
|
|
6932
|
+
var caseExpression = this.parseExpression();
|
|
6921
6933
|
assertReservedSymbolToken(this.peek(), 'then');
|
|
6922
6934
|
this.advance();
|
|
6923
6935
|
var expressions = [];
|
|
@@ -6932,14 +6944,10 @@ var Parser = /** @class */ (function () {
|
|
|
6932
6944
|
throw new LitsError('Expected ;', this.peek()[2]);
|
|
6933
6945
|
}
|
|
6934
6946
|
}
|
|
6935
|
-
|
|
6947
|
+
var thenExpression = expressions.length === 1
|
|
6936
6948
|
? expressions[0]
|
|
6937
|
-
:
|
|
6938
|
-
|
|
6939
|
-
name: 'do',
|
|
6940
|
-
params: expressions,
|
|
6941
|
-
sourceCodeInfo: token[2],
|
|
6942
|
-
});
|
|
6949
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
|
|
6950
|
+
params.push([caseExpression, thenExpression]);
|
|
6943
6951
|
if (isReservedSymbolToken(this.peek(), 'end')) {
|
|
6944
6952
|
break;
|
|
6945
6953
|
}
|
|
@@ -6947,20 +6955,16 @@ var Parser = /** @class */ (function () {
|
|
|
6947
6955
|
}
|
|
6948
6956
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6949
6957
|
this.advance();
|
|
6950
|
-
return
|
|
6951
|
-
type: 'SpecialExpression',
|
|
6952
|
-
name: 'cond',
|
|
6953
|
-
params: params,
|
|
6954
|
-
sourceCodeInfo: token[2],
|
|
6955
|
-
};
|
|
6958
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.cond, params]], token[2]);
|
|
6956
6959
|
};
|
|
6957
6960
|
Parser.prototype.parseSwitch = function (token) {
|
|
6958
6961
|
this.advance();
|
|
6959
|
-
var
|
|
6962
|
+
var valueExpression = this.parseExpression();
|
|
6963
|
+
var params = [];
|
|
6960
6964
|
while (!this.isAtEnd() && !isReservedSymbolToken(this.peek(), 'end')) {
|
|
6961
6965
|
assertReservedSymbolToken(this.peek(), 'case');
|
|
6962
6966
|
this.advance();
|
|
6963
|
-
|
|
6967
|
+
var caseExpression = this.parseExpression();
|
|
6964
6968
|
assertReservedSymbolToken(this.peek(), 'then');
|
|
6965
6969
|
this.advance();
|
|
6966
6970
|
var expressions = [];
|
|
@@ -6975,14 +6979,10 @@ var Parser = /** @class */ (function () {
|
|
|
6975
6979
|
throw new LitsError('Expected ;', this.peek()[2]);
|
|
6976
6980
|
}
|
|
6977
6981
|
}
|
|
6978
|
-
|
|
6982
|
+
var thenExpression = expressions.length === 1
|
|
6979
6983
|
? expressions[0]
|
|
6980
|
-
:
|
|
6981
|
-
|
|
6982
|
-
name: 'do',
|
|
6983
|
-
params: expressions,
|
|
6984
|
-
sourceCodeInfo: token[2],
|
|
6985
|
-
});
|
|
6984
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
|
|
6985
|
+
params.push([caseExpression, thenExpression]);
|
|
6986
6986
|
if (isReservedSymbolToken(this.peek(), 'end')) {
|
|
6987
6987
|
break;
|
|
6988
6988
|
}
|
|
@@ -6990,12 +6990,7 @@ var Parser = /** @class */ (function () {
|
|
|
6990
6990
|
}
|
|
6991
6991
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6992
6992
|
this.advance();
|
|
6993
|
-
return
|
|
6994
|
-
type: 'SpecialExpression',
|
|
6995
|
-
name: 'switch',
|
|
6996
|
-
params: params,
|
|
6997
|
-
sourceCodeInfo: token[2],
|
|
6998
|
-
};
|
|
6993
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.switch, valueExpression, params]], token[2]);
|
|
6999
6994
|
};
|
|
7000
6995
|
Parser.prototype.parseFunction = function (token) {
|
|
7001
6996
|
this.advance();
|
|
@@ -7014,17 +7009,10 @@ var Parser = /** @class */ (function () {
|
|
|
7014
7009
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
7015
7010
|
this.advance();
|
|
7016
7011
|
assertOperatorToken(this.peek(), ';');
|
|
7017
|
-
return
|
|
7018
|
-
|
|
7019
|
-
|
|
7020
|
-
|
|
7021
|
-
params: [],
|
|
7022
|
-
function: {
|
|
7023
|
-
arguments: functionArguments,
|
|
7024
|
-
body: body,
|
|
7025
|
-
},
|
|
7026
|
-
sourceCodeInfo: token[2],
|
|
7027
|
-
};
|
|
7012
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.function, symbol, [
|
|
7013
|
+
functionArguments,
|
|
7014
|
+
body,
|
|
7015
|
+
]]], token[2]);
|
|
7028
7016
|
};
|
|
7029
7017
|
Parser.prototype.isAtEnd = function () {
|
|
7030
7018
|
return this.parseState.position >= this.tokenStream.tokens.length;
|
|
@@ -7046,7 +7034,7 @@ var Parser = /** @class */ (function () {
|
|
|
7046
7034
|
this.advance();
|
|
7047
7035
|
if (isSymbolToken(this.peek(), 'let')) {
|
|
7048
7036
|
var letNode = this.parseLet(asSymbolToken(this.peek()));
|
|
7049
|
-
return
|
|
7037
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes['0_def'], letNode[1][1]]], token[2]);
|
|
7050
7038
|
}
|
|
7051
7039
|
else if (isReservedSymbolToken(this.peek(), 'function')) {
|
|
7052
7040
|
this.advance();
|
|
@@ -7064,71 +7052,57 @@ var Parser = /** @class */ (function () {
|
|
|
7064
7052
|
}
|
|
7065
7053
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
7066
7054
|
this.advance();
|
|
7067
|
-
return
|
|
7068
|
-
|
|
7069
|
-
|
|
7070
|
-
|
|
7071
|
-
params: [],
|
|
7072
|
-
function: {
|
|
7073
|
-
arguments: functionArguments,
|
|
7074
|
-
body: body,
|
|
7075
|
-
},
|
|
7076
|
-
sourceCodeInfo: token[2],
|
|
7077
|
-
};
|
|
7055
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes['0_defn'], symbol, [
|
|
7056
|
+
functionArguments,
|
|
7057
|
+
body,
|
|
7058
|
+
]]], token[2]);
|
|
7078
7059
|
}
|
|
7079
7060
|
else {
|
|
7080
7061
|
throw new LitsError('Expected let or function', this.peek()[2]);
|
|
7081
7062
|
}
|
|
7082
7063
|
};
|
|
7064
|
+
Parser.prototype.stringToSymbolNode = function (value, sourceCodeInfo) {
|
|
7065
|
+
if (specialExpressionTypes[value] !== undefined && value !== 'fn' && value !== 'def' && value !== 'defn') {
|
|
7066
|
+
return withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[value]], sourceCodeInfo);
|
|
7067
|
+
}
|
|
7068
|
+
if (normalExpressionTypes[value] !== undefined) {
|
|
7069
|
+
return withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[value]], sourceCodeInfo);
|
|
7070
|
+
}
|
|
7071
|
+
return withSourceCodeInfo([NodeTypes.UserDefinedSymbol, value], sourceCodeInfo);
|
|
7072
|
+
};
|
|
7073
|
+
Parser.prototype.stringFromQuotedSymbol = function (value) {
|
|
7074
|
+
return value.substring(1, value.length - 1)
|
|
7075
|
+
.replace(/(\\{2})|(\\')|\\(.)/g, function (_, backslash, singleQuote, normalChar) {
|
|
7076
|
+
if (backslash) {
|
|
7077
|
+
return '\\';
|
|
7078
|
+
}
|
|
7079
|
+
if (singleQuote) {
|
|
7080
|
+
return '\'';
|
|
7081
|
+
}
|
|
7082
|
+
return "\\".concat(normalChar);
|
|
7083
|
+
});
|
|
7084
|
+
};
|
|
7083
7085
|
Parser.prototype.parseSymbol = function () {
|
|
7084
7086
|
var token = this.peek();
|
|
7085
7087
|
this.advance();
|
|
7086
7088
|
if (!isSymbolToken(token)) {
|
|
7087
7089
|
throw new LitsError("Expected symbol token, got ".concat(token[0]), token[2]);
|
|
7088
7090
|
}
|
|
7089
|
-
if (token[1][0]
|
|
7090
|
-
return
|
|
7091
|
-
type: 'Symbol',
|
|
7092
|
-
value: token[1],
|
|
7093
|
-
sourceCodeInfo: token[2],
|
|
7094
|
-
};
|
|
7091
|
+
if (token[1][0] === '\'') {
|
|
7092
|
+
return this.stringToSymbolNode(this.stringFromQuotedSymbol(token[1]), token[2]);
|
|
7095
7093
|
}
|
|
7096
7094
|
else {
|
|
7097
|
-
|
|
7098
|
-
.replace(/(\\{2})|(\\')|\\(.)/g, function (_, backslash, singleQuote, normalChar) {
|
|
7099
|
-
if (backslash) {
|
|
7100
|
-
return '\\';
|
|
7101
|
-
}
|
|
7102
|
-
if (singleQuote) {
|
|
7103
|
-
return '\'';
|
|
7104
|
-
}
|
|
7105
|
-
return "\\".concat(normalChar);
|
|
7106
|
-
});
|
|
7107
|
-
return {
|
|
7108
|
-
type: 'Symbol',
|
|
7109
|
-
value: value,
|
|
7110
|
-
sourceCodeInfo: token[2],
|
|
7111
|
-
};
|
|
7095
|
+
return this.stringToSymbolNode(token[1], token[2]);
|
|
7112
7096
|
}
|
|
7113
7097
|
};
|
|
7114
7098
|
Parser.prototype.parseReservedSymbol = function () {
|
|
7115
|
-
var token = this.peek();
|
|
7099
|
+
var token = asReservedSymbolToken(this.peek());
|
|
7116
7100
|
this.advance();
|
|
7117
|
-
|
|
7118
|
-
|
|
7119
|
-
|
|
7120
|
-
return {
|
|
7121
|
-
type: 'Number',
|
|
7122
|
-
value: numberReservedSymbolRecord[symbol],
|
|
7123
|
-
sourceCodeInfo: token[2],
|
|
7124
|
-
};
|
|
7125
|
-
}
|
|
7101
|
+
var symbol = token[1];
|
|
7102
|
+
if (isNumberReservedSymbol(symbol)) {
|
|
7103
|
+
return withSourceCodeInfo([NodeTypes.Number, numberReservedSymbolRecord[symbol]], token[2]);
|
|
7126
7104
|
}
|
|
7127
|
-
return
|
|
7128
|
-
type: 'ReservedSymbol',
|
|
7129
|
-
value: token[1],
|
|
7130
|
-
sourceCodeInfo: token[2],
|
|
7131
|
-
};
|
|
7105
|
+
return withSourceCodeInfo([NodeTypes.ReservedSymbol, token[1]], token[2]);
|
|
7132
7106
|
};
|
|
7133
7107
|
Parser.prototype.parseNumber = function () {
|
|
7134
7108
|
var token = this.peek();
|
|
@@ -7136,11 +7110,7 @@ var Parser = /** @class */ (function () {
|
|
|
7136
7110
|
var value = token[1];
|
|
7137
7111
|
var negative = value[0] === '-';
|
|
7138
7112
|
var numberString = (negative ? value.substring(1) : value).replace(/_/g, '');
|
|
7139
|
-
return
|
|
7140
|
-
type: 'Number',
|
|
7141
|
-
value: negative ? -Number(numberString) : Number(numberString),
|
|
7142
|
-
sourceCodeInfo: token[2],
|
|
7143
|
-
};
|
|
7113
|
+
return withSourceCodeInfo([NodeTypes.Number, negative ? -Number(numberString) : Number(numberString)], token[2]);
|
|
7144
7114
|
};
|
|
7145
7115
|
Parser.prototype.parseString = function () {
|
|
7146
7116
|
var token = this.peek();
|
|
@@ -7172,11 +7142,7 @@ var Parser = /** @class */ (function () {
|
|
|
7172
7142
|
}
|
|
7173
7143
|
return normalChar;
|
|
7174
7144
|
});
|
|
7175
|
-
return
|
|
7176
|
-
type: 'String',
|
|
7177
|
-
value: value,
|
|
7178
|
-
sourceCodeInfo: token[2],
|
|
7179
|
-
};
|
|
7145
|
+
return withSourceCodeInfo([NodeTypes.String, value], token[2]);
|
|
7180
7146
|
};
|
|
7181
7147
|
Parser.prototype.parseRegexpShorthand = function () {
|
|
7182
7148
|
var token = this.peek();
|
|
@@ -7184,22 +7150,15 @@ var Parser = /** @class */ (function () {
|
|
|
7184
7150
|
var endStringPosition = token[1].lastIndexOf('"');
|
|
7185
7151
|
var regexpString = token[1].substring(2, endStringPosition);
|
|
7186
7152
|
var optionsString = token[1].substring(endStringPosition + 1);
|
|
7187
|
-
var stringNode =
|
|
7188
|
-
|
|
7189
|
-
|
|
7190
|
-
|
|
7191
|
-
|
|
7192
|
-
|
|
7193
|
-
|
|
7194
|
-
|
|
7195
|
-
|
|
7196
|
-
};
|
|
7197
|
-
var node = {
|
|
7198
|
-
type: 'NormalExpression',
|
|
7199
|
-
name: 'regexp',
|
|
7200
|
-
params: [stringNode, optionsNode],
|
|
7201
|
-
sourceCodeInfo: token[2],
|
|
7202
|
-
};
|
|
7153
|
+
var stringNode = withSourceCodeInfo([NodeTypes.String, regexpString], token[2]);
|
|
7154
|
+
var optionsNode = withSourceCodeInfo([NodeTypes.String, optionsString], token[2]);
|
|
7155
|
+
var node = withSourceCodeInfo([
|
|
7156
|
+
NodeTypes.NormalExpression,
|
|
7157
|
+
[
|
|
7158
|
+
withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes.regexp], token[2]),
|
|
7159
|
+
[stringNode, optionsNode],
|
|
7160
|
+
],
|
|
7161
|
+
], token[2]);
|
|
7203
7162
|
return node;
|
|
7204
7163
|
};
|
|
7205
7164
|
return Parser;
|
|
@@ -7316,7 +7275,7 @@ var Lits = /** @class */ (function () {
|
|
|
7316
7275
|
if (params === void 0) { params = {}; }
|
|
7317
7276
|
var ast = typeof programOrAst === 'string' ? this.generateAst(programOrAst, params) : programOrAst;
|
|
7318
7277
|
var contextStack = createContextStack(params);
|
|
7319
|
-
return getUndefinedSymbols(ast, contextStack, builtin,
|
|
7278
|
+
return getUndefinedSymbols(ast, contextStack, builtin, evaluateNode);
|
|
7320
7279
|
};
|
|
7321
7280
|
Lits.prototype.tokenize = function (program, tokenizeParams) {
|
|
7322
7281
|
if (tokenizeParams === void 0) { tokenizeParams = {}; }
|
|
@@ -7561,28 +7520,6 @@ var api = {
|
|
|
7561
7520
|
'replace',
|
|
7562
7521
|
'replace-all',
|
|
7563
7522
|
],
|
|
7564
|
-
specialExpressions: [
|
|
7565
|
-
'&&',
|
|
7566
|
-
'||',
|
|
7567
|
-
'def',
|
|
7568
|
-
'let',
|
|
7569
|
-
'fn',
|
|
7570
|
-
'defn',
|
|
7571
|
-
'function',
|
|
7572
|
-
'try',
|
|
7573
|
-
'throw',
|
|
7574
|
-
'if',
|
|
7575
|
-
'unless',
|
|
7576
|
-
'cond',
|
|
7577
|
-
'switch',
|
|
7578
|
-
'do',
|
|
7579
|
-
'recur',
|
|
7580
|
-
'loop',
|
|
7581
|
-
'doseq',
|
|
7582
|
-
'for',
|
|
7583
|
-
'defined?',
|
|
7584
|
-
'??',
|
|
7585
|
-
],
|
|
7586
7523
|
string: [
|
|
7587
7524
|
'string-repeat',
|
|
7588
7525
|
'str',
|
|
@@ -13218,8 +13155,7 @@ Object.entries(specialExpressionsReference).forEach(function (_a) {
|
|
|
13218
13155
|
var _b;
|
|
13219
13156
|
var _c = __read(_a, 2), key = _c[0], obj = _c[1];
|
|
13220
13157
|
if (isFunctionReference(obj)) {
|
|
13221
|
-
var
|
|
13222
|
-
var paramCount = (_b = specialExpressions[key]) === null || _b === void 0 ? void 0 : _b.paramCount;
|
|
13158
|
+
var paramCount = (_b = specialExpressions[specialExpressionTypes[key]]) === null || _b === void 0 ? void 0 : _b.paramCount;
|
|
13223
13159
|
if (paramCount && canBeOperator(paramCount)) {
|
|
13224
13160
|
obj._isOperator = true;
|
|
13225
13161
|
}
|