diff options
author | 2021-05-13 00:46:22 -0700 | |
---|---|---|
committer | 2021-05-13 00:46:22 -0700 | |
commit | bed0227a8f2d8b674a98803659922d08ac665bfe (patch) | |
tree | 42e6cd96757a0f9c01d103de1f42bdc7a9e958b8 /src/json_parser.zig | |
parent | 9fd6f635cd5092ce82359b504f1e053d7f0387d6 (diff) | |
download | bun-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.zig | 47 |
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; |