aboutsummaryrefslogtreecommitdiff
path: root/src/js_parser/js_parser.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/js_parser/js_parser.zig')
-rw-r--r--src/js_parser/js_parser.zig44
1 files changed, 40 insertions, 4 deletions
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
+ // <div {foo} />
+ // ->
+ // <div foo={foo} />
+ 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
+ // <div {"foo"} />
+ // <div {'foo'} />
+ // ->
+ // <div foo="foo" />
+ // 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 => {