From 44b0c8153a7092f97c36c5aab82b692f672c3ddf Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Fri, 11 Mar 2022 00:03:09 -0800 Subject: Source Maps for client-side errors & columns --- src/js_parser/js_parser.zig | 237 +++++++++++++++++++++++++------------------- 1 file changed, 133 insertions(+), 104 deletions(-) (limited to 'src/js_parser/js_parser.zig') diff --git a/src/js_parser/js_parser.zig b/src/js_parser/js_parser.zig index 603bef93e..1945f9fa4 100644 --- a/src/js_parser/js_parser.zig +++ b/src/js_parser/js_parser.zig @@ -46,7 +46,10 @@ fn _disabledAssert(_: bool) void { } const assert = if (Environment.allow_assert) std.debug.assert else _disabledAssert; - +const ExprListLoc = struct { + list: ExprNodeList, + loc: logger.Loc, +}; pub const LocRef = js_ast.LocRef; pub const S = js_ast.S; pub const B = js_ast.B; @@ -174,6 +177,87 @@ const TransposeState = struct { loc: logger.Loc, }; +const JSXTag = struct { + pub const TagType = enum { fragment, tag }; + pub const Data = union(TagType) { + fragment: u8, + tag: Expr, + + pub fn asExpr(d: *const Data) ?ExprNodeIndex { + switch (d.*) { + .tag => |tag| { + return tag; + }, + else => { + return null; + }, + } + } + }; + data: Data, + range: logger.Range, + name: string = "", + + pub fn parse(comptime P: type, p: *P) anyerror!JSXTag { + const loc = p.lexer.loc(); + + // A missing tag is a fragment + if (p.lexer.token == .t_greater_than) { + return JSXTag{ + .range = logger.Range{ .loc = loc, .len = 0 }, + .data = Data{ .fragment = 1 }, + .name = "", + }; + } + + // The tag is an identifier + var name = p.lexer.identifier; + var tag_range = p.lexer.range(); + try p.lexer.expectInsideJSXElement(.t_identifier); + + // Certain identifiers are strings + //
= 'a' and name[0] <= 'z')) { + return JSXTag{ + .data = Data{ .tag = p.e(E.String{ + .utf8 = name, + }, loc) }, + .range = tag_range, + }; + } + + // Otherwise, this is an identifier + //