@mojir/lits 2.1.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +392 -109
- package/dist/cli/cli.js +863 -914
- package/dist/cli/reference/index.d.ts +208 -208
- package/dist/cli/src/builtin/bindingNode.d.ts +2 -2
- package/dist/cli/src/builtin/index.d.ts +10 -50
- package/dist/cli/src/builtin/interface.d.ts +10 -17
- package/dist/cli/src/builtin/normalExpressions/index.d.ts +4 -1
- package/dist/cli/src/builtin/specialExpressionTypes.d.ts +27 -0
- package/dist/cli/src/builtin/specialExpressions/and.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/array.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/cond.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/def.d.ts +3 -6
- package/dist/cli/src/builtin/specialExpressions/defined.d.ts +5 -0
- package/dist/cli/src/builtin/specialExpressions/do.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/functions.d.ts +5 -13
- package/dist/cli/src/builtin/specialExpressions/if.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/let.d.ts +3 -6
- package/dist/cli/src/builtin/specialExpressions/loop.d.ts +3 -4
- package/dist/cli/src/builtin/specialExpressions/loops.d.ts +5 -14
- package/dist/cli/src/builtin/specialExpressions/object.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/or.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/qq.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/recur.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/switch.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/throw.d.ts +3 -3
- package/dist/cli/src/builtin/specialExpressions/try.d.ts +3 -5
- package/dist/cli/src/builtin/specialExpressions/unless.d.ts +3 -3
- package/dist/cli/src/builtin/utils.d.ts +2 -5
- package/dist/cli/src/constants/constants.d.ts +15 -3
- package/dist/cli/src/evaluator/ContextStack.d.ts +3 -3
- package/dist/cli/src/evaluator/functionExecutors.d.ts +3 -3
- package/dist/cli/src/evaluator/index.d.ts +2 -2
- package/dist/cli/src/evaluator/interface.d.ts +3 -3
- package/dist/cli/src/getUndefinedSymbols/index.d.ts +3 -3
- package/dist/cli/src/parser/Parser.d.ts +7 -5
- package/dist/cli/src/parser/types.d.ts +33 -96
- package/dist/cli/src/typeGuards/astNode.d.ts +24 -16
- package/dist/cli/src/typeGuards/index.d.ts +2 -5
- package/dist/cli/src/typeGuards/litsFunction.d.ts +2 -2
- package/dist/cli/src/utils/index.d.ts +0 -1
- package/dist/index.esm.js +836 -887
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +836 -887
- package/dist/index.js.map +1 -1
- package/dist/lits.iife.js +836 -887
- package/dist/lits.iife.js.map +1 -1
- package/dist/reference/index.d.ts +208 -208
- package/dist/src/builtin/bindingNode.d.ts +2 -2
- package/dist/src/builtin/index.d.ts +10 -50
- package/dist/src/builtin/interface.d.ts +10 -17
- package/dist/src/builtin/normalExpressions/index.d.ts +4 -1
- package/dist/src/builtin/specialExpressionTypes.d.ts +27 -0
- package/dist/src/builtin/specialExpressions/and.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/array.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/cond.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/def.d.ts +3 -6
- package/dist/src/builtin/specialExpressions/defined.d.ts +5 -0
- package/dist/src/builtin/specialExpressions/do.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/functions.d.ts +5 -13
- package/dist/src/builtin/specialExpressions/if.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/let.d.ts +3 -6
- package/dist/src/builtin/specialExpressions/loop.d.ts +3 -4
- package/dist/src/builtin/specialExpressions/loops.d.ts +5 -14
- package/dist/src/builtin/specialExpressions/object.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/or.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/qq.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/recur.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/switch.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/throw.d.ts +3 -3
- package/dist/src/builtin/specialExpressions/try.d.ts +3 -5
- package/dist/src/builtin/specialExpressions/unless.d.ts +3 -3
- package/dist/src/builtin/utils.d.ts +2 -5
- package/dist/src/constants/constants.d.ts +15 -3
- package/dist/src/evaluator/ContextStack.d.ts +3 -3
- package/dist/src/evaluator/functionExecutors.d.ts +3 -3
- package/dist/src/evaluator/index.d.ts +2 -2
- package/dist/src/evaluator/interface.d.ts +3 -3
- package/dist/src/getUndefinedSymbols/index.d.ts +3 -3
- package/dist/src/parser/Parser.d.ts +7 -5
- package/dist/src/parser/types.d.ts +33 -96
- package/dist/src/typeGuards/astNode.d.ts +24 -16
- package/dist/src/typeGuards/index.d.ts +2 -5
- package/dist/src/typeGuards/litsFunction.d.ts +2 -2
- package/dist/src/utils/index.d.ts +0 -1
- package/dist/testFramework.esm.js +851 -901
- package/dist/testFramework.esm.js.map +1 -1
- package/dist/testFramework.js +851 -901
- package/dist/testFramework.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/src/builtin/specialExpressions/declared.d.ts +0 -5
- package/dist/src/builtin/specialExpressions/declared.d.ts +0 -5
package/dist/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,159 @@ 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
|
-
var
|
|
3739
|
+
var specialExpressionTypes = {
|
|
3740
|
+
'??': 0,
|
|
3741
|
+
'&&': 1,
|
|
3742
|
+
'||': 2,
|
|
3743
|
+
'array': 3,
|
|
3744
|
+
'cond': 4,
|
|
3745
|
+
'def': 5,
|
|
3746
|
+
'defined?': 6,
|
|
3747
|
+
'defn': 7,
|
|
3748
|
+
'do': 8,
|
|
3749
|
+
'doseq': 9,
|
|
3750
|
+
'fn': 10,
|
|
3751
|
+
'for': 11,
|
|
3752
|
+
'function': 12,
|
|
3753
|
+
'if': 13,
|
|
3754
|
+
'let': 14,
|
|
3755
|
+
'loop': 15,
|
|
3756
|
+
'object': 16,
|
|
3757
|
+
'recur': 17,
|
|
3758
|
+
'switch': 18,
|
|
3759
|
+
'throw': 19,
|
|
3760
|
+
'try': 20,
|
|
3761
|
+
'unless': 21,
|
|
3762
|
+
};
|
|
3763
|
+
|
|
3764
|
+
function isSymbolNode(node) {
|
|
3765
|
+
var nodeType = node[0];
|
|
3766
|
+
return NodeTypes.UserDefinedSymbol === nodeType
|
|
3767
|
+
|| NodeTypes.NormalBuiltinSymbol === nodeType
|
|
3768
|
+
|| NodeTypes.SpecialBuiltinSymbol === nodeType;
|
|
3769
|
+
}
|
|
3770
|
+
function assertSymbolNode(node, sourceCodeInfo) {
|
|
3771
|
+
if (!isSymbolNode(node))
|
|
3772
|
+
throw getAssertionError('SymbolNode', node, sourceCodeInfo);
|
|
3773
|
+
}
|
|
3774
|
+
function isUserDefinedSymbolNode(node) {
|
|
3775
|
+
return NodeTypes.UserDefinedSymbol === node[0];
|
|
3776
|
+
}
|
|
3777
|
+
function asUserDefinedSymbolNode(node, sourceCodeInfo) {
|
|
3778
|
+
assertUserDefinedSymbolNode(node, sourceCodeInfo);
|
|
3779
|
+
return node;
|
|
3780
|
+
}
|
|
3781
|
+
function assertUserDefinedSymbolNode(node, sourceCodeInfo) {
|
|
3782
|
+
if (!isUserDefinedSymbolNode(node))
|
|
3783
|
+
throw getAssertionError('UserDefinedSymbolNode', node, sourceCodeInfo);
|
|
3784
|
+
}
|
|
3785
|
+
function isNormalBuiltinSymbolNode(node) {
|
|
3786
|
+
return NodeTypes.NormalBuiltinSymbol === node[0];
|
|
3787
|
+
}
|
|
3788
|
+
function isSpecialBuiltinSymbolNode(node, name) {
|
|
3789
|
+
if (NodeTypes.SpecialBuiltinSymbol !== node[0]) {
|
|
3790
|
+
return false;
|
|
3791
|
+
}
|
|
3792
|
+
{
|
|
3793
|
+
return true;
|
|
3794
|
+
}
|
|
3795
|
+
}
|
|
3796
|
+
// export function isNumberNode(node: Node): node is NumberNode {
|
|
3797
|
+
// return node[0] === NodeTypes.Number
|
|
3798
|
+
// }
|
|
3799
|
+
// export function asNumberNode(node: Node, sourceCodeInfo?: SourceCodeInfo): NumberNode {
|
|
3800
|
+
// assertNumberNode(node, sourceCodeInfo)
|
|
3801
|
+
// return node
|
|
3802
|
+
// }
|
|
3803
|
+
// export function assertNumberNode(node: Node, sourceCodeInfo?: SourceCodeInfo): asserts node is NumberNode {
|
|
3804
|
+
// if (!isNumberNode(node))
|
|
3805
|
+
// throw getAssertionError('NumberNode', node, sourceCodeInfo)
|
|
3806
|
+
// }
|
|
3807
|
+
function isNormalExpressionNode(node) {
|
|
3808
|
+
return node[0] === NodeTypes.NormalExpression;
|
|
3809
|
+
}
|
|
3810
|
+
function isNormalExpressionNodeWithName(node) {
|
|
3811
|
+
if (!isNormalExpressionNode(node)) {
|
|
3812
|
+
return false;
|
|
3813
|
+
}
|
|
3814
|
+
return isSymbolNode(node[1][0]);
|
|
3815
|
+
}
|
|
3816
|
+
function isSpreadNode(node) {
|
|
3817
|
+
return node[0] === NodeTypes.Spread;
|
|
3818
|
+
}
|
|
3819
|
+
|
|
3820
|
+
var definedSpecialExpression = {
|
|
3738
3821
|
paramCount: 1,
|
|
3739
3822
|
evaluate: function (node, contextStack) {
|
|
3740
|
-
var
|
|
3823
|
+
var symbolNode = node[1][1];
|
|
3824
|
+
assertSymbolNode(symbolNode);
|
|
3825
|
+
if (!isUserDefinedSymbolNode(symbolNode)) {
|
|
3826
|
+
return true; // If the symbol is not a user defined symbol, it is defined. normal or special builtin
|
|
3827
|
+
}
|
|
3828
|
+
var lookUpResult = contextStack.lookUp(symbolNode);
|
|
3741
3829
|
return lookUpResult !== null;
|
|
3742
3830
|
},
|
|
3743
3831
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3744
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3745
|
-
return getUndefinedSymbols(node
|
|
3832
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
3833
|
+
return getUndefinedSymbols([node[1][1]], contextStack, builtin, evaluateNode);
|
|
3746
3834
|
},
|
|
3747
3835
|
};
|
|
3748
3836
|
|
|
3749
|
-
|
|
3750
|
-
|
|
3751
|
-
|
|
3837
|
+
var bindingTargetTypes = {
|
|
3838
|
+
symbol: 11,
|
|
3839
|
+
rest: 12,
|
|
3840
|
+
object: 13,
|
|
3841
|
+
array: 14,
|
|
3842
|
+
};
|
|
3843
|
+
|
|
3844
|
+
function evalueateBindingNodeValues(target, value, evaluate) {
|
|
3845
|
+
var sourceCodeInfo = target[2];
|
|
3752
3846
|
var record = {};
|
|
3753
3847
|
createRecord(target, value, evaluate, sourceCodeInfo, record);
|
|
3754
3848
|
return record;
|
|
3755
3849
|
}
|
|
3756
3850
|
function createRecord(bindingTarget, value, evaluate, sourceCodeInfo, record) {
|
|
3757
3851
|
var _a, _b;
|
|
3758
|
-
if (bindingTarget
|
|
3852
|
+
if (bindingTarget[0] === bindingTargetTypes.object) {
|
|
3759
3853
|
assertUnknownRecord(value, sourceCodeInfo);
|
|
3760
3854
|
var capturedKeys_1 = new Set();
|
|
3761
3855
|
var restElement_1;
|
|
3762
|
-
Object.entries(bindingTarget
|
|
3856
|
+
Object.entries(bindingTarget[1][0]).forEach(function (_a) {
|
|
3763
3857
|
var _b;
|
|
3764
3858
|
var _c = __read(_a, 2), key = _c[0], element = _c[1];
|
|
3765
|
-
if (element
|
|
3859
|
+
if (element[0] === bindingTargetTypes.rest) {
|
|
3766
3860
|
restElement_1 = element;
|
|
3767
3861
|
return;
|
|
3768
3862
|
}
|
|
3769
3863
|
capturedKeys_1.add(key);
|
|
3770
|
-
var val = (_b = (value[key] !== undefined ? value[key] : element
|
|
3864
|
+
var val = (_b = (value[key] !== undefined ? value[key] : element[1][1] && evaluate(element[1][1]))) !== null && _b !== void 0 ? _b : null;
|
|
3771
3865
|
assertAny(val, sourceCodeInfo);
|
|
3772
3866
|
createRecord(element, val, evaluate, sourceCodeInfo, record);
|
|
3773
3867
|
});
|
|
@@ -3782,33 +3876,36 @@ function createRecord(bindingTarget, value, evaluate, sourceCodeInfo, record) {
|
|
|
3782
3876
|
acc[key] = asAny(val);
|
|
3783
3877
|
return acc;
|
|
3784
3878
|
}, {});
|
|
3785
|
-
record[restElement_1
|
|
3879
|
+
record[restElement_1[1][0]] = restValues;
|
|
3786
3880
|
}
|
|
3787
3881
|
}
|
|
3788
|
-
else if (bindingTarget
|
|
3882
|
+
else if (bindingTarget[0] === bindingTargetTypes.array) {
|
|
3789
3883
|
var restIndex = null;
|
|
3790
3884
|
assertArray(value, sourceCodeInfo);
|
|
3791
|
-
for (var index = 0; index < bindingTarget.
|
|
3792
|
-
var element = (_a = bindingTarget
|
|
3885
|
+
for (var index = 0; index < bindingTarget[1][0].length; index += 1) {
|
|
3886
|
+
var element = (_a = bindingTarget[1][0][index]) !== null && _a !== void 0 ? _a : null;
|
|
3793
3887
|
if (element === null) {
|
|
3794
3888
|
continue;
|
|
3795
3889
|
}
|
|
3796
|
-
if (element
|
|
3890
|
+
if (element[0] === bindingTargetTypes.rest) {
|
|
3797
3891
|
restIndex = index;
|
|
3798
3892
|
break;
|
|
3799
3893
|
}
|
|
3800
|
-
var val = (_b = (value[index] !== undefined ? value[index] : element
|
|
3894
|
+
var val = (_b = (value[index] !== undefined ? value[index] : element[1][1] && evaluate(element[1][1]))) !== null && _b !== void 0 ? _b : null;
|
|
3801
3895
|
assertAny(val, sourceCodeInfo);
|
|
3802
3896
|
createRecord(element, val, evaluate, sourceCodeInfo, record);
|
|
3803
3897
|
}
|
|
3804
3898
|
if (restIndex !== null) {
|
|
3805
3899
|
var restValues = value.slice(restIndex);
|
|
3806
|
-
var restElement = bindingTarget
|
|
3807
|
-
record[restElement
|
|
3900
|
+
var restElement = bindingTarget[1][0][restIndex];
|
|
3901
|
+
record[restElement[1][0]] = restValues;
|
|
3808
3902
|
}
|
|
3809
3903
|
}
|
|
3904
|
+
else if (bindingTarget[0] === bindingTargetTypes.rest) {
|
|
3905
|
+
record[bindingTarget[1][0]] = asAny(value);
|
|
3906
|
+
}
|
|
3810
3907
|
else {
|
|
3811
|
-
record[bindingTarget
|
|
3908
|
+
record[bindingTarget[1][0][1]] = asAny(value);
|
|
3812
3909
|
}
|
|
3813
3910
|
}
|
|
3814
3911
|
function getAllBindingTargetNames(bindingTarget) {
|
|
@@ -3821,9 +3918,9 @@ function getNamesFromBindingTarget(target, names) {
|
|
|
3821
3918
|
if (target === null) {
|
|
3822
3919
|
return;
|
|
3823
3920
|
}
|
|
3824
|
-
if (target
|
|
3921
|
+
if (target[0] === bindingTargetTypes.array) {
|
|
3825
3922
|
try {
|
|
3826
|
-
for (var _c = __values(target
|
|
3923
|
+
for (var _c = __values(target[1][0]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
3827
3924
|
var element = _d.value;
|
|
3828
3925
|
getNamesFromBindingTarget(element, names);
|
|
3829
3926
|
}
|
|
@@ -3836,9 +3933,9 @@ function getNamesFromBindingTarget(target, names) {
|
|
|
3836
3933
|
finally { if (e_1) throw e_1.error; }
|
|
3837
3934
|
}
|
|
3838
3935
|
}
|
|
3839
|
-
else if (target
|
|
3936
|
+
else if (target[0] === bindingTargetTypes.object) {
|
|
3840
3937
|
try {
|
|
3841
|
-
for (var _e = __values(Object.values(target
|
|
3938
|
+
for (var _e = __values(Object.values(target[1][0])), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
3842
3939
|
var element = _f.value;
|
|
3843
3940
|
getNamesFromBindingTarget(element, names);
|
|
3844
3941
|
}
|
|
@@ -3851,27 +3948,39 @@ function getNamesFromBindingTarget(target, names) {
|
|
|
3851
3948
|
finally { if (e_2) throw e_2.error; }
|
|
3852
3949
|
}
|
|
3853
3950
|
}
|
|
3951
|
+
else if (target[0] === bindingTargetTypes.rest) {
|
|
3952
|
+
if (names[target[1][0]]) {
|
|
3953
|
+
throw new LitsError("Duplicate binding name: ".concat(target[1][0]), target[2]);
|
|
3954
|
+
}
|
|
3955
|
+
names[target[1][0]] = true;
|
|
3956
|
+
}
|
|
3854
3957
|
else {
|
|
3855
|
-
if (names[target
|
|
3856
|
-
throw new LitsError("Duplicate binding name: ".concat(target
|
|
3958
|
+
if (names[target[1][0][1]]) {
|
|
3959
|
+
throw new LitsError("Duplicate binding name: ".concat(target[1][0]), target[2]);
|
|
3857
3960
|
}
|
|
3858
|
-
names[target
|
|
3961
|
+
names[target[1][0][1]] = true;
|
|
3859
3962
|
}
|
|
3860
3963
|
}
|
|
3861
3964
|
|
|
3862
3965
|
var defSpecialExpression = {
|
|
3863
3966
|
paramCount: 2,
|
|
3864
3967
|
evaluate: function (node, contextStack, _a) {
|
|
3865
|
-
var
|
|
3866
|
-
var
|
|
3867
|
-
var
|
|
3968
|
+
var evaluateNode = _a.evaluateNode;
|
|
3969
|
+
var bindingNode = node[1][1];
|
|
3970
|
+
var target = bindingNode[1][0];
|
|
3971
|
+
var value = bindingNode[1][1];
|
|
3972
|
+
var bindingValue = evaluateNode(value, contextStack);
|
|
3973
|
+
var values = evalueateBindingNodeValues(target, bindingValue, function (Node) { return evaluateNode(Node, contextStack); });
|
|
3868
3974
|
contextStack.exportValues(values);
|
|
3869
3975
|
return null;
|
|
3870
3976
|
},
|
|
3871
3977
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3872
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3873
|
-
var
|
|
3874
|
-
|
|
3978
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
3979
|
+
var bindingNode = node[1][1];
|
|
3980
|
+
var target = bindingNode[1][0];
|
|
3981
|
+
var value = bindingNode[1][1];
|
|
3982
|
+
var bindingResult = getUndefinedSymbols([value], contextStack, builtin, evaluateNode);
|
|
3983
|
+
contextStack.addValues(getAllBindingTargetNames(target));
|
|
3875
3984
|
return bindingResult;
|
|
3876
3985
|
},
|
|
3877
3986
|
};
|
|
@@ -3880,14 +3989,14 @@ var doSpecialExpression = {
|
|
|
3880
3989
|
paramCount: {},
|
|
3881
3990
|
evaluate: function (node, contextStack, _a) {
|
|
3882
3991
|
var e_1, _b;
|
|
3883
|
-
var
|
|
3992
|
+
var evaluateNode = _a.evaluateNode;
|
|
3884
3993
|
var newContext = {};
|
|
3885
3994
|
var newContextStack = contextStack.create(newContext);
|
|
3886
3995
|
var result = null;
|
|
3887
3996
|
try {
|
|
3888
|
-
for (var _c = __values(node
|
|
3997
|
+
for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
3889
3998
|
var form = _d.value;
|
|
3890
|
-
result =
|
|
3999
|
+
result = evaluateNode(form, newContextStack);
|
|
3891
4000
|
}
|
|
3892
4001
|
}
|
|
3893
4002
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
@@ -3900,8 +4009,8 @@ var doSpecialExpression = {
|
|
|
3900
4009
|
return result;
|
|
3901
4010
|
},
|
|
3902
4011
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3903
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3904
|
-
return getUndefinedSymbols(node
|
|
4012
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4013
|
+
return getUndefinedSymbols(node[1][1], contextStack.create({}), builtin, evaluateNode);
|
|
3905
4014
|
},
|
|
3906
4015
|
};
|
|
3907
4016
|
|
|
@@ -3962,7 +4071,8 @@ function isNumberReservedSymbol(symbol) {
|
|
|
3962
4071
|
function assertNameNotDefined(name, contextStack, builtin, sourceCodeInfo) {
|
|
3963
4072
|
if (typeof name !== 'string')
|
|
3964
4073
|
return;
|
|
3965
|
-
|
|
4074
|
+
// TODO only subset of special expressions are necessary to check (CommonSpecialExpressionType)
|
|
4075
|
+
if (specialExpressionTypes[name])
|
|
3966
4076
|
throw new LitsError("Cannot define variable ".concat(name, ", it's a special expression."), sourceCodeInfo);
|
|
3967
4077
|
if (builtin.normalExpressions[name])
|
|
3968
4078
|
throw new LitsError("Cannot define variable ".concat(name, ", it's a builtin function."), sourceCodeInfo);
|
|
@@ -3976,63 +4086,69 @@ var functionSpecialExpression = {
|
|
|
3976
4086
|
paramCount: {},
|
|
3977
4087
|
evaluate: function (node, contextStack, _a) {
|
|
3978
4088
|
var _b, _c;
|
|
3979
|
-
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols,
|
|
3980
|
-
var
|
|
3981
|
-
|
|
3982
|
-
|
|
4089
|
+
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
|
|
4090
|
+
var _d = __read(node[1], 3), functionSymbol = _d[1], fn = _d[2];
|
|
4091
|
+
assertUserDefinedSymbolNode(functionSymbol, node[2]);
|
|
4092
|
+
assertNameNotDefined(functionSymbol[1], contextStack, builtin, node[2]);
|
|
4093
|
+
var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
|
|
3983
4094
|
var litsFunction = (_b = {},
|
|
3984
4095
|
_b[FUNCTION_SYMBOL] = true,
|
|
3985
|
-
_b.sourceCodeInfo = node
|
|
4096
|
+
_b.sourceCodeInfo = node[2],
|
|
3986
4097
|
_b.functionType = 'UserDefined',
|
|
3987
|
-
_b.name =
|
|
4098
|
+
_b.name = functionSymbol[1],
|
|
3988
4099
|
_b.evaluatedfunction = evaluatedFunction,
|
|
3989
4100
|
_b);
|
|
3990
|
-
contextStack.addValues((_c = {}, _c[
|
|
4101
|
+
contextStack.addValues((_c = {}, _c[functionSymbol[1]] = litsFunction, _c));
|
|
3991
4102
|
return null;
|
|
3992
4103
|
},
|
|
3993
4104
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
3994
4105
|
var _b, _c;
|
|
3995
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
3996
|
-
|
|
3997
|
-
|
|
3998
|
-
|
|
4106
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4107
|
+
var functionName = node[1][1][1];
|
|
4108
|
+
contextStack.addValues((_b = {}, _b[functionName] = true, _b));
|
|
4109
|
+
var newContext = (_c = {}, _c[functionName] = { value: true }, _c);
|
|
4110
|
+
return addFunctionUnresolvedSymbols(node[1][2], contextStack, getUndefinedSymbols, builtin, evaluateNode, newContext);
|
|
3999
4111
|
},
|
|
4000
4112
|
};
|
|
4001
4113
|
var defnSpecialExpression = {
|
|
4002
4114
|
paramCount: {},
|
|
4003
4115
|
evaluate: function (node, contextStack, _a) {
|
|
4004
4116
|
var _b, _c;
|
|
4005
|
-
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols,
|
|
4006
|
-
var
|
|
4007
|
-
|
|
4008
|
-
|
|
4117
|
+
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
|
|
4118
|
+
var _d = __read(node[1], 3), functionSymbol = _d[1], fn = _d[2];
|
|
4119
|
+
assertUserDefinedSymbolNode(functionSymbol, node[2]);
|
|
4120
|
+
assertNameNotDefined(functionSymbol[1], contextStack, builtin, node[2]);
|
|
4121
|
+
var evaluatedFunctionOverloades = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
|
|
4009
4122
|
var litsFunction = (_b = {},
|
|
4010
4123
|
_b[FUNCTION_SYMBOL] = true,
|
|
4011
|
-
_b.sourceCodeInfo = node
|
|
4124
|
+
_b.sourceCodeInfo = node[2],
|
|
4012
4125
|
_b.functionType = 'UserDefined',
|
|
4013
|
-
_b.name =
|
|
4126
|
+
_b.name = functionSymbol[1],
|
|
4014
4127
|
_b.evaluatedfunction = evaluatedFunctionOverloades,
|
|
4015
4128
|
_b);
|
|
4016
|
-
contextStack.exportValues((_c = {}, _c[
|
|
4129
|
+
contextStack.exportValues((_c = {}, _c[functionSymbol[1]] = litsFunction, _c));
|
|
4017
4130
|
return null;
|
|
4018
4131
|
},
|
|
4019
4132
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4020
4133
|
var _b, _c;
|
|
4021
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4022
|
-
|
|
4023
|
-
var
|
|
4024
|
-
|
|
4134
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4135
|
+
var functionName = node[1][1][1];
|
|
4136
|
+
var fn = node[1][2];
|
|
4137
|
+
contextStack.exportValues((_b = {}, _b[functionName] = true, _b));
|
|
4138
|
+
var newContext = (_c = {}, _c[functionName] = { value: true }, _c);
|
|
4139
|
+
return addFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode, newContext);
|
|
4025
4140
|
},
|
|
4026
4141
|
};
|
|
4027
4142
|
var fnSpecialExpression = {
|
|
4028
4143
|
paramCount: {},
|
|
4029
4144
|
evaluate: function (node, contextStack, _a) {
|
|
4030
4145
|
var _b;
|
|
4031
|
-
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols,
|
|
4032
|
-
var
|
|
4146
|
+
var builtin = _a.builtin, getUndefinedSymbols = _a.getUndefinedSymbols, evaluateNode = _a.evaluateNode;
|
|
4147
|
+
var fn = node[1][1];
|
|
4148
|
+
var evaluatedFunction = evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode);
|
|
4033
4149
|
var litsFunction = (_b = {},
|
|
4034
4150
|
_b[FUNCTION_SYMBOL] = true,
|
|
4035
|
-
_b.sourceCodeInfo = node
|
|
4151
|
+
_b.sourceCodeInfo = node[2],
|
|
4036
4152
|
_b.functionType = 'UserDefined',
|
|
4037
4153
|
_b.name = undefined,
|
|
4038
4154
|
_b.evaluatedfunction = evaluatedFunction,
|
|
@@ -4040,129 +4156,103 @@ var fnSpecialExpression = {
|
|
|
4040
4156
|
return litsFunction;
|
|
4041
4157
|
},
|
|
4042
4158
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4043
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4044
|
-
|
|
4159
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4160
|
+
var fn = node[1][1];
|
|
4161
|
+
return addFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode);
|
|
4045
4162
|
},
|
|
4046
4163
|
};
|
|
4047
|
-
function evaluateFunction(
|
|
4048
|
-
var fn = node.function;
|
|
4164
|
+
function evaluateFunction(fn, contextStack, builtin, getUndefinedSymbols, evaluateNode) {
|
|
4049
4165
|
var functionContext = {};
|
|
4050
|
-
var context = fn.
|
|
4166
|
+
var context = fn[0].reduce(function (ctx, arg) {
|
|
4051
4167
|
Object.keys(getAllBindingTargetNames(arg)).forEach(function (name) {
|
|
4052
4168
|
ctx[name] = { value: null };
|
|
4053
4169
|
});
|
|
4054
4170
|
return ctx;
|
|
4055
4171
|
}, {});
|
|
4056
|
-
var undefinedSymbols = getUndefinedSymbols(fn
|
|
4172
|
+
var undefinedSymbols = getUndefinedSymbols(fn[1], contextStack.new(context), builtin, evaluateNode);
|
|
4057
4173
|
undefinedSymbols.forEach(function (name) {
|
|
4058
4174
|
var value = contextStack.getValue(name);
|
|
4059
4175
|
if (isAny(value)) {
|
|
4060
4176
|
functionContext[name] = { value: value };
|
|
4061
4177
|
}
|
|
4062
4178
|
});
|
|
4063
|
-
var evaluatedFunction =
|
|
4064
|
-
|
|
4065
|
-
|
|
4066
|
-
|
|
4067
|
-
|
|
4179
|
+
var evaluatedFunction = [
|
|
4180
|
+
fn[0],
|
|
4181
|
+
fn[1],
|
|
4182
|
+
functionContext,
|
|
4183
|
+
];
|
|
4068
4184
|
return evaluatedFunction;
|
|
4069
4185
|
}
|
|
4070
|
-
function addFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin,
|
|
4186
|
+
function addFunctionUnresolvedSymbols(fn, contextStack, getUndefinedSymbols, builtin, evaluateNode, functionNameContext) {
|
|
4071
4187
|
var result = new Set();
|
|
4072
4188
|
var contextStackWithFunctionName = functionNameContext ? contextStack.create(functionNameContext) : contextStack;
|
|
4073
4189
|
var newContext = {};
|
|
4074
|
-
fn.
|
|
4190
|
+
fn[0].forEach(function (arg) {
|
|
4075
4191
|
Object.assign(newContext, getAllBindingTargetNames(arg));
|
|
4076
4192
|
});
|
|
4077
4193
|
var newContextStack = contextStackWithFunctionName.create(newContext);
|
|
4078
|
-
var overloadResult = getUndefinedSymbols(fn
|
|
4194
|
+
var overloadResult = getUndefinedSymbols(fn[1], newContextStack, builtin, evaluateNode);
|
|
4079
4195
|
addToSet(result, overloadResult);
|
|
4080
4196
|
return result;
|
|
4081
4197
|
}
|
|
4082
4198
|
|
|
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
4199
|
var ifSpecialExpression = {
|
|
4110
4200
|
paramCount: { min: 2, max: 3 },
|
|
4111
4201
|
evaluate: function (node, contextStack, _a) {
|
|
4112
|
-
var
|
|
4113
|
-
var
|
|
4114
|
-
|
|
4115
|
-
|
|
4116
|
-
return evaluateAstNode(asAstNode(trueNode, sourceCodeInfo), contextStack);
|
|
4202
|
+
var evaluateNode = _a.evaluateNode;
|
|
4203
|
+
var _b = __read(node[1][1], 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
|
|
4204
|
+
if (evaluateNode(conditionNode, contextStack)) {
|
|
4205
|
+
return evaluateNode(trueNode, contextStack);
|
|
4117
4206
|
}
|
|
4118
|
-
else {
|
|
4119
|
-
|
|
4120
|
-
return evaluateAstNode(asAstNode(falseNode, sourceCodeInfo), contextStack);
|
|
4121
|
-
else
|
|
4122
|
-
return null;
|
|
4207
|
+
else if (falseNode) {
|
|
4208
|
+
return evaluateNode(falseNode, contextStack);
|
|
4123
4209
|
}
|
|
4210
|
+
return null;
|
|
4124
4211
|
},
|
|
4125
4212
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4126
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4127
|
-
return getUndefinedSymbols(node.
|
|
4213
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4214
|
+
return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
|
|
4128
4215
|
},
|
|
4129
4216
|
};
|
|
4130
4217
|
|
|
4131
4218
|
var unlessSpecialExpression = {
|
|
4132
4219
|
paramCount: { min: 2, max: 3 },
|
|
4133
4220
|
evaluate: function (node, contextStack, _a) {
|
|
4134
|
-
var
|
|
4135
|
-
var
|
|
4136
|
-
|
|
4137
|
-
|
|
4138
|
-
return evaluateAstNode(asAstNode(trueNode, sourceCodeInfo), contextStack);
|
|
4221
|
+
var evaluateNode = _a.evaluateNode;
|
|
4222
|
+
var _b = __read(node[1][1], 3), conditionNode = _b[0], trueNode = _b[1], falseNode = _b[2];
|
|
4223
|
+
if (!evaluateNode(conditionNode, contextStack)) {
|
|
4224
|
+
return evaluateNode(trueNode, contextStack);
|
|
4139
4225
|
}
|
|
4140
|
-
else {
|
|
4141
|
-
|
|
4142
|
-
return evaluateAstNode(asAstNode(falseNode, sourceCodeInfo), contextStack);
|
|
4143
|
-
else
|
|
4144
|
-
return null;
|
|
4226
|
+
else if (falseNode) {
|
|
4227
|
+
return evaluateNode(falseNode, contextStack);
|
|
4145
4228
|
}
|
|
4229
|
+
return null;
|
|
4146
4230
|
},
|
|
4147
4231
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4148
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4149
|
-
return getUndefinedSymbols(node.
|
|
4232
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4233
|
+
return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
|
|
4150
4234
|
},
|
|
4151
4235
|
};
|
|
4152
4236
|
|
|
4153
4237
|
var letSpecialExpression = {
|
|
4154
4238
|
paramCount: 0,
|
|
4155
4239
|
evaluate: function (node, contextStack, _a) {
|
|
4156
|
-
var
|
|
4157
|
-
var
|
|
4158
|
-
var
|
|
4240
|
+
var evaluateNode = _a.evaluateNode;
|
|
4241
|
+
var bindingNode = node[1][1];
|
|
4242
|
+
var target = bindingNode[1][0];
|
|
4243
|
+
var value = bindingNode[1][1];
|
|
4244
|
+
var bindingValue = evaluateNode(value, contextStack);
|
|
4245
|
+
var values = evalueateBindingNodeValues(target, bindingValue, function (Node) { return evaluateNode(Node, contextStack); });
|
|
4159
4246
|
contextStack.addValues(values);
|
|
4160
4247
|
return null;
|
|
4161
4248
|
},
|
|
4162
4249
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4163
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4164
|
-
var
|
|
4165
|
-
|
|
4250
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4251
|
+
var bindingNode = node[1][1];
|
|
4252
|
+
var target = bindingNode[1][0];
|
|
4253
|
+
var value = bindingNode[1][1];
|
|
4254
|
+
var bindingResult = getUndefinedSymbols([value], contextStack, builtin, evaluateNode);
|
|
4255
|
+
contextStack.addValues(getAllBindingTargetNames(target));
|
|
4166
4256
|
return bindingResult;
|
|
4167
4257
|
},
|
|
4168
4258
|
};
|
|
@@ -4170,11 +4260,11 @@ var letSpecialExpression = {
|
|
|
4170
4260
|
var loopSpecialExpression = {
|
|
4171
4261
|
paramCount: {},
|
|
4172
4262
|
evaluate: function (node, contextStack, _a) {
|
|
4173
|
-
var
|
|
4174
|
-
var
|
|
4175
|
-
var bindingContext =
|
|
4176
|
-
var val =
|
|
4177
|
-
var valueRecord = evalueateBindingNodeValues(
|
|
4263
|
+
var evaluateNode = _a.evaluateNode;
|
|
4264
|
+
var bindingNodes = node[1][1];
|
|
4265
|
+
var bindingContext = bindingNodes.reduce(function (result, bindingNode) {
|
|
4266
|
+
var val = evaluateNode(bindingNode[1][1], contextStack.create(result));
|
|
4267
|
+
var valueRecord = evalueateBindingNodeValues(bindingNode[1][0], val, function (Node) { return evaluateNode(Node, contextStack); });
|
|
4178
4268
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4179
4269
|
var _b = __read(_a, 2), name = _b[0], value = _b[1];
|
|
4180
4270
|
result[name] = { value: value };
|
|
@@ -4182,20 +4272,21 @@ var loopSpecialExpression = {
|
|
|
4182
4272
|
return result;
|
|
4183
4273
|
}, {});
|
|
4184
4274
|
var newContextStack = contextStack.create(bindingContext);
|
|
4275
|
+
var body = node[1][2];
|
|
4185
4276
|
var _loop_1 = function () {
|
|
4186
4277
|
var e_1, _b;
|
|
4187
4278
|
var result = null;
|
|
4188
4279
|
try {
|
|
4189
4280
|
try {
|
|
4190
|
-
for (var
|
|
4191
|
-
var form =
|
|
4192
|
-
result =
|
|
4281
|
+
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()) {
|
|
4282
|
+
var form = body_1_1.value;
|
|
4283
|
+
result = evaluateNode(form, newContextStack);
|
|
4193
4284
|
}
|
|
4194
4285
|
}
|
|
4195
4286
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
4196
4287
|
finally {
|
|
4197
4288
|
try {
|
|
4198
|
-
if (
|
|
4289
|
+
if (body_1_1 && !body_1_1.done && (_b = body_1.return)) _b.call(body_1);
|
|
4199
4290
|
}
|
|
4200
4291
|
finally { if (e_1) throw e_1.error; }
|
|
4201
4292
|
}
|
|
@@ -4203,16 +4294,16 @@ var loopSpecialExpression = {
|
|
|
4203
4294
|
catch (error) {
|
|
4204
4295
|
if (error instanceof RecurSignal) {
|
|
4205
4296
|
var params_1 = error.params;
|
|
4206
|
-
if (params_1.length !==
|
|
4207
|
-
throw new LitsError("recur expected ".concat(
|
|
4297
|
+
if (params_1.length !== bindingNodes.length) {
|
|
4298
|
+
throw new LitsError("recur expected ".concat(bindingNodes.length, " parameters, got ").concat(valueToString(params_1.length)), node[2]);
|
|
4208
4299
|
}
|
|
4209
|
-
|
|
4300
|
+
bindingNodes.forEach(function (bindingNode, index) {
|
|
4210
4301
|
var e_2, _a;
|
|
4211
|
-
var valueRecord = evalueateBindingNodeValues(
|
|
4302
|
+
var valueRecord = evalueateBindingNodeValues(bindingNode[1][0], asAny(params_1[index]), function (Node) { return evaluateNode(Node, contextStack); });
|
|
4212
4303
|
try {
|
|
4213
4304
|
for (var _b = (e_2 = void 0, __values(Object.entries(valueRecord))), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
4214
4305
|
var _d = __read(_c.value, 2), name_1 = _d[0], value = _d[1];
|
|
4215
|
-
|
|
4306
|
+
bindingContext[name_1].value = value;
|
|
4216
4307
|
}
|
|
4217
4308
|
}
|
|
4218
4309
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
@@ -4236,29 +4327,31 @@ var loopSpecialExpression = {
|
|
|
4236
4327
|
}
|
|
4237
4328
|
},
|
|
4238
4329
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4239
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4240
|
-
var
|
|
4330
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4331
|
+
var bindingNodes = node[1][1];
|
|
4332
|
+
var newContext = bindingNodes
|
|
4241
4333
|
.reduce(function (context, bindingNode) {
|
|
4242
|
-
var names = getAllBindingTargetNames(bindingNode
|
|
4334
|
+
var names = getAllBindingTargetNames(bindingNode[1][0]);
|
|
4243
4335
|
Object.keys(names).forEach(function (name) {
|
|
4244
4336
|
context[name] = { value: true };
|
|
4245
4337
|
});
|
|
4246
4338
|
return context;
|
|
4247
4339
|
}, {});
|
|
4248
|
-
var bindingValueNodes =
|
|
4249
|
-
var bindingsResult = getUndefinedSymbols(bindingValueNodes, contextStack, builtin,
|
|
4250
|
-
var paramsResult = getUndefinedSymbols(node
|
|
4340
|
+
var bindingValueNodes = bindingNodes.map(function (bindingNode) { return bindingNode[1][1]; });
|
|
4341
|
+
var bindingsResult = getUndefinedSymbols(bindingValueNodes, contextStack, builtin, evaluateNode);
|
|
4342
|
+
var paramsResult = getUndefinedSymbols(node[1][2], contextStack.create(newContext), builtin, evaluateNode);
|
|
4251
4343
|
return joinSets(bindingsResult, paramsResult);
|
|
4252
4344
|
},
|
|
4253
4345
|
};
|
|
4254
4346
|
|
|
4255
|
-
function addToContext(bindings, context, contextStack,
|
|
4347
|
+
function addToContext(bindings, context, contextStack, evaluateNode) {
|
|
4256
4348
|
var e_1, _a;
|
|
4257
4349
|
try {
|
|
4258
4350
|
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
|
|
4351
|
+
var bindingNode = bindings_1_1.value;
|
|
4352
|
+
var _b = __read(bindingNode[1], 2), target = _b[0], bindingValue = _b[1];
|
|
4353
|
+
var val = evaluateNode(bindingValue, contextStack);
|
|
4354
|
+
var valueRecord = evalueateBindingNodeValues(target, val, function (Node) { return evaluateNode(Node, contextStack); });
|
|
4262
4355
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4263
4356
|
var _b = __read(_a, 2), name = _b[0], value = _b[1];
|
|
4264
4357
|
context[name] = { value: value };
|
|
@@ -4273,9 +4366,9 @@ function addToContext(bindings, context, contextStack, evaluateAstNode) {
|
|
|
4273
4366
|
finally { if (e_1) throw e_1.error; }
|
|
4274
4367
|
}
|
|
4275
4368
|
}
|
|
4276
|
-
function evaluateLoop(returnResult,
|
|
4277
|
-
var sourceCodeInfo =
|
|
4278
|
-
var _a =
|
|
4369
|
+
function evaluateLoop(returnResult, loopNode, contextStack, evaluateNode) {
|
|
4370
|
+
var sourceCodeInfo = loopNode[2];
|
|
4371
|
+
var _a = __read(loopNode[1], 3), loopBindings = _a[1], body = _a[2];
|
|
4279
4372
|
var result = [];
|
|
4280
4373
|
var bindingIndices = loopBindings.map(function () { return 0; });
|
|
4281
4374
|
var abort = false;
|
|
@@ -4285,8 +4378,9 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
|
|
|
4285
4378
|
var newContextStack = contextStack.create(context);
|
|
4286
4379
|
var skip = false;
|
|
4287
4380
|
bindingsLoop: for (var bindingIndex = 0; bindingIndex < loopBindings.length; bindingIndex += 1) {
|
|
4288
|
-
var _c =
|
|
4289
|
-
var
|
|
4381
|
+
var _c = __read(loopBindings[bindingIndex], 4), bindingNode = _c[0], letBindings = _c[1], whenNode = _c[2], whileNode = _c[3];
|
|
4382
|
+
var _d = __read(bindingNode[1], 2), targetNode = _d[0], valueNode = _d[1];
|
|
4383
|
+
var coll = asColl(evaluateNode(valueNode, newContextStack), sourceCodeInfo);
|
|
4290
4384
|
var seq = isSeq(coll) ? coll : Object.entries(coll);
|
|
4291
4385
|
if (seq.length === 0) {
|
|
4292
4386
|
skip = true;
|
|
@@ -4305,45 +4399,40 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
|
|
|
4305
4399
|
break;
|
|
4306
4400
|
}
|
|
4307
4401
|
var val = asAny(seq[index], sourceCodeInfo);
|
|
4308
|
-
var valueRecord = evalueateBindingNodeValues(
|
|
4402
|
+
var valueRecord = evalueateBindingNodeValues(targetNode, val, function (Node) { return evaluateNode(Node, newContextStack); });
|
|
4309
4403
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4310
4404
|
var _b = __read(_a, 2), name = _b[0], value = _b[1];
|
|
4311
4405
|
context[name] = { value: value };
|
|
4312
4406
|
});
|
|
4407
|
+
if (letBindings) {
|
|
4408
|
+
addToContext(letBindings, context, newContextStack, evaluateNode);
|
|
4409
|
+
}
|
|
4410
|
+
if (whenNode && !evaluateNode(whenNode, newContextStack)) {
|
|
4411
|
+
bindingIndices[bindingIndex] = asNonUndefined(bindingIndices[bindingIndex], sourceCodeInfo) + 1;
|
|
4412
|
+
skip = true;
|
|
4413
|
+
break bindingsLoop;
|
|
4414
|
+
}
|
|
4415
|
+
if (whileNode && !evaluateNode(whileNode, newContextStack)) {
|
|
4416
|
+
bindingIndices[bindingIndex] = Number.POSITIVE_INFINITY;
|
|
4417
|
+
skip = true;
|
|
4418
|
+
break bindingsLoop;
|
|
4419
|
+
}
|
|
4420
|
+
}
|
|
4421
|
+
if (!skip) {
|
|
4422
|
+
var value = null;
|
|
4313
4423
|
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
|
-
}
|
|
4424
|
+
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()) {
|
|
4425
|
+
var form = body_1_1.value;
|
|
4426
|
+
value = evaluateNode(form, newContextStack);
|
|
4335
4427
|
}
|
|
4336
4428
|
}
|
|
4337
4429
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
4338
4430
|
finally {
|
|
4339
4431
|
try {
|
|
4340
|
-
if (
|
|
4432
|
+
if (body_1_1 && !body_1_1.done && (_b = body_1.return)) _b.call(body_1);
|
|
4341
4433
|
}
|
|
4342
4434
|
finally { if (e_2) throw e_2.error; }
|
|
4343
4435
|
}
|
|
4344
|
-
}
|
|
4345
|
-
if (!skip) {
|
|
4346
|
-
var value = evaluateAstNode(params[0], newContextStack);
|
|
4347
4436
|
if (returnResult)
|
|
4348
4437
|
result.push(value);
|
|
4349
4438
|
if (bindingIndices.length > 0)
|
|
@@ -4355,57 +4444,59 @@ function evaluateLoop(returnResult, node, contextStack, evaluateAstNode) {
|
|
|
4355
4444
|
}
|
|
4356
4445
|
return returnResult ? result : null;
|
|
4357
4446
|
}
|
|
4358
|
-
function analyze(
|
|
4447
|
+
function analyze(loopNode, contextStack, getUndefinedSymbols, builtin, evaluateNode) {
|
|
4359
4448
|
var result = new Set();
|
|
4360
4449
|
var newContext = {};
|
|
4361
|
-
var loopBindings =
|
|
4362
|
-
loopBindings.forEach(function (
|
|
4363
|
-
var
|
|
4364
|
-
|
|
4450
|
+
var _a = __read(loopNode[1], 3), loopBindings = _a[1], body = _a[2];
|
|
4451
|
+
loopBindings.forEach(function (loopBindingNode) {
|
|
4452
|
+
var _a = __read(loopBindingNode, 4), bindingNode = _a[0], letBindings = _a[1], whenNode = _a[2], whileNode = _a[3];
|
|
4453
|
+
var _b = __read(bindingNode[1], 2), target = _b[0], value = _b[1];
|
|
4454
|
+
getUndefinedSymbols([value], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4365
4455
|
return result.add(symbol);
|
|
4366
4456
|
});
|
|
4367
|
-
Object.assign(newContext, getAllBindingTargetNames(
|
|
4457
|
+
Object.assign(newContext, getAllBindingTargetNames(target));
|
|
4368
4458
|
if (letBindings) {
|
|
4369
|
-
letBindings.forEach(function (
|
|
4370
|
-
|
|
4459
|
+
letBindings.forEach(function (letBindingNode) {
|
|
4460
|
+
var _a = __read(letBindingNode[1], 2), letTarget = _a[0], letValue = _a[1];
|
|
4461
|
+
getUndefinedSymbols([letValue], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4371
4462
|
return result.add(symbol);
|
|
4372
4463
|
});
|
|
4373
|
-
Object.assign(newContext, getAllBindingTargetNames(
|
|
4464
|
+
Object.assign(newContext, getAllBindingTargetNames(letTarget));
|
|
4374
4465
|
});
|
|
4375
4466
|
}
|
|
4376
4467
|
if (whenNode) {
|
|
4377
|
-
getUndefinedSymbols([whenNode], contextStack.create(newContext), builtin,
|
|
4468
|
+
getUndefinedSymbols([whenNode], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4378
4469
|
return result.add(symbol);
|
|
4379
4470
|
});
|
|
4380
4471
|
}
|
|
4381
4472
|
if (whileNode) {
|
|
4382
|
-
getUndefinedSymbols([whileNode], contextStack.create(newContext), builtin,
|
|
4473
|
+
getUndefinedSymbols([whileNode], contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4383
4474
|
return result.add(symbol);
|
|
4384
4475
|
});
|
|
4385
4476
|
}
|
|
4386
4477
|
});
|
|
4387
|
-
getUndefinedSymbols(
|
|
4478
|
+
getUndefinedSymbols(body, contextStack.create(newContext), builtin, evaluateNode).forEach(function (symbol) {
|
|
4388
4479
|
return result.add(symbol);
|
|
4389
4480
|
});
|
|
4390
4481
|
return result;
|
|
4391
4482
|
}
|
|
4392
4483
|
var forSpecialExpression = {
|
|
4393
4484
|
paramCount: 1,
|
|
4394
|
-
evaluate: function (node, contextStack, helpers) { return evaluateLoop(true, node, contextStack, helpers.
|
|
4485
|
+
evaluate: function (node, contextStack, helpers) { return evaluateLoop(true, node, contextStack, helpers.evaluateNode); },
|
|
4395
4486
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4396
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4397
|
-
return analyze(node, contextStack, getUndefinedSymbols, builtin,
|
|
4487
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4488
|
+
return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateNode);
|
|
4398
4489
|
},
|
|
4399
4490
|
};
|
|
4400
4491
|
var doseqSpecialExpression = {
|
|
4401
4492
|
paramCount: 1,
|
|
4402
4493
|
evaluate: function (node, contextStack, helpers) {
|
|
4403
|
-
evaluateLoop(false, node, contextStack, helpers.
|
|
4494
|
+
evaluateLoop(false, node, contextStack, helpers.evaluateNode);
|
|
4404
4495
|
return null;
|
|
4405
4496
|
},
|
|
4406
4497
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4407
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4408
|
-
return analyze(node, contextStack, getUndefinedSymbols, builtin,
|
|
4498
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4499
|
+
return analyze(node, contextStack, getUndefinedSymbols, builtin, evaluateNode);
|
|
4409
4500
|
},
|
|
4410
4501
|
};
|
|
4411
4502
|
|
|
@@ -4413,12 +4504,12 @@ var orSpecialExpression = {
|
|
|
4413
4504
|
paramCount: {},
|
|
4414
4505
|
evaluate: function (node, contextStack, _a) {
|
|
4415
4506
|
var e_1, _b;
|
|
4416
|
-
var
|
|
4507
|
+
var evaluateNode = _a.evaluateNode;
|
|
4417
4508
|
var value = false;
|
|
4418
4509
|
try {
|
|
4419
|
-
for (var _c = __values(node
|
|
4510
|
+
for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
4420
4511
|
var param = _d.value;
|
|
4421
|
-
value =
|
|
4512
|
+
value = evaluateNode(param, contextStack);
|
|
4422
4513
|
if (value)
|
|
4423
4514
|
break;
|
|
4424
4515
|
}
|
|
@@ -4433,55 +4524,55 @@ var orSpecialExpression = {
|
|
|
4433
4524
|
return value;
|
|
4434
4525
|
},
|
|
4435
4526
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4436
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4437
|
-
return getUndefinedSymbols(node
|
|
4527
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4528
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
4438
4529
|
},
|
|
4439
4530
|
};
|
|
4440
4531
|
|
|
4441
4532
|
var qqSpecialExpression = {
|
|
4442
4533
|
paramCount: { min: 1, max: 2 },
|
|
4443
4534
|
evaluate: function (node, contextStack, _a) {
|
|
4444
|
-
var
|
|
4445
|
-
var _b = __read(node
|
|
4446
|
-
if (
|
|
4447
|
-
|
|
4448
|
-
return secondNode ? evaluateAstNode(secondNode, contextStack) : null;
|
|
4535
|
+
var evaluateNode = _a.evaluateNode;
|
|
4536
|
+
var _b = __read(node[1][1], 2), firstNode = _b[0], secondNode = _b[1];
|
|
4537
|
+
if (isUserDefinedSymbolNode(firstNode) && contextStack.lookUp(firstNode) === null) {
|
|
4538
|
+
return secondNode ? evaluateNode(secondNode, contextStack) : null;
|
|
4449
4539
|
}
|
|
4450
|
-
assertAny(firstNode, node
|
|
4451
|
-
var firstResult =
|
|
4452
|
-
return firstResult !== null && firstResult !== void 0 ? firstResult : (secondNode ?
|
|
4540
|
+
assertAny(firstNode, node[2]);
|
|
4541
|
+
var firstResult = evaluateNode(firstNode, contextStack);
|
|
4542
|
+
return firstResult !== null && firstResult !== void 0 ? firstResult : (secondNode ? evaluateNode(secondNode, contextStack) : null);
|
|
4453
4543
|
},
|
|
4454
4544
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4455
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4456
|
-
return getUndefinedSymbols(node.
|
|
4545
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4546
|
+
return getUndefinedSymbols(node[1][1].filter(function (n) { return !!n; }), contextStack, builtin, evaluateNode);
|
|
4457
4547
|
},
|
|
4458
4548
|
};
|
|
4459
4549
|
|
|
4460
4550
|
var recurSpecialExpression = {
|
|
4461
4551
|
paramCount: {},
|
|
4462
4552
|
evaluate: function (node, contextStack, _a) {
|
|
4463
|
-
var
|
|
4464
|
-
var params = node
|
|
4465
|
-
|
|
4553
|
+
var evaluateNode = _a.evaluateNode;
|
|
4554
|
+
var params = node[1][1];
|
|
4555
|
+
var evaluatedParams = params.map(function (paramNode) { return evaluateNode(paramNode, contextStack); });
|
|
4556
|
+
throw new RecurSignal(evaluatedParams);
|
|
4466
4557
|
},
|
|
4467
4558
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4468
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4469
|
-
return getUndefinedSymbols(node
|
|
4559
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4560
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
4470
4561
|
},
|
|
4471
4562
|
};
|
|
4472
4563
|
|
|
4473
4564
|
var throwSpecialExpression = {
|
|
4474
4565
|
paramCount: 1,
|
|
4475
4566
|
evaluate: function (node, contextStack, _a) {
|
|
4476
|
-
var
|
|
4477
|
-
var message = asString(
|
|
4567
|
+
var evaluateNode = _a.evaluateNode;
|
|
4568
|
+
var message = asString(evaluateNode(node[1][1], contextStack), node[2], {
|
|
4478
4569
|
nonEmpty: true,
|
|
4479
4570
|
});
|
|
4480
|
-
throw new UserDefinedError(message, node
|
|
4571
|
+
throw new UserDefinedError(message, node[2]);
|
|
4481
4572
|
},
|
|
4482
4573
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4483
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4484
|
-
return getUndefinedSymbols(node
|
|
4574
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4575
|
+
return getUndefinedSymbols([node[1][1]], contextStack, builtin, evaluateNode);
|
|
4485
4576
|
},
|
|
4486
4577
|
};
|
|
4487
4578
|
|
|
@@ -4489,29 +4580,29 @@ var trySpecialExpression = {
|
|
|
4489
4580
|
paramCount: 1,
|
|
4490
4581
|
evaluate: function (node, contextStack, _a) {
|
|
4491
4582
|
var _b;
|
|
4492
|
-
var
|
|
4493
|
-
var
|
|
4583
|
+
var evaluateNode = _a.evaluateNode;
|
|
4584
|
+
var _c = __read(node[1], 4), tryExpression = _c[1], errorSymbol = _c[2], catchExpression = _c[3];
|
|
4494
4585
|
try {
|
|
4495
|
-
return
|
|
4586
|
+
return evaluateNode(tryExpression, contextStack);
|
|
4496
4587
|
}
|
|
4497
4588
|
catch (error) {
|
|
4498
|
-
var newContext =
|
|
4589
|
+
var newContext = errorSymbol
|
|
4499
4590
|
? (_b = {},
|
|
4500
|
-
_b[
|
|
4591
|
+
_b[errorSymbol[1]] = { value: error },
|
|
4501
4592
|
_b) : {};
|
|
4502
|
-
return
|
|
4593
|
+
return evaluateNode(catchExpression, contextStack.create(newContext));
|
|
4503
4594
|
}
|
|
4504
4595
|
},
|
|
4505
4596
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4506
4597
|
var _b;
|
|
4507
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4508
|
-
var
|
|
4509
|
-
var tryResult = getUndefinedSymbols(
|
|
4510
|
-
var newContext =
|
|
4598
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4599
|
+
var _c = __read(node[1], 4), tryExpression = _c[1], errorSymbol = _c[2], catchExpression = _c[3];
|
|
4600
|
+
var tryResult = getUndefinedSymbols([tryExpression], contextStack, builtin, evaluateNode);
|
|
4601
|
+
var newContext = errorSymbol
|
|
4511
4602
|
? (_b = {},
|
|
4512
|
-
_b[
|
|
4603
|
+
_b[errorSymbol[1]] = { value: true },
|
|
4513
4604
|
_b) : {};
|
|
4514
|
-
var catchResult = getUndefinedSymbols([catchExpression], contextStack.create(newContext), builtin,
|
|
4605
|
+
var catchResult = getUndefinedSymbols([catchExpression], contextStack.create(newContext), builtin, evaluateNode);
|
|
4515
4606
|
return joinSets(tryResult, catchResult);
|
|
4516
4607
|
},
|
|
4517
4608
|
};
|
|
@@ -4520,20 +4611,20 @@ var arraySpecialExpression = {
|
|
|
4520
4611
|
paramCount: {},
|
|
4521
4612
|
evaluate: function (node, contextStack, _a) {
|
|
4522
4613
|
var e_1, _b;
|
|
4523
|
-
var
|
|
4614
|
+
var evaluateNode = _a.evaluateNode;
|
|
4524
4615
|
var result = [];
|
|
4525
4616
|
try {
|
|
4526
|
-
for (var _c = __values(node
|
|
4617
|
+
for (var _c = __values(node[1][1]), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
4527
4618
|
var param = _d.value;
|
|
4528
|
-
if (param
|
|
4529
|
-
var spreadValue =
|
|
4619
|
+
if (isSpreadNode(param)) {
|
|
4620
|
+
var spreadValue = evaluateNode(param[1], contextStack);
|
|
4530
4621
|
if (!Array.isArray(spreadValue)) {
|
|
4531
|
-
throw new LitsError('Spread value is not an array', param
|
|
4622
|
+
throw new LitsError('Spread value is not an array', param[2]);
|
|
4532
4623
|
}
|
|
4533
4624
|
result.push.apply(result, __spreadArray([], __read(spreadValue), false));
|
|
4534
4625
|
}
|
|
4535
4626
|
else {
|
|
4536
|
-
result.push(
|
|
4627
|
+
result.push(evaluateNode(param, contextStack));
|
|
4537
4628
|
}
|
|
4538
4629
|
}
|
|
4539
4630
|
}
|
|
@@ -4547,156 +4638,171 @@ var arraySpecialExpression = {
|
|
|
4547
4638
|
return result;
|
|
4548
4639
|
},
|
|
4549
4640
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4550
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4551
|
-
return getUndefinedSymbols(node
|
|
4641
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4642
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
4552
4643
|
},
|
|
4553
4644
|
};
|
|
4554
4645
|
|
|
4555
4646
|
var objectSpecialExpression = {
|
|
4556
4647
|
paramCount: {},
|
|
4557
4648
|
evaluate: function (node, contextStack, _a) {
|
|
4558
|
-
var
|
|
4649
|
+
var evaluateNode = _a.evaluateNode;
|
|
4559
4650
|
var result = {};
|
|
4560
|
-
|
|
4561
|
-
|
|
4562
|
-
|
|
4563
|
-
|
|
4651
|
+
var params = node[1][1];
|
|
4652
|
+
for (var i = 0; i < params.length; i += 2) {
|
|
4653
|
+
var keyNode = params[i];
|
|
4654
|
+
if (isSpreadNode(keyNode)) {
|
|
4655
|
+
var spreadObject = evaluateNode(keyNode[1], contextStack);
|
|
4564
4656
|
if (!isUnknownRecord(spreadObject)) {
|
|
4565
|
-
throw new LitsError('Spread value is not an object', keyNode
|
|
4657
|
+
throw new LitsError('Spread value is not an object', keyNode[2]);
|
|
4566
4658
|
}
|
|
4567
4659
|
Object.assign(result, spreadObject);
|
|
4568
4660
|
i -= 1;
|
|
4569
4661
|
}
|
|
4570
4662
|
else {
|
|
4571
|
-
var key =
|
|
4572
|
-
var value =
|
|
4573
|
-
assertString(key, keyNode
|
|
4663
|
+
var key = evaluateNode(keyNode, contextStack);
|
|
4664
|
+
var value = evaluateNode(params[i + 1], contextStack);
|
|
4665
|
+
assertString(key, keyNode[2]);
|
|
4574
4666
|
result[key] = value;
|
|
4575
4667
|
}
|
|
4576
4668
|
}
|
|
4577
4669
|
return result;
|
|
4578
4670
|
},
|
|
4579
4671
|
getUndefinedSymbols: function (node, contextStack, _a) {
|
|
4580
|
-
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin,
|
|
4581
|
-
return getUndefinedSymbols(node
|
|
4672
|
+
var getUndefinedSymbols = _a.getUndefinedSymbols, builtin = _a.builtin, evaluateNode = _a.evaluateNode;
|
|
4673
|
+
return getUndefinedSymbols(node[1][1], contextStack, builtin, evaluateNode);
|
|
4582
4674
|
},
|
|
4583
4675
|
};
|
|
4584
4676
|
|
|
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
|
-
|
|
4677
|
+
var specialExpressions = [
|
|
4678
|
+
qqSpecialExpression,
|
|
4679
|
+
andSpecialExpression,
|
|
4680
|
+
orSpecialExpression,
|
|
4681
|
+
arraySpecialExpression,
|
|
4682
|
+
condSpecialExpression,
|
|
4683
|
+
defSpecialExpression,
|
|
4684
|
+
definedSpecialExpression,
|
|
4685
|
+
defnSpecialExpression,
|
|
4686
|
+
doSpecialExpression,
|
|
4687
|
+
doseqSpecialExpression,
|
|
4688
|
+
fnSpecialExpression,
|
|
4689
|
+
forSpecialExpression,
|
|
4690
|
+
functionSpecialExpression,
|
|
4691
|
+
ifSpecialExpression,
|
|
4692
|
+
letSpecialExpression,
|
|
4693
|
+
loopSpecialExpression,
|
|
4694
|
+
objectSpecialExpression,
|
|
4695
|
+
recurSpecialExpression,
|
|
4696
|
+
switchSpecialExpression,
|
|
4697
|
+
throwSpecialExpression,
|
|
4698
|
+
trySpecialExpression,
|
|
4699
|
+
unlessSpecialExpression,
|
|
4700
|
+
];
|
|
4609
4701
|
var builtin = {
|
|
4610
4702
|
normalExpressions: normalExpressions,
|
|
4611
4703
|
specialExpressions: specialExpressions,
|
|
4704
|
+
allNormalExpressions: allNormalExpressions,
|
|
4612
4705
|
};
|
|
4613
4706
|
var normalExpressionKeys = Object.keys(normalExpressions);
|
|
4614
|
-
var specialExpressionKeys = Object.keys(
|
|
4707
|
+
var specialExpressionKeys = Object.keys(specialExpressionTypes);
|
|
4708
|
+
new Set(specialExpressionKeys);
|
|
4615
4709
|
|
|
4616
|
-
var getUndefinedSymbols = function (ast, contextStack, builtin,
|
|
4710
|
+
var getUndefinedSymbols = function (ast, contextStack, builtin, evaluateNode) {
|
|
4617
4711
|
var e_1, _a;
|
|
4618
4712
|
var _b;
|
|
4619
|
-
var
|
|
4713
|
+
var nodes = Array.isArray(ast)
|
|
4620
4714
|
? ast
|
|
4621
|
-
: [
|
|
4622
|
-
type: 'SpecialExpression',
|
|
4623
|
-
name: 'do',
|
|
4624
|
-
params: ast.body,
|
|
4625
|
-
sourceCodeInfo: undefined,
|
|
4626
|
-
}];
|
|
4715
|
+
: [[NodeTypes.SpecialExpression, [specialExpressionTypes.do, ast.body]]];
|
|
4627
4716
|
var unresolvedSymbols = new Set();
|
|
4628
4717
|
try {
|
|
4629
|
-
for (var
|
|
4630
|
-
var subNode =
|
|
4631
|
-
(_b =
|
|
4718
|
+
for (var nodes_1 = __values(nodes), nodes_1_1 = nodes_1.next(); !nodes_1_1.done; nodes_1_1 = nodes_1.next()) {
|
|
4719
|
+
var subNode = nodes_1_1.value;
|
|
4720
|
+
(_b = findUnresolvedSymbolsInNode(subNode, contextStack, builtin, evaluateNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols.add(symbol); });
|
|
4632
4721
|
}
|
|
4633
4722
|
}
|
|
4634
4723
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
4635
4724
|
finally {
|
|
4636
4725
|
try {
|
|
4637
|
-
if (
|
|
4726
|
+
if (nodes_1_1 && !nodes_1_1.done && (_a = nodes_1.return)) _a.call(nodes_1);
|
|
4638
4727
|
}
|
|
4639
4728
|
finally { if (e_1) throw e_1.error; }
|
|
4640
4729
|
}
|
|
4641
4730
|
return unresolvedSymbols;
|
|
4642
4731
|
};
|
|
4643
|
-
function
|
|
4732
|
+
function findUnresolvedSymbolsInNode(node, contextStack, builtin, evaluateNode) {
|
|
4644
4733
|
var e_2, _a;
|
|
4645
|
-
var _b;
|
|
4646
|
-
|
|
4647
|
-
|
|
4648
|
-
|
|
4734
|
+
var _b, _c;
|
|
4735
|
+
var nodeType = node[0];
|
|
4736
|
+
switch (nodeType) {
|
|
4737
|
+
case NodeTypes.UserDefinedSymbol: {
|
|
4738
|
+
var symbolNode = node;
|
|
4739
|
+
var lookUpResult = contextStack.lookUp(symbolNode);
|
|
4649
4740
|
if (lookUpResult === null)
|
|
4650
|
-
return new Set([
|
|
4741
|
+
return new Set([symbolNode[1]]);
|
|
4651
4742
|
return null;
|
|
4652
4743
|
}
|
|
4653
|
-
case
|
|
4654
|
-
case
|
|
4655
|
-
case
|
|
4656
|
-
case
|
|
4657
|
-
case
|
|
4744
|
+
case NodeTypes.NormalBuiltinSymbol:
|
|
4745
|
+
case NodeTypes.SpecialBuiltinSymbol:
|
|
4746
|
+
case NodeTypes.String:
|
|
4747
|
+
case NodeTypes.Number:
|
|
4748
|
+
case NodeTypes.ReservedSymbol:
|
|
4658
4749
|
return null;
|
|
4659
|
-
case
|
|
4750
|
+
case NodeTypes.NormalExpression: {
|
|
4751
|
+
var normalExpressionNode = node;
|
|
4660
4752
|
var unresolvedSymbols_1 = new Set();
|
|
4661
|
-
|
|
4662
|
-
|
|
4663
|
-
|
|
4664
|
-
|
|
4665
|
-
|
|
4753
|
+
if (isNormalExpressionNodeWithName(normalExpressionNode)) {
|
|
4754
|
+
var _d = __read(normalExpressionNode, 2), _e = __read(_d[1], 1), symbolNode = _e[0];
|
|
4755
|
+
if (isUserDefinedSymbolNode(symbolNode)) {
|
|
4756
|
+
var lookUpResult = contextStack.lookUp(symbolNode);
|
|
4757
|
+
if (lookUpResult === null)
|
|
4758
|
+
unresolvedSymbols_1.add(symbolNode[1]);
|
|
4759
|
+
}
|
|
4760
|
+
}
|
|
4761
|
+
else {
|
|
4762
|
+
var _f = __read(normalExpressionNode, 2), _g = __read(_f[1], 1), expressionNode = _g[0];
|
|
4763
|
+
(_b = findUnresolvedSymbolsInNode(expressionNode, contextStack, builtin, evaluateNode)) === null || _b === void 0 ? void 0 : _b.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
|
|
4666
4764
|
}
|
|
4667
4765
|
try {
|
|
4668
|
-
for (var
|
|
4669
|
-
var subNode =
|
|
4670
|
-
(
|
|
4766
|
+
for (var _h = __values(normalExpressionNode[1][1]), _j = _h.next(); !_j.done; _j = _h.next()) {
|
|
4767
|
+
var subNode = _j.value;
|
|
4768
|
+
(_c = findUnresolvedSymbolsInNode(subNode, contextStack, builtin, evaluateNode)) === null || _c === void 0 ? void 0 : _c.forEach(function (symbol) { return unresolvedSymbols_1.add(symbol); });
|
|
4671
4769
|
}
|
|
4672
4770
|
}
|
|
4673
4771
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
4674
4772
|
finally {
|
|
4675
4773
|
try {
|
|
4676
|
-
if (
|
|
4774
|
+
if (_j && !_j.done && (_a = _h.return)) _a.call(_h);
|
|
4677
4775
|
}
|
|
4678
4776
|
finally { if (e_2) throw e_2.error; }
|
|
4679
4777
|
}
|
|
4680
4778
|
return unresolvedSymbols_1;
|
|
4681
4779
|
}
|
|
4682
|
-
case
|
|
4683
|
-
var
|
|
4684
|
-
|
|
4685
|
-
|
|
4780
|
+
case NodeTypes.SpecialExpression: {
|
|
4781
|
+
var specialExpressionNode = node;
|
|
4782
|
+
var specialExpressionType = specialExpressionNode[1][0];
|
|
4783
|
+
var specialExpression = builtin.specialExpressions[specialExpressionType];
|
|
4784
|
+
var castedGetUndefinedSymbols = specialExpression.getUndefinedSymbols;
|
|
4785
|
+
return castedGetUndefinedSymbols(specialExpressionNode, contextStack, {
|
|
4686
4786
|
getUndefinedSymbols: getUndefinedSymbols,
|
|
4687
4787
|
builtin: builtin,
|
|
4688
|
-
|
|
4788
|
+
evaluateNode: evaluateNode,
|
|
4689
4789
|
});
|
|
4690
4790
|
}
|
|
4691
|
-
case
|
|
4692
|
-
return
|
|
4791
|
+
case NodeTypes.Spread:
|
|
4792
|
+
return findUnresolvedSymbolsInNode(node[1], contextStack, builtin, evaluateNode);
|
|
4793
|
+
case NodeTypes.Binding: {
|
|
4794
|
+
var bindingNode = node;
|
|
4795
|
+
return findUnresolvedSymbolsInNode(bindingNode[1][1], contextStack, builtin, evaluateNode);
|
|
4796
|
+
}
|
|
4797
|
+
default:
|
|
4798
|
+
throw new Error("Unhandled node type: ".concat(nodeType));
|
|
4693
4799
|
}
|
|
4694
4800
|
}
|
|
4695
4801
|
|
|
4696
4802
|
function checkParams(evaluatedFunction, nbrOfParams, sourceCodeInfo) {
|
|
4697
|
-
var hasRest = evaluatedFunction.
|
|
4698
|
-
var minArity = evaluatedFunction.
|
|
4699
|
-
var maxArity = hasRest ? Number.MAX_SAFE_INTEGER : evaluatedFunction.
|
|
4803
|
+
var hasRest = evaluatedFunction[0].some(function (arg) { return arg[0] === bindingTargetTypes.rest; });
|
|
4804
|
+
var minArity = evaluatedFunction[0].filter(function (arg) { return arg[0] !== bindingTargetTypes.rest && arg[1][1] === undefined; }).length;
|
|
4805
|
+
var maxArity = hasRest ? Number.MAX_SAFE_INTEGER : evaluatedFunction[0].length;
|
|
4700
4806
|
if (nbrOfParams < minArity || nbrOfParams > maxArity) {
|
|
4701
4807
|
throw new LitsError("Unexpected number of arguments, got ".concat(valueToString(nbrOfParams), "."), sourceCodeInfo);
|
|
4702
4808
|
}
|
|
@@ -4720,21 +4826,21 @@ var functionExecutors = {
|
|
|
4720
4826
|
}
|
|
4721
4827
|
},
|
|
4722
4828
|
UserDefined: function (fn, params, sourceCodeInfo, contextStack, _a) {
|
|
4723
|
-
var
|
|
4829
|
+
var evaluateNode = _a.evaluateNode;
|
|
4724
4830
|
var _loop_1 = function () {
|
|
4725
4831
|
var e_1, _b;
|
|
4726
4832
|
checkParams(fn.evaluatedfunction, params.length, sourceCodeInfo);
|
|
4727
4833
|
var evaluatedFunction = fn.evaluatedfunction;
|
|
4728
|
-
var args = evaluatedFunction
|
|
4729
|
-
var nbrOfNonRestArgs = args.filter(function (arg) { return arg
|
|
4730
|
-
var newContextStack = contextStack.create(fn.evaluatedfunction
|
|
4834
|
+
var args = evaluatedFunction[0];
|
|
4835
|
+
var nbrOfNonRestArgs = args.filter(function (arg) { return arg[0] !== bindingTargetTypes.rest; }).length;
|
|
4836
|
+
var newContextStack = contextStack.create(fn.evaluatedfunction[2]);
|
|
4731
4837
|
var newContext = {};
|
|
4732
4838
|
var rest = [];
|
|
4733
4839
|
for (var i = 0; i < params.length; i += 1) {
|
|
4734
4840
|
if (i < nbrOfNonRestArgs) {
|
|
4735
4841
|
var param = toAny(params[i]);
|
|
4736
|
-
var valueRecord = evalueateBindingNodeValues(args[i], param, function (
|
|
4737
|
-
return
|
|
4842
|
+
var valueRecord = evalueateBindingNodeValues(args[i], param, function (Node) {
|
|
4843
|
+
return evaluateNode(Node, newContextStack.create(newContext));
|
|
4738
4844
|
});
|
|
4739
4845
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4740
4846
|
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
@@ -4747,18 +4853,18 @@ var functionExecutors = {
|
|
|
4747
4853
|
}
|
|
4748
4854
|
for (var i = params.length; i < nbrOfNonRestArgs; i++) {
|
|
4749
4855
|
var arg = args[i];
|
|
4750
|
-
var defaultValue =
|
|
4751
|
-
var valueRecord = evalueateBindingNodeValues(arg, defaultValue, function (
|
|
4752
|
-
return
|
|
4856
|
+
var defaultValue = evaluateNode(arg[1][1], contextStack.create(newContext));
|
|
4857
|
+
var valueRecord = evalueateBindingNodeValues(arg, defaultValue, function (Node) {
|
|
4858
|
+
return evaluateNode(Node, contextStack.create(newContext));
|
|
4753
4859
|
});
|
|
4754
4860
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4755
4861
|
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
4756
4862
|
newContext[key] = { value: value };
|
|
4757
4863
|
});
|
|
4758
4864
|
}
|
|
4759
|
-
var restArgument = args.find(function (arg) { return arg
|
|
4865
|
+
var restArgument = args.find(function (arg) { return arg[0] === bindingTargetTypes.rest; });
|
|
4760
4866
|
if (restArgument !== undefined) {
|
|
4761
|
-
var valueRecord = evalueateBindingNodeValues(restArgument, rest, function (
|
|
4867
|
+
var valueRecord = evalueateBindingNodeValues(restArgument, rest, function (Node) { return evaluateNode(Node, contextStack.create(newContext)); });
|
|
4762
4868
|
Object.entries(valueRecord).forEach(function (_a) {
|
|
4763
4869
|
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
4764
4870
|
newContext[key] = { value: value };
|
|
@@ -4768,9 +4874,9 @@ var functionExecutors = {
|
|
|
4768
4874
|
var result = null;
|
|
4769
4875
|
var newContextStack2 = newContextStack.create(newContext);
|
|
4770
4876
|
try {
|
|
4771
|
-
for (var _c = (e_1 = void 0, __values(evaluatedFunction
|
|
4877
|
+
for (var _c = (e_1 = void 0, __values(evaluatedFunction[1])), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
4772
4878
|
var node = _d.value;
|
|
4773
|
-
result =
|
|
4879
|
+
result = evaluateNode(node, newContextStack2);
|
|
4774
4880
|
}
|
|
4775
4881
|
}
|
|
4776
4882
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
@@ -4894,7 +5000,7 @@ var functionExecutors = {
|
|
|
4894
5000
|
},
|
|
4895
5001
|
Builtin: function (fn, params, sourceCodeInfo, contextStack, _a) {
|
|
4896
5002
|
var executeFunction = _a.executeFunction;
|
|
4897
|
-
var normalExpression = asNonUndefined(
|
|
5003
|
+
var normalExpression = asNonUndefined(allNormalExpressions[fn.normalBuitinSymbolType], sourceCodeInfo);
|
|
4898
5004
|
return normalExpression.evaluate(params, sourceCodeInfo, contextStack, { executeFunction: executeFunction });
|
|
4899
5005
|
},
|
|
4900
5006
|
};
|
|
@@ -4905,7 +5011,7 @@ function evaluate(ast, contextStack) {
|
|
|
4905
5011
|
try {
|
|
4906
5012
|
for (var _b = __values(ast.body), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
4907
5013
|
var node = _c.value;
|
|
4908
|
-
result =
|
|
5014
|
+
result = evaluateNode(node, contextStack);
|
|
4909
5015
|
}
|
|
4910
5016
|
}
|
|
4911
5017
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
@@ -4917,53 +5023,66 @@ function evaluate(ast, contextStack) {
|
|
|
4917
5023
|
}
|
|
4918
5024
|
return result;
|
|
4919
5025
|
}
|
|
4920
|
-
function
|
|
4921
|
-
switch (node
|
|
4922
|
-
case
|
|
5026
|
+
function evaluateNode(node, contextStack) {
|
|
5027
|
+
switch (node[0]) {
|
|
5028
|
+
case NodeTypes.Number:
|
|
4923
5029
|
return evaluateNumber(node);
|
|
4924
|
-
case
|
|
5030
|
+
case NodeTypes.String:
|
|
4925
5031
|
return evaluateString(node);
|
|
4926
|
-
case
|
|
4927
|
-
|
|
4928
|
-
case
|
|
4929
|
-
return
|
|
4930
|
-
case
|
|
5032
|
+
case NodeTypes.NormalBuiltinSymbol:
|
|
5033
|
+
case NodeTypes.SpecialBuiltinSymbol:
|
|
5034
|
+
case NodeTypes.UserDefinedSymbol:
|
|
5035
|
+
return contextStack.evaluateSymbol(node);
|
|
5036
|
+
case NodeTypes.ReservedSymbol:
|
|
5037
|
+
return evaluateReservedSymbol(node);
|
|
5038
|
+
case NodeTypes.NormalExpression:
|
|
4931
5039
|
return evaluateNormalExpression(node, contextStack);
|
|
4932
|
-
case
|
|
5040
|
+
case NodeTypes.SpecialExpression:
|
|
4933
5041
|
return evaluateSpecialExpression(node, contextStack);
|
|
4934
5042
|
/* v8 ignore next 2 */
|
|
4935
5043
|
default:
|
|
4936
|
-
throw new LitsError("".concat(node
|
|
5044
|
+
throw new LitsError("".concat(getNodeTypeName(node[0]), "-node cannot be evaluated"), node[2]);
|
|
4937
5045
|
}
|
|
4938
5046
|
}
|
|
4939
5047
|
function evaluateNumber(node) {
|
|
4940
|
-
return node
|
|
5048
|
+
return node[1];
|
|
4941
5049
|
}
|
|
4942
5050
|
function evaluateString(node) {
|
|
4943
|
-
return node
|
|
5051
|
+
return node[1];
|
|
4944
5052
|
}
|
|
4945
|
-
function
|
|
4946
|
-
var reservedName = node
|
|
5053
|
+
function evaluateReservedSymbol(node) {
|
|
5054
|
+
var reservedName = node[1];
|
|
4947
5055
|
var value = reservedSymbolRecord[reservedName];
|
|
4948
|
-
return asNonUndefined(value, node
|
|
5056
|
+
return asNonUndefined(value, node[2]);
|
|
4949
5057
|
}
|
|
4950
5058
|
function evaluateNormalExpression(node, contextStack) {
|
|
4951
|
-
var
|
|
4952
|
-
var
|
|
5059
|
+
var sourceCodeInfo = node[2];
|
|
5060
|
+
var paramNodes = node[1][1];
|
|
5061
|
+
var params = paramNodes.map(function (paramNode) { return evaluateNode(paramNode, contextStack); });
|
|
4953
5062
|
if (isNormalExpressionNodeWithName(node)) {
|
|
4954
|
-
var
|
|
4955
|
-
if (
|
|
4956
|
-
|
|
4957
|
-
|
|
5063
|
+
var nameSymbol = node[1][0];
|
|
5064
|
+
if (isNormalBuiltinSymbolNode(nameSymbol)) {
|
|
5065
|
+
var type = nameSymbol[1];
|
|
5066
|
+
var normalExpression = builtin.allNormalExpressions[type];
|
|
5067
|
+
return normalExpression.evaluate(params, node[2], contextStack, { executeFunction: executeFunction });
|
|
5068
|
+
}
|
|
5069
|
+
else {
|
|
5070
|
+
var fn = contextStack.getValue(nameSymbol[1]);
|
|
5071
|
+
if (fn !== undefined) {
|
|
5072
|
+
return executeFunction(asAny(fn), params, contextStack, sourceCodeInfo);
|
|
5073
|
+
}
|
|
5074
|
+
throw new UndefinedSymbolError(nameSymbol[1], node[2]);
|
|
5075
|
+
}
|
|
4958
5076
|
}
|
|
4959
5077
|
else {
|
|
4960
|
-
var
|
|
4961
|
-
|
|
5078
|
+
var fnNode = node[1][0];
|
|
5079
|
+
var fn = evaluateNode(fnNode, contextStack);
|
|
5080
|
+
return executeFunction(fn, params, contextStack, sourceCodeInfo);
|
|
4962
5081
|
}
|
|
4963
5082
|
}
|
|
4964
5083
|
function executeFunction(fn, params, contextStack, sourceCodeInfo) {
|
|
4965
5084
|
if (isLitsFunction(fn))
|
|
4966
|
-
return functionExecutors[fn.functionType](fn, params, sourceCodeInfo, contextStack, {
|
|
5085
|
+
return functionExecutors[fn.functionType](fn, params, sourceCodeInfo, contextStack, { evaluateNode: evaluateNode, executeFunction: executeFunction });
|
|
4967
5086
|
if (Array.isArray(fn))
|
|
4968
5087
|
return evaluateArrayAsFunction(fn, params, sourceCodeInfo);
|
|
4969
5088
|
if (isObj(fn))
|
|
@@ -4974,16 +5093,11 @@ function executeFunction(fn, params, contextStack, sourceCodeInfo) {
|
|
|
4974
5093
|
return evaluateNumberAsFunction(fn, params, sourceCodeInfo);
|
|
4975
5094
|
throw new NotAFunctionError(fn, sourceCodeInfo);
|
|
4976
5095
|
}
|
|
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
5096
|
function evaluateSpecialExpression(node, contextStack) {
|
|
4984
|
-
var
|
|
4985
|
-
|
|
4986
|
-
|
|
5097
|
+
var specialExpressionType = node[1][0];
|
|
5098
|
+
var specialExpression = asNonUndefined(builtin.specialExpressions[specialExpressionType], node[2]);
|
|
5099
|
+
var castedEvaluate = specialExpression.evaluate;
|
|
5100
|
+
return castedEvaluate(node, contextStack, { evaluateNode: evaluateNode, builtin: builtin, getUndefinedSymbols: getUndefinedSymbols });
|
|
4987
5101
|
}
|
|
4988
5102
|
function evalueateObjectAsFunction(fn, params, sourceCodeInfo) {
|
|
4989
5103
|
if (params.length !== 1)
|
|
@@ -5125,13 +5239,13 @@ var ContextStackImpl = /** @class */ (function () {
|
|
|
5125
5239
|
return (_d = this.values) === null || _d === void 0 ? void 0 : _d[name];
|
|
5126
5240
|
};
|
|
5127
5241
|
ContextStackImpl.prototype.lookUp = function (node) {
|
|
5128
|
-
var e_4, _a
|
|
5129
|
-
var _c, _d
|
|
5130
|
-
var value = node
|
|
5131
|
-
var sourceCodeInfo = node.sourceCodeInfo;
|
|
5242
|
+
var e_4, _a;
|
|
5243
|
+
var _b, _c, _d;
|
|
5244
|
+
var value = node[1];
|
|
5132
5245
|
try {
|
|
5133
|
-
|
|
5134
|
-
|
|
5246
|
+
// const sourceCodeInfo = node[2]
|
|
5247
|
+
for (var _e = __values(this.contexts), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
5248
|
+
var context = _f.value;
|
|
5135
5249
|
var contextEntry = context[value];
|
|
5136
5250
|
if (contextEntry)
|
|
5137
5251
|
return contextEntry;
|
|
@@ -5140,32 +5254,23 @@ var ContextStackImpl = /** @class */ (function () {
|
|
|
5140
5254
|
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
5141
5255
|
finally {
|
|
5142
5256
|
try {
|
|
5143
|
-
if (
|
|
5257
|
+
if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
|
|
5144
5258
|
}
|
|
5145
5259
|
finally { if (e_4) throw e_4.error; }
|
|
5146
5260
|
}
|
|
5147
|
-
var lazyHostValue = (
|
|
5261
|
+
var lazyHostValue = (_b = this.lazyValues) === null || _b === void 0 ? void 0 : _b[value];
|
|
5148
5262
|
if (lazyHostValue !== undefined) {
|
|
5149
5263
|
return {
|
|
5150
5264
|
value: toAny(lazyHostValue.read()),
|
|
5151
5265
|
};
|
|
5152
5266
|
}
|
|
5153
|
-
var hostValue = (
|
|
5267
|
+
var hostValue = (_c = this.values) === null || _c === void 0 ? void 0 : _c[value];
|
|
5154
5268
|
if (hostValue !== undefined) {
|
|
5155
5269
|
return {
|
|
5156
5270
|
value: toAny(hostValue),
|
|
5157
5271
|
};
|
|
5158
5272
|
}
|
|
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];
|
|
5273
|
+
var nativeJsFunction = (_d = this.nativeJsFunctions) === null || _d === void 0 ? void 0 : _d[value];
|
|
5169
5274
|
if (nativeJsFunction) {
|
|
5170
5275
|
return {
|
|
5171
5276
|
value: nativeJsFunction,
|
|
@@ -5173,13 +5278,26 @@ var ContextStackImpl = /** @class */ (function () {
|
|
|
5173
5278
|
}
|
|
5174
5279
|
return null;
|
|
5175
5280
|
};
|
|
5176
|
-
ContextStackImpl.prototype.
|
|
5281
|
+
ContextStackImpl.prototype.evaluateSymbol = function (node) {
|
|
5282
|
+
var _a;
|
|
5283
|
+
if (isSpecialBuiltinSymbolNode(node)) {
|
|
5284
|
+
throw new Error('Special builtin symbols should not be evaluated');
|
|
5285
|
+
}
|
|
5286
|
+
if (isNormalBuiltinSymbolNode(node)) {
|
|
5287
|
+
var type = node[1];
|
|
5288
|
+
return _a = {},
|
|
5289
|
+
_a[FUNCTION_SYMBOL] = true,
|
|
5290
|
+
_a.functionType = 'Builtin',
|
|
5291
|
+
_a.normalBuitinSymbolType = type,
|
|
5292
|
+
_a.sourceCodeInfo = node[2],
|
|
5293
|
+
_a;
|
|
5294
|
+
}
|
|
5177
5295
|
var lookUpResult = this.lookUp(node);
|
|
5178
5296
|
if (isContextEntry(lookUpResult))
|
|
5179
5297
|
return lookUpResult.value;
|
|
5180
5298
|
else if (isBuiltinFunction(lookUpResult))
|
|
5181
5299
|
return lookUpResult;
|
|
5182
|
-
throw new UndefinedSymbolError(node
|
|
5300
|
+
throw new UndefinedSymbolError(node[1], node[2]);
|
|
5183
5301
|
};
|
|
5184
5302
|
return ContextStackImpl;
|
|
5185
5303
|
}());
|
|
@@ -5714,6 +5832,10 @@ function assertReservedSymbolToken(token, symbolName) {
|
|
|
5714
5832
|
throwUnexpectedToken('ReservedSymbol', symbolName, token);
|
|
5715
5833
|
}
|
|
5716
5834
|
}
|
|
5835
|
+
function asReservedSymbolToken(token, symbolName) {
|
|
5836
|
+
assertReservedSymbolToken(token, symbolName);
|
|
5837
|
+
return token;
|
|
5838
|
+
}
|
|
5717
5839
|
function isSingleLineCommentToken(token) {
|
|
5718
5840
|
return (token === null || token === void 0 ? void 0 : token[0]) === 'SingleLineComment';
|
|
5719
5841
|
}
|
|
@@ -5796,6 +5918,9 @@ function assertRBraceToken(token) {
|
|
|
5796
5918
|
throwUnexpectedToken('RBrace', undefined, token);
|
|
5797
5919
|
}
|
|
5798
5920
|
}
|
|
5921
|
+
function isStringToken(token) {
|
|
5922
|
+
return (token === null || token === void 0 ? void 0 : token[0]) === 'String';
|
|
5923
|
+
}
|
|
5799
5924
|
function isA_BinaryOperatorToken(token) {
|
|
5800
5925
|
return (token === null || token === void 0 ? void 0 : token[0]) === 'Operator' && isBinaryOperator(token[1]);
|
|
5801
5926
|
}
|
|
@@ -5833,6 +5958,12 @@ function untokenize(tokenStream) {
|
|
|
5833
5958
|
var exponentiationPrecedence = 10;
|
|
5834
5959
|
var binaryFunctionalOperatorPrecedence = 1;
|
|
5835
5960
|
var placeholderRegexp = /^\$([1-9]\d?)?$/;
|
|
5961
|
+
function withSourceCodeInfo(node, sourceCodeInfo) {
|
|
5962
|
+
if (sourceCodeInfo) {
|
|
5963
|
+
node[2] = sourceCodeInfo;
|
|
5964
|
+
}
|
|
5965
|
+
return node;
|
|
5966
|
+
}
|
|
5836
5967
|
function getPrecedence(operatorSign) {
|
|
5837
5968
|
switch (operatorSign) {
|
|
5838
5969
|
case '**': // exponentiation
|
|
@@ -5875,29 +6006,18 @@ function getPrecedence(operatorSign) {
|
|
|
5875
6006
|
throw new Error("Unknown binary operator: ".concat(operatorSign));
|
|
5876
6007
|
}
|
|
5877
6008
|
}
|
|
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);
|
|
6009
|
+
function createNamedNormalExpressionNode(symbolNode, params, sourceCodeInfo) {
|
|
6010
|
+
var node = withSourceCodeInfo([NodeTypes.NormalExpression, [symbolNode, params]], sourceCodeInfo);
|
|
6011
|
+
if (isNormalBuiltinSymbolNode(symbolNode)) {
|
|
6012
|
+
assertNumberOfParams(allNormalExpressions[symbolNode[1]].paramCount, node);
|
|
5888
6013
|
}
|
|
5889
6014
|
return node;
|
|
5890
6015
|
}
|
|
5891
6016
|
function createAccessorNode(left, right, sourceCodeInfo) {
|
|
5892
6017
|
// Unnamed normal expression
|
|
5893
|
-
return
|
|
5894
|
-
type: 'NormalExpression',
|
|
5895
|
-
params: [left, right],
|
|
5896
|
-
name: undefined,
|
|
5897
|
-
sourceCodeInfo: sourceCodeInfo,
|
|
5898
|
-
};
|
|
6018
|
+
return withSourceCodeInfo([NodeTypes.NormalExpression, [left, [right]]], sourceCodeInfo);
|
|
5899
6019
|
}
|
|
5900
|
-
function
|
|
6020
|
+
function fromBinaryOperatorToNode(operator, symbolNode, left, right, sourceCodeInfo) {
|
|
5901
6021
|
var operatorName = operator[1];
|
|
5902
6022
|
switch (operatorName) {
|
|
5903
6023
|
case '**': // exponentiation
|
|
@@ -5922,16 +6042,11 @@ function fromBinaryOperatorToAstNode(operator, left, right, sourceCodeInfo) {
|
|
|
5922
6042
|
case '&':
|
|
5923
6043
|
case '^':
|
|
5924
6044
|
case '|':
|
|
5925
|
-
return createNamedNormalExpressionNode(
|
|
6045
|
+
return createNamedNormalExpressionNode(symbolNode, [left, right], sourceCodeInfo);
|
|
5926
6046
|
case '&&':
|
|
5927
6047
|
case '||':
|
|
5928
6048
|
case '??':
|
|
5929
|
-
return
|
|
5930
|
-
type: 'SpecialExpression',
|
|
5931
|
-
name: operatorName,
|
|
5932
|
-
params: [left, right],
|
|
5933
|
-
sourceCodeInfo: sourceCodeInfo,
|
|
5934
|
-
};
|
|
6049
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes[operatorName], [left, right]]], sourceCodeInfo);
|
|
5935
6050
|
/* v8 ignore next 10 */
|
|
5936
6051
|
case '.':
|
|
5937
6052
|
case ';':
|
|
@@ -6027,9 +6142,12 @@ var Parser = /** @class */ (function () {
|
|
|
6027
6142
|
&& !(newPrecedece === exponentiationPrecedence && precedence === exponentiationPrecedence)) {
|
|
6028
6143
|
break;
|
|
6029
6144
|
}
|
|
6145
|
+
var symbol = specialExpressionTypes[name_1]
|
|
6146
|
+
? withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[name_1]], operator[2])
|
|
6147
|
+
: withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[name_1]], operator[2]);
|
|
6030
6148
|
this.advance();
|
|
6031
6149
|
var right = this.parseExpression(newPrecedece);
|
|
6032
|
-
left =
|
|
6150
|
+
left = fromBinaryOperatorToNode(operator, symbol, left, right, operator[2]);
|
|
6033
6151
|
}
|
|
6034
6152
|
else if (isSymbolToken(operator)) {
|
|
6035
6153
|
if (!isFunctionOperator(operator[1])) {
|
|
@@ -6039,9 +6157,12 @@ var Parser = /** @class */ (function () {
|
|
|
6039
6157
|
if (newPrecedece <= precedence) {
|
|
6040
6158
|
break;
|
|
6041
6159
|
}
|
|
6042
|
-
this.
|
|
6160
|
+
var operatorSymbol = this.parseSymbol();
|
|
6043
6161
|
var right = this.parseExpression(newPrecedece);
|
|
6044
|
-
|
|
6162
|
+
if (isSpecialBuiltinSymbolNode(operatorSymbol)) {
|
|
6163
|
+
throw new LitsError('Special expressions are not allowed in binary functional operators', operatorSymbol[2]);
|
|
6164
|
+
}
|
|
6165
|
+
left = createNamedNormalExpressionNode(operatorSymbol, [left, right], operator[2]);
|
|
6045
6166
|
}
|
|
6046
6167
|
else {
|
|
6047
6168
|
break;
|
|
@@ -6060,11 +6181,7 @@ var Parser = /** @class */ (function () {
|
|
|
6060
6181
|
if (!isSymbolToken(symbolToken)) {
|
|
6061
6182
|
throw new LitsError('Expected symbol', this.peek()[2]);
|
|
6062
6183
|
}
|
|
6063
|
-
var stringNode =
|
|
6064
|
-
type: 'String',
|
|
6065
|
-
value: symbolToken[1],
|
|
6066
|
-
sourceCodeInfo: symbolToken[2],
|
|
6067
|
-
};
|
|
6184
|
+
var stringNode = withSourceCodeInfo([NodeTypes.String, symbolToken[1]], symbolToken[2]);
|
|
6068
6185
|
operand = createAccessorNode(operand, stringNode, token[2]);
|
|
6069
6186
|
this.advance();
|
|
6070
6187
|
token = this.peek();
|
|
@@ -6104,16 +6221,17 @@ var Parser = /** @class */ (function () {
|
|
|
6104
6221
|
this.advance();
|
|
6105
6222
|
return expression;
|
|
6106
6223
|
}
|
|
6107
|
-
// Unary operators
|
|
6108
6224
|
else if (isOperatorToken(token)) {
|
|
6109
6225
|
var operatorName = token[1];
|
|
6110
6226
|
if (isBinaryOperator(operatorName)) {
|
|
6111
6227
|
this.advance();
|
|
6112
|
-
|
|
6113
|
-
|
|
6114
|
-
|
|
6115
|
-
|
|
6116
|
-
|
|
6228
|
+
if (specialExpressionTypes[operatorName] !== undefined) {
|
|
6229
|
+
return withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[operatorName]], token[2]);
|
|
6230
|
+
}
|
|
6231
|
+
else if (normalExpressionTypes[operatorName] !== undefined) {
|
|
6232
|
+
return withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[operatorName]], token[2]);
|
|
6233
|
+
}
|
|
6234
|
+
return withSourceCodeInfo([NodeTypes.UserDefinedSymbol, operatorName], token[2]);
|
|
6117
6235
|
}
|
|
6118
6236
|
if (operatorName === '->') {
|
|
6119
6237
|
return this.parseShorthandLamdaFunction();
|
|
@@ -6161,22 +6279,24 @@ var Parser = /** @class */ (function () {
|
|
|
6161
6279
|
while (!this.isAtEnd() && !isRBraceToken(this.peek())) {
|
|
6162
6280
|
if (isOperatorToken(this.peek(), '...')) {
|
|
6163
6281
|
this.advance();
|
|
6164
|
-
params.push(
|
|
6165
|
-
type: 'Spread',
|
|
6166
|
-
value: this.parseExpression(),
|
|
6167
|
-
sourceCodeInfo: this.peek()[2],
|
|
6168
|
-
});
|
|
6282
|
+
params.push(withSourceCodeInfo([NodeTypes.Spread, this.parseExpression()], this.peek()[2]));
|
|
6169
6283
|
}
|
|
6170
6284
|
else {
|
|
6171
|
-
var
|
|
6172
|
-
if (
|
|
6285
|
+
var token = this.peek();
|
|
6286
|
+
if (isStringToken(token)) {
|
|
6287
|
+
var stringNode = this.parseString();
|
|
6288
|
+
params.push(withSourceCodeInfo([NodeTypes.String, stringNode[1]], token[2]));
|
|
6289
|
+
}
|
|
6290
|
+
else if (isSymbolToken(token)) {
|
|
6291
|
+
var value = token[1].startsWith('\'')
|
|
6292
|
+
? this.stringFromQuotedSymbol(token[1])
|
|
6293
|
+
: token[1];
|
|
6294
|
+
params.push(withSourceCodeInfo([NodeTypes.String, value], token[2]));
|
|
6295
|
+
this.advance();
|
|
6296
|
+
}
|
|
6297
|
+
else {
|
|
6173
6298
|
throw new LitsError('Expected key to be a symbol or a string', this.peek()[2]);
|
|
6174
6299
|
}
|
|
6175
|
-
params.push({
|
|
6176
|
-
type: 'String',
|
|
6177
|
-
value: key.value,
|
|
6178
|
-
sourceCodeInfo: key.sourceCodeInfo,
|
|
6179
|
-
});
|
|
6180
6300
|
assertOperatorToken(this.peek(), ':=');
|
|
6181
6301
|
this.advance();
|
|
6182
6302
|
params.push(this.parseExpression());
|
|
@@ -6191,12 +6311,7 @@ var Parser = /** @class */ (function () {
|
|
|
6191
6311
|
}
|
|
6192
6312
|
assertRBraceToken(this.peek());
|
|
6193
6313
|
this.advance();
|
|
6194
|
-
return
|
|
6195
|
-
type: 'SpecialExpression',
|
|
6196
|
-
name: 'object',
|
|
6197
|
-
params: params,
|
|
6198
|
-
sourceCodeInfo: firstToken[2],
|
|
6199
|
-
};
|
|
6314
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.object, params]], firstToken[2]);
|
|
6200
6315
|
};
|
|
6201
6316
|
Parser.prototype.parseArray = function () {
|
|
6202
6317
|
var firstToken = asLBracketToken(this.peek());
|
|
@@ -6205,11 +6320,7 @@ var Parser = /** @class */ (function () {
|
|
|
6205
6320
|
while (!this.isAtEnd() && !isRBracketToken(this.peek())) {
|
|
6206
6321
|
if (isOperatorToken(this.peek(), '...')) {
|
|
6207
6322
|
this.advance();
|
|
6208
|
-
params.push(
|
|
6209
|
-
type: 'Spread',
|
|
6210
|
-
value: this.parseExpression(),
|
|
6211
|
-
sourceCodeInfo: this.peek()[2],
|
|
6212
|
-
});
|
|
6323
|
+
params.push(withSourceCodeInfo([NodeTypes.Spread, this.parseExpression()], this.peek()[2]));
|
|
6213
6324
|
}
|
|
6214
6325
|
else {
|
|
6215
6326
|
params.push(this.parseExpression());
|
|
@@ -6224,15 +6335,9 @@ var Parser = /** @class */ (function () {
|
|
|
6224
6335
|
}
|
|
6225
6336
|
assertRBracketToken(this.peek());
|
|
6226
6337
|
this.advance();
|
|
6227
|
-
return
|
|
6228
|
-
type: 'SpecialExpression',
|
|
6229
|
-
name: 'array',
|
|
6230
|
-
params: params,
|
|
6231
|
-
sourceCodeInfo: firstToken[2],
|
|
6232
|
-
};
|
|
6338
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.array, params]], firstToken[2]);
|
|
6233
6339
|
};
|
|
6234
6340
|
Parser.prototype.parseFunctionCall = function (symbol) {
|
|
6235
|
-
var isNamedFunction = symbol.type === 'Symbol';
|
|
6236
6341
|
this.advance();
|
|
6237
6342
|
var params = [];
|
|
6238
6343
|
while (!this.isAtEnd() && !isRParenToken(this.peek())) {
|
|
@@ -6249,45 +6354,57 @@ var Parser = /** @class */ (function () {
|
|
|
6249
6354
|
throw new LitsError('Expected closing parenthesis', this.peek()[2]);
|
|
6250
6355
|
}
|
|
6251
6356
|
this.advance();
|
|
6252
|
-
if (
|
|
6253
|
-
|
|
6254
|
-
|
|
6255
|
-
|
|
6256
|
-
|
|
6257
|
-
|
|
6258
|
-
|
|
6259
|
-
|
|
6260
|
-
|
|
6261
|
-
|
|
6262
|
-
|
|
6263
|
-
|
|
6264
|
-
|
|
6265
|
-
|
|
6266
|
-
|
|
6267
|
-
|
|
6268
|
-
|
|
6269
|
-
|
|
6270
|
-
|
|
6271
|
-
return
|
|
6357
|
+
if (isSpecialBuiltinSymbolNode(symbol)) { // Named function
|
|
6358
|
+
var specialExpressionType = symbol[1];
|
|
6359
|
+
var type = specialExpressionType;
|
|
6360
|
+
switch (type) {
|
|
6361
|
+
case specialExpressionTypes['||']:
|
|
6362
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6363
|
+
case specialExpressionTypes['&&']:
|
|
6364
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6365
|
+
case specialExpressionTypes.recur:
|
|
6366
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6367
|
+
case specialExpressionTypes.array:
|
|
6368
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6369
|
+
case specialExpressionTypes.object:
|
|
6370
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, params]], symbol[2]);
|
|
6371
|
+
case specialExpressionTypes['??']: {
|
|
6372
|
+
if (params.length === 1) {
|
|
6373
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, [params[0], undefined]]], symbol[2]);
|
|
6374
|
+
}
|
|
6375
|
+
if (params.length === 2) {
|
|
6376
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, [params[0], params[1]]]], symbol[2]);
|
|
6377
|
+
}
|
|
6378
|
+
throw new LitsError('Expected exactly two parameters', symbol[2]);
|
|
6379
|
+
}
|
|
6380
|
+
case specialExpressionTypes['defined?']: {
|
|
6381
|
+
if (params.length !== 1) {
|
|
6382
|
+
throw new LitsError('Expected exactly one parameter', symbol[2]);
|
|
6272
6383
|
}
|
|
6273
|
-
|
|
6274
|
-
|
|
6275
|
-
case 'defn':
|
|
6276
|
-
throw new Error("".concat(name_2, " is not allowed"));
|
|
6277
|
-
/* v8 ignore next 2 */
|
|
6278
|
-
default:
|
|
6279
|
-
throw new Error("Unknown special expression: ".concat(name_2));
|
|
6384
|
+
var _a = __read(params, 1), param = _a[0];
|
|
6385
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, param]], symbol[2]);
|
|
6280
6386
|
}
|
|
6387
|
+
case specialExpressionTypes.throw: {
|
|
6388
|
+
if (params.length !== 1) {
|
|
6389
|
+
throw new LitsError('Expected exactly one parameter', symbol[2]);
|
|
6390
|
+
}
|
|
6391
|
+
var _b = __read(params, 1), param = _b[0];
|
|
6392
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [type, param]], symbol[2]);
|
|
6393
|
+
}
|
|
6394
|
+
case specialExpressionTypes.fn:
|
|
6395
|
+
case specialExpressionTypes.def:
|
|
6396
|
+
case specialExpressionTypes.defn:
|
|
6397
|
+
throw new LitsError("".concat(type, " is not allowed"), symbol[2]);
|
|
6398
|
+
/* v8 ignore next 2 */
|
|
6399
|
+
default:
|
|
6400
|
+
throw new Error("Unknown special expression: ".concat(type));
|
|
6281
6401
|
}
|
|
6282
|
-
|
|
6402
|
+
}
|
|
6403
|
+
else if (isNormalBuiltinSymbolNode(symbol) || isNormalBuiltinSymbolNode(symbol)) {
|
|
6404
|
+
return createNamedNormalExpressionNode(symbol, params, symbol[2]);
|
|
6283
6405
|
}
|
|
6284
6406
|
else {
|
|
6285
|
-
return
|
|
6286
|
-
type: 'NormalExpression',
|
|
6287
|
-
name: undefined,
|
|
6288
|
-
params: __spreadArray([symbol], __read(params), false),
|
|
6289
|
-
sourceCodeInfo: symbol.sourceCodeInfo,
|
|
6290
|
-
};
|
|
6407
|
+
return withSourceCodeInfo([NodeTypes.NormalExpression, [symbol, params]], symbol[2]);
|
|
6291
6408
|
}
|
|
6292
6409
|
};
|
|
6293
6410
|
Parser.prototype.parseLambdaFunction = function () {
|
|
@@ -6304,16 +6421,10 @@ var Parser = /** @class */ (function () {
|
|
|
6304
6421
|
}
|
|
6305
6422
|
this.advance();
|
|
6306
6423
|
var body = this.parseExpression();
|
|
6307
|
-
return
|
|
6308
|
-
|
|
6309
|
-
|
|
6310
|
-
|
|
6311
|
-
function: {
|
|
6312
|
-
arguments: functionArguments,
|
|
6313
|
-
body: [body],
|
|
6314
|
-
},
|
|
6315
|
-
sourceCodeInfo: firstToken[2],
|
|
6316
|
-
};
|
|
6424
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.fn, [
|
|
6425
|
+
functionArguments,
|
|
6426
|
+
[body],
|
|
6427
|
+
]]], firstToken[2]);
|
|
6317
6428
|
}
|
|
6318
6429
|
catch (_a) {
|
|
6319
6430
|
return null;
|
|
@@ -6322,11 +6433,7 @@ var Parser = /** @class */ (function () {
|
|
|
6322
6433
|
Parser.prototype.parseFunctionArguments = function () {
|
|
6323
6434
|
var firstToken = this.peek();
|
|
6324
6435
|
if (isSymbolToken(firstToken)) {
|
|
6325
|
-
return [
|
|
6326
|
-
type: 'symbol',
|
|
6327
|
-
name: this.parseSymbol().value,
|
|
6328
|
-
sourceCodeInfo: firstToken[2],
|
|
6329
|
-
}];
|
|
6436
|
+
return [withSourceCodeInfo([bindingTargetTypes.symbol, [this.parseSymbol(), undefined]], firstToken[2])];
|
|
6330
6437
|
}
|
|
6331
6438
|
assertLParenToken(firstToken);
|
|
6332
6439
|
this.advance();
|
|
@@ -6338,13 +6445,13 @@ var Parser = /** @class */ (function () {
|
|
|
6338
6445
|
throw new LitsError('Rest argument must be last', this.peek()[2]);
|
|
6339
6446
|
}
|
|
6340
6447
|
var bindingTarget = this.parseBindingTarget();
|
|
6341
|
-
if (bindingTarget
|
|
6448
|
+
if (bindingTarget[1][1] !== undefined) {
|
|
6342
6449
|
defaults = true;
|
|
6343
6450
|
}
|
|
6344
|
-
if (bindingTarget
|
|
6451
|
+
if (bindingTarget[0] === bindingTargetTypes.rest) {
|
|
6345
6452
|
rest = true;
|
|
6346
6453
|
}
|
|
6347
|
-
if (defaults && !bindingTarget
|
|
6454
|
+
if (defaults && !bindingTarget[1][1]) {
|
|
6348
6455
|
throw new LitsError('Default arguments must be last', this.peek()[2]);
|
|
6349
6456
|
}
|
|
6350
6457
|
functionArguments.push(bindingTarget);
|
|
@@ -6391,22 +6498,16 @@ var Parser = /** @class */ (function () {
|
|
|
6391
6498
|
var functionArguments = [];
|
|
6392
6499
|
for (var i = 1; i <= arity; i += 1) {
|
|
6393
6500
|
if (i === 1 && dollar1 === 'NAKED') {
|
|
6394
|
-
functionArguments.push(
|
|
6501
|
+
functionArguments.push(withSourceCodeInfo([bindingTargetTypes.symbol, [[NodeTypes.UserDefinedSymbol, '$'], undefined]], firstToken[2]));
|
|
6395
6502
|
}
|
|
6396
6503
|
else {
|
|
6397
|
-
functionArguments.push(
|
|
6504
|
+
functionArguments.push(withSourceCodeInfo([bindingTargetTypes.symbol, [[NodeTypes.UserDefinedSymbol, "$".concat(i)], undefined]], firstToken[2]));
|
|
6398
6505
|
}
|
|
6399
6506
|
}
|
|
6400
|
-
var node =
|
|
6401
|
-
|
|
6402
|
-
|
|
6403
|
-
|
|
6404
|
-
function: {
|
|
6405
|
-
arguments: functionArguments,
|
|
6406
|
-
body: [exprNode],
|
|
6407
|
-
},
|
|
6408
|
-
sourceCodeInfo: firstToken[2],
|
|
6409
|
-
};
|
|
6507
|
+
var node = withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.fn, [
|
|
6508
|
+
functionArguments,
|
|
6509
|
+
[exprNode],
|
|
6510
|
+
]]], firstToken[2]);
|
|
6410
6511
|
return node;
|
|
6411
6512
|
};
|
|
6412
6513
|
Parser.prototype.parseOptionalDefaulValue = function () {
|
|
@@ -6422,16 +6523,14 @@ var Parser = /** @class */ (function () {
|
|
|
6422
6523
|
// Symbol
|
|
6423
6524
|
if (isSymbolToken(firstToken)) {
|
|
6424
6525
|
var symbol = this.parseSymbol();
|
|
6526
|
+
if (!isUserDefinedSymbolNode(symbol)) {
|
|
6527
|
+
throw new LitsError('Expected user defined symbol', firstToken[2]);
|
|
6528
|
+
}
|
|
6425
6529
|
var defaultValue = this.parseOptionalDefaulValue();
|
|
6426
6530
|
if (requireDefaultValue && !defaultValue) {
|
|
6427
6531
|
throw new LitsError('Expected assignment', this.peek()[2]);
|
|
6428
6532
|
}
|
|
6429
|
-
return
|
|
6430
|
-
type: 'symbol',
|
|
6431
|
-
name: symbol.value,
|
|
6432
|
-
default: defaultValue,
|
|
6433
|
-
sourceCodeInfo: firstToken[2],
|
|
6434
|
-
};
|
|
6533
|
+
return withSourceCodeInfo([bindingTargetTypes.symbol, [symbol, defaultValue]], firstToken[2]);
|
|
6435
6534
|
}
|
|
6436
6535
|
// Rest
|
|
6437
6536
|
if (isOperatorToken(firstToken, '...')) {
|
|
@@ -6439,15 +6538,11 @@ var Parser = /** @class */ (function () {
|
|
|
6439
6538
|
throw new LitsError('Rest element not allowed', firstToken[2]);
|
|
6440
6539
|
}
|
|
6441
6540
|
this.advance();
|
|
6442
|
-
var symbol = this.parseSymbol();
|
|
6541
|
+
var symbol = asUserDefinedSymbolNode(this.parseSymbol());
|
|
6443
6542
|
if (isOperatorToken(this.peek(), ':=')) {
|
|
6444
6543
|
throw new LitsError('Rest argument can not have default value', this.peek()[2]);
|
|
6445
6544
|
}
|
|
6446
|
-
return
|
|
6447
|
-
type: 'rest',
|
|
6448
|
-
name: symbol.value,
|
|
6449
|
-
sourceCodeInfo: firstToken[2],
|
|
6450
|
-
};
|
|
6545
|
+
return withSourceCodeInfo([bindingTargetTypes.rest, [symbol[1], undefined]], firstToken[2]);
|
|
6451
6546
|
}
|
|
6452
6547
|
// Array
|
|
6453
6548
|
if (isLBracketToken(firstToken)) {
|
|
@@ -6466,7 +6561,7 @@ var Parser = /** @class */ (function () {
|
|
|
6466
6561
|
continue;
|
|
6467
6562
|
}
|
|
6468
6563
|
var target = this.parseBindingTarget();
|
|
6469
|
-
if (target
|
|
6564
|
+
if (target[0] === bindingTargetTypes.rest) {
|
|
6470
6565
|
rest = true;
|
|
6471
6566
|
}
|
|
6472
6567
|
elements.push(target);
|
|
@@ -6482,12 +6577,7 @@ var Parser = /** @class */ (function () {
|
|
|
6482
6577
|
if (requireDefaultValue && !defaultValue) {
|
|
6483
6578
|
throw new LitsError('Expected assignment', this.peek()[2]);
|
|
6484
6579
|
}
|
|
6485
|
-
return
|
|
6486
|
-
type: 'array',
|
|
6487
|
-
elements: elements,
|
|
6488
|
-
default: defaultValue,
|
|
6489
|
-
sourceCodeInfo: firstToken[2],
|
|
6490
|
-
};
|
|
6580
|
+
return withSourceCodeInfo([bindingTargetTypes.array, [elements, defaultValue]], firstToken[2]);
|
|
6491
6581
|
}
|
|
6492
6582
|
// Object
|
|
6493
6583
|
if (isLBraceToken(firstToken)) {
|
|
@@ -6503,40 +6593,32 @@ var Parser = /** @class */ (function () {
|
|
|
6503
6593
|
rest = true;
|
|
6504
6594
|
this.advance();
|
|
6505
6595
|
}
|
|
6506
|
-
var key = this.parseSymbol()
|
|
6596
|
+
var key = asUserDefinedSymbolNode(this.parseSymbol());
|
|
6507
6597
|
token = this.peek();
|
|
6508
6598
|
if (isReservedSymbolToken(token, 'as')) {
|
|
6509
6599
|
if (rest) {
|
|
6510
6600
|
throw new LitsError('Rest argument can not have alias', token[2]);
|
|
6511
6601
|
}
|
|
6512
6602
|
this.advance();
|
|
6513
|
-
var
|
|
6514
|
-
if (elements[
|
|
6515
|
-
throw new LitsError("Duplicate binding name: ".concat(
|
|
6603
|
+
var name_2 = asUserDefinedSymbolNode(this.parseSymbol());
|
|
6604
|
+
if (elements[name_2[1]]) {
|
|
6605
|
+
throw new LitsError("Duplicate binding name: ".concat(name_2), token[2]);
|
|
6516
6606
|
}
|
|
6517
|
-
elements[key] =
|
|
6518
|
-
type: 'symbol',
|
|
6519
|
-
name: name_3,
|
|
6520
|
-
default: this.parseOptionalDefaulValue(),
|
|
6521
|
-
sourceCodeInfo: firstToken[2],
|
|
6522
|
-
};
|
|
6607
|
+
elements[key[1]] = withSourceCodeInfo([bindingTargetTypes.symbol, [name_2, this.parseOptionalDefaulValue()]], firstToken[2]);
|
|
6523
6608
|
}
|
|
6524
6609
|
else if (isRBraceToken(token) || isOperatorToken(token, ',') || isOperatorToken(token, ':=')) {
|
|
6525
|
-
if (elements[key]) {
|
|
6610
|
+
if (elements[key[1]]) {
|
|
6526
6611
|
throw new LitsError("Duplicate binding name: ".concat(key), token[2]);
|
|
6527
6612
|
}
|
|
6528
6613
|
if (rest && isOperatorToken(this.peek(), ':=')) {
|
|
6529
6614
|
throw new LitsError('Rest argument can not have default value', this.peek()[2]);
|
|
6530
6615
|
}
|
|
6531
|
-
elements[key] =
|
|
6532
|
-
|
|
6533
|
-
|
|
6534
|
-
default: this.parseOptionalDefaulValue(),
|
|
6535
|
-
sourceCodeInfo: firstToken[2],
|
|
6536
|
-
};
|
|
6616
|
+
elements[key[1]] = rest
|
|
6617
|
+
? withSourceCodeInfo([bindingTargetTypes.rest, [key[1], this.parseOptionalDefaulValue()]], firstToken[2])
|
|
6618
|
+
: withSourceCodeInfo([bindingTargetTypes.symbol, [key, this.parseOptionalDefaulValue()]], firstToken[2]);
|
|
6537
6619
|
}
|
|
6538
6620
|
else if (isLBraceToken(token) || isLBracketToken(token)) {
|
|
6539
|
-
elements[key] = this.parseBindingTarget();
|
|
6621
|
+
elements[key[1]] = this.parseBindingTarget();
|
|
6540
6622
|
}
|
|
6541
6623
|
if (!isRBraceToken(this.peek())) {
|
|
6542
6624
|
assertOperatorToken(this.peek(), ',');
|
|
@@ -6550,12 +6632,7 @@ var Parser = /** @class */ (function () {
|
|
|
6550
6632
|
if (requireDefaultValue && !defaultValue) {
|
|
6551
6633
|
throw new LitsError('Expected assignment', token[2]);
|
|
6552
6634
|
}
|
|
6553
|
-
return
|
|
6554
|
-
type: 'object',
|
|
6555
|
-
elements: elements,
|
|
6556
|
-
default: defaultValue,
|
|
6557
|
-
sourceCodeInfo: firstToken[2],
|
|
6558
|
-
};
|
|
6635
|
+
return withSourceCodeInfo([bindingTargetTypes.object, [elements, defaultValue]], firstToken[2]);
|
|
6559
6636
|
}
|
|
6560
6637
|
throw new LitsError('Expected symbol', this.peek()[2]);
|
|
6561
6638
|
};
|
|
@@ -6563,22 +6640,13 @@ var Parser = /** @class */ (function () {
|
|
|
6563
6640
|
if (optionalSemicolon === void 0) { optionalSemicolon = false; }
|
|
6564
6641
|
this.advance();
|
|
6565
6642
|
var target = this.parseBindingTarget({ requireDefaultValue: true, noRest: true });
|
|
6566
|
-
var value = target
|
|
6567
|
-
|
|
6643
|
+
var value = target[1][1];
|
|
6644
|
+
target[1][1] = undefined;
|
|
6568
6645
|
if (!optionalSemicolon) {
|
|
6569
6646
|
assertOperatorToken(this.peek(), ';');
|
|
6570
6647
|
}
|
|
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
|
-
};
|
|
6648
|
+
var bindingTarget = withSourceCodeInfo([NodeTypes.Binding, [target, value]], token[2]);
|
|
6649
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.let, bindingTarget]], token[2]);
|
|
6582
6650
|
};
|
|
6583
6651
|
Parser.prototype.parseDo = function (token) {
|
|
6584
6652
|
this.advance();
|
|
@@ -6594,12 +6662,7 @@ var Parser = /** @class */ (function () {
|
|
|
6594
6662
|
}
|
|
6595
6663
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6596
6664
|
this.advance();
|
|
6597
|
-
return
|
|
6598
|
-
type: 'SpecialExpression',
|
|
6599
|
-
name: 'do',
|
|
6600
|
-
params: expressions,
|
|
6601
|
-
sourceCodeInfo: token[2],
|
|
6602
|
-
};
|
|
6665
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
|
|
6603
6666
|
};
|
|
6604
6667
|
Parser.prototype.parseLoop = function (firstToken) {
|
|
6605
6668
|
this.advance();
|
|
@@ -6609,14 +6672,9 @@ var Parser = /** @class */ (function () {
|
|
|
6609
6672
|
assertSymbolToken(token, 'let');
|
|
6610
6673
|
this.advance();
|
|
6611
6674
|
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
|
-
});
|
|
6675
|
+
var value = target[1][1];
|
|
6676
|
+
target[1][1] = undefined;
|
|
6677
|
+
bindingNodes.push(withSourceCodeInfo([NodeTypes.Binding, [target, value]], token[2]));
|
|
6620
6678
|
if (isOperatorToken(this.peek(), ',')) {
|
|
6621
6679
|
this.advance();
|
|
6622
6680
|
}
|
|
@@ -6639,13 +6697,7 @@ var Parser = /** @class */ (function () {
|
|
|
6639
6697
|
}
|
|
6640
6698
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6641
6699
|
this.advance();
|
|
6642
|
-
return
|
|
6643
|
-
type: 'SpecialExpression',
|
|
6644
|
-
name: 'loop',
|
|
6645
|
-
params: params,
|
|
6646
|
-
bindingNodes: bindingNodes,
|
|
6647
|
-
sourceCodeInfo: firstToken[2],
|
|
6648
|
-
};
|
|
6700
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.loop, bindingNodes, params]], firstToken[2]);
|
|
6649
6701
|
};
|
|
6650
6702
|
Parser.prototype.parseTry = function (token) {
|
|
6651
6703
|
this.advance();
|
|
@@ -6661,12 +6713,7 @@ var Parser = /** @class */ (function () {
|
|
|
6661
6713
|
}
|
|
6662
6714
|
var tryExpression = tryExpressions.length === 1
|
|
6663
6715
|
? tryExpressions[0]
|
|
6664
|
-
:
|
|
6665
|
-
type: 'SpecialExpression',
|
|
6666
|
-
name: 'do',
|
|
6667
|
-
params: tryExpressions,
|
|
6668
|
-
sourceCodeInfo: token[2],
|
|
6669
|
-
};
|
|
6716
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, tryExpressions]], token[2]);
|
|
6670
6717
|
assertReservedSymbolToken(this.peek(), 'catch');
|
|
6671
6718
|
this.advance();
|
|
6672
6719
|
var errorSymbol;
|
|
@@ -6690,20 +6737,8 @@ var Parser = /** @class */ (function () {
|
|
|
6690
6737
|
this.advance();
|
|
6691
6738
|
var catchExpression = catchExpressions.length === 1
|
|
6692
6739
|
? 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
|
-
};
|
|
6740
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, catchExpressions]], token[2]);
|
|
6741
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.try, tryExpression, errorSymbol, catchExpression]], token[2]);
|
|
6707
6742
|
};
|
|
6708
6743
|
Parser.prototype.parseForOrDoseq = function (firstToken) {
|
|
6709
6744
|
var isDoseq = firstToken[1] === 'doseq';
|
|
@@ -6711,10 +6746,10 @@ var Parser = /** @class */ (function () {
|
|
|
6711
6746
|
var forLoopBindings = [];
|
|
6712
6747
|
var _loop_1 = function () {
|
|
6713
6748
|
var loopBinding = this_1.parseForLoopBinding();
|
|
6714
|
-
var existingBoundNames = forLoopBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b
|
|
6715
|
-
var newBoundNames = getAllBindingTargetNames(loopBinding
|
|
6749
|
+
var existingBoundNames = forLoopBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b[0][1][0])); });
|
|
6750
|
+
var newBoundNames = getAllBindingTargetNames(loopBinding[0][1][0]);
|
|
6716
6751
|
if (Object.keys(newBoundNames).some(function (n) { return existingBoundNames.includes(n); })) {
|
|
6717
|
-
throw new LitsError('Duplicate binding', loopBinding
|
|
6752
|
+
throw new LitsError('Duplicate binding', loopBinding[0][2]);
|
|
6718
6753
|
}
|
|
6719
6754
|
forLoopBindings.push(loopBinding);
|
|
6720
6755
|
};
|
|
@@ -6736,13 +6771,9 @@ var Parser = /** @class */ (function () {
|
|
|
6736
6771
|
}
|
|
6737
6772
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6738
6773
|
this.advance();
|
|
6739
|
-
return
|
|
6740
|
-
|
|
6741
|
-
|
|
6742
|
-
params: expressions,
|
|
6743
|
-
sourceCodeInfo: firstToken[2],
|
|
6744
|
-
l: forLoopBindings,
|
|
6745
|
-
};
|
|
6774
|
+
return isDoseq
|
|
6775
|
+
? withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.doseq, forLoopBindings, expressions]], firstToken[2])
|
|
6776
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.for, forLoopBindings, expressions]], firstToken[2]);
|
|
6746
6777
|
};
|
|
6747
6778
|
Parser.prototype.parseForLoopBinding = function () {
|
|
6748
6779
|
assertReservedSymbolToken(this.peek(), 'each');
|
|
@@ -6764,18 +6795,17 @@ var Parser = /** @class */ (function () {
|
|
|
6764
6795
|
&& !isReservedSymbolToken(token, 'each')) {
|
|
6765
6796
|
throw new LitsError('Expected symbol each, do, let, when or while', token[2]);
|
|
6766
6797
|
}
|
|
6767
|
-
var letBindings;
|
|
6798
|
+
var letBindings = [];
|
|
6768
6799
|
if (token[1] === 'let') {
|
|
6769
6800
|
modifiers.push('&let');
|
|
6770
|
-
letBindings = [];
|
|
6771
6801
|
var _loop_2 = function () {
|
|
6772
6802
|
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
|
|
6803
|
+
var existingBoundNames = letBindings.flatMap(function (b) { return Object.keys(getAllBindingTargetNames(b[1][0])); });
|
|
6804
|
+
var newBoundNames = Object.keys(getAllBindingTargetNames(letNode[1][1][1][0]));
|
|
6775
6805
|
if (newBoundNames.some(function (n) { return existingBoundNames.includes(n); })) {
|
|
6776
|
-
throw new LitsError('Duplicate binding', letNode
|
|
6806
|
+
throw new LitsError('Duplicate binding', letNode[1][1][2]);
|
|
6777
6807
|
}
|
|
6778
|
-
letBindings.push(letNode
|
|
6808
|
+
letBindings.push(letNode[1][1]);
|
|
6779
6809
|
token = this_2.peek();
|
|
6780
6810
|
if (!isSymbolToken(token, 'do') && !isReservedSymbolToken(this_2.peek(), 'each') && !isOperatorToken(token, ',')) {
|
|
6781
6811
|
throw new LitsError('Expected do, each or comma', token[2]);
|
|
@@ -6821,31 +6851,21 @@ var Parser = /** @class */ (function () {
|
|
|
6821
6851
|
if (!isSymbolToken(token, 'do') && !isReservedSymbolToken(this.peek(), 'each')) {
|
|
6822
6852
|
throw new LitsError('Expected do or each', token[2]);
|
|
6823
6853
|
}
|
|
6824
|
-
return
|
|
6825
|
-
b: bindingNode,
|
|
6826
|
-
m: modifiers,
|
|
6827
|
-
l: letBindings,
|
|
6828
|
-
wn: whenNode,
|
|
6829
|
-
we: whileNode,
|
|
6830
|
-
};
|
|
6854
|
+
return [bindingNode, letBindings, whenNode, whileNode];
|
|
6831
6855
|
};
|
|
6832
6856
|
Parser.prototype.parseBinding = function () {
|
|
6833
6857
|
var firstToken = asSymbolToken(this.peek());
|
|
6834
|
-
var name =
|
|
6835
|
-
this.advance();
|
|
6858
|
+
var name = asUserDefinedSymbolNode(this.parseSymbol());
|
|
6836
6859
|
assertReservedSymbolToken(this.peek(), 'in');
|
|
6837
6860
|
this.advance();
|
|
6838
6861
|
var value = this.parseExpression();
|
|
6839
|
-
var node =
|
|
6840
|
-
|
|
6841
|
-
|
|
6842
|
-
|
|
6843
|
-
|
|
6844
|
-
|
|
6845
|
-
|
|
6846
|
-
value: value,
|
|
6847
|
-
sourceCodeInfo: firstToken[2],
|
|
6848
|
-
};
|
|
6862
|
+
var node = withSourceCodeInfo([
|
|
6863
|
+
NodeTypes.Binding,
|
|
6864
|
+
[
|
|
6865
|
+
withSourceCodeInfo([bindingTargetTypes.symbol, [name, undefined]], firstToken[2]),
|
|
6866
|
+
value,
|
|
6867
|
+
],
|
|
6868
|
+
], firstToken[2]);
|
|
6849
6869
|
return node;
|
|
6850
6870
|
};
|
|
6851
6871
|
Parser.prototype.parseIfOrUnless = function (token) {
|
|
@@ -6868,12 +6888,7 @@ var Parser = /** @class */ (function () {
|
|
|
6868
6888
|
}
|
|
6869
6889
|
var thenExpression = thenExpressions.length === 1
|
|
6870
6890
|
? thenExpressions[0]
|
|
6871
|
-
:
|
|
6872
|
-
type: 'SpecialExpression',
|
|
6873
|
-
name: 'do',
|
|
6874
|
-
params: thenExpressions,
|
|
6875
|
-
sourceCodeInfo: token[2],
|
|
6876
|
-
};
|
|
6891
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, thenExpressions]], token[2]);
|
|
6877
6892
|
var elseExpression;
|
|
6878
6893
|
if (isReservedSymbolToken(this.peek(), 'else')) {
|
|
6879
6894
|
this.advance();
|
|
@@ -6889,25 +6904,13 @@ var Parser = /** @class */ (function () {
|
|
|
6889
6904
|
}
|
|
6890
6905
|
elseExpression = elseExpressions.length === 1
|
|
6891
6906
|
? elseExpressions[0]
|
|
6892
|
-
:
|
|
6893
|
-
type: 'SpecialExpression',
|
|
6894
|
-
name: 'do',
|
|
6895
|
-
params: elseExpressions,
|
|
6896
|
-
sourceCodeInfo: token[2],
|
|
6897
|
-
};
|
|
6907
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, elseExpressions]], token[2]);
|
|
6898
6908
|
}
|
|
6899
6909
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6900
6910
|
this.advance();
|
|
6901
|
-
|
|
6902
|
-
|
|
6903
|
-
|
|
6904
|
-
}
|
|
6905
|
-
return {
|
|
6906
|
-
type: 'SpecialExpression',
|
|
6907
|
-
name: isUnless ? 'unless' : 'if',
|
|
6908
|
-
params: params,
|
|
6909
|
-
sourceCodeInfo: token[2],
|
|
6910
|
-
};
|
|
6911
|
+
return isUnless
|
|
6912
|
+
? withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.unless, [condition, thenExpression, elseExpression]]], token[2])
|
|
6913
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.if, [condition, thenExpression, elseExpression]]], token[2]);
|
|
6911
6914
|
};
|
|
6912
6915
|
Parser.prototype.parseCond = function (token) {
|
|
6913
6916
|
this.advance();
|
|
@@ -6915,7 +6918,7 @@ var Parser = /** @class */ (function () {
|
|
|
6915
6918
|
while (!this.isAtEnd() && !isReservedSymbolToken(this.peek(), 'end')) {
|
|
6916
6919
|
assertReservedSymbolToken(this.peek(), 'case');
|
|
6917
6920
|
this.advance();
|
|
6918
|
-
|
|
6921
|
+
var caseExpression = this.parseExpression();
|
|
6919
6922
|
assertReservedSymbolToken(this.peek(), 'then');
|
|
6920
6923
|
this.advance();
|
|
6921
6924
|
var expressions = [];
|
|
@@ -6930,14 +6933,10 @@ var Parser = /** @class */ (function () {
|
|
|
6930
6933
|
throw new LitsError('Expected ;', this.peek()[2]);
|
|
6931
6934
|
}
|
|
6932
6935
|
}
|
|
6933
|
-
|
|
6936
|
+
var thenExpression = expressions.length === 1
|
|
6934
6937
|
? expressions[0]
|
|
6935
|
-
:
|
|
6936
|
-
|
|
6937
|
-
name: 'do',
|
|
6938
|
-
params: expressions,
|
|
6939
|
-
sourceCodeInfo: token[2],
|
|
6940
|
-
});
|
|
6938
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
|
|
6939
|
+
params.push([caseExpression, thenExpression]);
|
|
6941
6940
|
if (isReservedSymbolToken(this.peek(), 'end')) {
|
|
6942
6941
|
break;
|
|
6943
6942
|
}
|
|
@@ -6945,20 +6944,16 @@ var Parser = /** @class */ (function () {
|
|
|
6945
6944
|
}
|
|
6946
6945
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6947
6946
|
this.advance();
|
|
6948
|
-
return
|
|
6949
|
-
type: 'SpecialExpression',
|
|
6950
|
-
name: 'cond',
|
|
6951
|
-
params: params,
|
|
6952
|
-
sourceCodeInfo: token[2],
|
|
6953
|
-
};
|
|
6947
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.cond, params]], token[2]);
|
|
6954
6948
|
};
|
|
6955
6949
|
Parser.prototype.parseSwitch = function (token) {
|
|
6956
6950
|
this.advance();
|
|
6957
|
-
var
|
|
6951
|
+
var valueExpression = this.parseExpression();
|
|
6952
|
+
var params = [];
|
|
6958
6953
|
while (!this.isAtEnd() && !isReservedSymbolToken(this.peek(), 'end')) {
|
|
6959
6954
|
assertReservedSymbolToken(this.peek(), 'case');
|
|
6960
6955
|
this.advance();
|
|
6961
|
-
|
|
6956
|
+
var caseExpression = this.parseExpression();
|
|
6962
6957
|
assertReservedSymbolToken(this.peek(), 'then');
|
|
6963
6958
|
this.advance();
|
|
6964
6959
|
var expressions = [];
|
|
@@ -6973,14 +6968,10 @@ var Parser = /** @class */ (function () {
|
|
|
6973
6968
|
throw new LitsError('Expected ;', this.peek()[2]);
|
|
6974
6969
|
}
|
|
6975
6970
|
}
|
|
6976
|
-
|
|
6971
|
+
var thenExpression = expressions.length === 1
|
|
6977
6972
|
? expressions[0]
|
|
6978
|
-
:
|
|
6979
|
-
|
|
6980
|
-
name: 'do',
|
|
6981
|
-
params: expressions,
|
|
6982
|
-
sourceCodeInfo: token[2],
|
|
6983
|
-
});
|
|
6973
|
+
: withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.do, expressions]], token[2]);
|
|
6974
|
+
params.push([caseExpression, thenExpression]);
|
|
6984
6975
|
if (isReservedSymbolToken(this.peek(), 'end')) {
|
|
6985
6976
|
break;
|
|
6986
6977
|
}
|
|
@@ -6988,12 +6979,7 @@ var Parser = /** @class */ (function () {
|
|
|
6988
6979
|
}
|
|
6989
6980
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
6990
6981
|
this.advance();
|
|
6991
|
-
return
|
|
6992
|
-
type: 'SpecialExpression',
|
|
6993
|
-
name: 'switch',
|
|
6994
|
-
params: params,
|
|
6995
|
-
sourceCodeInfo: token[2],
|
|
6996
|
-
};
|
|
6982
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.switch, valueExpression, params]], token[2]);
|
|
6997
6983
|
};
|
|
6998
6984
|
Parser.prototype.parseFunction = function (token) {
|
|
6999
6985
|
this.advance();
|
|
@@ -7012,17 +6998,10 @@ var Parser = /** @class */ (function () {
|
|
|
7012
6998
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
7013
6999
|
this.advance();
|
|
7014
7000
|
assertOperatorToken(this.peek(), ';');
|
|
7015
|
-
return
|
|
7016
|
-
|
|
7017
|
-
|
|
7018
|
-
|
|
7019
|
-
params: [],
|
|
7020
|
-
function: {
|
|
7021
|
-
arguments: functionArguments,
|
|
7022
|
-
body: body,
|
|
7023
|
-
},
|
|
7024
|
-
sourceCodeInfo: token[2],
|
|
7025
|
-
};
|
|
7001
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.function, symbol, [
|
|
7002
|
+
functionArguments,
|
|
7003
|
+
body,
|
|
7004
|
+
]]], token[2]);
|
|
7026
7005
|
};
|
|
7027
7006
|
Parser.prototype.isAtEnd = function () {
|
|
7028
7007
|
return this.parseState.position >= this.tokenStream.tokens.length;
|
|
@@ -7044,7 +7023,7 @@ var Parser = /** @class */ (function () {
|
|
|
7044
7023
|
this.advance();
|
|
7045
7024
|
if (isSymbolToken(this.peek(), 'let')) {
|
|
7046
7025
|
var letNode = this.parseLet(asSymbolToken(this.peek()));
|
|
7047
|
-
return
|
|
7026
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.def, letNode[1][1]]], token[2]);
|
|
7048
7027
|
}
|
|
7049
7028
|
else if (isReservedSymbolToken(this.peek(), 'function')) {
|
|
7050
7029
|
this.advance();
|
|
@@ -7062,71 +7041,57 @@ var Parser = /** @class */ (function () {
|
|
|
7062
7041
|
}
|
|
7063
7042
|
assertReservedSymbolToken(this.peek(), 'end');
|
|
7064
7043
|
this.advance();
|
|
7065
|
-
return
|
|
7066
|
-
|
|
7067
|
-
|
|
7068
|
-
|
|
7069
|
-
params: [],
|
|
7070
|
-
function: {
|
|
7071
|
-
arguments: functionArguments,
|
|
7072
|
-
body: body,
|
|
7073
|
-
},
|
|
7074
|
-
sourceCodeInfo: token[2],
|
|
7075
|
-
};
|
|
7044
|
+
return withSourceCodeInfo([NodeTypes.SpecialExpression, [specialExpressionTypes.defn, symbol, [
|
|
7045
|
+
functionArguments,
|
|
7046
|
+
body,
|
|
7047
|
+
]]], token[2]);
|
|
7076
7048
|
}
|
|
7077
7049
|
else {
|
|
7078
7050
|
throw new LitsError('Expected let or function', this.peek()[2]);
|
|
7079
7051
|
}
|
|
7080
7052
|
};
|
|
7053
|
+
Parser.prototype.stringToSymbolNode = function (value, sourceCodeInfo) {
|
|
7054
|
+
if (specialExpressionTypes[value] !== undefined) {
|
|
7055
|
+
return withSourceCodeInfo([NodeTypes.SpecialBuiltinSymbol, specialExpressionTypes[value]], sourceCodeInfo);
|
|
7056
|
+
}
|
|
7057
|
+
if (normalExpressionTypes[value] !== undefined) {
|
|
7058
|
+
return withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes[value]], sourceCodeInfo);
|
|
7059
|
+
}
|
|
7060
|
+
return withSourceCodeInfo([NodeTypes.UserDefinedSymbol, value], sourceCodeInfo);
|
|
7061
|
+
};
|
|
7062
|
+
Parser.prototype.stringFromQuotedSymbol = function (value) {
|
|
7063
|
+
return value.substring(1, value.length - 1)
|
|
7064
|
+
.replace(/(\\{2})|(\\')|\\(.)/g, function (_, backslash, singleQuote, normalChar) {
|
|
7065
|
+
if (backslash) {
|
|
7066
|
+
return '\\';
|
|
7067
|
+
}
|
|
7068
|
+
if (singleQuote) {
|
|
7069
|
+
return '\'';
|
|
7070
|
+
}
|
|
7071
|
+
return "\\".concat(normalChar);
|
|
7072
|
+
});
|
|
7073
|
+
};
|
|
7081
7074
|
Parser.prototype.parseSymbol = function () {
|
|
7082
7075
|
var token = this.peek();
|
|
7083
7076
|
this.advance();
|
|
7084
7077
|
if (!isSymbolToken(token)) {
|
|
7085
7078
|
throw new LitsError("Expected symbol token, got ".concat(token[0]), token[2]);
|
|
7086
7079
|
}
|
|
7087
|
-
if (token[1][0]
|
|
7088
|
-
return
|
|
7089
|
-
type: 'Symbol',
|
|
7090
|
-
value: token[1],
|
|
7091
|
-
sourceCodeInfo: token[2],
|
|
7092
|
-
};
|
|
7080
|
+
if (token[1][0] === '\'') {
|
|
7081
|
+
return this.stringToSymbolNode(this.stringFromQuotedSymbol(token[1]), token[2]);
|
|
7093
7082
|
}
|
|
7094
7083
|
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
|
-
};
|
|
7084
|
+
return this.stringToSymbolNode(token[1], token[2]);
|
|
7110
7085
|
}
|
|
7111
7086
|
};
|
|
7112
7087
|
Parser.prototype.parseReservedSymbol = function () {
|
|
7113
|
-
var token = this.peek();
|
|
7088
|
+
var token = asReservedSymbolToken(this.peek());
|
|
7114
7089
|
this.advance();
|
|
7115
|
-
|
|
7116
|
-
|
|
7117
|
-
|
|
7118
|
-
return {
|
|
7119
|
-
type: 'Number',
|
|
7120
|
-
value: numberReservedSymbolRecord[symbol],
|
|
7121
|
-
sourceCodeInfo: token[2],
|
|
7122
|
-
};
|
|
7123
|
-
}
|
|
7090
|
+
var symbol = token[1];
|
|
7091
|
+
if (isNumberReservedSymbol(symbol)) {
|
|
7092
|
+
return withSourceCodeInfo([NodeTypes.Number, numberReservedSymbolRecord[symbol]], token[2]);
|
|
7124
7093
|
}
|
|
7125
|
-
return
|
|
7126
|
-
type: 'ReservedSymbol',
|
|
7127
|
-
value: token[1],
|
|
7128
|
-
sourceCodeInfo: token[2],
|
|
7129
|
-
};
|
|
7094
|
+
return withSourceCodeInfo([NodeTypes.ReservedSymbol, token[1]], token[2]);
|
|
7130
7095
|
};
|
|
7131
7096
|
Parser.prototype.parseNumber = function () {
|
|
7132
7097
|
var token = this.peek();
|
|
@@ -7134,11 +7099,7 @@ var Parser = /** @class */ (function () {
|
|
|
7134
7099
|
var value = token[1];
|
|
7135
7100
|
var negative = value[0] === '-';
|
|
7136
7101
|
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
|
-
};
|
|
7102
|
+
return withSourceCodeInfo([NodeTypes.Number, negative ? -Number(numberString) : Number(numberString)], token[2]);
|
|
7142
7103
|
};
|
|
7143
7104
|
Parser.prototype.parseString = function () {
|
|
7144
7105
|
var token = this.peek();
|
|
@@ -7170,11 +7131,7 @@ var Parser = /** @class */ (function () {
|
|
|
7170
7131
|
}
|
|
7171
7132
|
return normalChar;
|
|
7172
7133
|
});
|
|
7173
|
-
return
|
|
7174
|
-
type: 'String',
|
|
7175
|
-
value: value,
|
|
7176
|
-
sourceCodeInfo: token[2],
|
|
7177
|
-
};
|
|
7134
|
+
return withSourceCodeInfo([NodeTypes.String, value], token[2]);
|
|
7178
7135
|
};
|
|
7179
7136
|
Parser.prototype.parseRegexpShorthand = function () {
|
|
7180
7137
|
var token = this.peek();
|
|
@@ -7182,22 +7139,15 @@ var Parser = /** @class */ (function () {
|
|
|
7182
7139
|
var endStringPosition = token[1].lastIndexOf('"');
|
|
7183
7140
|
var regexpString = token[1].substring(2, endStringPosition);
|
|
7184
7141
|
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
|
-
};
|
|
7142
|
+
var stringNode = withSourceCodeInfo([NodeTypes.String, regexpString], token[2]);
|
|
7143
|
+
var optionsNode = withSourceCodeInfo([NodeTypes.String, optionsString], token[2]);
|
|
7144
|
+
var node = withSourceCodeInfo([
|
|
7145
|
+
NodeTypes.NormalExpression,
|
|
7146
|
+
[
|
|
7147
|
+
withSourceCodeInfo([NodeTypes.NormalBuiltinSymbol, normalExpressionTypes.regexp], token[2]),
|
|
7148
|
+
[stringNode, optionsNode],
|
|
7149
|
+
],
|
|
7150
|
+
], token[2]);
|
|
7201
7151
|
return node;
|
|
7202
7152
|
};
|
|
7203
7153
|
return Parser;
|
|
@@ -7314,7 +7264,7 @@ var Lits = /** @class */ (function () {
|
|
|
7314
7264
|
if (params === void 0) { params = {}; }
|
|
7315
7265
|
var ast = typeof programOrAst === 'string' ? this.generateAst(programOrAst, params) : programOrAst;
|
|
7316
7266
|
var contextStack = createContextStack(params);
|
|
7317
|
-
return getUndefinedSymbols(ast, contextStack, builtin,
|
|
7267
|
+
return getUndefinedSymbols(ast, contextStack, builtin, evaluateNode);
|
|
7318
7268
|
};
|
|
7319
7269
|
Lits.prototype.tokenize = function (program, tokenizeParams) {
|
|
7320
7270
|
if (tokenizeParams === void 0) { tokenizeParams = {}; }
|
|
@@ -13216,8 +13166,7 @@ Object.entries(specialExpressionsReference).forEach(function (_a) {
|
|
|
13216
13166
|
var _b;
|
|
13217
13167
|
var _c = __read(_a, 2), key = _c[0], obj = _c[1];
|
|
13218
13168
|
if (isFunctionReference(obj)) {
|
|
13219
|
-
var
|
|
13220
|
-
var paramCount = (_b = specialExpressions[key]) === null || _b === void 0 ? void 0 : _b.paramCount;
|
|
13169
|
+
var paramCount = (_b = specialExpressions[specialExpressionTypes[key]]) === null || _b === void 0 ? void 0 : _b.paramCount;
|
|
13221
13170
|
if (paramCount && canBeOperator(paramCount)) {
|
|
13222
13171
|
obj._isOperator = true;
|
|
13223
13172
|
}
|