From 81a608b6da9a5132cce5761f72e7be15fac4076a Mon Sep 17 00:00:00 2001 From: Dave Holoway Date: Wed, 27 May 2020 13:01:31 +0100 Subject: [PATCH] add support for array-literal expressions --- src/expression/parse.js | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/expression/parse.js b/src/expression/parse.js index 100d4d2..2c6ec36 100644 --- a/src/expression/parse.js +++ b/src/expression/parse.js @@ -151,6 +151,10 @@ class BracketedExpression extends ParsedExpression { } } +class ArrayLiteralExpression extends ParsedExpression { + elements = []; +} + class ParsedNewExpression extends ParsedExpression {} class NewObjectExpression extends ParsedNewExpression { @@ -382,6 +386,25 @@ function parseNewExpression(e) { return new_expression; } +/** + * @param {ExpressionText} e + */ +function parseArrayLiteral(e) { + const arr = new ArrayLiteralExpression(); + if (!strip(e, '}')) { + for (let element; ;) { + if ((element = parse_expression(e)) === null) { + return null; + } + arr.elements.push(element); + if (strip(e, ',')) continue; + if (strip(e, '}')) break; + return null; + } + } + return arr; +} + /** * @param {ExpressionText} e */ @@ -419,15 +442,23 @@ function getBinaryOperator(s) { } /** - * @param {ExpressionText} e + * @param {ExpressionText|string} e * @returns {ParsedExpression} */ function parse_expression(e) { + if (typeof e === 'string') { + e = new ExpressionText(e); + } const newop = e.expr.match(/^new\b/); if (newop) { strip(e, 3); return parseNewExpression(e); } + const arrayinit = e.expr.match(/^\{/); + if (arrayinit) { + strip(e, 1); + return parseArrayLiteral(e); + } const prefix_incdec = e.expr.match(/^(?:(\+\+)|\-\-)(?=[a-zA-Z_])/); if (prefix_incdec) { strip(e, 2);