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