diff --git a/internal/js_parser/js_parser_lower.go b/internal/js_parser/js_parser_lower.go index 79e49f69..f86f013f 100644 --- a/internal/js_parser/js_parser_lower.go +++ b/internal/js_parser/js_parser_lower.go @@ -508,11 +508,18 @@ flatten: // Stop now if we can strip the whole chain as dead code. Since the chain is // lazily evaluated, it's safe to just drop the code entirely. - if isNullOrUndefined, sideEffects, ok := toNullOrUndefinedWithSideEffects(expr.Data); ok && isNullOrUndefined { - if sideEffects == couldHaveSideEffects { - return js_ast.JoinWithComma(p.simplifyUnusedExpr(expr), valueWhenUndefined), exprOut{} + if p.options.mangleSyntax { + if isNullOrUndefined, sideEffects, ok := toNullOrUndefinedWithSideEffects(expr.Data); ok && isNullOrUndefined { + if sideEffects == couldHaveSideEffects { + return js_ast.JoinWithComma(p.simplifyUnusedExpr(expr), valueWhenUndefined), exprOut{} + } + return valueWhenUndefined, exprOut{} + } + } else { + switch expr.Data.(type) { + case *js_ast.ENull, *js_ast.EUndefined: + return valueWhenUndefined, exprOut{} } - return valueWhenUndefined, exprOut{} } // We need to lower this if this is an optional call off of a private name diff --git a/internal/js_parser/js_parser_lower_test.go b/internal/js_parser/js_parser_lower_test.go index 2585719f..4daa6914 100644 --- a/internal/js_parser/js_parser_lower_test.go +++ b/internal/js_parser/js_parser_lower_test.go @@ -429,13 +429,13 @@ func TestLowerOptionalChain(t *testing.T) { expectPrintedTarget(t, 2019, "delete undefined?.[x]", "true;\n") expectPrintedTarget(t, 2019, "delete undefined?.(x)", "true;\n") - expectPrintedTarget(t, 2019, "(foo(), null)?.x", "foo(), void 0;\n") - expectPrintedTarget(t, 2019, "(foo(), null)?.[x]", "foo(), void 0;\n") - expectPrintedTarget(t, 2019, "(foo(), null)?.(x)", "foo(), void 0;\n") + expectPrintedMangleTarget(t, 2019, "(foo(), null)?.x; y = (bar(), null)?.x", "foo(), y = (bar(), void 0);\n") + expectPrintedMangleTarget(t, 2019, "(foo(), null)?.[x]; y = (bar(), null)?.[x]", "foo(), y = (bar(), void 0);\n") + expectPrintedMangleTarget(t, 2019, "(foo(), null)?.(x); y = (bar(), null)?.(x)", "foo(), y = (bar(), void 0);\n") - expectPrintedTarget(t, 2019, "(foo(), void 0)?.x", "foo(), void 0;\n") - expectPrintedTarget(t, 2019, "(foo(), void 0)?.[x]", "foo(), void 0;\n") - expectPrintedTarget(t, 2019, "(foo(), void 0)?.(x)", "foo(), void 0;\n") + expectPrintedMangleTarget(t, 2019, "(foo(), void 0)?.x; y = (bar(), void 0)?.x", "foo(), y = (bar(), void 0);\n") + expectPrintedMangleTarget(t, 2019, "(foo(), void 0)?.[x]; y = (bar(), void 0)?.[x]", "foo(), y = (bar(), void 0);\n") + expectPrintedMangleTarget(t, 2019, "(foo(), void 0)?.(x); y = (bar(), void 0)?.(x)", "foo(), y = (bar(), void 0);\n") expectPrintedTarget(t, 2020, "x?.y", "x?.y;\n") expectPrintedTarget(t, 2020, "x?.[y]", "x?.[y];\n") @@ -449,13 +449,21 @@ func TestLowerOptionalChain(t *testing.T) { expectPrintedTarget(t, 2020, "undefined?.[x]", "void 0;\n") expectPrintedTarget(t, 2020, "undefined?.(x)", "void 0;\n") - expectPrintedTarget(t, 2020, "(foo(), null)?.x", "foo(), void 0;\n") - expectPrintedTarget(t, 2020, "(foo(), null)?.[x]", "foo(), void 0;\n") - expectPrintedTarget(t, 2020, "(foo(), null)?.(x)", "foo(), void 0;\n") + expectPrintedTarget(t, 2020, "(foo(), null)?.x", "(foo(), null)?.x;\n") + expectPrintedTarget(t, 2020, "(foo(), null)?.[x]", "(foo(), null)?.[x];\n") + expectPrintedTarget(t, 2020, "(foo(), null)?.(x)", "(foo(), null)?.(x);\n") - expectPrintedTarget(t, 2020, "(foo(), void 0)?.x", "foo(), void 0;\n") - expectPrintedTarget(t, 2020, "(foo(), void 0)?.[x]", "foo(), void 0;\n") - expectPrintedTarget(t, 2020, "(foo(), void 0)?.(x)", "foo(), void 0;\n") + expectPrintedTarget(t, 2020, "(foo(), void 0)?.x", "(foo(), void 0)?.x;\n") + expectPrintedTarget(t, 2020, "(foo(), void 0)?.[x]", "(foo(), void 0)?.[x];\n") + expectPrintedTarget(t, 2020, "(foo(), void 0)?.(x)", "(foo(), void 0)?.(x);\n") + + expectPrintedMangleTarget(t, 2020, "(foo(), null)?.x; y = (bar(), null)?.x", "foo(), y = (bar(), void 0);\n") + expectPrintedMangleTarget(t, 2020, "(foo(), null)?.[x]; y = (bar(), null)?.[x]", "foo(), y = (bar(), void 0);\n") + expectPrintedMangleTarget(t, 2020, "(foo(), null)?.(x); y = (bar(), null)?.(x)", "foo(), y = (bar(), void 0);\n") + + expectPrintedMangleTarget(t, 2020, "(foo(), void 0)?.x; y = (bar(), void 0)?.x", "foo(), y = (bar(), void 0);\n") + expectPrintedMangleTarget(t, 2020, "(foo(), void 0)?.[x]; y = (bar(), void 0)?.[x]", "foo(), y = (bar(), void 0);\n") + expectPrintedMangleTarget(t, 2020, "(foo(), void 0)?.(x); y = (bar(), void 0)?.(x)", "foo(), y = (bar(), void 0);\n") expectPrintedTarget(t, 2019, "a?.b()", "a == null ? void 0 : a.b();\n") expectPrintedTarget(t, 2019, "a?.[b]()", "a == null ? void 0 : a[b]();\n")