aboutsummaryrefslogtreecommitdiff
path: root/src/json_parser.zig
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2021-05-13 00:46:22 -0700
committerGravatar Jarred Sumner <jarred@jarredsumner.com> 2021-05-13 00:46:22 -0700
commitbed0227a8f2d8b674a98803659922d08ac665bfe (patch)
tree42e6cd96757a0f9c01d103de1f42bdc7a9e958b8 /src/json_parser.zig
parent9fd6f635cd5092ce82359b504f1e053d7f0387d6 (diff)
downloadbun-bed0227a8f2d8b674a98803659922d08ac665bfe.tar.gz
bun-bed0227a8f2d8b674a98803659922d08ac665bfe.tar.zst
bun-bed0227a8f2d8b674a98803659922d08ac665bfe.zip
hm
Former-commit-id: 28fce4aac174c7cf7a492ca4c5442d57a4f395a3
Diffstat (limited to 'src/json_parser.zig')
-rw-r--r--src/json_parser.zig47
1 files changed, 34 insertions, 13 deletions
diff --git a/src/json_parser.zig b/src/json_parser.zig
index 4fb1f89f7..120bcb4d7 100644
--- a/src/json_parser.zig
+++ b/src/json_parser.zig
@@ -93,11 +93,20 @@ fn JSONLikeParser(opts: js_lexer.JSONOptions) type {
return p.e(E.Null{}, loc);
},
.t_string_literal => {
- const value = p.lexer.string_literal;
+ var str: E.String = undefined;
+ if (p.lexer.string_literal_is_ascii) {
+ str = E.String{
+ .utf8 = p.lexer.string_literal_slice,
+ };
+ } else {
+ const value = p.lexer.stringLiteralUTF16();
+ str = E.String{
+ .value = value,
+ };
+ }
+
try p.lexer.next();
- return p.e(E.String{
- .value = value,
- }, loc);
+ return p.e(str, loc);
},
.t_numeric_literal => {
const value = p.lexer.number;
@@ -143,7 +152,7 @@ fn JSONLikeParser(opts: js_lexer.JSONOptions) type {
try p.lexer.next();
var is_single_line = !p.lexer.has_newline_before;
var properties = std.ArrayList(G.Property).init(p.allocator);
- var duplicates = std.StringHashMap(u1).init(p.allocator);
+ var duplicates = std.BufSet.init(p.allocator);
while (p.lexer.token != .t_close_brace) {
if (properties.items.len > 0) {
@@ -158,18 +167,30 @@ fn JSONLikeParser(opts: js_lexer.JSONOptions) type {
}
}
- var key_string = p.lexer.string_literal;
+ var str: E.String = undefined;
+ if (p.lexer.string_literal_is_ascii) {
+ str = E.String{
+ .utf8 = p.lexer.string_literal_slice,
+ };
+ } else {
+ const value = p.lexer.stringLiteralUTF16();
+ str = E.String{
+ .value = value,
+ };
+ }
+ const is_duplicate = duplicates.exists(p.lexer.string_literal_slice);
+ if (!is_duplicate) {
+ duplicates.put(p.lexer.string_literal_slice) catch unreachable;
+ }
var key_range = p.lexer.range();
- var key = p.e(E.String{ .value = key_string }, key_range.loc);
- try p.lexer.expect(.t_string_literal);
- var key_text = p.lexer.utf16ToString(key_string);
// Warn about duplicate keys
-
- const entry = duplicates.getOrPut(key_text) catch unreachable;
- if (entry.found_existing) {
- p.log.addRangeWarningFmt(p.source, key_range, p.allocator, "Duplicate key \"{s}\" in object literal", .{key_text}) catch unreachable;
+ if (is_duplicate) {
+ p.log.addRangeWarningFmt(p.source, key_range, p.allocator, "Duplicate key \"{s}\" in object literal", .{p.lexer.string_literal_slice}) catch unreachable;
}
+ var key = p.e(str, key_range.loc);
+ try p.lexer.expect(.t_string_literal);
+
try p.lexer.expect(.t_colon);
var value = try p.parseExpr();
properties.append(G.Property{ .key = key, .value = value }) catch unreachable;