aboutsummaryrefslogtreecommitdiff
path: root/src/json_parser.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/json_parser.zig')
-rw-r--r--src/json_parser.zig80
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();