From 4f5aa438d6799f24c7a112ca8dc0910466944f2e Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Fri, 4 Mar 2022 17:51:22 -0800 Subject: [JS Parser] Support JSX prop punning --- src/js_parser/js_parser.zig | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) (limited to 'src/js_parser/js_parser.zig') diff --git a/src/js_parser/js_parser.zig b/src/js_parser/js_parser.zig index 0ee6c5edf..b299b4498 100644 --- a/src/js_parser/js_parser.zig +++ b/src/js_parser/js_parser.zig @@ -11342,10 +11342,46 @@ fn NewParser_( defer i += 1; // Use Next() not ExpectInsideJSXElement() so we can parse "..." try p.lexer.next(); - try p.lexer.expect(.t_dot_dot_dot); - spread_prop_i = i; - spread_loc = p.lexer.loc(); - try props.append(G.Property{ .value = try p.parseExpr(.comma), .kind = .spread }); + + switch (p.lexer.token) { + .t_dot_dot_dot => { + try p.lexer.next(); + + spread_prop_i = i; + spread_loc = p.lexer.loc(); + try props.append(G.Property{ .value = try p.parseExpr(.comma), .kind = .spread }); + }, + // This implements + //
+ // -> + //
+ T.t_identifier => { + const name = p.lexer.identifier; + if (strings.eqlComptime(name, "let")) { + p.lexer.addError(p.source, p.lexer.loc(), "\"let\" is not allowed with JSX prop punning") catch unreachable; + } + const key = p.e(E.String{ .utf8 = name }, p.lexer.loc()); + const ref = p.storeNameInRef(name) catch unreachable; + const value = p.e(E.Identifier{ .ref = ref }, key.loc); + try p.lexer.next(); + + try props.append(G.Property{ .value = value, .key = key, .kind = .normal }); + }, + // This implements + //
+ //
+ // -> + //
+ // note: template literals are not supported, operations on strings are not supported either + T.t_string_literal => { + const key = p.e(p.lexer.toEString(), p.lexer.loc()); + try p.lexer.next(); + try props.append(G.Property{ .value = key, .key = key, .kind = .normal }); + }, + + else => try p.lexer.unexpected(), + } + try p.lexer.nextInsideJSXElement(); }, else => { -- cgit v1.2.3