diff options
author | 2021-09-22 02:16:31 -0700 | |
---|---|---|
committer | 2021-09-22 02:16:31 -0700 | |
commit | 8f460a9be3d954d6be555d1bcd382383d23d9280 (patch) | |
tree | 4a64f0164554c99af419564a4e4885d27d09deff | |
parent | 204b07f46b6c8985c8928ec58b51d941903ad69b (diff) | |
download | bun-8f460a9be3d954d6be555d1bcd382383d23d9280.tar.gz bun-8f460a9be3d954d6be555d1bcd382383d23d9280.tar.zst bun-8f460a9be3d954d6be555d1bcd382383d23d9280.zip |
Fix parsing bug with arrays that have default values
-rw-r--r-- | integration/scripts/browser.js | 1 | ||||
-rw-r--r-- | integration/snippets/array-args-with-default-values.js | 28 | ||||
-rw-r--r-- | integration/snippets/package-json-exports/index.js | 4 | ||||
-rw-r--r-- | src/js_parser/js_parser.zig | 13 |
4 files changed, 40 insertions, 6 deletions
diff --git a/integration/scripts/browser.js b/integration/scripts/browser.js index 8eb776c29..5d84de0e7 100644 --- a/integration/scripts/browser.js +++ b/integration/scripts/browser.js @@ -114,6 +114,7 @@ async function main() { "/unicode-identifiers.js", "/string-escapes.js", "/package-json-exports/index.js", + "/array-args-with-default-values.js", ]; tests.reverse(); diff --git a/integration/snippets/array-args-with-default-values.js b/integration/snippets/array-args-with-default-values.js new file mode 100644 index 000000000..f733a1bfa --- /dev/null +++ b/integration/snippets/array-args-with-default-values.js @@ -0,0 +1,28 @@ +var lines; +const data = () => + lines.map(([a = null, b = null, c = null, d = null]) => ({ + a, + b, + c, + d, + })); + +export function test() { + let ran = false; + lines = [ + [undefined, undefined, undefined, undefined], + [undefined, undefined, undefined, undefined], + [undefined, undefined, undefined, undefined], + [undefined, undefined, undefined, undefined], + ]; + + for (let foo of data()) { + console.assert(foo.a === null); + console.assert(foo.b === null); + console.assert(foo.c === null); + console.assert(foo.d === null); + ran = true; + } + console.assert(ran); + testDone(import.meta.url); +} diff --git a/integration/snippets/package-json-exports/index.js b/integration/snippets/package-json-exports/index.js index 7603e0d59..7573e431c 100644 --- a/integration/snippets/package-json-exports/index.js +++ b/integration/snippets/package-json-exports/index.js @@ -2,9 +2,11 @@ import * as InexactRoot from "inexact"; import * as InexactFile from "inexact/file"; import * as ExactFile from "inexact/foo"; -export function test() { +export async function test() { console.assert(InexactRoot.target === "browser"); console.assert(InexactFile.target === "browser"); console.assert(ExactFile.target === "browser"); + + console.assert(failed); return testDone(import.meta.url); } diff --git a/src/js_parser/js_parser.zig b/src/js_parser/js_parser.zig index d3db3861b..a32a077ac 100644 --- a/src/js_parser/js_parser.zig +++ b/src/js_parser/js_parser.zig @@ -1507,7 +1507,10 @@ fn notimpl() noreturn { Global.panic("Not implemented yet!!", .{}); } -const ExprBindingTuple = struct { expr: ?ExprNodeIndex = null, binding: ?Binding = null, override_expr: ?ExprNodeIndex = null }; +const ExprBindingTuple = struct { + expr: ?ExprNodeIndex = null, + binding: ?Binding = null, +}; const TempRef = struct { ref: Ref, @@ -3842,13 +3845,13 @@ pub fn NewParser( // p.markSyntaxFeature(Destructing) var items = List(js_ast.ArrayBinding).initCapacity(p.allocator, ex.items.len) catch unreachable; - var is_spread = true; + var is_spread = false; for (ex.items) |_, i| { var item = ex.items[i]; var _expr = item; - if (@as(Expr.Tag, item.data) == .e_spread) { + if (item.data == .e_spread) { is_spread = true; - item = item.getSpread().value; + item = item.data.e_spread.value; } const res = p.convertExprToBindingAndInitializer(&item, invalid_loc, is_spread); @@ -3858,7 +3861,7 @@ pub fn NewParser( // Promise.all(promises).then(([, len]) => true); // ^ Binding is missing there .binding = res.binding orelse p.b(B.Missing{}, item.loc), - .default_value = res.override_expr, + .default_value = res.expr, }); } |