diff options
Diffstat (limited to 'src/js_ast.zig')
-rw-r--r-- | src/js_ast.zig | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/src/js_ast.zig b/src/js_ast.zig index 350bf6561..5b575eda5 100644 --- a/src/js_ast.zig +++ b/src/js_ast.zig @@ -2228,6 +2228,13 @@ pub const Expr = struct { loc: logger.Loc, data: Data, + pub fn clone(this: Expr, allocator: std.mem.Allocator) !Expr { + return .{ + .loc = this.loc, + .data = try this.data.clone(allocator), + }; + } + pub fn wrapInArrow(this: Expr, allocator: std.mem.Allocator) !Expr { var stmts = try allocator.alloc(Stmt, 1); stmts[0] = Stmt.alloc(S.Return, S.Return{ .value = this }, this.loc); @@ -3608,6 +3615,122 @@ pub const Expr = struct { // If it ends up in JSParser or JSPrinter, it is a bug. inline_identifier: i32, + pub fn clone(this: Expr.Data, allocator: std.mem.Allocator) !Data { + return switch (this) { + .e_array => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_array))); + item.* = el.*; + return .{ .e_array = item }; + }, + .e_unary => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_unary))); + item.* = el.*; + return .{ .e_unary = item }; + }, + .e_binary => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_binary))); + item.* = el.*; + return .{ .e_binary = item }; + }, + .e_class => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_class))); + item.* = el.*; + return .{ .e_class = item }; + }, + .e_new => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_new))); + item.* = el.*; + return .{ .e_new = item }; + }, + .e_function => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_function))); + item.* = el.*; + return .{ .e_function = item }; + }, + .e_call => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_call))); + item.* = el.*; + return .{ .e_call = item }; + }, + .e_dot => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_dot))); + item.* = el.*; + return .{ .e_dot = item }; + }, + .e_index => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_index))); + item.* = el.*; + return .{ .e_index = item }; + }, + .e_arrow => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_arrow))); + item.* = el.*; + return .{ .e_arrow = item }; + }, + .e_jsx_element => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_jsx_element))); + item.* = el.*; + return .{ .e_jsx_element = item }; + }, + .e_object => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_object))); + item.* = el.*; + return .{ .e_object = item }; + }, + .e_spread => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_spread))); + item.* = el.*; + return .{ .e_spread = item }; + }, + .e_template_part => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_template_part))); + item.* = el.*; + return .{ .e_template_part = item }; + }, + .e_template => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_template))); + item.* = el.*; + return .{ .e_template = item }; + }, + .e_reg_exp => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_reg_exp))); + item.* = el.*; + return .{ .e_reg_exp = item }; + }, + .e_await => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_await))); + item.* = el.*; + return .{ .e_await = item }; + }, + .e_yield => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_yield))); + item.* = el.*; + return .{ .e_yield = item }; + }, + .e_if => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_if))); + item.* = el.*; + return .{ .e_if = item }; + }, + .e_import => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_import))); + item.* = el.*; + return .{ .e_import = item }; + }, + .e_big_int => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_big_int))); + item.* = el.*; + return .{ .e_big_int = item }; + }, + .e_string => |el| { + var item = try allocator.create(std.meta.Child(@TypeOf(this.e_string))); + item.* = el.*; + return .{ .e_string = item }; + }, + else => this, + }; + } + pub fn canBeConstValue(this: Expr.Data) bool { return switch (this) { .e_number, .e_boolean, .e_null, .e_undefined => true, |