diff --git a/src/ast/entry.js b/src/ast/entry.js index 97674309c..d3f48c138 100644 --- a/src/ast/entry.js +++ b/src/ast/entry.js @@ -14,14 +14,20 @@ const KIND = "entry"; * @extends {Expression} * @property {Node|null} key The entry key/offset * @property {Node} value The entry value + * @property {Boolean} byRef By reference + * @property {Boolean} unpack Argument unpacking */ module.exports = Expression.extends(KIND, function Entry( key, value, + byRef, + unpack, docs, location ) { Expression.apply(this, [KIND, docs, location]); this.key = key; this.value = value; + this.byRef = byRef; + this.unpack = unpack; }); diff --git a/src/parser/array.js b/src/parser/array.js index c1a14ced1..6f18dfb15 100644 --- a/src/parser/array.js +++ b/src/parser/array.js @@ -5,9 +5,6 @@ */ "use strict"; -const ArrayExpr = "array"; -const ArrayEntry = "entry"; - module.exports = { /** * Parse an array @@ -19,7 +16,7 @@ module.exports = { read_array: function() { let expect = null; let shortForm = false; - const result = this.node(ArrayExpr); + const result = this.node("array"); if (this.token === this.tok.T_ARRAY) { this.next().expect("("); @@ -69,27 +66,45 @@ module.exports = { ) { return; } + if (this.token === ",") { return this.node("noop")(); } + + const entry = this.node("entry"); + + let key = null; + let value = null; + let byRef = false; + let unpack = false; + if (this.token === "&") { - return this.read_byref(this.read_variable.bind(this, true, false)); + this.next(); + byRef = true; + value = this.read_variable(true, false); + } else if (this.token === this.tok.T_ELLIPSIS && this.php74) { + this.next(); + unpack = true; + value = this.read_expr() } else { - const entry = this.node(ArrayEntry); const expr = this.read_expr(); + if (this.token === this.tok.T_DOUBLE_ARROW) { - if (this.next().token === "&") { - return entry( - expr, - this.read_byref(this.read_variable.bind(this, true, false)) - ); + this.next(); + key = expr; + + if (this.token === "&") { + this.next(); + byRef = true; + value = this.read_variable(true, false); } else { - return entry(expr, this.read_expr()); + value = this.read_expr(); } } else { - entry.destroy(); + value = expr; } - return expr; } + + return entry(key, value, byRef, unpack); } }; diff --git a/test/snapshot/__snapshots__/acid.test.js.snap b/test/snapshot/__snapshots__/acid.test.js.snap index 300935918..1281168ed 100644 --- a/test/snapshot/__snapshots__/acid.test.js.snap +++ b/test/snapshot/__snapshots__/acid.test.js.snap @@ -883,6 +883,7 @@ Program { "value": Array { "items": Array [ Entry { + "byRef": false, "key": String { "isDoubleQuote": false, "kind": "string", @@ -917,6 +918,7 @@ Program { "offset": 594, }, }, + "unpack": false, "value": String { "isDoubleQuote": false, "kind": "string", @@ -939,6 +941,7 @@ Program { }, }, Entry { + "byRef": false, "key": String { "isDoubleQuote": false, "kind": "string", @@ -973,6 +976,7 @@ Program { "offset": 622, }, }, + "unpack": false, "value": String { "isDoubleQuote": false, "kind": "string", @@ -5450,8 +5454,10 @@ next: "arguments": Array [ Array { "items": Array [ - Number { - "kind": "number", + Entry { + "byRef": false, + "key": null, + "kind": "entry", "loc": Location { "end": Position { "column": 33, @@ -5465,10 +5471,29 @@ next: "offset": 2327, }, }, - "value": "1", + "unpack": false, + "value": Number { + "kind": "number", + "loc": Location { + "end": Position { + "column": 33, + "line": 111, + "offset": 2328, + }, + "source": "1", + "start": Position { + "column": 32, + "line": 111, + "offset": 2327, + }, + }, + "value": "1", + }, }, - Number { - "kind": "number", + Entry { + "byRef": false, + "key": null, + "kind": "entry", "loc": Location { "end": Position { "column": 36, @@ -5482,10 +5507,29 @@ next: "offset": 2330, }, }, - "value": "2", + "unpack": false, + "value": Number { + "kind": "number", + "loc": Location { + "end": Position { + "column": 36, + "line": 111, + "offset": 2331, + }, + "source": "2", + "start": Position { + "column": 35, + "line": 111, + "offset": 2330, + }, + }, + "value": "2", + }, }, - Number { - "kind": "number", + Entry { + "byRef": false, + "key": null, + "kind": "entry", "loc": Location { "end": Position { "column": 39, @@ -5499,7 +5543,24 @@ next: "offset": 2333, }, }, - "value": "3", + "unpack": false, + "value": Number { + "kind": "number", + "loc": Location { + "end": Position { + "column": 39, + "line": 111, + "offset": 2334, + }, + "source": "3", + "start": Position { + "column": 38, + "line": 111, + "offset": 2333, + }, + }, + "value": "3", + }, }, ], "kind": "array", @@ -6994,9 +7055,10 @@ next: }, }, }, - Variable { - "curly": false, - "kind": "variable", + Entry { + "byRef": false, + "key": null, + "kind": "entry", "loc": Location { "end": Position { "column": 10, @@ -7010,48 +7072,30 @@ next: "offset": 2985, }, }, - "name": "a", - }, - List { - "items": Array [ - Variable { - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 19, - "line": 140, - "offset": 2996, - }, - "source": "$b", - "start": Position { - "column": 17, - "line": 140, - "offset": 2994, - }, + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "loc": Location { + "end": Position { + "column": 10, + "line": 140, + "offset": 2987, }, - "name": "b", - }, - Variable { - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 23, - "line": 140, - "offset": 3000, - }, - "source": "$c", - "start": Position { - "column": 21, - "line": 140, - "offset": 2998, - }, + "source": "$a", + "start": Position { + "column": 8, + "line": 140, + "offset": 2985, }, - "name": "c", }, - ], - "kind": "list", + "name": "a", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", "loc": Location { "end": Position { "column": 24, @@ -7065,7 +7109,100 @@ next: "offset": 2989, }, }, - "shortForm": false, + "unpack": false, + "value": List { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "loc": Location { + "end": Position { + "column": 19, + "line": 140, + "offset": 2996, + }, + "source": "$b", + "start": Position { + "column": 17, + "line": 140, + "offset": 2994, + }, + }, + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "loc": Location { + "end": Position { + "column": 19, + "line": 140, + "offset": 2996, + }, + "source": "$b", + "start": Position { + "column": 17, + "line": 140, + "offset": 2994, + }, + }, + "name": "b", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "loc": Location { + "end": Position { + "column": 23, + "line": 140, + "offset": 3000, + }, + "source": "$c", + "start": Position { + "column": 21, + "line": 140, + "offset": 2998, + }, + }, + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "loc": Location { + "end": Position { + "column": 23, + "line": 140, + "offset": 3000, + }, + "source": "$c", + "start": Position { + "column": 21, + "line": 140, + "offset": 2998, + }, + }, + "name": "c", + }, + }, + ], + "kind": "list", + "loc": Location { + "end": Position { + "column": 24, + "line": 140, + "offset": 3001, + }, + "source": "list($b, $c)", + "start": Position { + "column": 12, + "line": 140, + "offset": 2989, + }, + }, + "shortForm": false, + }, }, ], "kind": "list", @@ -7100,8 +7237,10 @@ next: "operator": "=", "right": Array { "items": Array [ - Number { - "kind": "number", + Entry { + "byRef": false, + "key": null, + "kind": "entry", "loc": Location { "end": Position { "column": 30, @@ -7115,46 +7254,29 @@ next: "offset": 3006, }, }, - "value": "1", - }, - Array { - "items": Array [ - Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 34, - "line": 140, - "offset": 3011, - }, - "source": "2", - "start": Position { - "column": 33, - "line": 140, - "offset": 3010, - }, + "unpack": false, + "value": Number { + "kind": "number", + "loc": Location { + "end": Position { + "column": 30, + "line": 140, + "offset": 3007, }, - "value": "2", - }, - Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 37, - "line": 140, - "offset": 3014, - }, - "source": "3", - "start": Position { - "column": 36, - "line": 140, - "offset": 3013, - }, + "source": "1", + "start": Position { + "column": 29, + "line": 140, + "offset": 3006, }, - "value": "3", }, - ], - "kind": "array", + "value": "1", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", "loc": Location { "end": Position { "column": 38, @@ -7168,7 +7290,98 @@ next: "offset": 3009, }, }, - "shortForm": true, + "unpack": false, + "value": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "loc": Location { + "end": Position { + "column": 34, + "line": 140, + "offset": 3011, + }, + "source": "2", + "start": Position { + "column": 33, + "line": 140, + "offset": 3010, + }, + }, + "unpack": false, + "value": Number { + "kind": "number", + "loc": Location { + "end": Position { + "column": 34, + "line": 140, + "offset": 3011, + }, + "source": "2", + "start": Position { + "column": 33, + "line": 140, + "offset": 3010, + }, + }, + "value": "2", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "loc": Location { + "end": Position { + "column": 37, + "line": 140, + "offset": 3014, + }, + "source": "3", + "start": Position { + "column": 36, + "line": 140, + "offset": 3013, + }, + }, + "unpack": false, + "value": Number { + "kind": "number", + "loc": Location { + "end": Position { + "column": 37, + "line": 140, + "offset": 3014, + }, + "source": "3", + "start": Position { + "column": 36, + "line": 140, + "offset": 3013, + }, + }, + "value": "3", + }, + }, + ], + "kind": "array", + "loc": Location { + "end": Position { + "column": 38, + "line": 140, + "offset": 3015, + }, + "source": "[2, 3]", + "start": Position { + "column": 32, + "line": 140, + "offset": 3009, + }, + }, + "shortForm": true, + }, }, ], "kind": "array", @@ -7246,9 +7459,10 @@ next: }, }, }, - Variable { - "curly": false, - "kind": "variable", + Entry { + "byRef": false, + "key": null, + "kind": "entry", "loc": Location { "end": Position { "column": 6, @@ -7262,64 +7476,30 @@ next: "offset": 3022, }, }, - "name": "a", - }, - Array { - "items": Array [ - Variable { - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 10, - "line": 141, - "offset": 3028, - }, - "source": "$b", - "start": Position { - "column": 8, - "line": 141, - "offset": 3026, - }, - }, - "name": "b", - }, - Noop { - "kind": "noop", - "loc": Location { - "end": Position { - "column": 11, - "line": 141, - "offset": 3029, - }, - "source": " ", - "start": Position { - "column": 12, - "line": 141, - "offset": 3030, - }, + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "loc": Location { + "end": Position { + "column": 6, + "line": 141, + "offset": 3024, }, - }, - Variable { - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 15, - "line": 141, - "offset": 3033, - }, - "source": "$c", - "start": Position { - "column": 13, - "line": 141, - "offset": 3031, - }, + "source": "$a", + "start": Position { + "column": 4, + "line": 141, + "offset": 3022, }, - "name": "c", }, - ], - "kind": "array", + "name": "a", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", "loc": Location { "end": Position { "column": 16, @@ -7333,7 +7513,116 @@ next: "offset": 3025, }, }, - "shortForm": true, + "unpack": false, + "value": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "loc": Location { + "end": Position { + "column": 10, + "line": 141, + "offset": 3028, + }, + "source": "$b", + "start": Position { + "column": 8, + "line": 141, + "offset": 3026, + }, + }, + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "loc": Location { + "end": Position { + "column": 10, + "line": 141, + "offset": 3028, + }, + "source": "$b", + "start": Position { + "column": 8, + "line": 141, + "offset": 3026, + }, + }, + "name": "b", + }, + }, + Noop { + "kind": "noop", + "loc": Location { + "end": Position { + "column": 11, + "line": 141, + "offset": 3029, + }, + "source": " ", + "start": Position { + "column": 12, + "line": 141, + "offset": 3030, + }, + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "loc": Location { + "end": Position { + "column": 15, + "line": 141, + "offset": 3033, + }, + "source": "$c", + "start": Position { + "column": 13, + "line": 141, + "offset": 3031, + }, + }, + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "loc": Location { + "end": Position { + "column": 15, + "line": 141, + "offset": 3033, + }, + "source": "$c", + "start": Position { + "column": 13, + "line": 141, + "offset": 3031, + }, + }, + "name": "c", + }, + }, + ], + "kind": "array", + "loc": Location { + "end": Position { + "column": 16, + "line": 141, + "offset": 3034, + }, + "source": "[$b, ,$c]", + "start": Position { + "column": 7, + "line": 141, + "offset": 3025, + }, + }, + "shortForm": true, + }, }, ], "kind": "list", diff --git a/test/snapshot/__snapshots__/array.test.js.snap b/test/snapshot/__snapshots__/array.test.js.snap index 45f9c6986..294cdcff5 100644 --- a/test/snapshot/__snapshots__/array.test.js.snap +++ b/test/snapshot/__snapshots__/array.test.js.snap @@ -15,12 +15,18 @@ Program { Noop { "kind": "noop", }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'foo'", - "unicode": false, - "value": "foo", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'foo'", + "unicode": false, + "value": "foo", + }, }, Noop { "kind": "noop", @@ -28,12 +34,18 @@ Program { Noop { "kind": "noop", }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'bar'", - "unicode": false, - "value": "bar", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'bar'", + "unicode": false, + "value": "bar", + }, }, Noop { "kind": "noop", @@ -41,12 +53,18 @@ Program { Noop { "kind": "noop", }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'baz'", - "unicode": false, - "value": "baz", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'baz'", + "unicode": false, + "value": "baz", + }, }, ], "kind": "array", @@ -75,12 +93,18 @@ Program { Noop { "kind": "noop", }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'foo'", - "unicode": false, - "value": "foo", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'foo'", + "unicode": false, + "value": "foo", + }, }, Noop { "kind": "noop", @@ -88,12 +112,18 @@ Program { Noop { "kind": "noop", }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'bar'", - "unicode": false, - "value": "bar", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'bar'", + "unicode": false, + "value": "bar", + }, }, Noop { "kind": "noop", @@ -101,12 +131,18 @@ Program { Noop { "kind": "noop", }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'baz'", - "unicode": false, - "value": "baz", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'baz'", + "unicode": false, + "value": "baz", + }, }, Noop { "kind": "noop", @@ -138,12 +174,18 @@ Program { Noop { "kind": "noop", }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'foo'", - "unicode": false, - "value": "foo", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'foo'", + "unicode": false, + "value": "foo", + }, }, Noop { "kind": "noop", @@ -151,12 +193,18 @@ Program { Noop { "kind": "noop", }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'bar'", - "unicode": false, - "value": "bar", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'bar'", + "unicode": false, + "value": "bar", + }, }, Noop { "kind": "noop", @@ -164,12 +212,18 @@ Program { Noop { "kind": "noop", }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'baz'", - "unicode": false, - "value": "baz", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'baz'", + "unicode": false, + "value": "baz", + }, }, ], "kind": "array", @@ -189,19 +243,31 @@ Program { ExpressionStatement { "expression": Array { "items": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'foo'", - "unicode": false, - "value": "foo", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'bar'", - "unicode": false, - "value": "bar", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'foo'", + "unicode": false, + "value": "foo", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'bar'", + "unicode": false, + "value": "bar", + }, }, Noop { "kind": "noop", @@ -233,19 +299,31 @@ Program { ExpressionStatement { "expression": Array { "items": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'foo'", - "unicode": false, - "value": "foo", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'bar'", - "unicode": false, - "value": "bar", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'foo'", + "unicode": false, + "value": "foo", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'bar'", + "unicode": false, + "value": "bar", + }, }, Noop { "kind": "noop", @@ -268,19 +346,31 @@ Program { ExpressionStatement { "expression": Array { "items": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'foo'", - "unicode": false, - "value": "foo", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'bar'", - "unicode": false, - "value": "bar", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'foo'", + "unicode": false, + "value": "foo", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'bar'", + "unicode": false, + "value": "bar", + }, }, ], "kind": "array", @@ -300,19 +390,31 @@ Program { ExpressionStatement { "expression": Array { "items": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'foo'", - "unicode": false, - "value": "foo", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'bar'", - "unicode": false, - "value": "bar", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'foo'", + "unicode": false, + "value": "foo", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'bar'", + "unicode": false, + "value": "bar", + }, }, ], "kind": "array", @@ -332,19 +434,31 @@ Program { ExpressionStatement { "expression": Array { "items": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'foo'", - "unicode": false, - "value": "foo", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'bar'", - "unicode": false, - "value": "bar", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'foo'", + "unicode": false, + "value": "foo", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'bar'", + "unicode": false, + "value": "bar", + }, }, ], "kind": "array", @@ -364,19 +478,31 @@ Program { ExpressionStatement { "expression": Array { "items": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'foo'", - "unicode": false, - "value": "foo", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'bar'", - "unicode": false, - "value": "bar", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'foo'", + "unicode": false, + "value": "foo", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'bar'", + "unicode": false, + "value": "bar", + }, }, ], "kind": "array", @@ -396,19 +522,31 @@ Program { ExpressionStatement { "expression": Array { "items": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'foo'", - "unicode": false, - "value": "foo", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'bar'", - "unicode": false, - "value": "bar", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'foo'", + "unicode": false, + "value": "foo", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'bar'", + "unicode": false, + "value": "bar", + }, }, ], "kind": "array", @@ -422,6 +560,84 @@ Program { } `; +exports[`Array without keys byRef 1`] = ` +Program { + "children": Array [ + ExpressionStatement { + "expression": Assign { + "kind": "assign", + "left": Variable { + "curly": false, + "kind": "variable", + "name": "var", + }, + "operator": "=", + "right": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "1", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'test'", + "unicode": false, + "value": "test", + }, + }, + Entry { + "byRef": true, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "var", + }, + }, + Entry { + "byRef": true, + "key": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'test'", + "unicode": false, + "value": "test", + }, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "var", + }, + }, + ], + "kind": "array", + "shortForm": true, + }, + }, + "kind": "expressionstatement", + }, + ], + "errors": Array [], + "kind": "program", +} +`; + exports[`Array without keys deference array 1`] = ` Program { "children": Array [ @@ -479,19 +695,31 @@ Program { "kind": "call", "what": Array { "items": Array [ - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"a\\"", - "unicode": false, - "value": "a", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": true, + "kind": "string", + "raw": "\\"a\\"", + "unicode": false, + "value": "a", + }, }, - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"b\\"", - "unicode": false, - "value": "b", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": true, + "kind": "string", + "raw": "\\"b\\"", + "unicode": false, + "value": "b", + }, }, ], "kind": "array", @@ -560,25 +788,28 @@ Program { "expression": Array { "items": Array [ Entry { + "byRef": true, "key": Number { "kind": "number", "value": "0", }, "kind": "entry", + "unpack": false, "value": Variable { - "byref": true, "curly": false, "kind": "variable", "name": "foo", }, }, Entry { + "byRef": false, "key": Variable { "curly": false, "kind": "variable", "name": "bar", }, "kind": "entry", + "unpack": false, "value": String { "isDoubleQuote": true, "kind": "string", @@ -599,75 +830,163 @@ Program { } `; -exports[`Array without keys of arrays 1`] = ` +exports[`Array without keys non empty array 1`] = ` Program { "children": Array [ ExpressionStatement { - "expression": Array { - "items": Array [ - Array { - "items": Array [ - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"item1\\"", - "unicode": false, - "value": "item1", + "expression": Assign { + "kind": "assign", + "left": Variable { + "curly": false, + "kind": "variable", + "name": "var", + }, + "operator": "=", + "right": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Boolean { + "kind": "boolean", + "raw": "true", + "value": true, }, - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"item2\\"", - "unicode": false, - "value": "item2", + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "1", }, - ], - "kind": "array", - "shortForm": false, - }, - Array { - "items": Array [ - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"item3\\"", - "unicode": false, - "value": "item3", + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "1.1", }, - String { - "isDoubleQuote": true, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, "kind": "string", - "raw": "\\"item4\\"", + "raw": "'test'", "unicode": false, - "value": "item4", + "value": "test", }, - ], - "kind": "array", - "shortForm": false, - }, - Array { - "items": Array [ - String { + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { "isDoubleQuote": true, "kind": "string", - "raw": "\\"item5\\"", + "raw": "\\"test\\"", "unicode": false, - "value": "item5", + "value": "test", }, - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"item6\\"", - "unicode": false, - "value": "item6", + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "1", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "2", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "3", + }, + }, + ], + "kind": "array", + "shortForm": true, }, - ], - "kind": "array", - "shortForm": false, - }, - ], - "kind": "array", - "shortForm": false, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": New { + "arguments": Array [], + "kind": "new", + "what": ClassReference { + "kind": "classreference", + "name": "Foo", + "resolution": "uqn", + }, + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Call { + "arguments": Array [], + "kind": "call", + "what": ClassReference { + "kind": "classreference", + "name": "call", + "resolution": "uqn", + }, + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": NullKeyword { + "kind": "nullkeyword", + "raw": "null", + }, + }, + ], + "kind": "array", + "shortForm": true, + }, }, "kind": "expressionstatement", }, @@ -677,27 +996,177 @@ Program { } `; -exports[`Array without keys of numbers 1`] = ` +exports[`Array without keys of arrays 1`] = ` Program { "children": Array [ ExpressionStatement { "expression": Array { "items": Array [ - Number { - "kind": "number", - "value": "1", - }, - Number { - "kind": "number", - "value": "2.5", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": true, + "kind": "string", + "raw": "\\"item1\\"", + "unicode": false, + "value": "item1", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": true, + "kind": "string", + "raw": "\\"item2\\"", + "unicode": false, + "value": "item2", + }, + }, + ], + "kind": "array", + "shortForm": false, + }, }, - Number { - "kind": "number", - "value": "0x1000", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": true, + "kind": "string", + "raw": "\\"item3\\"", + "unicode": false, + "value": "item3", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": true, + "kind": "string", + "raw": "\\"item4\\"", + "unicode": false, + "value": "item4", + }, + }, + ], + "kind": "array", + "shortForm": false, + }, }, - ], - "kind": "array", - "shortForm": false, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": true, + "kind": "string", + "raw": "\\"item5\\"", + "unicode": false, + "value": "item5", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": true, + "kind": "string", + "raw": "\\"item6\\"", + "unicode": false, + "value": "item6", + }, + }, + ], + "kind": "array", + "shortForm": false, + }, + }, + ], + "kind": "array", + "shortForm": false, + }, + "kind": "expressionstatement", + }, + ], + "errors": Array [], + "kind": "program", +} +`; + +exports[`Array without keys of numbers 1`] = ` +Program { + "children": Array [ + ExpressionStatement { + "expression": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "1", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "2.5", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "0x1000", + }, + }, + ], + "kind": "array", + "shortForm": false, }, "kind": "expressionstatement", }, @@ -713,31 +1182,49 @@ Program { ExpressionStatement { "expression": Array { "items": Array [ - New { - "arguments": Array [], - "kind": "new", - "what": ClassReference { - "kind": "classreference", - "name": "foo", - "resolution": "uqn", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": New { + "arguments": Array [], + "kind": "new", + "what": ClassReference { + "kind": "classreference", + "name": "foo", + "resolution": "uqn", + }, }, }, - New { - "arguments": Array [], - "kind": "new", - "what": ClassReference { - "kind": "classreference", - "name": "stdClass", - "resolution": "uqn", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": New { + "arguments": Array [], + "kind": "new", + "what": ClassReference { + "kind": "classreference", + "name": "stdClass", + "resolution": "uqn", + }, }, }, - New { - "arguments": Array [], - "kind": "new", - "what": ClassReference { - "kind": "classreference", - "name": "bar", - "resolution": "uqn", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": New { + "arguments": Array [], + "kind": "new", + "what": ClassReference { + "kind": "classreference", + "name": "bar", + "resolution": "uqn", + }, }, }, ], @@ -758,26 +1245,44 @@ Program { ExpressionStatement { "expression": Array { "items": Array [ - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"item1\\"", - "unicode": false, - "value": "item1", - }, - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"item2\\"", - "unicode": false, - "value": "item2", - }, - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"item3\\"", - "unicode": false, - "value": "item3", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": true, + "kind": "string", + "raw": "\\"item1\\"", + "unicode": false, + "value": "item1", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": true, + "kind": "string", + "raw": "\\"item2\\"", + "unicode": false, + "value": "item2", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": true, + "kind": "string", + "raw": "\\"item3\\"", + "unicode": false, + "value": "item3", + }, }, ], "kind": "array", @@ -797,27 +1302,51 @@ Program { ExpressionStatement { "expression": Array { "items": Array [ - Number { - "kind": "number", - "value": "1", - }, - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"item2\\"", - "unicode": false, - "value": "item2", - }, - Number { - "kind": "number", - "value": "3", - }, - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"item4\\"", - "unicode": false, - "value": "item4", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "1", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": true, + "kind": "string", + "raw": "\\"item2\\"", + "unicode": false, + "value": "item2", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "3", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": true, + "kind": "string", + "raw": "\\"item4\\"", + "unicode": false, + "value": "item4", + }, }, ], "kind": "array", @@ -837,20 +1366,38 @@ Program { ExpressionStatement { "expression": Array { "items": Array [ - Variable { - "curly": false, - "kind": "variable", - "name": "obj1", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "obj1", + }, }, - Variable { - "curly": false, - "kind": "variable", - "name": "obj2", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "obj2", + }, }, - Variable { - "curly": false, - "kind": "variable", - "name": "obj3", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "obj3", + }, }, ], "kind": "array", @@ -897,3 +1444,363 @@ Program { "kind": "program", } `; + +exports[`Array without keys spread operator 1`] = ` +Program { + "children": Array [ + ExpressionStatement { + "expression": Assign { + "kind": "assign", + "left": Variable { + "curly": false, + "kind": "variable", + "name": "var", + }, + "operator": "=", + "right": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'banana'", + "unicode": false, + "value": "banana", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'orange'", + "unicode": false, + "value": "orange", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": true, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "parts", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'watermelon'", + "unicode": false, + "value": "watermelon", + }, + }, + ], + "kind": "array", + "shortForm": true, + }, + }, + "kind": "expressionstatement", + }, + ExpressionStatement { + "expression": Assign { + "kind": "assign", + "left": Variable { + "curly": false, + "kind": "variable", + "name": "var", + }, + "operator": "=", + "right": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": true, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "arr1", + }, + }, + ], + "kind": "array", + "shortForm": true, + }, + }, + "kind": "expressionstatement", + }, + ExpressionStatement { + "expression": Assign { + "kind": "assign", + "left": Variable { + "curly": false, + "kind": "variable", + "name": "var", + }, + "operator": "=", + "right": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "0", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": true, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "arr1", + }, + }, + ], + "kind": "array", + "shortForm": true, + }, + }, + "kind": "expressionstatement", + }, + ExpressionStatement { + "expression": Assign { + "kind": "assign", + "left": Variable { + "curly": false, + "kind": "variable", + "name": "var", + }, + "operator": "=", + "right": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": true, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "arr1", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": true, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "arr2", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "111", + }, + }, + ], + "kind": "array", + "shortForm": false, + }, + }, + "kind": "expressionstatement", + }, + ExpressionStatement { + "expression": Assign { + "kind": "assign", + "left": Variable { + "curly": false, + "kind": "variable", + "name": "var", + }, + "operator": "=", + "right": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": true, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "arr1", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": true, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "arr1", + }, + }, + ], + "kind": "array", + "shortForm": true, + }, + }, + "kind": "expressionstatement", + }, + ExpressionStatement { + "expression": Assign { + "kind": "assign", + "left": Variable { + "curly": false, + "kind": "variable", + "name": "var", + }, + "operator": "=", + "right": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": true, + "value": Call { + "arguments": Array [], + "kind": "call", + "what": ClassReference { + "kind": "classreference", + "name": "getArr", + "resolution": "uqn", + }, + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'c'", + "unicode": false, + "value": "c", + }, + }, + ], + "kind": "array", + "shortForm": true, + }, + }, + "kind": "expressionstatement", + }, + ExpressionStatement { + "expression": Assign { + "kind": "assign", + "left": Variable { + "curly": false, + "kind": "variable", + "name": "var", + }, + "operator": "=", + "right": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": true, + "value": New { + "arguments": Array [ + Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'a'", + "unicode": false, + "value": "a", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'b'", + "unicode": false, + "value": "b", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'c'", + "unicode": false, + "value": "c", + }, + }, + ], + "kind": "array", + "shortForm": true, + }, + ], + "kind": "new", + "what": ClassReference { + "kind": "classreference", + "name": "ArrayIterator", + "resolution": "uqn", + }, + }, + }, + ], + "kind": "array", + "shortForm": true, + }, + }, + "kind": "expressionstatement", + }, + ], + "errors": Array [], + "kind": "program", +} +`; diff --git a/test/snapshot/__snapshots__/call.test.js.snap b/test/snapshot/__snapshots__/call.test.js.snap index 3985172bd..4960fcefe 100644 --- a/test/snapshot/__snapshots__/call.test.js.snap +++ b/test/snapshot/__snapshots__/call.test.js.snap @@ -9,19 +9,31 @@ Program { "kind": "call", "what": Array { "items": Array [ - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"Foo\\"", - "unicode": false, - "value": "Foo", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": true, + "kind": "string", + "raw": "\\"Foo\\"", + "unicode": false, + "value": "Foo", + }, }, - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"bar\\"", - "unicode": false, - "value": "bar", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": true, + "kind": "string", + "raw": "\\"bar\\"", + "unicode": false, + "value": "bar", + }, }, ], "kind": "array", @@ -45,19 +57,31 @@ Program { "kind": "call", "what": Array { "items": Array [ - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"Foo\\"", - "unicode": false, - "value": "Foo", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": true, + "kind": "string", + "raw": "\\"Foo\\"", + "unicode": false, + "value": "Foo", + }, }, - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"bar\\"", - "unicode": false, - "value": "bar", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": true, + "kind": "string", + "raw": "\\"bar\\"", + "unicode": false, + "value": "bar", + }, }, ], "kind": "array", diff --git a/test/snapshot/__snapshots__/expr.test.js.snap b/test/snapshot/__snapshots__/expr.test.js.snap index f2867a9cd..926e67660 100644 --- a/test/snapshot/__snapshots__/expr.test.js.snap +++ b/test/snapshot/__snapshots__/expr.test.js.snap @@ -75,17 +75,35 @@ Program { }, "what": Array { "items": Array [ - Number { - "kind": "number", - "value": "1", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "1", + }, }, - Number { - "kind": "number", - "value": "2", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "2", + }, }, - Number { - "kind": "number", - "value": "3", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "3", + }, }, ], "kind": "array", @@ -1299,9 +1317,15 @@ Program { ExpressionStatement { "expression": Array { "items": Array [ - Number { - "kind": "number", - "value": "0", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "0", + }, }, ], "kind": "array", diff --git a/test/snapshot/__snapshots__/foreach.test.js.snap b/test/snapshot/__snapshots__/foreach.test.js.snap new file mode 100644 index 000000000..fd3bc6092 --- /dev/null +++ b/test/snapshot/__snapshots__/foreach.test.js.snap @@ -0,0 +1,722 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`foreach as list 1`] = ` +Program { + "children": Array [ + Foreach { + "body": Block { + "children": Array [ + Echo { + "expressions": Array [ + Variable { + "curly": false, + "kind": "variable", + "name": "a", + }, + ], + "kind": "echo", + "shortForm": false, + }, + ], + "kind": "block", + }, + "key": null, + "kind": "foreach", + "shortForm": false, + "source": Variable { + "curly": false, + "kind": "variable", + "name": "array", + }, + "value": List { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "a", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "b", + }, + }, + ], + "kind": "list", + "shortForm": false, + }, + }, + ], + "errors": Array [], + "kind": "program", +} +`; + +exports[`foreach as list with key 1`] = ` +Program { + "children": Array [ + Foreach { + "body": Block { + "children": Array [ + Echo { + "expressions": Array [ + Variable { + "curly": false, + "kind": "variable", + "name": "v", + }, + ], + "kind": "echo", + "shortForm": false, + }, + ], + "kind": "block", + }, + "key": Variable { + "curly": false, + "kind": "variable", + "name": "v", + }, + "kind": "foreach", + "shortForm": false, + "source": Variable { + "curly": false, + "kind": "variable", + "name": "array", + }, + "value": List { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "a", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "b", + }, + }, + ], + "kind": "list", + "shortForm": false, + }, + }, + ], + "errors": Array [], + "kind": "program", +} +`; + +exports[`foreach as short list 1`] = ` +Program { + "children": Array [ + Foreach { + "body": Block { + "children": Array [ + Echo { + "expressions": Array [ + Variable { + "curly": false, + "kind": "variable", + "name": "a", + }, + ], + "kind": "echo", + "shortForm": false, + }, + ], + "kind": "block", + }, + "key": null, + "kind": "foreach", + "shortForm": false, + "source": Variable { + "curly": false, + "kind": "variable", + "name": "array", + }, + "value": List { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "a", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "b", + }, + }, + ], + "kind": "list", + "shortForm": true, + }, + }, + ], + "errors": Array [], + "kind": "program", +} +`; + +exports[`foreach as short list with key 1`] = ` +Program { + "children": Array [ + Foreach { + "body": Block { + "children": Array [ + Echo { + "expressions": Array [ + Variable { + "curly": false, + "kind": "variable", + "name": "v", + }, + ], + "kind": "echo", + "shortForm": false, + }, + ], + "kind": "block", + }, + "key": Variable { + "curly": false, + "kind": "variable", + "name": "v", + }, + "kind": "foreach", + "shortForm": false, + "source": Variable { + "curly": false, + "kind": "variable", + "name": "array", + }, + "value": List { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "a", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "b", + }, + }, + ], + "kind": "list", + "shortForm": true, + }, + }, + ], + "errors": Array [], + "kind": "program", +} +`; + +exports[`foreach as variable 1`] = ` +Program { + "children": Array [ + Foreach { + "body": Block { + "children": Array [ + Echo { + "expressions": Array [ + Variable { + "curly": false, + "kind": "variable", + "name": "a", + }, + ], + "kind": "echo", + "shortForm": false, + }, + ], + "kind": "block", + }, + "key": null, + "kind": "foreach", + "shortForm": false, + "source": Variable { + "curly": false, + "kind": "variable", + "name": "array", + }, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "var", + }, + }, + ], + "errors": Array [], + "kind": "program", +} +`; + +exports[`foreach as variable by ref 1`] = ` +Program { + "children": Array [ + Foreach { + "body": Block { + "children": Array [ + Echo { + "expressions": Array [ + Variable { + "curly": false, + "kind": "variable", + "name": "a", + }, + ], + "kind": "echo", + "shortForm": false, + }, + ], + "kind": "block", + }, + "key": null, + "kind": "foreach", + "shortForm": false, + "source": Variable { + "curly": false, + "kind": "variable", + "name": "array", + }, + "value": Variable { + "byref": true, + "curly": false, + "kind": "variable", + "name": "var", + }, + }, + ], + "errors": Array [], + "kind": "program", +} +`; + +exports[`foreach unpacking #2 1`] = ` +Program { + "children": Array [ + Foreach { + "body": Block { + "children": Array [ + ExpressionStatement { + "expression": Call { + "arguments": Array [ + Variable { + "curly": false, + "kind": "variable", + "name": "value", + }, + ], + "kind": "call", + "what": ClassReference { + "kind": "classreference", + "name": "print_r", + "resolution": "uqn", + }, + }, + "kind": "expressionstatement", + }, + ], + "kind": "block", + }, + "key": null, + "kind": "foreach", + "shortForm": false, + "source": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": true, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "var", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "2", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "3", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "4", + }, + }, + ], + "kind": "array", + "shortForm": false, + }, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "value", + }, + }, + ], + "errors": Array [], + "kind": "program", +} +`; + +exports[`foreach unpacking #3 1`] = ` +Program { + "children": Array [ + Foreach { + "body": Block { + "children": Array [ + ExpressionStatement { + "expression": Call { + "arguments": Array [ + Variable { + "curly": false, + "kind": "variable", + "name": "value", + }, + ], + "kind": "call", + "what": ClassReference { + "kind": "classreference", + "name": "print_r", + "resolution": "uqn", + }, + }, + "kind": "expressionstatement", + }, + ], + "kind": "block", + }, + "key": null, + "kind": "foreach", + "shortForm": false, + "source": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": true, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "var", + }, + }, + ], + "kind": "array", + "shortForm": true, + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "2", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "3", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "4", + }, + }, + ], + "kind": "array", + "shortForm": true, + }, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "value", + }, + }, + ], + "errors": Array [], + "kind": "program", +} +`; + +exports[`foreach unpacking #4 1`] = ` +Program { + "children": Array [ + Foreach { + "body": Block { + "children": Array [ + ExpressionStatement { + "expression": Call { + "arguments": Array [ + Variable { + "curly": false, + "kind": "variable", + "name": "value", + }, + ], + "kind": "call", + "what": ClassReference { + "kind": "classreference", + "name": "print_r", + "resolution": "uqn", + }, + }, + "kind": "expressionstatement", + }, + ], + "kind": "block", + }, + "key": null, + "kind": "foreach", + "shortForm": false, + "source": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": true, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "var", + }, + }, + ], + "kind": "array", + "shortForm": false, + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "2", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "3", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "4", + }, + }, + ], + "kind": "array", + "shortForm": false, + }, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "value", + }, + }, + ], + "errors": Array [], + "kind": "program", +} +`; + +exports[`foreach unpacking 1`] = ` +Program { + "children": Array [ + Foreach { + "body": Block { + "children": Array [ + ExpressionStatement { + "expression": Call { + "arguments": Array [ + Variable { + "curly": false, + "kind": "variable", + "name": "value", + }, + ], + "kind": "call", + "what": ClassReference { + "kind": "classreference", + "name": "print_r", + "resolution": "uqn", + }, + }, + "kind": "expressionstatement", + }, + ], + "kind": "block", + }, + "key": null, + "kind": "foreach", + "shortForm": false, + "source": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": true, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "var", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "2", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "3", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "4", + }, + }, + ], + "kind": "array", + "shortForm": true, + }, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "value", + }, + }, + ], + "errors": Array [], + "kind": "program", +} +`; diff --git a/test/snapshot/__snapshots__/function.test.js.snap b/test/snapshot/__snapshots__/function.test.js.snap index ae5049bff..75c0d409b 100644 --- a/test/snapshot/__snapshots__/function.test.js.snap +++ b/test/snapshot/__snapshots__/function.test.js.snap @@ -373,25 +373,55 @@ Program { "kind": "variadic", "what": Array { "items": Array [ - Number { - "kind": "number", - "value": "1", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "1", + }, }, - NullKeyword { - "kind": "nullkeyword", - "raw": "null", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": NullKeyword { + "kind": "nullkeyword", + "raw": "null", + }, }, - Number { - "kind": "number", - "value": "1", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "1", + }, }, - Number { - "kind": "number", - "value": "2", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "2", + }, }, - Number { - "kind": "number", - "value": "3", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "3", + }, }, ], "kind": "array", @@ -499,17 +529,35 @@ Program { "kind": "variadic", "what": Array { "items": Array [ - Number { - "kind": "number", - "value": "1", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "1", + }, }, - Number { - "kind": "number", - "value": "2", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "2", + }, }, - Number { - "kind": "number", - "value": "3", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "3", + }, }, ], "kind": "array", diff --git a/test/snapshot/__snapshots__/heredoc.test.js.snap b/test/snapshot/__snapshots__/heredoc.test.js.snap index c2ca9e3a6..2c74707d2 100644 --- a/test/snapshot/__snapshots__/heredoc.test.js.snap +++ b/test/snapshot/__snapshots__/heredoc.test.js.snap @@ -31,29 +31,35 @@ Program { "arguments": Array [ Array { "items": Array [ - Encapsed { - "kind": "encapsed", - "label": "EOD", - "raw": "<< $foo, 'test' => &$foo, ...$var];", + "start": Position { + "column": 0, + "line": 1, + "offset": 0, + }, + }, + "operator": "=", + "right": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "loc": Location { + "end": Position { + "column": 9, + "line": 1, + "offset": 9, + }, + "source": "1", + "start": Position { + "column": 8, + "line": 1, + "offset": 8, + }, + }, + "unpack": false, + "value": Number { "kind": "number", "loc": Location { "end": Position { - "column": 3, + "column": 9, + "line": 1, + "offset": 9, + }, + "source": "1", + "start": Position { + "column": 8, + "line": 1, + "offset": 8, + }, + }, + "value": "1", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "loc": Location { + "end": Position { + "column": 16, + "line": 1, + "offset": 16, + }, + "source": "'foo'", + "start": Position { + "column": 11, + "line": 1, + "offset": 11, + }, + }, + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "loc": Location { + "end": Position { + "column": 16, "line": 1, - "offset": 3, + "offset": 16, }, - "source": "1", + "source": "'foo'", "start": Position { - "column": 2, + "column": 11, "line": 1, - "offset": 2, + "offset": 11, }, }, - "value": "1", + "raw": "'foo'", + "unicode": false, + "value": "foo", }, - Number { - "kind": "number", + }, + Entry { + "byRef": false, + "key": String { + "isDoubleQuote": false, + "kind": "string", "loc": Location { "end": Position { - "column": 6, + "column": 24, "line": 1, - "offset": 6, + "offset": 24, }, - "source": "2", + "source": "'test'", "start": Position { - "column": 5, + "column": 18, "line": 1, - "offset": 5, + "offset": 18, }, }, - "value": "2", + "raw": "'test'", + "unicode": false, + "value": "test", }, - Number { - "kind": "number", + "kind": "entry", + "loc": Location { + "end": Position { + "column": 32, + "line": 1, + "offset": 32, + }, + "source": "'test' => $foo", + "start": Position { + "column": 18, + "line": 1, + "offset": 18, + }, + }, + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", "loc": Location { "end": Position { - "column": 9, + "column": 32, "line": 1, - "offset": 9, + "offset": 32, }, - "source": "3", + "source": "$foo", "start": Position { - "column": 8, + "column": 28, "line": 1, - "offset": 8, + "offset": 28, }, }, - "value": "3", + "name": "foo", }, - ], - "kind": "array", - "loc": Location { - "end": Position { - "column": 10, - "line": 1, - "offset": 10, + }, + Entry { + "byRef": true, + "key": String { + "isDoubleQuote": false, + "kind": "string", + "loc": Location { + "end": Position { + "column": 40, + "line": 1, + "offset": 40, + }, + "source": "'test'", + "start": Position { + "column": 34, + "line": 1, + "offset": 34, + }, + }, + "raw": "'test'", + "unicode": false, + "value": "test", }, - "source": "[1, 2, 3]", - "start": Position { - "column": 1, - "line": 1, - "offset": 1, + "kind": "entry", + "loc": Location { + "end": Position { + "column": 49, + "line": 1, + "offset": 49, + }, + "source": "'test' => &$foo", + "start": Position { + "column": 34, + "line": 1, + "offset": 34, + }, + }, + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "loc": Location { + "end": Position { + "column": 49, + "line": 1, + "offset": 49, + }, + "source": "$foo", + "start": Position { + "column": 45, + "line": 1, + "offset": 45, + }, + }, + "name": "foo", }, }, - "shortForm": true, - }, - ], - "kind": "array", - "loc": Location { - "end": Position { - "column": 12, - "line": 1, - "offset": 12, - }, - "source": "[[1, 2, 3]];", - "start": Position { - "column": 0, - "line": 1, - "offset": 0, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "loc": Location { + "end": Position { + "column": 58, + "line": 1, + "offset": 58, + }, + "source": "...$var", + "start": Position { + "column": 51, + "line": 1, + "offset": 51, + }, + }, + "unpack": true, + "value": Variable { + "curly": false, + "kind": "variable", + "loc": Location { + "end": Position { + "column": 58, + "line": 1, + "offset": 58, + }, + "source": "$var", + "start": Position { + "column": 54, + "line": 1, + "offset": 54, + }, + }, + "name": "var", + }, + }, + ], + "kind": "array", + "loc": Location { + "end": Position { + "column": 59, + "line": 1, + "offset": 59, + }, + "source": "[1, 'foo', 'test' => $foo, 'test' => &$foo, ...$var]", + "start": Position { + "column": 7, + "line": 1, + "offset": 7, + }, }, + "shortForm": true, }, - "shortForm": true, }, "kind": "expressionstatement", "loc": Location { "end": Position { - "column": 12, + "column": 60, "line": 1, - "offset": 12, + "offset": 60, }, - "source": "[[1, 2, 3]];", + "source": "$var = [1, 'foo', 'test' => $foo, 'test' => &$foo, ...$var];", "start": Position { "column": 0, "line": 1, @@ -1471,11 +2053,11 @@ Program { "kind": "program", "loc": Location { "end": Position { - "column": 12, + "column": 60, "line": 1, - "offset": 12, + "offset": 60, }, - "source": "[[1, 2, 3]];", + "source": "$var = [1, 'foo', 'test' => $foo, 'test' => &$foo, ...$var];", "start": Position { "column": 0, "line": 1, @@ -7123,9 +7705,10 @@ Program { "kind": "assign", "left": List { "items": Array [ - Variable { - "curly": false, - "kind": "variable", + Entry { + "byRef": false, + "key": null, + "kind": "entry", "loc": Location { "end": Position { "column": 7, @@ -7139,11 +7722,30 @@ Program { "offset": 5, }, }, - "name": "a", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "loc": Location { + "end": Position { + "column": 7, + "line": 1, + "offset": 7, + }, + "source": "$a", + "start": Position { + "column": 5, + "line": 1, + "offset": 5, + }, + }, + "name": "a", + }, }, - Variable { - "curly": false, - "kind": "variable", + Entry { + "byRef": false, + "key": null, + "kind": "entry", "loc": Location { "end": Position { "column": 11, @@ -7157,11 +7759,30 @@ Program { "offset": 9, }, }, - "name": "b", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "loc": Location { + "end": Position { + "column": 11, + "line": 1, + "offset": 11, + }, + "source": "$b", + "start": Position { + "column": 9, + "line": 1, + "offset": 9, + }, + }, + "name": "b", + }, }, - Variable { - "curly": false, - "kind": "variable", + Entry { + "byRef": false, + "key": null, + "kind": "entry", "loc": Location { "end": Position { "column": 15, @@ -7175,7 +7796,25 @@ Program { "offset": 13, }, }, - "name": "c", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "loc": Location { + "end": Position { + "column": 15, + "line": 1, + "offset": 15, + }, + "source": "$c", + "start": Position { + "column": 13, + "line": 1, + "offset": 13, + }, + }, + "name": "c", + }, }, ], "kind": "list", @@ -7269,9 +7908,10 @@ Program { "kind": "assign", "left": List { "items": Array [ - Variable { - "curly": false, - "kind": "variable", + Entry { + "byRef": false, + "key": null, + "kind": "entry", "loc": Location { "end": Position { "column": 3, @@ -7285,11 +7925,30 @@ Program { "offset": 1, }, }, - "name": "a", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "loc": Location { + "end": Position { + "column": 3, + "line": 1, + "offset": 3, + }, + "source": "$a", + "start": Position { + "column": 1, + "line": 1, + "offset": 1, + }, + }, + "name": "a", + }, }, - Variable { - "curly": false, - "kind": "variable", + Entry { + "byRef": false, + "key": null, + "kind": "entry", "loc": Location { "end": Position { "column": 7, @@ -7303,11 +7962,30 @@ Program { "offset": 5, }, }, - "name": "b", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "loc": Location { + "end": Position { + "column": 7, + "line": 1, + "offset": 7, + }, + "source": "$b", + "start": Position { + "column": 5, + "line": 1, + "offset": 5, + }, + }, + "name": "b", + }, }, - Variable { - "curly": false, - "kind": "variable", + Entry { + "byRef": false, + "key": null, + "kind": "entry", "loc": Location { "end": Position { "column": 11, @@ -7321,7 +7999,25 @@ Program { "offset": 9, }, }, - "name": "c", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "loc": Location { + "end": Position { + "column": 11, + "line": 1, + "offset": 11, + }, + "source": "$c", + "start": Position { + "column": 9, + "line": 1, + "offset": 9, + }, + }, + "name": "c", + }, }, ], "kind": "list", diff --git a/test/snapshot/__snapshots__/loop.test.js.snap b/test/snapshot/__snapshots__/loop.test.js.snap index 5d8e4fe7a..e070d38fc 100644 --- a/test/snapshot/__snapshots__/loop.test.js.snap +++ b/test/snapshot/__snapshots__/loop.test.js.snap @@ -7,10 +7,16 @@ Program { "body": ExpressionStatement { "expression": Array { "items": Array [ - Variable { - "curly": false, - "kind": "variable", - "name": "foo", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "foo", + }, }, ], "kind": "array", @@ -196,10 +202,16 @@ Program { }, "key": List { "items": Array [ - Variable { - "curly": false, - "kind": "variable", - "name": "bar", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "bar", + }, }, ], "kind": "list", @@ -534,33 +546,69 @@ Program { "shortForm": true, "source": Array { "items": Array [ - Array { - "items": Array [ - Number { - "kind": "number", - "value": "1", - }, - Number { - "kind": "number", - "value": "2", - }, - ], - "kind": "array", - "shortForm": true, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "1", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "2", + }, + }, + ], + "kind": "array", + "shortForm": true, + }, }, - Array { - "items": Array [ - Number { - "kind": "number", - "value": "3", - }, - Number { - "kind": "number", - "value": "4", - }, - ], - "kind": "array", - "shortForm": true, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Array { + "items": Array [ + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "3", + }, + }, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "4", + }, + }, + ], + "kind": "array", + "shortForm": true, + }, }, ], "kind": "array", @@ -568,15 +616,27 @@ Program { }, "value": List { "items": Array [ - Variable { - "curly": false, - "kind": "variable", - "name": "c", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "c", + }, }, - Variable { - "curly": false, - "kind": "variable", - "name": "d", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "d", + }, }, ], "kind": "list", diff --git a/test/snapshot/__snapshots__/nowdoc.test.js.snap b/test/snapshot/__snapshots__/nowdoc.test.js.snap index bd3cebc44..00623116a 100644 --- a/test/snapshot/__snapshots__/nowdoc.test.js.snap +++ b/test/snapshot/__snapshots__/nowdoc.test.js.snap @@ -31,15 +31,21 @@ Program { "arguments": Array [ Array { "items": Array [ - Nowdoc { - "kind": "nowdoc", - "label": "EOD", - "quote": true, - "raw": "<<<'EOD' + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Nowdoc { + "kind": "nowdoc", + "label": "EOD", + "quote": true, + "raw": "<<<'EOD' foobar! EOD ", - "value": "foobar!", + "value": "foobar!", + }, }, ], "kind": "array", diff --git a/test/snapshot/__snapshots__/php73.test.js.snap b/test/snapshot/__snapshots__/php73.test.js.snap index 3ea264aff..94ce4f678 100644 --- a/test/snapshot/__snapshots__/php73.test.js.snap +++ b/test/snapshot/__snapshots__/php73.test.js.snap @@ -8,16 +8,27 @@ Program { "kind": "assign", "left": List { "items": Array [ - Variable { - "curly": false, - "kind": "variable", - "name": "a", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "a", + }, }, - Variable { - "byref": true, - "curly": false, - "kind": "variable", - "name": "b", + Entry { + "byRef": true, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "b", + }, }, ], "kind": "list", @@ -37,16 +48,27 @@ Program { "kind": "assign", "left": List { "items": Array [ - Variable { - "curly": false, - "kind": "variable", - "name": "a", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "a", + }, }, - Variable { - "byref": true, - "curly": false, - "kind": "variable", - "name": "b", + Entry { + "byRef": true, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "b", + }, }, ], "kind": "list", @@ -93,19 +115,31 @@ Program { }, Array { "items": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'foo'", - "unicode": false, - "value": "foo", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'foo'", + "unicode": false, + "value": "foo", + }, }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'bar'", - "unicode": false, - "value": "bar", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": String { + "isDoubleQuote": false, + "kind": "string", + "raw": "'bar'", + "unicode": false, + "value": "bar", + }, }, ], "kind": "array", diff --git a/test/snapshot/__snapshots__/property.test.js.snap b/test/snapshot/__snapshots__/property.test.js.snap index 8c63f9b9c..293b9dc12 100644 --- a/test/snapshot/__snapshots__/property.test.js.snap +++ b/test/snapshot/__snapshots__/property.test.js.snap @@ -412,15 +412,27 @@ Program { }, "value": Array { "items": Array [ - Boolean { - "kind": "boolean", - "raw": "true", - "value": true, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Boolean { + "kind": "boolean", + "raw": "true", + "value": true, + }, }, - Boolean { - "kind": "boolean", - "raw": "false", - "value": false, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Boolean { + "kind": "boolean", + "raw": "false", + "value": false, + }, }, ], "kind": "array", @@ -803,15 +815,27 @@ Program { }, "value": Array { "items": Array [ - Boolean { - "kind": "boolean", - "raw": "true", - "value": true, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Boolean { + "kind": "boolean", + "raw": "true", + "value": true, + }, }, - Boolean { - "kind": "boolean", - "raw": "false", - "value": false, + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Boolean { + "kind": "boolean", + "raw": "false", + "value": false, + }, }, ], "kind": "array", diff --git a/test/snapshot/__snapshots__/variable.test.js.snap b/test/snapshot/__snapshots__/variable.test.js.snap index a643a0fcf..155f3fa2b 100644 --- a/test/snapshot/__snapshots__/variable.test.js.snap +++ b/test/snapshot/__snapshots__/variable.test.js.snap @@ -729,15 +729,27 @@ Program { "kind": "assign", "left": List { "items": Array [ - Variable { - "curly": false, - "kind": "variable", - "name": "id1", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "id1", + }, }, - Variable { - "curly": false, - "kind": "variable", - "name": "name1", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Variable { + "curly": false, + "kind": "variable", + "name": "name1", + }, }, ], "kind": "list", diff --git a/test/snapshot/__snapshots__/yieldfrom.test.js.snap b/test/snapshot/__snapshots__/yieldfrom.test.js.snap index b23f9ff20..97751d8b5 100644 --- a/test/snapshot/__snapshots__/yieldfrom.test.js.snap +++ b/test/snapshot/__snapshots__/yieldfrom.test.js.snap @@ -8,13 +8,25 @@ Program { "kind": "yieldfrom", "value": Array { "items": Array [ - Number { - "kind": "number", - "value": "3", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "3", + }, }, - Number { - "kind": "number", - "value": "4", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "4", + }, }, ], "kind": "array", @@ -39,13 +51,25 @@ Program { "arguments": Array [ Array { "items": Array [ - Number { - "kind": "number", - "value": "5", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "5", + }, }, - Number { - "kind": "number", - "value": "6", + Entry { + "byRef": false, + "key": null, + "kind": "entry", + "unpack": false, + "value": Number { + "kind": "number", + "value": "6", + }, }, ], "kind": "array", diff --git a/test/snapshot/array.test.js b/test/snapshot/array.test.js index e24d12655..e340e0aa5 100644 --- a/test/snapshot/array.test.js +++ b/test/snapshot/array.test.js @@ -1,56 +1,56 @@ -const parser = require('../main'); +const parser = require("../main"); -describe('Array without keys', () => { - it('deference array', () => { +describe("Array without keys", () => { + it("deference array", () => { expect( parser.parseEval( - ['$a = [', '"a", "b"', ']($foo)[$foo->bar()[1]]->foo()'].join('\r'), - ), + ["$a = [", '"a", "b"', "]($foo)[$foo->bar()[1]]->foo()"].join("\r") + ) ).toMatchSnapshot(); }); - it('of strings', () => { + it("of strings", () => { expect( - parser.parseEval('array("item1", "item2", "item3")'), + parser.parseEval('array("item1", "item2", "item3")') ).toMatchSnapshot(); }); - it('of numbers', () => { - expect(parser.parseEval('array(1, 2.5, 0x1000)')).toMatchSnapshot(); + it("of numbers", () => { + expect(parser.parseEval("array(1, 2.5, 0x1000)")).toMatchSnapshot(); }); - it('of strings and numbers', () => { + it("of strings and numbers", () => { expect(parser.parseEval('array(1, "item2", 3, "item4")')).toMatchSnapshot(); }); - it('of variables', () => { - expect(parser.parseEval('array($obj1, $obj2, $obj3)')).toMatchSnapshot(); + it("of variables", () => { + expect(parser.parseEval("array($obj1, $obj2, $obj3)")).toMatchSnapshot(); }); - it('of objects', () => { + it("of objects", () => { expect( - parser.parseEval('[new foo(), new stdClass(), new bar()]'), + parser.parseEval("[new foo(), new stdClass(), new bar()]") ).toMatchSnapshot(); }); - it('of arrays', () => { + it("of arrays", () => { expect( parser.parseEval(` array( array("item1", "item2"), array("item3", "item4"), array("item5", "item6") - )`), + )`) ).toMatchSnapshot(); }); - describe('mixed tests / coverage', function() { - it('test empty array', function() { - expect(parser.parseEval('$a = []; $b = array();')).toMatchSnapshot(); + describe("mixed tests / coverage", function() { + it("test empty array", function() { + expect(parser.parseEval("$a = []; $b = array();")).toMatchSnapshot(); }); - it('test short form / keys', function() { + it("test short form / keys", function() { expect( - parser.parseEval('[0 => &$foo, $bar => "foobar"];'), + parser.parseEval('[0 => &$foo, $bar => "foobar"];') ).toMatchSnapshot(); }); }); @@ -102,4 +102,34 @@ describe('Array without keys', () => { it("array with empty values #3", () => { expect(parser.parseEval("[,,,'foo',,, 'bar',,,'baz',,]")).toMatchSnapshot(); }); + + it("non empty array", () => { + expect( + parser.parseEval( + "$var = [true, 1, 1.1, 'test', \"test\", [1, 2, 3], new Foo(), call(), null];" + ) + ).toMatchSnapshot(); + }); + + it("spread operator", () => { + expect( + parser.parseEval(` +$var = ['banana', 'orange', ...$parts, 'watermelon']; +$var = [...$arr1]; +$var = [0, ...$arr1]; +$var = array(...$arr1, ...$arr2, 111); +$var = [...$arr1, ...$arr1]; +$var = [...getArr(), 'c']; +$var = [...new ArrayIterator(['a', 'b', 'c'])]; +`) + ).toMatchSnapshot(); + }); + + it("byRef", () => { + expect( + parser.parseEval(` +$var = [1, 'test', &$var, 'test' => &$var]; +`) + ).toMatchSnapshot(); + }); }); diff --git a/test/snapshot/foreach.test.js b/test/snapshot/foreach.test.js new file mode 100644 index 000000000..74dc73ee0 --- /dev/null +++ b/test/snapshot/foreach.test.js @@ -0,0 +1,103 @@ +const parser = require("../main"); + +describe("foreach", function() { + it("as variable", function() { + expect( + parser.parseEval(` +foreach ($array as $var) { + echo $a; +} + `) + ).toMatchSnapshot(); + }); + + it("as variable by ref", function() { + expect( + parser.parseEval(` +foreach ($array as &$var) { + echo $a; +} + `) + ).toMatchSnapshot(); + }); + + it("as list", function() { + expect( + parser.parseEval(` +foreach ($array as list($a, $b)) { + echo $a; +} + `) + ).toMatchSnapshot(); + }); + + it("as short list", function() { + expect( + parser.parseEval(` +foreach ($array as [$a, $b]) { + echo $a; +} + `) + ).toMatchSnapshot(); + }); + + it("as list with key", function() { + expect( + parser.parseEval(` +foreach ($array as $v => list($a, $b)) { + echo $v; +} + `) + ).toMatchSnapshot(); + }); + + it("as short list with key", function() { + expect( + parser.parseEval(` +foreach ($array as $v => [$a, $b]) { + echo $v; +} + `) + ).toMatchSnapshot(); + }); + + it("unpacking", function() { + expect( + parser.parseEval(` +foreach ([...$var, 2, 3, 4] as $value) { + print_r($value); +} + `) + ).toMatchSnapshot(); + }); + + it("unpacking #2", function() { + expect( + parser.parseEval(` +foreach (array(...$var, 2, 3, 4) as $value) { + print_r($value); +} + `) + ).toMatchSnapshot(); + }); + + it("unpacking #3", function() { + expect( + parser.parseEval(` +foreach ([[...$var], 2, 3, 4] as $value) { + print_r($value); +} + `) + ).toMatchSnapshot(); + }); + + it("unpacking #4", function() { + expect( + parser.parseEval(` +foreach (array(array(...$var), 2, 3, 4) as $value) { + print_r($value); +} + `) + ).toMatchSnapshot(); + }); +}); diff --git a/test/snapshot/location.test.js b/test/snapshot/location.test.js index 106ba94b7..5e1f8f9fe 100644 --- a/test/snapshot/location.test.js +++ b/test/snapshot/location.test.js @@ -662,6 +662,19 @@ describe("Test locations", function() { }) ).toMatchSnapshot(); }); + it("array with keys, byRef and unpack", function() { + expect( + parser.parseEval( + `$var = [1, 'foo', 'test' => $foo, 'test' => &$foo, ...$var];`, + { + ast: { + withPositions: true, + withSource: true + } + } + ) + ).toMatchSnapshot(); + }); it("clone", function() { expect( parser.parseEval("clone $var;", {