Skip to content

Commit

Permalink
fix #2063: remove simplified literal statements
Browse files Browse the repository at this point in the history
  • Loading branch information
evanw committed Mar 2, 2022
1 parent b6f826e commit 0ceefac
Show file tree
Hide file tree
Showing 6 changed files with 259 additions and 254 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@
console.log(import(foo));
```

* Remove simplified statement-level literal expressions ([#2063](https://github.com/evanw/esbuild/issues/2063))

With this release, esbuild now removes simplified statement-level expressions if the simplified result is a literal expression even when minification is disabled. Previously this was only done when minification is enabled. This change was only made because some people are bothered by seeing top-level literal expressions. This change has no effect on code behavior.

## 0.14.23

* Update feature database to indicate that node 16.14+ supports import assertions ([#2030](https://github.com/evanw/esbuild/issues/2030))
Expand Down
29 changes: 15 additions & 14 deletions internal/js_parser/js_parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -9347,23 +9347,16 @@ func (p *parser) visitAndAppendStmt(stmts []js_ast.Stmt, stmt js_ast.Stmt) []js_
}

case *js_ast.SExpr:
shouldTrimUndefined := false
if !p.options.minifySyntax {
if _, ok := s.Value.Data.(*js_ast.ECall); ok {
shouldTrimUndefined = true
}
}

shouldTrimUnsightlyPrimitives := !p.options.minifySyntax && !isUnsightlyPrimitive(s.Value.Data)
p.stmtExprValue = s.Value.Data
s.Value = p.visitExpr(s.Value)

// If this was a call and is now undefined, then it probably was a console
// API call that was dropped with "--drop:console". Manually discard the
// undefined value even when we're not minifying for aesthetic reasons.
if shouldTrimUndefined {
if _, ok := s.Value.Data.(*js_ast.EUndefined); ok {
return stmts
}
// Expressions that have been simplified down to a single primitive don't
// have any effect, and are automatically removed during minification.
// However, some people are really bothered by seeing them. Remove them
// so we don't bother these people.
if shouldTrimUnsightlyPrimitives && isUnsightlyPrimitive(s.Value.Data) {
return stmts
}

// Trim expressions without side effects
Expand Down Expand Up @@ -9927,6 +9920,14 @@ func (p *parser) visitAndAppendStmt(stmts []js_ast.Stmt, stmt js_ast.Stmt) []js_
return stmts
}

func isUnsightlyPrimitive(data js_ast.E) bool {
switch data.(type) {
case *js_ast.EBoolean, *js_ast.ENull, *js_ast.EUndefined, *js_ast.ENumber, *js_ast.EBigInt, *js_ast.EString:
return true
}
return false
}

// If we encounter a variable initializer that could possibly trigger access to
// a constant declared later on, then we need to end the const local prefix.
// We want to avoid situations like this:
Expand Down
28 changes: 14 additions & 14 deletions internal/js_parser/js_parser_lower_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -502,21 +502,21 @@ func TestLowerOptionalChain(t *testing.T) {
expectPrintedTarget(t, 2019, "(delete a?.[b])[c]", "(a == null ? true : delete a[b])[c];\n")
expectPrintedTarget(t, 2019, "(delete a?.(b))(c)", "(a == null ? true : delete a(b))(c);\n")

expectPrintedTarget(t, 2019, "null?.x", "void 0;\n")
expectPrintedTarget(t, 2019, "null?.[x]", "void 0;\n")
expectPrintedTarget(t, 2019, "null?.x", "")
expectPrintedTarget(t, 2019, "null?.[x]", "")
expectPrintedTarget(t, 2019, "null?.(x)", "")

expectPrintedTarget(t, 2019, "delete null?.x", "true;\n")
expectPrintedTarget(t, 2019, "delete null?.[x]", "true;\n")
expectPrintedTarget(t, 2019, "delete null?.(x)", "true;\n")
expectPrintedTarget(t, 2019, "delete null?.x", "")
expectPrintedTarget(t, 2019, "delete null?.[x]", "")
expectPrintedTarget(t, 2019, "delete null?.(x)", "")

expectPrintedTarget(t, 2019, "undefined?.x", "void 0;\n")
expectPrintedTarget(t, 2019, "undefined?.[x]", "void 0;\n")
expectPrintedTarget(t, 2019, "undefined?.x", "")
expectPrintedTarget(t, 2019, "undefined?.[x]", "")
expectPrintedTarget(t, 2019, "undefined?.(x)", "")

expectPrintedTarget(t, 2019, "delete undefined?.x", "true;\n")
expectPrintedTarget(t, 2019, "delete undefined?.[x]", "true;\n")
expectPrintedTarget(t, 2019, "delete undefined?.(x)", "true;\n")
expectPrintedTarget(t, 2019, "delete undefined?.x", "")
expectPrintedTarget(t, 2019, "delete undefined?.[x]", "")
expectPrintedTarget(t, 2019, "delete undefined?.(x)", "")

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")
Expand All @@ -530,12 +530,12 @@ func TestLowerOptionalChain(t *testing.T) {
expectPrintedTarget(t, 2020, "x?.[y]", "x?.[y];\n")
expectPrintedTarget(t, 2020, "x?.(y)", "x?.(y);\n")

expectPrintedTarget(t, 2020, "null?.x", "void 0;\n")
expectPrintedTarget(t, 2020, "null?.[x]", "void 0;\n")
expectPrintedTarget(t, 2020, "null?.x", "")
expectPrintedTarget(t, 2020, "null?.[x]", "")
expectPrintedTarget(t, 2020, "null?.(x)", "")

expectPrintedTarget(t, 2020, "undefined?.x", "void 0;\n")
expectPrintedTarget(t, 2020, "undefined?.[x]", "void 0;\n")
expectPrintedTarget(t, 2020, "undefined?.x", "")
expectPrintedTarget(t, 2020, "undefined?.[x]", "")
expectPrintedTarget(t, 2020, "undefined?.(x)", "")

expectPrintedTarget(t, 2020, "(foo(), null)?.x", "(foo(), null)?.x;\n")
Expand Down
278 changes: 139 additions & 139 deletions internal/js_parser/js_parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2257,152 +2257,152 @@ func TestSwitch(t *testing.T) {
}

func TestConstantFolding(t *testing.T) {
expectPrinted(t, "!false", "true;\n")
expectPrinted(t, "!true", "false;\n")

expectPrinted(t, "!!0", "false;\n")
expectPrinted(t, "!!-0", "false;\n")
expectPrinted(t, "!!1", "true;\n")
expectPrinted(t, "!!NaN", "false;\n")
expectPrinted(t, "!!Infinity", "true;\n")
expectPrinted(t, "!!-Infinity", "true;\n")
expectPrinted(t, "!!\"\"", "false;\n")
expectPrinted(t, "!!\"x\"", "true;\n")
expectPrinted(t, "!!function() {}", "true;\n")
expectPrinted(t, "!!(() => {})", "true;\n")
expectPrinted(t, "!!0n", "false;\n")
expectPrinted(t, "!!1n", "true;\n")

expectPrinted(t, "1 ? a : b", "1 ? a : b;\n")
expectPrinted(t, "0 ? a : b", "0 ? a : b;\n")
expectPrintedMangle(t, "1 ? a : b", "a;\n")
expectPrintedMangle(t, "0 ? a : b", "b;\n")

expectPrinted(t, "1 && 2", "2;\n")
expectPrinted(t, "1 || 2", "1;\n")
expectPrinted(t, "0 && 1", "0;\n")
expectPrinted(t, "0 || 1", "1;\n")

expectPrinted(t, "null ?? 1", "1;\n")
expectPrinted(t, "undefined ?? 1", "1;\n")
expectPrinted(t, "0 ?? 1", "0;\n")
expectPrinted(t, "false ?? 1", "false;\n")
expectPrinted(t, "\"\" ?? 1", "\"\";\n")

expectPrinted(t, "typeof undefined", "\"undefined\";\n")
expectPrinted(t, "typeof null", "\"object\";\n")
expectPrinted(t, "typeof false", "\"boolean\";\n")
expectPrinted(t, "typeof true", "\"boolean\";\n")
expectPrinted(t, "typeof 123", "\"number\";\n")
expectPrinted(t, "typeof 123n", "\"bigint\";\n")
expectPrinted(t, "typeof 'abc'", "\"string\";\n")
expectPrinted(t, "typeof function() {}", "\"function\";\n")
expectPrinted(t, "typeof (() => {})", "\"function\";\n")
expectPrinted(t, "typeof {}", "typeof {};\n")
expectPrinted(t, "typeof []", "typeof [];\n")

expectPrinted(t, "undefined === undefined", "true;\n")
expectPrinted(t, "undefined !== undefined", "false;\n")
expectPrinted(t, "undefined == undefined", "true;\n")
expectPrinted(t, "undefined != undefined", "false;\n")

expectPrinted(t, "null === null", "true;\n")
expectPrinted(t, "null !== null", "false;\n")
expectPrinted(t, "null == null", "true;\n")
expectPrinted(t, "null != null", "false;\n")

expectPrinted(t, "undefined === null", "void 0 === null;\n")
expectPrinted(t, "undefined !== null", "void 0 !== null;\n")
expectPrinted(t, "undefined == null", "void 0 == null;\n")
expectPrinted(t, "undefined != null", "void 0 != null;\n")

expectPrinted(t, "true === true", "true;\n")
expectPrinted(t, "true === false", "false;\n")
expectPrinted(t, "true !== true", "false;\n")
expectPrinted(t, "true !== false", "true;\n")
expectPrinted(t, "true == true", "true;\n")
expectPrinted(t, "true == false", "false;\n")
expectPrinted(t, "true != true", "false;\n")
expectPrinted(t, "true != false", "true;\n")

expectPrinted(t, "1 === 1", "true;\n")
expectPrinted(t, "1 === 2", "false;\n")
expectPrinted(t, "1 === '1'", "1 === \"1\";\n")
expectPrinted(t, "1 == 1", "true;\n")
expectPrinted(t, "1 == 2", "false;\n")
expectPrinted(t, "1 == '1'", "1 == \"1\";\n")

expectPrinted(t, "1 !== 1", "false;\n")
expectPrinted(t, "1 !== 2", "true;\n")
expectPrinted(t, "1 !== '1'", "1 !== \"1\";\n")
expectPrinted(t, "1 != 1", "false;\n")
expectPrinted(t, "1 != 2", "true;\n")
expectPrinted(t, "1 != '1'", "1 != \"1\";\n")

expectPrinted(t, "'a' === '\\x61'", "true;\n")
expectPrinted(t, "'a' === '\\x62'", "false;\n")
expectPrinted(t, "'a' === 'abc'", "false;\n")
expectPrinted(t, "'a' !== '\\x61'", "false;\n")
expectPrinted(t, "'a' !== '\\x62'", "true;\n")
expectPrinted(t, "'a' !== 'abc'", "true;\n")
expectPrinted(t, "'a' == '\\x61'", "true;\n")
expectPrinted(t, "'a' == '\\x62'", "false;\n")
expectPrinted(t, "'a' == 'abc'", "false;\n")
expectPrinted(t, "'a' != '\\x61'", "false;\n")
expectPrinted(t, "'a' != '\\x62'", "true;\n")
expectPrinted(t, "'a' != 'abc'", "true;\n")

expectPrinted(t, "'a' + 'b'", "\"ab\";\n")
expectPrinted(t, "'a' + 'bc'", "\"abc\";\n")
expectPrinted(t, "'ab' + 'c'", "\"abc\";\n")
expectPrinted(t, "x + 'a' + 'b'", "x + \"ab\";\n")
expectPrinted(t, "x + 'a' + 'bc'", "x + \"abc\";\n")
expectPrinted(t, "x + 'ab' + 'c'", "x + \"abc\";\n")
expectPrinted(t, "'a' + 1", "\"a\" + 1;\n")
expectPrinted(t, "x * 'a' + 'b'", "x * \"a\" + \"b\";\n")

expectPrinted(t, "'string' + `template`", "`stringtemplate`;\n")
expectPrinted(t, "'string' + `a${foo}b`", "`stringa${foo}b`;\n")
expectPrinted(t, "'string' + tag`template`", "\"string\" + tag`template`;\n")
expectPrinted(t, "`template` + 'string'", "`templatestring`;\n")
expectPrinted(t, "`a${foo}b` + 'string'", "`a${foo}bstring`;\n")
expectPrinted(t, "tag`template` + 'string'", "tag`template` + \"string\";\n")
expectPrinted(t, "`template` + `a${foo}b`", "`templatea${foo}b`;\n")
expectPrinted(t, "`a${foo}b` + `template`", "`a${foo}btemplate`;\n")
expectPrinted(t, "`a${foo}b` + `x${bar}y`", "`a${foo}bx${bar}y`;\n")
expectPrinted(t, "`a${i}${j}bb` + `xxx${bar}yyyy`", "`a${i}${j}bbxxx${bar}yyyy`;\n")
expectPrinted(t, "`a${foo}bb` + `xxx${i}${j}yyyy`", "`a${foo}bbxxx${i}${j}yyyy`;\n")
expectPrinted(t, "`template` + tag`template2`", "`template` + tag`template2`;\n")
expectPrinted(t, "tag`template` + `template2`", "tag`template` + `template2`;\n")

expectPrinted(t, "123", "123;\n")
expectPrinted(t, "123 .toString()", "123 .toString();\n")
expectPrinted(t, "-123", "-123;\n")
expectPrinted(t, "(-123).toString()", "(-123).toString();\n")
expectPrinted(t, "-0", "-0;\n")
expectPrinted(t, "(-0).toString()", "(-0).toString();\n")
expectPrinted(t, "-0 === 0", "true;\n")

expectPrinted(t, "NaN", "NaN;\n")
expectPrinted(t, "NaN.toString()", "NaN.toString();\n")
expectPrinted(t, "NaN === NaN", "false;\n")

expectPrinted(t, "Infinity", "Infinity;\n")
expectPrinted(t, "Infinity.toString()", "Infinity.toString();\n")
expectPrinted(t, "(-Infinity).toString()", "(-Infinity).toString();\n")
expectPrinted(t, "Infinity === Infinity", "true;\n")
expectPrinted(t, "Infinity === -Infinity", "false;\n")

expectPrinted(t, "123n === 1_2_3n", "true;\n")
expectPrinted(t, "x = !false", "x = true;\n")
expectPrinted(t, "x = !true", "x = false;\n")

expectPrinted(t, "x = !!0", "x = false;\n")
expectPrinted(t, "x = !!-0", "x = false;\n")
expectPrinted(t, "x = !!1", "x = true;\n")
expectPrinted(t, "x = !!NaN", "x = false;\n")
expectPrinted(t, "x = !!Infinity", "x = true;\n")
expectPrinted(t, "x = !!-Infinity", "x = true;\n")
expectPrinted(t, "x = !!\"\"", "x = false;\n")
expectPrinted(t, "x = !!\"x\"", "x = true;\n")
expectPrinted(t, "x = !!function() {}", "x = true;\n")
expectPrinted(t, "x = !!(() => {})", "x = true;\n")
expectPrinted(t, "x = !!0n", "x = false;\n")
expectPrinted(t, "x = !!1n", "x = true;\n")

expectPrinted(t, "x = 1 ? a : b", "x = 1 ? a : b;\n")
expectPrinted(t, "x = 0 ? a : b", "x = 0 ? a : b;\n")
expectPrintedMangle(t, "x = 1 ? a : b", "x = a;\n")
expectPrintedMangle(t, "x = 0 ? a : b", "x = b;\n")

expectPrinted(t, "x = 1 && 2", "x = 2;\n")
expectPrinted(t, "x = 1 || 2", "x = 1;\n")
expectPrinted(t, "x = 0 && 1", "x = 0;\n")
expectPrinted(t, "x = 0 || 1", "x = 1;\n")

expectPrinted(t, "x = null ?? 1", "x = 1;\n")
expectPrinted(t, "x = undefined ?? 1", "x = 1;\n")
expectPrinted(t, "x = 0 ?? 1", "x = 0;\n")
expectPrinted(t, "x = false ?? 1", "x = false;\n")
expectPrinted(t, "x = \"\" ?? 1", "x = \"\";\n")

expectPrinted(t, "x = typeof undefined", "x = \"undefined\";\n")
expectPrinted(t, "x = typeof null", "x = \"object\";\n")
expectPrinted(t, "x = typeof false", "x = \"boolean\";\n")
expectPrinted(t, "x = typeof true", "x = \"boolean\";\n")
expectPrinted(t, "x = typeof 123", "x = \"number\";\n")
expectPrinted(t, "x = typeof 123n", "x = \"bigint\";\n")
expectPrinted(t, "x = typeof 'abc'", "x = \"string\";\n")
expectPrinted(t, "x = typeof function() {}", "x = \"function\";\n")
expectPrinted(t, "x = typeof (() => {})", "x = \"function\";\n")
expectPrinted(t, "x = typeof {}", "x = typeof {};\n")
expectPrinted(t, "x = typeof []", "x = typeof [];\n")

expectPrinted(t, "x = undefined === undefined", "x = true;\n")
expectPrinted(t, "x = undefined !== undefined", "x = false;\n")
expectPrinted(t, "x = undefined == undefined", "x = true;\n")
expectPrinted(t, "x = undefined != undefined", "x = false;\n")

expectPrinted(t, "x = null === null", "x = true;\n")
expectPrinted(t, "x = null !== null", "x = false;\n")
expectPrinted(t, "x = null == null", "x = true;\n")
expectPrinted(t, "x = null != null", "x = false;\n")

expectPrinted(t, "x = undefined === null", "x = void 0 === null;\n")
expectPrinted(t, "x = undefined !== null", "x = void 0 !== null;\n")
expectPrinted(t, "x = undefined == null", "x = void 0 == null;\n")
expectPrinted(t, "x = undefined != null", "x = void 0 != null;\n")

expectPrinted(t, "x = true === true", "x = true;\n")
expectPrinted(t, "x = true === false", "x = false;\n")
expectPrinted(t, "x = true !== true", "x = false;\n")
expectPrinted(t, "x = true !== false", "x = true;\n")
expectPrinted(t, "x = true == true", "x = true;\n")
expectPrinted(t, "x = true == false", "x = false;\n")
expectPrinted(t, "x = true != true", "x = false;\n")
expectPrinted(t, "x = true != false", "x = true;\n")

expectPrinted(t, "x = 1 === 1", "x = true;\n")
expectPrinted(t, "x = 1 === 2", "x = false;\n")
expectPrinted(t, "x = 1 === '1'", "x = 1 === \"1\";\n")
expectPrinted(t, "x = 1 == 1", "x = true;\n")
expectPrinted(t, "x = 1 == 2", "x = false;\n")
expectPrinted(t, "x = 1 == '1'", "x = 1 == \"1\";\n")

expectPrinted(t, "x = 1 !== 1", "x = false;\n")
expectPrinted(t, "x = 1 !== 2", "x = true;\n")
expectPrinted(t, "x = 1 !== '1'", "x = 1 !== \"1\";\n")
expectPrinted(t, "x = 1 != 1", "x = false;\n")
expectPrinted(t, "x = 1 != 2", "x = true;\n")
expectPrinted(t, "x = 1 != '1'", "x = 1 != \"1\";\n")

expectPrinted(t, "x = 'a' === '\\x61'", "x = true;\n")
expectPrinted(t, "x = 'a' === '\\x62'", "x = false;\n")
expectPrinted(t, "x = 'a' === 'abc'", "x = false;\n")
expectPrinted(t, "x = 'a' !== '\\x61'", "x = false;\n")
expectPrinted(t, "x = 'a' !== '\\x62'", "x = true;\n")
expectPrinted(t, "x = 'a' !== 'abc'", "x = true;\n")
expectPrinted(t, "x = 'a' == '\\x61'", "x = true;\n")
expectPrinted(t, "x = 'a' == '\\x62'", "x = false;\n")
expectPrinted(t, "x = 'a' == 'abc'", "x = false;\n")
expectPrinted(t, "x = 'a' != '\\x61'", "x = false;\n")
expectPrinted(t, "x = 'a' != '\\x62'", "x = true;\n")
expectPrinted(t, "x = 'a' != 'abc'", "x = true;\n")

expectPrinted(t, "x = 'a' + 'b'", "x = \"ab\";\n")
expectPrinted(t, "x = 'a' + 'bc'", "x = \"abc\";\n")
expectPrinted(t, "x = 'ab' + 'c'", "x = \"abc\";\n")
expectPrinted(t, "x = x + 'a' + 'b'", "x = x + \"ab\";\n")
expectPrinted(t, "x = x + 'a' + 'bc'", "x = x + \"abc\";\n")
expectPrinted(t, "x = x + 'ab' + 'c'", "x = x + \"abc\";\n")
expectPrinted(t, "x = 'a' + 1", "x = \"a\" + 1;\n")
expectPrinted(t, "x = x * 'a' + 'b'", "x = x * \"a\" + \"b\";\n")

expectPrinted(t, "x = 'string' + `template`", "x = `stringtemplate`;\n")
expectPrinted(t, "x = 'string' + `a${foo}b`", "x = `stringa${foo}b`;\n")
expectPrinted(t, "x = 'string' + tag`template`", "x = \"string\" + tag`template`;\n")
expectPrinted(t, "x = `template` + 'string'", "x = `templatestring`;\n")
expectPrinted(t, "x = `a${foo}b` + 'string'", "x = `a${foo}bstring`;\n")
expectPrinted(t, "x = tag`template` + 'string'", "x = tag`template` + \"string\";\n")
expectPrinted(t, "x = `template` + `a${foo}b`", "x = `templatea${foo}b`;\n")
expectPrinted(t, "x = `a${foo}b` + `template`", "x = `a${foo}btemplate`;\n")
expectPrinted(t, "x = `a${foo}b` + `x${bar}y`", "x = `a${foo}bx${bar}y`;\n")
expectPrinted(t, "x = `a${i}${j}bb` + `xxx${bar}yyyy`", "x = `a${i}${j}bbxxx${bar}yyyy`;\n")
expectPrinted(t, "x = `a${foo}bb` + `xxx${i}${j}yyyy`", "x = `a${foo}bbxxx${i}${j}yyyy`;\n")
expectPrinted(t, "x = `template` + tag`template2`", "x = `template` + tag`template2`;\n")
expectPrinted(t, "x = tag`template` + `template2`", "x = tag`template` + `template2`;\n")

expectPrinted(t, "x = 123", "x = 123;\n")
expectPrinted(t, "x = 123 .toString()", "x = 123 .toString();\n")
expectPrinted(t, "x = -123", "x = -123;\n")
expectPrinted(t, "x = (-123).toString()", "x = (-123).toString();\n")
expectPrinted(t, "x = -0", "x = -0;\n")
expectPrinted(t, "x = (-0).toString()", "x = (-0).toString();\n")
expectPrinted(t, "x = -0 === 0", "x = true;\n")

expectPrinted(t, "x = NaN", "x = NaN;\n")
expectPrinted(t, "x = NaN.toString()", "x = NaN.toString();\n")
expectPrinted(t, "x = NaN === NaN", "x = false;\n")

expectPrinted(t, "x = Infinity", "x = Infinity;\n")
expectPrinted(t, "x = Infinity.toString()", "x = Infinity.toString();\n")
expectPrinted(t, "x = (-Infinity).toString()", "x = (-Infinity).toString();\n")
expectPrinted(t, "x = Infinity === Infinity", "x = true;\n")
expectPrinted(t, "x = Infinity === -Infinity", "x = false;\n")

expectPrinted(t, "x = 123n === 1_2_3n", "x = true;\n")
}

func TestConstantFoldingScopes(t *testing.T) {
// Parsing will crash if somehow the scope traversal is misaligned between
// the parsing and binding passes. This checks for those cases.
expectPrintedMangle(t, "x; 1 ? 0 : ()=>{}; (()=>{})()", "x;\n")
expectPrintedMangle(t, "x; 0 ? ()=>{} : 1; (()=>{})()", "x;\n")
expectPrinted(t, "x; 0 && (()=>{}); (()=>{})()", "x;\n0;\n(() => {\n})();\n")
expectPrinted(t, "x; 1 || (()=>{}); (()=>{})()", "x;\n1;\n(() => {\n})();\n")
expectPrinted(t, "x; 0 && (()=>{}); (()=>{})()", "x;\n(() => {\n})();\n")
expectPrinted(t, "x; 1 || (()=>{}); (()=>{})()", "x;\n(() => {\n})();\n")
expectPrintedMangle(t, "if (1) 0; else ()=>{}; (()=>{})()", "")
expectPrintedMangle(t, "if (0) ()=>{}; else 1; (()=>{})()", "")
}
Expand Down
Loading

0 comments on commit 0ceefac

Please sign in to comment.