diff --git a/CHANGELOG.md b/CHANGELOG.md index ad65be741ce..a896e793d96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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)) diff --git a/internal/js_parser/js_parser.go b/internal/js_parser/js_parser.go index 36b7a224da0..68a740a21e0 100644 --- a/internal/js_parser/js_parser.go +++ b/internal/js_parser/js_parser.go @@ -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 @@ -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: diff --git a/internal/js_parser/js_parser_lower_test.go b/internal/js_parser/js_parser_lower_test.go index fc700926838..a618135e545 100644 --- a/internal/js_parser/js_parser_lower_test.go +++ b/internal/js_parser/js_parser_lower_test.go @@ -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") @@ -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") diff --git a/internal/js_parser/js_parser_test.go b/internal/js_parser/js_parser_test.go index 66bc6462d0a..8f1070228a7 100644 --- a/internal/js_parser/js_parser_test.go +++ b/internal/js_parser/js_parser_test.go @@ -2257,143 +2257,143 @@ 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) { @@ -2401,8 +2401,8 @@ func TestConstantFoldingScopes(t *testing.T) { // 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; (()=>{})()", "") } diff --git a/internal/js_parser/ts_parser_test.go b/internal/js_parser/ts_parser_test.go index 333221dca90..f3bbf7a6bfd 100644 --- a/internal/js_parser/ts_parser_test.go +++ b/internal/js_parser/ts_parser_test.go @@ -1323,8 +1323,8 @@ func TestTSDecl(t *testing.T) { expectPrintedTS(t, "var a!: string, b!: boolean", "var a, b;\n") expectPrintedTS(t, "let a!: string, b!: boolean", "let a, b;\n") expectPrintedTS(t, "const a!: string = '', b!: boolean = false", "const a = \"\", b = false;\n") - expectPrintedTS(t, "var a\n!0", "var a;\ntrue;\n") - expectPrintedTS(t, "let a\n!0", "let a;\ntrue;\n") + expectPrintedTS(t, "var a\n!b", "var a;\n!b;\n") + expectPrintedTS(t, "let a\n!b", "let a;\n!b;\n") expectParseErrorTS(t, "var a!", ": ERROR: Expected \":\" but found end of file\n") expectParseErrorTS(t, "var a! = ", ": ERROR: Expected \":\" but found \"=\"\n") expectParseErrorTS(t, "var a!, b", ": ERROR: Expected \":\" but found \",\"\n") diff --git a/internal/js_printer/js_printer_test.go b/internal/js_printer/js_printer_test.go index c2985eac36a..b436231600d 100644 --- a/internal/js_printer/js_printer_test.go +++ b/internal/js_printer/js_printer_test.go @@ -162,106 +162,106 @@ func expectPrintedJSXMinify(t *testing.T, contents string, expected string) { func TestNumber(t *testing.T) { // Check "1eN" - expectPrinted(t, "1e-100", "1e-100;\n") - expectPrinted(t, "1e-4", "1e-4;\n") - expectPrinted(t, "1e-3", "1e-3;\n") - expectPrinted(t, "1e-2", "0.01;\n") - expectPrinted(t, "1e-1", "0.1;\n") - expectPrinted(t, "1e0", "1;\n") - expectPrinted(t, "1e1", "10;\n") - expectPrinted(t, "1e2", "100;\n") - expectPrinted(t, "1e3", "1e3;\n") - expectPrinted(t, "1e4", "1e4;\n") - expectPrinted(t, "1e100", "1e100;\n") - expectPrintedMinify(t, "1e-100", "1e-100;") - expectPrintedMinify(t, "1e-5", "1e-5;") - expectPrintedMinify(t, "1e-4", "1e-4;") - expectPrintedMinify(t, "1e-3", ".001;") - expectPrintedMinify(t, "1e-2", ".01;") - expectPrintedMinify(t, "1e-1", ".1;") - expectPrintedMinify(t, "1e0", "1;") - expectPrintedMinify(t, "1e1", "10;") - expectPrintedMinify(t, "1e2", "100;") - expectPrintedMinify(t, "1e3", "1e3;") - expectPrintedMinify(t, "1e4", "1e4;") - expectPrintedMinify(t, "1e100", "1e100;") + expectPrinted(t, "x = 1e-100", "x = 1e-100;\n") + expectPrinted(t, "x = 1e-4", "x = 1e-4;\n") + expectPrinted(t, "x = 1e-3", "x = 1e-3;\n") + expectPrinted(t, "x = 1e-2", "x = 0.01;\n") + expectPrinted(t, "x = 1e-1", "x = 0.1;\n") + expectPrinted(t, "x = 1e0", "x = 1;\n") + expectPrinted(t, "x = 1e1", "x = 10;\n") + expectPrinted(t, "x = 1e2", "x = 100;\n") + expectPrinted(t, "x = 1e3", "x = 1e3;\n") + expectPrinted(t, "x = 1e4", "x = 1e4;\n") + expectPrinted(t, "x = 1e100", "x = 1e100;\n") + expectPrintedMinify(t, "x = 1e-100", "x=1e-100;") + expectPrintedMinify(t, "x = 1e-5", "x=1e-5;") + expectPrintedMinify(t, "x = 1e-4", "x=1e-4;") + expectPrintedMinify(t, "x = 1e-3", "x=.001;") + expectPrintedMinify(t, "x = 1e-2", "x=.01;") + expectPrintedMinify(t, "x = 1e-1", "x=.1;") + expectPrintedMinify(t, "x = 1e0", "x=1;") + expectPrintedMinify(t, "x = 1e1", "x=10;") + expectPrintedMinify(t, "x = 1e2", "x=100;") + expectPrintedMinify(t, "x = 1e3", "x=1e3;") + expectPrintedMinify(t, "x = 1e4", "x=1e4;") + expectPrintedMinify(t, "x = 1e100", "x=1e100;") // Check "12eN" - expectPrinted(t, "12e-100", "12e-100;\n") - expectPrinted(t, "12e-5", "12e-5;\n") - expectPrinted(t, "12e-4", "12e-4;\n") - expectPrinted(t, "12e-3", "0.012;\n") - expectPrinted(t, "12e-2", "0.12;\n") - expectPrinted(t, "12e-1", "1.2;\n") - expectPrinted(t, "12e0", "12;\n") - expectPrinted(t, "12e1", "120;\n") - expectPrinted(t, "12e2", "1200;\n") - expectPrinted(t, "12e3", "12e3;\n") - expectPrinted(t, "12e4", "12e4;\n") - expectPrinted(t, "12e100", "12e100;\n") - expectPrintedMinify(t, "12e-100", "12e-100;") - expectPrintedMinify(t, "12e-6", "12e-6;") - expectPrintedMinify(t, "12e-5", "12e-5;") - expectPrintedMinify(t, "12e-4", ".0012;") - expectPrintedMinify(t, "12e-3", ".012;") - expectPrintedMinify(t, "12e-2", ".12;") - expectPrintedMinify(t, "12e-1", "1.2;") - expectPrintedMinify(t, "12e0", "12;") - expectPrintedMinify(t, "12e1", "120;") - expectPrintedMinify(t, "12e2", "1200;") - expectPrintedMinify(t, "12e3", "12e3;") - expectPrintedMinify(t, "12e4", "12e4;") - expectPrintedMinify(t, "12e100", "12e100;") + expectPrinted(t, "x = 12e-100", "x = 12e-100;\n") + expectPrinted(t, "x = 12e-5", "x = 12e-5;\n") + expectPrinted(t, "x = 12e-4", "x = 12e-4;\n") + expectPrinted(t, "x = 12e-3", "x = 0.012;\n") + expectPrinted(t, "x = 12e-2", "x = 0.12;\n") + expectPrinted(t, "x = 12e-1", "x = 1.2;\n") + expectPrinted(t, "x = 12e0", "x = 12;\n") + expectPrinted(t, "x = 12e1", "x = 120;\n") + expectPrinted(t, "x = 12e2", "x = 1200;\n") + expectPrinted(t, "x = 12e3", "x = 12e3;\n") + expectPrinted(t, "x = 12e4", "x = 12e4;\n") + expectPrinted(t, "x = 12e100", "x = 12e100;\n") + expectPrintedMinify(t, "x = 12e-100", "x=12e-100;") + expectPrintedMinify(t, "x = 12e-6", "x=12e-6;") + expectPrintedMinify(t, "x = 12e-5", "x=12e-5;") + expectPrintedMinify(t, "x = 12e-4", "x=.0012;") + expectPrintedMinify(t, "x = 12e-3", "x=.012;") + expectPrintedMinify(t, "x = 12e-2", "x=.12;") + expectPrintedMinify(t, "x = 12e-1", "x=1.2;") + expectPrintedMinify(t, "x = 12e0", "x=12;") + expectPrintedMinify(t, "x = 12e1", "x=120;") + expectPrintedMinify(t, "x = 12e2", "x=1200;") + expectPrintedMinify(t, "x = 12e3", "x=12e3;") + expectPrintedMinify(t, "x = 12e4", "x=12e4;") + expectPrintedMinify(t, "x = 12e100", "x=12e100;") // Check cases for "A.BeX" => "ABeY" simplification - expectPrinted(t, "123456789", "123456789;\n") - expectPrinted(t, "1123456789", "1123456789;\n") - expectPrinted(t, "10123456789", "10123456789;\n") - expectPrinted(t, "100123456789", "100123456789;\n") - expectPrinted(t, "1000123456789", "1000123456789;\n") - expectPrinted(t, "10000123456789", "10000123456789;\n") - expectPrinted(t, "100000123456789", "100000123456789;\n") - expectPrinted(t, "1000000123456789", "1000000123456789;\n") - expectPrinted(t, "10000000123456789", "10000000123456788;\n") - expectPrinted(t, "100000000123456789", "100000000123456780;\n") - expectPrinted(t, "1000000000123456789", "1000000000123456800;\n") - expectPrinted(t, "10000000000123456789", "10000000000123458e3;\n") - expectPrinted(t, "100000000000123456789", "10000000000012345e4;\n") + expectPrinted(t, "x = 123456789", "x = 123456789;\n") + expectPrinted(t, "x = 1123456789", "x = 1123456789;\n") + expectPrinted(t, "x = 10123456789", "x = 10123456789;\n") + expectPrinted(t, "x = 100123456789", "x = 100123456789;\n") + expectPrinted(t, "x = 1000123456789", "x = 1000123456789;\n") + expectPrinted(t, "x = 10000123456789", "x = 10000123456789;\n") + expectPrinted(t, "x = 100000123456789", "x = 100000123456789;\n") + expectPrinted(t, "x = 1000000123456789", "x = 1000000123456789;\n") + expectPrinted(t, "x = 10000000123456789", "x = 10000000123456788;\n") + expectPrinted(t, "x = 100000000123456789", "x = 100000000123456780;\n") + expectPrinted(t, "x = 1000000000123456789", "x = 1000000000123456800;\n") + expectPrinted(t, "x = 10000000000123456789", "x = 10000000000123458e3;\n") + expectPrinted(t, "x = 100000000000123456789", "x = 10000000000012345e4;\n") // Check numbers around the ends of various integer ranges. These were // crashing in the WebAssembly build due to a bug in the Go runtime. // int32 - expectPrinted(t, "0x7fff_ffff", "2147483647;\n") - expectPrinted(t, "0x8000_0000", "2147483648;\n") - expectPrinted(t, "0x8000_0001", "2147483649;\n") - expectPrinted(t, "-0x7fff_ffff", "-2147483647;\n") - expectPrinted(t, "-0x8000_0000", "-2147483648;\n") - expectPrinted(t, "-0x8000_0001", "-2147483649;\n") + expectPrinted(t, "x = 0x7fff_ffff", "x = 2147483647;\n") + expectPrinted(t, "x = 0x8000_0000", "x = 2147483648;\n") + expectPrinted(t, "x = 0x8000_0001", "x = 2147483649;\n") + expectPrinted(t, "x = -0x7fff_ffff", "x = -2147483647;\n") + expectPrinted(t, "x = -0x8000_0000", "x = -2147483648;\n") + expectPrinted(t, "x = -0x8000_0001", "x = -2147483649;\n") // uint32 - expectPrinted(t, "0xffff_ffff", "4294967295;\n") - expectPrinted(t, "0x1_0000_0000", "4294967296;\n") - expectPrinted(t, "0x1_0000_0001", "4294967297;\n") - expectPrinted(t, "-0xffff_ffff", "-4294967295;\n") - expectPrinted(t, "-0x1_0000_0000", "-4294967296;\n") - expectPrinted(t, "-0x1_0000_0001", "-4294967297;\n") + expectPrinted(t, "x = 0xffff_ffff", "x = 4294967295;\n") + expectPrinted(t, "x = 0x1_0000_0000", "x = 4294967296;\n") + expectPrinted(t, "x = 0x1_0000_0001", "x = 4294967297;\n") + expectPrinted(t, "x = -0xffff_ffff", "x = -4294967295;\n") + expectPrinted(t, "x = -0x1_0000_0000", "x = -4294967296;\n") + expectPrinted(t, "x = -0x1_0000_0001", "x = -4294967297;\n") // int64 - expectPrinted(t, "0x7fff_ffff_ffff_fdff", "9223372036854775e3;\n") - expectPrinted(t, "0x8000_0000_0000_0000", "9223372036854776e3;\n") - expectPrinted(t, "0x8000_0000_0000_3000", "9223372036854788e3;\n") - expectPrinted(t, "-0x7fff_ffff_ffff_fdff", "-9223372036854775e3;\n") - expectPrinted(t, "-0x8000_0000_0000_0000", "-9223372036854776e3;\n") - expectPrinted(t, "-0x8000_0000_0000_3000", "-9223372036854788e3;\n") + expectPrinted(t, "x = 0x7fff_ffff_ffff_fdff", "x = 9223372036854775e3;\n") + expectPrinted(t, "x = 0x8000_0000_0000_0000", "x = 9223372036854776e3;\n") + expectPrinted(t, "x = 0x8000_0000_0000_3000", "x = 9223372036854788e3;\n") + expectPrinted(t, "x = -0x7fff_ffff_ffff_fdff", "x = -9223372036854775e3;\n") + expectPrinted(t, "x = -0x8000_0000_0000_0000", "x = -9223372036854776e3;\n") + expectPrinted(t, "x = -0x8000_0000_0000_3000", "x = -9223372036854788e3;\n") // uint64 - expectPrinted(t, "0xffff_ffff_ffff_fbff", "1844674407370955e4;\n") - expectPrinted(t, "0x1_0000_0000_0000_0000", "18446744073709552e3;\n") - expectPrinted(t, "0x1_0000_0000_0000_1000", "18446744073709556e3;\n") - expectPrinted(t, "-0xffff_ffff_ffff_fbff", "-1844674407370955e4;\n") - expectPrinted(t, "-0x1_0000_0000_0000_0000", "-18446744073709552e3;\n") - expectPrinted(t, "-0x1_0000_0000_0000_1000", "-18446744073709556e3;\n") + expectPrinted(t, "x = 0xffff_ffff_ffff_fbff", "x = 1844674407370955e4;\n") + expectPrinted(t, "x = 0x1_0000_0000_0000_0000", "x = 18446744073709552e3;\n") + expectPrinted(t, "x = 0x1_0000_0000_0000_1000", "x = 18446744073709556e3;\n") + expectPrinted(t, "x = -0xffff_ffff_ffff_fbff", "x = -1844674407370955e4;\n") + expectPrinted(t, "x = -0x1_0000_0000_0000_0000", "x = -18446744073709552e3;\n") + expectPrinted(t, "x = -0x1_0000_0000_0000_1000", "x = -18446744073709556e3;\n") } func TestArray(t *testing.T) {