aboutsummaryrefslogtreecommitdiff
path: root/src/js_parser.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/js_parser.zig')
-rw-r--r--src/js_parser.zig19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/js_parser.zig b/src/js_parser.zig
index abecc989c..3a35ed679 100644
--- a/src/js_parser.zig
+++ b/src/js_parser.zig
@@ -19154,6 +19154,9 @@ fn NewParser_(
constructor_function.?.func.body.stmts = constructor_stmts.items;
}
+
+ // TODO: make sure "super()" comes before instance field initializers
+ // https://github.com/evanw/esbuild/blob/e9413cc4f7ab87263ea244a999c6fa1f1e34dc65/internal/js_parser/js_parser_lower.go#L2742
}
var stmts_count: usize = 1 + static_members.items.len + instance_decorators.items.len + static_decorators.items.len;
@@ -20128,6 +20131,12 @@ fn NewParser_(
break;
}
+ // don't merge super calls to ensure they are called before "this" is accessed
+ if (stmt.isSuperCall()) {
+ output.append(stmt) catch unreachable;
+ continue;
+ }
+
switch (stmt.data) {
.s_empty => continue,
@@ -20151,7 +20160,7 @@ fn NewParser_(
// Merge adjacent expression statements
if (output.items.len > 0) {
var prev_stmt = &output.items[output.items.len - 1];
- if (prev_stmt.data == .s_expr) {
+ if (prev_stmt.data == .s_expr and !prev_stmt.isSuperCall()) {
prev_stmt.data.s_expr.does_not_affect_tree_shaking = prev_stmt.data.s_expr.does_not_affect_tree_shaking and
s_expr.does_not_affect_tree_shaking;
prev_stmt.data.s_expr.value = prev_stmt.data.s_expr.value.joinWithComma(
@@ -20166,7 +20175,7 @@ fn NewParser_(
// Absorb a previous expression statement
if (output.items.len > 0) {
var prev_stmt = &output.items[output.items.len - 1];
- if (prev_stmt.data == .s_expr) {
+ if (prev_stmt.data == .s_expr and !prev_stmt.isSuperCall()) {
s_switch.test_ = prev_stmt.data.s_expr.value.joinWithComma(s_switch.test_, p.allocator);
output.items.len -= 1;
}
@@ -20176,7 +20185,7 @@ fn NewParser_(
// Absorb a previous expression statement
if (output.items.len > 0) {
var prev_stmt = &output.items[output.items.len - 1];
- if (prev_stmt.data == .s_expr) {
+ if (prev_stmt.data == .s_expr and !prev_stmt.isSuperCall()) {
s_if.test_ = prev_stmt.data.s_expr.value.joinWithComma(s_if.test_, p.allocator);
output.items.len -= 1;
}
@@ -20189,7 +20198,7 @@ fn NewParser_(
// Merge return statements with the previous expression statement
if (output.items.len > 0 and ret.value != null) {
var prev_stmt = &output.items[output.items.len - 1];
- if (prev_stmt.data == .s_expr) {
+ if (prev_stmt.data == .s_expr and !prev_stmt.isSuperCall()) {
ret.value = prev_stmt.data.s_expr.value.joinWithComma(ret.value.?, p.allocator);
prev_stmt.* = stmt;
continue;
@@ -20207,7 +20216,7 @@ fn NewParser_(
// Merge throw statements with the previous expression statement
if (output.items.len > 0) {
var prev_stmt = &output.items[output.items.len - 1];
- if (prev_stmt.data == .s_expr) {
+ if (prev_stmt.data == .s_expr and !prev_stmt.isSuperCall()) {
prev_stmt.* = p.s(S.Throw{
.value = prev_stmt.data.s_expr.value.joinWithComma(
stmt.data.s_throw.value,