diff options
Diffstat (limited to 'src/json_parser.zig')
-rw-r--r-- | src/json_parser.zig | 80 |
1 files changed, 44 insertions, 36 deletions
diff --git a/src/json_parser.zig b/src/json_parser.zig index 619590c0f..9ce9fea7c 100644 --- a/src/json_parser.zig +++ b/src/json_parser.zig @@ -84,6 +84,26 @@ const HashMapPool = struct { } }; +fn newExpr(t: anytype, loc: logger.Loc) Expr { + const Type = @TypeOf(t); + if (comptime @typeInfo(Type) == .Pointer) { + @compileError("Unexpected pointer"); + } + + if (comptime Environment.allow_assert) { + if (comptime Type == E.Object) { + for (t.properties.slice()) |prop| { + // json should never have an initializer set + std.debug.assert(prop.initializer == null); + std.debug.assert(prop.key != null); + std.debug.assert(prop.value != null); + } + } + } + + return Expr.init(Type, t, loc); +} + // This hack fixes using LLDB fn JSONLikeParser(comptime opts: js_lexer.JSONOptions) type { return JSONLikeParser_( @@ -123,6 +143,9 @@ fn JSONLikeParser_( allocator: std.mem.Allocator, pub fn init(allocator: std.mem.Allocator, source_: logger.Source, log: *logger.Log) !Parser { + Expr.Data.Store.assert(); + Stmt.Data.Store.assert(); + return Parser{ .lexer = try Lexer.init(log, source_, allocator), .allocator = allocator, @@ -136,33 +159,25 @@ fn JSONLikeParser_( const Parser = @This(); - pub fn e(_: *Parser, t: anytype, loc: logger.Loc) Expr { - const Type = @TypeOf(t); - if (@typeInfo(Type) == .Pointer) { - return Expr.init(std.meta.Child(Type), t.*, loc); - } else { - return Expr.init(Type, t, loc); - } - } pub fn parseExpr(p: *Parser, comptime maybe_auto_quote: bool, comptime force_utf8: bool) anyerror!Expr { const loc = p.lexer.loc(); switch (p.lexer.token) { .t_false => { try p.lexer.next(); - return p.e(E.Boolean{ + return newExpr(E.Boolean{ .value = false, }, loc); }, .t_true => { try p.lexer.next(); - return p.e(E.Boolean{ + return newExpr(E.Boolean{ .value = true, }, loc); }, .t_null => { try p.lexer.next(); - return p.e(E.Null{}, loc); + return newExpr(E.Null{}, loc); }, .t_string_literal => { var str: E.String = p.lexer.toEString(); @@ -171,18 +186,18 @@ fn JSONLikeParser_( } try p.lexer.next(); - return p.e(str, loc); + return newExpr(str, loc); }, .t_numeric_literal => { const value = p.lexer.number; try p.lexer.next(); - return p.e(E.Number{ .value = value }, loc); + return newExpr(E.Number{ .value = value }, loc); }, .t_minus => { try p.lexer.next(); const value = p.lexer.number; try p.lexer.expect(.t_numeric_literal); - return p.e(E.Number{ .value = -value }, loc); + return newExpr(E.Number{ .value = -value }, loc); }, .t_open_bracket => { try p.lexer.next(); @@ -211,7 +226,7 @@ fn JSONLikeParser_( is_single_line = false; } try p.lexer.expect(.t_close_bracket); - return p.e(E.Array{ + return newExpr(E.Array{ .items = ExprNodeList.fromList(exprs), .is_single_line = is_single_line, .was_originally_macro = comptime opts.was_originally_macro, @@ -261,7 +276,7 @@ fn JSONLikeParser_( p.lexer.toEString(); const key_range = p.lexer.range(); - const key = p.e(str, key_range.loc); + const key = newExpr(str, key_range.loc); try p.lexer.expect(.t_string_literal); if (comptime opts.json_warn_duplicate_keys) { @@ -281,6 +296,7 @@ fn JSONLikeParser_( .key = key, .value = value, .kind = js_ast.G.Property.Kind.normal, + .initializer = null, }) catch unreachable; } @@ -288,7 +304,7 @@ fn JSONLikeParser_( is_single_line = false; } try p.lexer.expect(.t_close_brace); - return p.e(E.Object{ + return newExpr(E.Object{ .properties = G.Property.List.fromList(properties), .is_single_line = is_single_line, .was_originally_macro = comptime opts.was_originally_macro, @@ -375,52 +391,44 @@ pub const PackageJSONVersionChecker = struct { const Parser = @This(); - pub fn e(_: *Parser, t: anytype, loc: logger.Loc) Expr { - const Type = @TypeOf(t); - if (@typeInfo(Type) == .Pointer) { - return Expr.init(std.meta.Child(Type), t.*, loc); - } else { - return Expr.init(Type, t, loc); - } - } pub fn parseExpr(p: *Parser) anyerror!Expr { const loc = p.lexer.loc(); - if (p.has_found_name and p.has_found_version) return p.e(E.Missing{}, loc); + if (p.has_found_name and p.has_found_version) return newExpr(E.Missing{}, loc); switch (p.lexer.token) { .t_false => { try p.lexer.next(); - return p.e(E.Boolean{ + return newExpr(E.Boolean{ .value = false, }, loc); }, .t_true => { try p.lexer.next(); - return p.e(E.Boolean{ + return newExpr(E.Boolean{ .value = true, }, loc); }, .t_null => { try p.lexer.next(); - return p.e(E.Null{}, loc); + return newExpr(E.Null{}, loc); }, .t_string_literal => { var str: E.String = p.lexer.toEString(); try p.lexer.next(); - return p.e(str, loc); + return newExpr(str, loc); }, .t_numeric_literal => { const value = p.lexer.number; try p.lexer.next(); - return p.e(E.Number{ .value = value }, loc); + return newExpr(E.Number{ .value = value }, loc); }, .t_minus => { try p.lexer.next(); const value = p.lexer.number; try p.lexer.expect(.t_numeric_literal); - return p.e(E.Number{ .value = -value }, loc); + return newExpr(E.Number{ .value = -value }, loc); }, .t_open_bracket => { try p.lexer.next(); @@ -438,7 +446,7 @@ pub const PackageJSONVersionChecker = struct { } try p.lexer.expect(.t_close_bracket); - return p.e(E.Missing{}, loc); + return newExpr(E.Missing{}, loc); }, .t_open_brace => { try p.lexer.next(); @@ -456,7 +464,7 @@ pub const PackageJSONVersionChecker = struct { const str = p.lexer.toEString(); const key_range = p.lexer.range(); - const key = p.e(str, key_range.loc); + const key = newExpr(str, key_range.loc); try p.lexer.expect(.t_string_literal); try p.lexer.expect(.t_colon); @@ -487,12 +495,12 @@ pub const PackageJSONVersionChecker = struct { } } - if (p.has_found_name and p.has_found_version) return p.e(E.Missing{}, loc); + if (p.has_found_name and p.has_found_version) return newExpr(E.Missing{}, loc); has_properties = true; } try p.lexer.expect(.t_close_brace); - return p.e(E.Missing{}, loc); + return newExpr(E.Missing{}, loc); }, else => { try p.lexer.unexpected(); |