@weborigami/language 0.0.65-beta.2 → 0.0.65
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/index.ts +0 -2
- package/package.json +3 -3
- package/src/compiler/origami.pegjs +45 -23
- package/src/compiler/parse.d.ts +2 -2
- package/src/compiler/parse.js +139 -104
- package/src/compiler/parserHelpers.js +10 -2
- package/src/runtime/codeFragment.js +19 -0
- package/src/runtime/evaluate.js +21 -16
- package/src/runtime/expressionFunction.js +5 -6
- package/src/runtime/formatError.js +6 -6
- package/src/runtime/ops.js +8 -0
- package/test/compiler/parse.test.js +237 -112
- package/test/runtime/evaluate.test.js +20 -7
- package/test/runtime/ops.test.js +28 -10
package/src/compiler/parse.js
CHANGED
|
@@ -191,7 +191,7 @@ function peg$parse(input, options) {
|
|
|
191
191
|
var peg$FAILED = {};
|
|
192
192
|
var peg$source = options.grammarSource;
|
|
193
193
|
|
|
194
|
-
var peg$startRuleFunctions = { __: peg$parse__, absoluteFilePath: peg$parseabsoluteFilePath, args: peg$parseargs, array: peg$parsearray, arrayEntries: peg$parsearrayEntries, arrayEntry: peg$parsearrayEntry, callTarget: peg$parsecallTarget, closingBrace: peg$parseclosingBrace, closingBracket: peg$parseclosingBracket, closingParen: peg$parseclosingParen, comment: peg$parsecomment, digits: peg$parsedigits, doubleArrow: peg$parsedoubleArrow, doubleQuoteString: peg$parsedoubleQuoteString, doubleQuoteStringChar: peg$parsedoubleQuoteStringChar, ellipsis: peg$parseellipsis, escapedChar: peg$parseescapedChar, expr: peg$parseexpr, expression: peg$parseexpression, float: peg$parsefloat, functionComposition: peg$parsefunctionComposition, group: peg$parsegroup, guillemetString: peg$parseguillemetString, guillemetStringChar: peg$parseguillemetStringChar, host: peg$parsehost, identifier: peg$parseidentifier, identifierChar: peg$parseidentifierChar, identifierList: peg$parseidentifierList,
|
|
194
|
+
var peg$startRuleFunctions = { __: peg$parse__, absoluteFilePath: peg$parseabsoluteFilePath, args: peg$parseargs, array: peg$parsearray, arrayEntries: peg$parsearrayEntries, arrayEntry: peg$parsearrayEntry, callTarget: peg$parsecallTarget, closingBrace: peg$parseclosingBrace, closingBracket: peg$parseclosingBracket, closingParen: peg$parseclosingParen, comment: peg$parsecomment, digits: peg$parsedigits, doubleArrow: peg$parsedoubleArrow, doubleQuoteString: peg$parsedoubleQuoteString, doubleQuoteStringChar: peg$parsedoubleQuoteStringChar, ellipsis: peg$parseellipsis, escapedChar: peg$parseescapedChar, expr: peg$parseexpr, expression: peg$parseexpression, float: peg$parsefloat, functionComposition: peg$parsefunctionComposition, group: peg$parsegroup, guillemetString: peg$parseguillemetString, guillemetStringChar: peg$parseguillemetStringChar, host: peg$parsehost, identifier: peg$parseidentifier, identifierChar: peg$parseidentifierChar, identifierList: peg$parseidentifierList, implicitParensArgs: peg$parseimplicitParensArgs, inlineSpace: peg$parseinlineSpace, integer: peg$parseinteger, lambda: peg$parselambda, leadingSlashPath: peg$parseleadingSlashPath, list: peg$parselist, multiLineComment: peg$parsemultiLineComment, newLine: peg$parsenewLine, number: peg$parsenumber, object: peg$parseobject, objectEntries: peg$parseobjectEntries, objectEntry: peg$parseobjectEntry, objectGetter: peg$parseobjectGetter, objectHiddenKey: peg$parseobjectHiddenKey, objectKey: peg$parseobjectKey, objectPublicKey: peg$parseobjectPublicKey, objectProperty: peg$parseobjectProperty, objectShorthandProperty: peg$parseobjectShorthandProperty, parameterizedLambda: peg$parseparameterizedLambda, parensArgs: peg$parseparensArgs, pipeline: peg$parsepipeline, path: peg$parsepath, pathKey: peg$parsepathKey, pathKeyChar: peg$parsepathKeyChar, protocolCall: peg$parseprotocolCall, protocol: peg$parseprotocol, reservedProtocol: peg$parsereservedProtocol, scopeReference: peg$parsescopeReference, separator: peg$parseseparator, shebang: peg$parseshebang, sign: peg$parsesign, singleArrow: peg$parsesingleArrow, singleLineComment: peg$parsesingleLineComment, singleQuoteString: peg$parsesingleQuoteString, singleQuoteStringChar: peg$parsesingleQuoteStringChar, spread: peg$parsespread, step: peg$parsestep, start: peg$parsestart, string: peg$parsestring, templateDocument: peg$parsetemplateDocument, templateDocumentChar: peg$parsetemplateDocumentChar, templateDocumentContents: peg$parsetemplateDocumentContents, templateDocumentText: peg$parsetemplateDocumentText, templateLiteral: peg$parsetemplateLiteral, templateLiteralChar: peg$parsetemplateLiteralChar, templateLiteralContents: peg$parsetemplateLiteralContents, templateLiteralText: peg$parsetemplateLiteralText, templateSubstitution: peg$parsetemplateSubstitution, textChar: peg$parsetextChar, whitespaceWithNewLine: peg$parsewhitespaceWithNewLine };
|
|
195
195
|
var peg$startRuleFunction = peg$parse__;
|
|
196
196
|
|
|
197
197
|
var peg$c0 = "//";
|
|
@@ -308,9 +308,9 @@ function peg$parse(input, options) {
|
|
|
308
308
|
var peg$e56 = peg$otherExpectation("object literal");
|
|
309
309
|
var peg$e57 = peg$literalExpectation("{", false);
|
|
310
310
|
var peg$e58 = peg$otherExpectation("object getter");
|
|
311
|
-
var peg$e59 = peg$otherExpectation("object
|
|
312
|
-
var peg$e60 = peg$otherExpectation("object
|
|
313
|
-
var peg$e61 = peg$otherExpectation("object
|
|
311
|
+
var peg$e59 = peg$otherExpectation("object key");
|
|
312
|
+
var peg$e60 = peg$otherExpectation("object property");
|
|
313
|
+
var peg$e61 = peg$otherExpectation("object identifier");
|
|
314
314
|
var peg$e62 = peg$otherExpectation("function arguments in parentheses");
|
|
315
315
|
var peg$e63 = peg$otherExpectation("slash-separated path");
|
|
316
316
|
var peg$e64 = peg$otherExpectation("path element");
|
|
@@ -342,7 +342,9 @@ function peg$parse(input, options) {
|
|
|
342
342
|
var peg$e90 = peg$literalExpectation("`", false);
|
|
343
343
|
var peg$e91 = peg$otherExpectation("template substitution");
|
|
344
344
|
|
|
345
|
-
var peg$f0 = function() {
|
|
345
|
+
var peg$f0 = function() {
|
|
346
|
+
return null;
|
|
347
|
+
};
|
|
346
348
|
var peg$f1 = function(path) {
|
|
347
349
|
return annotate([[ops.filesRoot], ...path], location());
|
|
348
350
|
};
|
|
@@ -364,7 +366,9 @@ function peg$parse(input, options) {
|
|
|
364
366
|
var peg$f7 = function() {
|
|
365
367
|
error("Expected right parenthesis");
|
|
366
368
|
};
|
|
367
|
-
var peg$f8 = function(chars) {
|
|
369
|
+
var peg$f8 = function(chars) {
|
|
370
|
+
return annotate([ops.primitive, chars.join("")], location());
|
|
371
|
+
};
|
|
368
372
|
var peg$f9 = function() { return "\0"; };
|
|
369
373
|
var peg$f10 = function() { return "\b"; };
|
|
370
374
|
var peg$f11 = function() { return "\f"; };
|
|
@@ -373,19 +377,23 @@ function peg$parse(input, options) {
|
|
|
373
377
|
var peg$f14 = function() { return "\t"; };
|
|
374
378
|
var peg$f15 = function() { return "\v"; };
|
|
375
379
|
var peg$f16 = function() {
|
|
376
|
-
return parseFloat(text());
|
|
380
|
+
return annotate([ops.primitive, parseFloat(text())], location());
|
|
377
381
|
};
|
|
378
382
|
var peg$f17 = function(target, chain, end) {
|
|
379
383
|
if (end) {
|
|
380
384
|
chain.push(end);
|
|
381
385
|
}
|
|
382
|
-
return annotate(makeFunctionCall(target, chain), location());
|
|
386
|
+
return annotate(makeFunctionCall(target, chain, location()), location());
|
|
383
387
|
};
|
|
384
388
|
var peg$f18 = function(expr) {
|
|
385
389
|
return annotate(expr, location());
|
|
386
390
|
};
|
|
387
|
-
var peg$f19 = function(chars) {
|
|
388
|
-
|
|
391
|
+
var peg$f19 = function(chars) {
|
|
392
|
+
return annotate([ops.primitive, chars.join("")], location());
|
|
393
|
+
};
|
|
394
|
+
var peg$f20 = function() {
|
|
395
|
+
return annotate([ops.primitive, text()], location());
|
|
396
|
+
};
|
|
389
397
|
var peg$f21 = function(chars) { return chars.join(""); };
|
|
390
398
|
var peg$f22 = function(list) {
|
|
391
399
|
return annotate(list, location());
|
|
@@ -395,7 +403,7 @@ function peg$parse(input, options) {
|
|
|
395
403
|
return annotate(args, location());
|
|
396
404
|
};
|
|
397
405
|
var peg$f24 = function() {
|
|
398
|
-
return parseInt(text());
|
|
406
|
+
return annotate([ops.primitive, parseInt(text())], location());
|
|
399
407
|
};
|
|
400
408
|
var peg$f25 = function(expr) {
|
|
401
409
|
return annotate([ops.lambda, null, expr], location());
|
|
@@ -419,60 +427,72 @@ function peg$parse(input, options) {
|
|
|
419
427
|
var peg$f32 = function(key, value) {
|
|
420
428
|
return annotate([key, [ops.getter, value]], location());
|
|
421
429
|
};
|
|
422
|
-
var peg$f33 = function(
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
430
|
+
var peg$f33 = function(hiddenKey) { return hiddenKey.join(""); };
|
|
431
|
+
var peg$f34 = function(string) {
|
|
432
|
+
// Remove `ops.primitive` from the string code
|
|
433
|
+
return string[1];
|
|
434
|
+
};
|
|
426
435
|
var peg$f35 = function(key, value) {
|
|
427
436
|
return annotate([key, value], location());
|
|
428
437
|
};
|
|
429
|
-
var peg$f36 = function(
|
|
438
|
+
var peg$f36 = function(key) {
|
|
439
|
+
return annotate([key, [ops.inherited, key]], location());
|
|
440
|
+
};
|
|
441
|
+
var peg$f37 = function(parameters, expr) {
|
|
430
442
|
return annotate([ops.lambda, parameters ?? [], expr], location());
|
|
431
443
|
};
|
|
432
|
-
var peg$
|
|
444
|
+
var peg$f38 = function(list) {
|
|
433
445
|
return annotate(list ?? [undefined], location());
|
|
434
446
|
};
|
|
435
|
-
var peg$
|
|
447
|
+
var peg$f39 = function(steps) {
|
|
436
448
|
return annotate(makePipeline(steps), location());
|
|
437
449
|
};
|
|
438
|
-
var peg$
|
|
450
|
+
var peg$f40 = function(path) {
|
|
439
451
|
return annotate(path, location());
|
|
440
452
|
};
|
|
441
|
-
var peg$
|
|
442
|
-
|
|
453
|
+
var peg$f41 = function(chars) {
|
|
454
|
+
return annotate([ops.primitive, chars.join("")], location());
|
|
455
|
+
};
|
|
456
|
+
var peg$f42 = function(protocol, host, path) {
|
|
443
457
|
return annotate([protocol, host, ...(path ?? [])], location());
|
|
444
458
|
};
|
|
445
|
-
var peg$
|
|
446
|
-
var peg$
|
|
447
|
-
var peg$
|
|
448
|
-
var peg$
|
|
449
|
-
var peg$
|
|
450
|
-
var peg$
|
|
451
|
-
var peg$
|
|
452
|
-
var peg$
|
|
459
|
+
var peg$f43 = function() { return ops.https; };
|
|
460
|
+
var peg$f44 = function() { return ops.http; };
|
|
461
|
+
var peg$f45 = function() { return ops.constructor; };
|
|
462
|
+
var peg$f46 = function() { return [ops.scope, "@package"] };
|
|
463
|
+
var peg$f47 = function() { return ops.treeHttps; };
|
|
464
|
+
var peg$f48 = function() { return ops.treeHttp; };
|
|
465
|
+
var peg$f49 = function() { return ops.treeHttps; };
|
|
466
|
+
var peg$f50 = function(key) {
|
|
453
467
|
return annotate([ops.scope, key], location());
|
|
454
468
|
};
|
|
455
|
-
var peg$f50 = function() { return null; };
|
|
456
469
|
var peg$f51 = function() { return null; };
|
|
457
|
-
var peg$f52 = function(
|
|
458
|
-
var peg$f53 = function(
|
|
470
|
+
var peg$f52 = function() { return null; };
|
|
471
|
+
var peg$f53 = function(chars) {
|
|
472
|
+
return annotate([ops.primitive, chars.join("")], location());
|
|
473
|
+
};
|
|
474
|
+
var peg$f54 = function(expr) {
|
|
459
475
|
return annotate([ops.spread, expr], location());
|
|
460
476
|
};
|
|
461
|
-
var peg$
|
|
477
|
+
var peg$f55 = function(contents) {
|
|
462
478
|
return annotate([ops.lambda, null, contents], location());
|
|
463
479
|
};
|
|
464
|
-
var peg$
|
|
480
|
+
var peg$f56 = function(parts) {
|
|
465
481
|
return annotate(makeTemplate(parts), location());
|
|
466
482
|
};
|
|
467
|
-
var peg$
|
|
468
|
-
|
|
483
|
+
var peg$f57 = function(chars) {
|
|
484
|
+
return annotate([ops.primitive, chars.join("")], location());
|
|
485
|
+
};
|
|
486
|
+
var peg$f58 = function(contents) {
|
|
469
487
|
return annotate(contents, location());
|
|
470
488
|
};
|
|
471
|
-
var peg$
|
|
489
|
+
var peg$f59 = function(parts) {
|
|
472
490
|
return annotate(makeTemplate(parts), location());
|
|
473
491
|
};
|
|
474
|
-
var peg$
|
|
475
|
-
|
|
492
|
+
var peg$f60 = function(chars) {
|
|
493
|
+
return annotate([ops.primitive, chars.join("")], location());
|
|
494
|
+
};
|
|
495
|
+
var peg$f61 = function(expr) {
|
|
476
496
|
return annotate(expr, location());
|
|
477
497
|
};
|
|
478
498
|
var peg$currPos = options.peg$currPos | 0;
|
|
@@ -1689,17 +1709,6 @@ function peg$parse(input, options) {
|
|
|
1689
1709
|
return s0;
|
|
1690
1710
|
}
|
|
1691
1711
|
|
|
1692
|
-
function peg$parseidentifierOrString() {
|
|
1693
|
-
var s0;
|
|
1694
|
-
|
|
1695
|
-
s0 = peg$parseidentifier();
|
|
1696
|
-
if (s0 === peg$FAILED) {
|
|
1697
|
-
s0 = peg$parsestring();
|
|
1698
|
-
}
|
|
1699
|
-
|
|
1700
|
-
return s0;
|
|
1701
|
-
}
|
|
1702
|
-
|
|
1703
1712
|
function peg$parseimplicitParensArgs() {
|
|
1704
1713
|
var s0, s1, s2, s3, s4, s5;
|
|
1705
1714
|
|
|
@@ -2186,7 +2195,7 @@ function peg$parse(input, options) {
|
|
|
2186
2195
|
if (s0 === peg$FAILED) {
|
|
2187
2196
|
s0 = peg$parseobjectGetter();
|
|
2188
2197
|
if (s0 === peg$FAILED) {
|
|
2189
|
-
s0 = peg$
|
|
2198
|
+
s0 = peg$parseobjectShorthandProperty();
|
|
2190
2199
|
}
|
|
2191
2200
|
}
|
|
2192
2201
|
}
|
|
@@ -2236,30 +2245,9 @@ function peg$parse(input, options) {
|
|
|
2236
2245
|
return s0;
|
|
2237
2246
|
}
|
|
2238
2247
|
|
|
2239
|
-
function peg$
|
|
2240
|
-
var s0, s1;
|
|
2241
|
-
|
|
2242
|
-
peg$silentFails++;
|
|
2243
|
-
s0 = peg$currPos;
|
|
2244
|
-
s1 = peg$parseidentifierOrString();
|
|
2245
|
-
if (s1 !== peg$FAILED) {
|
|
2246
|
-
peg$savedPos = s0;
|
|
2247
|
-
s1 = peg$f33(s1);
|
|
2248
|
-
}
|
|
2249
|
-
s0 = s1;
|
|
2250
|
-
peg$silentFails--;
|
|
2251
|
-
if (s0 === peg$FAILED) {
|
|
2252
|
-
s1 = peg$FAILED;
|
|
2253
|
-
if (peg$silentFails === 0) { peg$fail(peg$e59); }
|
|
2254
|
-
}
|
|
2255
|
-
|
|
2256
|
-
return s0;
|
|
2257
|
-
}
|
|
2258
|
-
|
|
2259
|
-
function peg$parseobjectKey() {
|
|
2248
|
+
function peg$parseobjectHiddenKey() {
|
|
2260
2249
|
var s0, s1, s2, s3, s4;
|
|
2261
2250
|
|
|
2262
|
-
peg$silentFails++;
|
|
2263
2251
|
s0 = peg$currPos;
|
|
2264
2252
|
s1 = peg$currPos;
|
|
2265
2253
|
if (input.charCodeAt(peg$currPos) === 40) {
|
|
@@ -2270,7 +2258,7 @@ function peg$parse(input, options) {
|
|
|
2270
2258
|
if (peg$silentFails === 0) { peg$fail(peg$e32); }
|
|
2271
2259
|
}
|
|
2272
2260
|
if (s2 !== peg$FAILED) {
|
|
2273
|
-
s3 = peg$
|
|
2261
|
+
s3 = peg$parseobjectPublicKey();
|
|
2274
2262
|
if (s3 !== peg$FAILED) {
|
|
2275
2263
|
if (input.charCodeAt(peg$currPos) === 41) {
|
|
2276
2264
|
s4 = peg$c4;
|
|
@@ -2296,16 +2284,42 @@ function peg$parse(input, options) {
|
|
|
2296
2284
|
}
|
|
2297
2285
|
if (s1 !== peg$FAILED) {
|
|
2298
2286
|
peg$savedPos = s0;
|
|
2299
|
-
s1 = peg$
|
|
2287
|
+
s1 = peg$f33(s1);
|
|
2300
2288
|
}
|
|
2301
2289
|
s0 = s1;
|
|
2290
|
+
|
|
2291
|
+
return s0;
|
|
2292
|
+
}
|
|
2293
|
+
|
|
2294
|
+
function peg$parseobjectKey() {
|
|
2295
|
+
var s0, s1;
|
|
2296
|
+
|
|
2297
|
+
peg$silentFails++;
|
|
2298
|
+
s0 = peg$parseobjectHiddenKey();
|
|
2302
2299
|
if (s0 === peg$FAILED) {
|
|
2303
|
-
s0 = peg$
|
|
2300
|
+
s0 = peg$parseobjectPublicKey();
|
|
2304
2301
|
}
|
|
2305
2302
|
peg$silentFails--;
|
|
2306
2303
|
if (s0 === peg$FAILED) {
|
|
2307
2304
|
s1 = peg$FAILED;
|
|
2308
|
-
if (peg$silentFails === 0) { peg$fail(peg$
|
|
2305
|
+
if (peg$silentFails === 0) { peg$fail(peg$e59); }
|
|
2306
|
+
}
|
|
2307
|
+
|
|
2308
|
+
return s0;
|
|
2309
|
+
}
|
|
2310
|
+
|
|
2311
|
+
function peg$parseobjectPublicKey() {
|
|
2312
|
+
var s0, s1;
|
|
2313
|
+
|
|
2314
|
+
s0 = peg$parseidentifier();
|
|
2315
|
+
if (s0 === peg$FAILED) {
|
|
2316
|
+
s0 = peg$currPos;
|
|
2317
|
+
s1 = peg$parsestring();
|
|
2318
|
+
if (s1 !== peg$FAILED) {
|
|
2319
|
+
peg$savedPos = s0;
|
|
2320
|
+
s1 = peg$f34(s1);
|
|
2321
|
+
}
|
|
2322
|
+
s0 = s1;
|
|
2309
2323
|
}
|
|
2310
2324
|
|
|
2311
2325
|
return s0;
|
|
@@ -2345,6 +2359,26 @@ function peg$parse(input, options) {
|
|
|
2345
2359
|
s0 = peg$FAILED;
|
|
2346
2360
|
}
|
|
2347
2361
|
peg$silentFails--;
|
|
2362
|
+
if (s0 === peg$FAILED) {
|
|
2363
|
+
s1 = peg$FAILED;
|
|
2364
|
+
if (peg$silentFails === 0) { peg$fail(peg$e60); }
|
|
2365
|
+
}
|
|
2366
|
+
|
|
2367
|
+
return s0;
|
|
2368
|
+
}
|
|
2369
|
+
|
|
2370
|
+
function peg$parseobjectShorthandProperty() {
|
|
2371
|
+
var s0, s1;
|
|
2372
|
+
|
|
2373
|
+
peg$silentFails++;
|
|
2374
|
+
s0 = peg$currPos;
|
|
2375
|
+
s1 = peg$parseobjectPublicKey();
|
|
2376
|
+
if (s1 !== peg$FAILED) {
|
|
2377
|
+
peg$savedPos = s0;
|
|
2378
|
+
s1 = peg$f36(s1);
|
|
2379
|
+
}
|
|
2380
|
+
s0 = s1;
|
|
2381
|
+
peg$silentFails--;
|
|
2348
2382
|
if (s0 === peg$FAILED) {
|
|
2349
2383
|
s1 = peg$FAILED;
|
|
2350
2384
|
if (peg$silentFails === 0) { peg$fail(peg$e61); }
|
|
@@ -2386,7 +2420,7 @@ function peg$parse(input, options) {
|
|
|
2386
2420
|
s9 = peg$parsepipeline();
|
|
2387
2421
|
if (s9 !== peg$FAILED) {
|
|
2388
2422
|
peg$savedPos = s0;
|
|
2389
|
-
s0 = peg$
|
|
2423
|
+
s0 = peg$f37(s3, s9);
|
|
2390
2424
|
} else {
|
|
2391
2425
|
peg$currPos = s0;
|
|
2392
2426
|
s0 = peg$FAILED;
|
|
@@ -2435,7 +2469,7 @@ function peg$parse(input, options) {
|
|
|
2435
2469
|
}
|
|
2436
2470
|
if (s5 !== peg$FAILED) {
|
|
2437
2471
|
peg$savedPos = s0;
|
|
2438
|
-
s0 = peg$
|
|
2472
|
+
s0 = peg$f38(s3);
|
|
2439
2473
|
} else {
|
|
2440
2474
|
peg$currPos = s0;
|
|
2441
2475
|
s0 = peg$FAILED;
|
|
@@ -2501,7 +2535,7 @@ function peg$parse(input, options) {
|
|
|
2501
2535
|
}
|
|
2502
2536
|
if (s1 !== peg$FAILED) {
|
|
2503
2537
|
peg$savedPos = s0;
|
|
2504
|
-
s1 = peg$
|
|
2538
|
+
s1 = peg$f39(s1);
|
|
2505
2539
|
}
|
|
2506
2540
|
s0 = s1;
|
|
2507
2541
|
|
|
@@ -2540,7 +2574,7 @@ function peg$parse(input, options) {
|
|
|
2540
2574
|
s1 = s2;
|
|
2541
2575
|
}
|
|
2542
2576
|
peg$savedPos = s0;
|
|
2543
|
-
s1 = peg$
|
|
2577
|
+
s1 = peg$f40(s1);
|
|
2544
2578
|
s0 = s1;
|
|
2545
2579
|
peg$silentFails--;
|
|
2546
2580
|
s1 = peg$FAILED;
|
|
@@ -2561,7 +2595,7 @@ function peg$parse(input, options) {
|
|
|
2561
2595
|
s2 = peg$parsepathKeyChar();
|
|
2562
2596
|
}
|
|
2563
2597
|
peg$savedPos = s0;
|
|
2564
|
-
s1 = peg$
|
|
2598
|
+
s1 = peg$f41(s1);
|
|
2565
2599
|
s0 = s1;
|
|
2566
2600
|
peg$silentFails--;
|
|
2567
2601
|
s1 = peg$FAILED;
|
|
@@ -2631,7 +2665,7 @@ function peg$parse(input, options) {
|
|
|
2631
2665
|
s5 = null;
|
|
2632
2666
|
}
|
|
2633
2667
|
peg$savedPos = s0;
|
|
2634
|
-
s0 = peg$
|
|
2668
|
+
s0 = peg$f42(s1, s4, s5);
|
|
2635
2669
|
} else {
|
|
2636
2670
|
peg$currPos = s0;
|
|
2637
2671
|
s0 = peg$FAILED;
|
|
@@ -2684,7 +2718,7 @@ function peg$parse(input, options) {
|
|
|
2684
2718
|
}
|
|
2685
2719
|
if (s1 !== peg$FAILED) {
|
|
2686
2720
|
peg$savedPos = s0;
|
|
2687
|
-
s1 = peg$
|
|
2721
|
+
s1 = peg$f43();
|
|
2688
2722
|
}
|
|
2689
2723
|
s0 = s1;
|
|
2690
2724
|
if (s0 === peg$FAILED) {
|
|
@@ -2698,7 +2732,7 @@ function peg$parse(input, options) {
|
|
|
2698
2732
|
}
|
|
2699
2733
|
if (s1 !== peg$FAILED) {
|
|
2700
2734
|
peg$savedPos = s0;
|
|
2701
|
-
s1 = peg$
|
|
2735
|
+
s1 = peg$f44();
|
|
2702
2736
|
}
|
|
2703
2737
|
s0 = s1;
|
|
2704
2738
|
if (s0 === peg$FAILED) {
|
|
@@ -2712,7 +2746,7 @@ function peg$parse(input, options) {
|
|
|
2712
2746
|
}
|
|
2713
2747
|
if (s1 !== peg$FAILED) {
|
|
2714
2748
|
peg$savedPos = s0;
|
|
2715
|
-
s1 = peg$
|
|
2749
|
+
s1 = peg$f45();
|
|
2716
2750
|
}
|
|
2717
2751
|
s0 = s1;
|
|
2718
2752
|
if (s0 === peg$FAILED) {
|
|
@@ -2726,7 +2760,7 @@ function peg$parse(input, options) {
|
|
|
2726
2760
|
}
|
|
2727
2761
|
if (s1 !== peg$FAILED) {
|
|
2728
2762
|
peg$savedPos = s0;
|
|
2729
|
-
s1 = peg$
|
|
2763
|
+
s1 = peg$f46();
|
|
2730
2764
|
}
|
|
2731
2765
|
s0 = s1;
|
|
2732
2766
|
if (s0 === peg$FAILED) {
|
|
@@ -2740,7 +2774,7 @@ function peg$parse(input, options) {
|
|
|
2740
2774
|
}
|
|
2741
2775
|
if (s1 !== peg$FAILED) {
|
|
2742
2776
|
peg$savedPos = s0;
|
|
2743
|
-
s1 = peg$
|
|
2777
|
+
s1 = peg$f47();
|
|
2744
2778
|
}
|
|
2745
2779
|
s0 = s1;
|
|
2746
2780
|
if (s0 === peg$FAILED) {
|
|
@@ -2754,7 +2788,7 @@ function peg$parse(input, options) {
|
|
|
2754
2788
|
}
|
|
2755
2789
|
if (s1 !== peg$FAILED) {
|
|
2756
2790
|
peg$savedPos = s0;
|
|
2757
|
-
s1 = peg$
|
|
2791
|
+
s1 = peg$f48();
|
|
2758
2792
|
}
|
|
2759
2793
|
s0 = s1;
|
|
2760
2794
|
if (s0 === peg$FAILED) {
|
|
@@ -2768,7 +2802,7 @@ function peg$parse(input, options) {
|
|
|
2768
2802
|
}
|
|
2769
2803
|
if (s1 !== peg$FAILED) {
|
|
2770
2804
|
peg$savedPos = s0;
|
|
2771
|
-
s1 = peg$
|
|
2805
|
+
s1 = peg$f49();
|
|
2772
2806
|
}
|
|
2773
2807
|
s0 = s1;
|
|
2774
2808
|
}
|
|
@@ -2794,7 +2828,7 @@ function peg$parse(input, options) {
|
|
|
2794
2828
|
s1 = peg$parseidentifier();
|
|
2795
2829
|
if (s1 !== peg$FAILED) {
|
|
2796
2830
|
peg$savedPos = s0;
|
|
2797
|
-
s1 = peg$
|
|
2831
|
+
s1 = peg$f50(s1);
|
|
2798
2832
|
}
|
|
2799
2833
|
s0 = s1;
|
|
2800
2834
|
peg$silentFails--;
|
|
@@ -2864,7 +2898,7 @@ function peg$parse(input, options) {
|
|
|
2864
2898
|
}
|
|
2865
2899
|
}
|
|
2866
2900
|
peg$savedPos = s0;
|
|
2867
|
-
s0 = peg$
|
|
2901
|
+
s0 = peg$f51();
|
|
2868
2902
|
} else {
|
|
2869
2903
|
peg$currPos = s0;
|
|
2870
2904
|
s0 = peg$FAILED;
|
|
@@ -2941,7 +2975,7 @@ function peg$parse(input, options) {
|
|
|
2941
2975
|
}
|
|
2942
2976
|
}
|
|
2943
2977
|
peg$savedPos = s0;
|
|
2944
|
-
s0 = peg$
|
|
2978
|
+
s0 = peg$f52();
|
|
2945
2979
|
} else {
|
|
2946
2980
|
peg$currPos = s0;
|
|
2947
2981
|
s0 = peg$FAILED;
|
|
@@ -2978,7 +3012,7 @@ function peg$parse(input, options) {
|
|
|
2978
3012
|
}
|
|
2979
3013
|
if (s3 !== peg$FAILED) {
|
|
2980
3014
|
peg$savedPos = s0;
|
|
2981
|
-
s0 = peg$
|
|
3015
|
+
s0 = peg$f53(s2);
|
|
2982
3016
|
} else {
|
|
2983
3017
|
peg$currPos = s0;
|
|
2984
3018
|
s0 = peg$FAILED;
|
|
@@ -3044,7 +3078,7 @@ function peg$parse(input, options) {
|
|
|
3044
3078
|
s2 = peg$parsepipeline();
|
|
3045
3079
|
if (s2 !== peg$FAILED) {
|
|
3046
3080
|
peg$savedPos = s0;
|
|
3047
|
-
s0 = peg$
|
|
3081
|
+
s0 = peg$f54(s2);
|
|
3048
3082
|
} else {
|
|
3049
3083
|
peg$currPos = s0;
|
|
3050
3084
|
s0 = peg$FAILED;
|
|
@@ -3133,7 +3167,7 @@ function peg$parse(input, options) {
|
|
|
3133
3167
|
s0 = peg$currPos;
|
|
3134
3168
|
s1 = peg$parsetemplateDocumentContents();
|
|
3135
3169
|
peg$savedPos = s0;
|
|
3136
|
-
s1 = peg$
|
|
3170
|
+
s1 = peg$f55(s1);
|
|
3137
3171
|
s0 = s1;
|
|
3138
3172
|
peg$silentFails--;
|
|
3139
3173
|
s1 = peg$FAILED;
|
|
@@ -3195,7 +3229,7 @@ function peg$parse(input, options) {
|
|
|
3195
3229
|
}
|
|
3196
3230
|
}
|
|
3197
3231
|
peg$savedPos = s0;
|
|
3198
|
-
s1 = peg$
|
|
3232
|
+
s1 = peg$f56(s1);
|
|
3199
3233
|
s0 = s1;
|
|
3200
3234
|
|
|
3201
3235
|
return s0;
|
|
@@ -3218,7 +3252,7 @@ function peg$parse(input, options) {
|
|
|
3218
3252
|
}
|
|
3219
3253
|
if (s1 !== peg$FAILED) {
|
|
3220
3254
|
peg$savedPos = s0;
|
|
3221
|
-
s1 = peg$
|
|
3255
|
+
s1 = peg$f57(s1);
|
|
3222
3256
|
}
|
|
3223
3257
|
s0 = s1;
|
|
3224
3258
|
peg$silentFails--;
|
|
@@ -3253,7 +3287,7 @@ function peg$parse(input, options) {
|
|
|
3253
3287
|
}
|
|
3254
3288
|
if (s3 !== peg$FAILED) {
|
|
3255
3289
|
peg$savedPos = s0;
|
|
3256
|
-
s0 = peg$
|
|
3290
|
+
s0 = peg$f58(s2);
|
|
3257
3291
|
} else {
|
|
3258
3292
|
peg$currPos = s0;
|
|
3259
3293
|
s0 = peg$FAILED;
|
|
@@ -3333,7 +3367,7 @@ function peg$parse(input, options) {
|
|
|
3333
3367
|
}
|
|
3334
3368
|
}
|
|
3335
3369
|
peg$savedPos = s0;
|
|
3336
|
-
s1 = peg$
|
|
3370
|
+
s1 = peg$f59(s1);
|
|
3337
3371
|
s0 = s1;
|
|
3338
3372
|
|
|
3339
3373
|
return s0;
|
|
@@ -3355,7 +3389,7 @@ function peg$parse(input, options) {
|
|
|
3355
3389
|
}
|
|
3356
3390
|
if (s1 !== peg$FAILED) {
|
|
3357
3391
|
peg$savedPos = s0;
|
|
3358
|
-
s1 = peg$
|
|
3392
|
+
s1 = peg$f60(s1);
|
|
3359
3393
|
}
|
|
3360
3394
|
s0 = s1;
|
|
3361
3395
|
|
|
@@ -3388,7 +3422,7 @@ function peg$parse(input, options) {
|
|
|
3388
3422
|
}
|
|
3389
3423
|
if (s5 !== peg$FAILED) {
|
|
3390
3424
|
peg$savedPos = s0;
|
|
3391
|
-
s0 = peg$
|
|
3425
|
+
s0 = peg$f61(s3);
|
|
3392
3426
|
} else {
|
|
3393
3427
|
peg$currPos = s0;
|
|
3394
3428
|
s0 = peg$FAILED;
|
|
@@ -3511,7 +3545,6 @@ const peg$allowedStartRules = [
|
|
|
3511
3545
|
"identifier",
|
|
3512
3546
|
"identifierChar",
|
|
3513
3547
|
"identifierList",
|
|
3514
|
-
"identifierOrString",
|
|
3515
3548
|
"implicitParensArgs",
|
|
3516
3549
|
"inlineSpace",
|
|
3517
3550
|
"integer",
|
|
@@ -3525,9 +3558,11 @@ const peg$allowedStartRules = [
|
|
|
3525
3558
|
"objectEntries",
|
|
3526
3559
|
"objectEntry",
|
|
3527
3560
|
"objectGetter",
|
|
3528
|
-
"
|
|
3561
|
+
"objectHiddenKey",
|
|
3529
3562
|
"objectKey",
|
|
3563
|
+
"objectPublicKey",
|
|
3530
3564
|
"objectProperty",
|
|
3565
|
+
"objectShorthandProperty",
|
|
3531
3566
|
"parameterizedLambda",
|
|
3532
3567
|
"parensArgs",
|
|
3533
3568
|
"pipeline",
|
|
@@ -52,7 +52,13 @@ export function makeArray(entries) {
|
|
|
52
52
|
* @param {Code[]} chain
|
|
53
53
|
* @returns
|
|
54
54
|
*/
|
|
55
|
-
export function makeFunctionCall(target, chain) {
|
|
55
|
+
export function makeFunctionCall(target, chain, location) {
|
|
56
|
+
if (!(target instanceof Array)) {
|
|
57
|
+
const error = new SyntaxError(`Can't call this like a function: ${target}`);
|
|
58
|
+
/** @type {any} */ (error).location = location;
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
|
|
56
62
|
let value = target;
|
|
57
63
|
const source = target.location.source;
|
|
58
64
|
// The chain is an array of arguments (which are themselves arrays). We
|
|
@@ -136,7 +142,9 @@ export function makeTemplate(parts) {
|
|
|
136
142
|
// empty string. If there's just one string, return that directly.
|
|
137
143
|
return filtered.length === 0
|
|
138
144
|
? ""
|
|
139
|
-
: filtered.length === 1 &&
|
|
145
|
+
: filtered.length === 1 &&
|
|
146
|
+
filtered[0][0] === ops.primitive &&
|
|
147
|
+
typeof filtered[0][1] === "string"
|
|
140
148
|
? filtered[0]
|
|
141
149
|
: [ops.concat, ...filtered];
|
|
142
150
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export default function codeFragment(location) {
|
|
2
|
+
const { source, start, end } = location;
|
|
3
|
+
|
|
4
|
+
let fragment =
|
|
5
|
+
start.offset < end.offset
|
|
6
|
+
? source.text.slice(start.offset, end.offset)
|
|
7
|
+
: // Use entire source
|
|
8
|
+
source.text;
|
|
9
|
+
|
|
10
|
+
// Remove newlines and whitespace runs.
|
|
11
|
+
fragment = fragment.replace(/(\n|\s\s+)+/g, "");
|
|
12
|
+
|
|
13
|
+
// If longer than 80 characters, truncate with an ellipsis.
|
|
14
|
+
if (fragment.length > 80) {
|
|
15
|
+
fragment = fragment.slice(0, 80) + "…";
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return fragment;
|
|
19
|
+
}
|
package/src/runtime/evaluate.js
CHANGED
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
isUnpackable,
|
|
5
5
|
scope,
|
|
6
6
|
} from "@weborigami/async-tree";
|
|
7
|
+
import codeFragment from "./codeFragment.js";
|
|
7
8
|
import { ops } from "./internal.js";
|
|
8
9
|
|
|
9
10
|
const codeSymbol = Symbol("code");
|
|
@@ -16,7 +17,7 @@ const sourceSymbol = Symbol("source");
|
|
|
16
17
|
* `this` should be the tree used as the context for the evaluation.
|
|
17
18
|
*
|
|
18
19
|
* @this {import("@weborigami/types").AsyncTree|null}
|
|
19
|
-
* @param {
|
|
20
|
+
* @param {import("../../index.ts").Code} code
|
|
20
21
|
*/
|
|
21
22
|
export default async function evaluate(code) {
|
|
22
23
|
const tree = this;
|
|
@@ -43,7 +44,11 @@ export default async function evaluate(code) {
|
|
|
43
44
|
|
|
44
45
|
if (!fn) {
|
|
45
46
|
// The code wants to invoke something that's couldn't be found in scope.
|
|
46
|
-
|
|
47
|
+
const error = ReferenceError(
|
|
48
|
+
`${codeFragment(code[0].location)} is not defined`
|
|
49
|
+
);
|
|
50
|
+
/** @type {any} */ (error).location = code.location;
|
|
51
|
+
throw error;
|
|
47
52
|
}
|
|
48
53
|
|
|
49
54
|
if (isUnpackable(fn)) {
|
|
@@ -52,9 +57,12 @@ export default async function evaluate(code) {
|
|
|
52
57
|
}
|
|
53
58
|
|
|
54
59
|
if (!Tree.isTreelike(fn)) {
|
|
55
|
-
|
|
56
|
-
|
|
60
|
+
const text = fn.toString?.() ?? codeFragment(code[0].location);
|
|
61
|
+
const error = new TypeError(
|
|
62
|
+
`Not a callable function or tree: ${text.slice(0, 80)}`
|
|
57
63
|
);
|
|
64
|
+
/** @type {any} */ (error).location = code.location;
|
|
65
|
+
throw error;
|
|
58
66
|
}
|
|
59
67
|
|
|
60
68
|
// Execute the function or traverse the tree.
|
|
@@ -66,8 +74,14 @@ export default async function evaluate(code) {
|
|
|
66
74
|
: await Tree.traverseOrThrow(fn, ...args); // Traverse the tree.
|
|
67
75
|
} catch (/** @type {any} */ error) {
|
|
68
76
|
if (!error.location) {
|
|
69
|
-
// Attach the location of the code we
|
|
70
|
-
error.location =
|
|
77
|
+
// Attach the location of the code we tried to evaluate.
|
|
78
|
+
error.location =
|
|
79
|
+
error.position !== undefined
|
|
80
|
+
? // Use location of the argument with the given position (need to
|
|
81
|
+
// offset by 1 to skip the function).
|
|
82
|
+
code[error.position + 1].location
|
|
83
|
+
: // Use overall location.
|
|
84
|
+
code.location;
|
|
71
85
|
}
|
|
72
86
|
throw error;
|
|
73
87
|
}
|
|
@@ -83,7 +97,7 @@ export default async function evaluate(code) {
|
|
|
83
97
|
try {
|
|
84
98
|
result[codeSymbol] = code;
|
|
85
99
|
if (/** @type {any} */ (code).location) {
|
|
86
|
-
result[sourceSymbol] = codeFragment(code);
|
|
100
|
+
result[sourceSymbol] = codeFragment(code.location);
|
|
87
101
|
}
|
|
88
102
|
if (!result[scopeSymbol]) {
|
|
89
103
|
Object.defineProperty(result, scopeSymbol, {
|
|
@@ -100,12 +114,3 @@ export default async function evaluate(code) {
|
|
|
100
114
|
|
|
101
115
|
return result;
|
|
102
116
|
}
|
|
103
|
-
|
|
104
|
-
function codeFragment(code) {
|
|
105
|
-
if (code.location) {
|
|
106
|
-
const { source, start, end } = code.location;
|
|
107
|
-
return source.text.slice(start.offset, end.offset);
|
|
108
|
-
} else {
|
|
109
|
-
return "";
|
|
110
|
-
}
|
|
111
|
-
}
|