Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Fix #4482: Minify property names ourselves in fullLink when we don't use GCC. #4945

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Mar 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 65 additions & 45 deletions Jenkinsfile
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,9 @@ def Tasks = [
reversi$v/fastLinkJS \
reversi$v/fullLinkJS \
reversi$v/checksizes &&
sbtretry ++$scala \
'set Global/enableMinifyEverywhere := true' \
reversi$v/checksizes &&
sbtretry ++$scala javalibintf/compile:doc compiler$v/compile:doc library$v/compile:doc \
testInterface$v/compile:doc testBridge$v/compile:doc &&
sbtretry ++$scala headerCheck &&
Expand All @@ -199,68 +202,84 @@ def Tasks = [
"test-suite-default-esversion": '''
setJavaVersion $java
npm install &&
sbtretry ++$scala jUnitTestOutputsJVM$v/test jUnitTestOutputsJS$v/test testBridge$v/test \
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
jUnitTestOutputsJVM$v/test jUnitTestOutputsJS$v/test testBridge$v/test \
'set scalaJSStage in Global := FullOptStage' jUnitTestOutputsJS$v/test testBridge$v/test &&
sbtretry ++$scala $testSuite$v/test $testSuite$v/testHtmlJSDom &&
sbtretry 'set scalaJSStage in Global := FullOptStage' \
++$scala $testSuite$v/test \
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
$testSuite$v/test $testSuite$v/testHtmlJSDom &&
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSStage in Global := FullOptStage' \
$testSuite$v/test \
$testSuite$v/testHtmlJSDom &&
sbtretry 'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withOptimizer(false))' \
++$scala $testSuite$v/test &&
sbtretry 'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withOptimizer(false))' \
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withOptimizer(false))' \
$testSuite$v/test &&
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withOptimizer(false))' \
'set scalaJSStage in Global := FullOptStage' \
++$scala $testSuite$v/test &&
sbtretry 'set scalaJSLinkerConfig in $testSuite.v$v ~= makeCompliant' \
++$scala $testSuite$v/test &&
sbtretry 'set scalaJSLinkerConfig in $testSuite.v$v ~= makeCompliant' \
$testSuite$v/test &&
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= makeCompliant' \
$testSuite$v/test &&
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= makeCompliant' \
'set scalaJSStage in Global := FullOptStage' \
++$scala $testSuite$v/test &&
sbtretry 'set scalaJSLinkerConfig in $testSuite.v$v ~= makeCompliant' \
$testSuite$v/test &&
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= makeCompliant' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withOptimizer(false))' \
++$scala $testSuite$v/test &&
sbtretry 'set scalaJSLinkerConfig in $testSuite.v$v ~= { _.withSemantics(_.withStrictFloats(false)) }' \
++$scala $testSuite$v/test &&
sbtretry 'set scalaJSLinkerConfig in $testSuite.v$v ~= { _.withSemantics(_.withStrictFloats(false)) }' \
$testSuite$v/test &&
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= { _.withSemantics(_.withStrictFloats(false)) }' \
$testSuite$v/test &&
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= { _.withSemantics(_.withStrictFloats(false)) }' \
'set scalaJSStage in Global := FullOptStage' \
++$scala $testSuite$v/test &&
sbtretry 'set scalaJSLinkerConfig in $testSuite.v$v ~= { _.withSemantics(_.withStrictFloats(false)) }' \
$testSuite$v/test &&
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= { _.withSemantics(_.withStrictFloats(false)) }' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withOptimizer(false))' \
++$scala $testSuite$v/test &&
sbtretry 'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withESFeatures(_.withAllowBigIntsForLongs(true)))' \
++$scala $testSuite$v/test &&
sbtretry 'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withESFeatures(_.withAllowBigIntsForLongs(true)).withOptimizer(false))' \
++$scala $testSuite$v/test &&
sbtretry \
$testSuite$v/test &&
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withESFeatures(_.withAllowBigIntsForLongs(true)))' \
$testSuite$v/test &&
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withESFeatures(_.withAllowBigIntsForLongs(true)).withOptimizer(false))' \
$testSuite$v/test &&
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withESFeatures(_.withAvoidLetsAndConsts(false).withAvoidClasses(false)))' \
++$scala $testSuite$v/test &&
sbtretry \
$testSuite$v/test &&
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withESFeatures(_.withAvoidLetsAndConsts(false).withAvoidClasses(false)))' \
'set scalaJSStage in Global := FullOptStage' \
++$scala $testSuite$v/test &&
sbtretry 'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withModuleKind(ModuleKind.CommonJSModule))' \
++$scala $testSuite$v/test &&
sbtretry \
$testSuite$v/test &&
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withModuleKind(ModuleKind.CommonJSModule))' \
$testSuite$v/test &&
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withModuleKind(ModuleKind.CommonJSModule))' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withModuleSplitStyle(ModuleSplitStyle.SmallestModules))' \
++$scala $testSuite$v/test &&
sbtretry 'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withModuleKind(ModuleKind.CommonJSModule))' \
$testSuite$v/test &&
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withModuleKind(ModuleKind.CommonJSModule))' \
'set scalaJSStage in Global := FullOptStage' \
++$scala $testSuite$v/test &&
sbtretry \
$testSuite$v/test &&
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withModuleKind(ModuleKind.ESModule))' \
++$scala $testSuite$v/test &&
sbtretry \
$testSuite$v/test &&
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withModuleSplitStyle(ModuleSplitStyle.SmallestModules))' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withModuleKind(ModuleKind.ESModule))' \
++$scala $testSuite$v/test &&
sbtretry \
$testSuite$v/test &&
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withModuleSplitStyle(ModuleSplitStyle.SmallModulesFor(List("org.scalajs.testsuite"))))' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withModuleKind(ModuleKind.ESModule))' \
++$scala $testSuite$v/test &&
sbtretry \
$testSuite$v/test &&
# The following tests the same thing whether testMinify is true or false; we also set it for regularity.
sbtretry ++$scala 'set Global/enableMinifyEverywhere := $testMinify' \
'set scalaJSLinkerConfig in $testSuite.v$v ~= (_.withModuleKind(ModuleKind.ESModule))' \
'set scalaJSStage in Global := FullOptStage' \
++$scala $testSuite$v/test
$testSuite$v/test
''',

"test-suite-custom-esversion-force-polyfills": '''
Expand Down Expand Up @@ -504,9 +523,10 @@ mainScalaVersions.each { scalaVersion ->
quickMatrix.add([task: "main", scala: scalaVersion, java: javaVersion])
quickMatrix.add([task: "tools", scala: scalaVersion, java: javaVersion])
}
quickMatrix.add([task: "test-suite-default-esversion", scala: scalaVersion, java: mainJavaVersion, testSuite: "testSuite"])
quickMatrix.add([task: "test-suite-default-esversion", scala: scalaVersion, java: mainJavaVersion, testMinify: "false", testSuite: "testSuite"])
quickMatrix.add([task: "test-suite-default-esversion", scala: scalaVersion, java: mainJavaVersion, testMinify: "true", testSuite: "testSuite"])
quickMatrix.add([task: "test-suite-custom-esversion", scala: scalaVersion, java: mainJavaVersion, esVersion: "ES5_1", testSuite: "testSuite"])
quickMatrix.add([task: "test-suite-default-esversion", scala: scalaVersion, java: mainJavaVersion, testSuite: "scalaTestSuite"])
quickMatrix.add([task: "test-suite-default-esversion", scala: scalaVersion, java: mainJavaVersion, testMinify: "false", testSuite: "scalaTestSuite"])
quickMatrix.add([task: "test-suite-custom-esversion", scala: scalaVersion, java: mainJavaVersion, esVersion: "ES5_1", testSuite: "scalaTestSuite"])
quickMatrix.add([task: "bootstrap", scala: scalaVersion, java: mainJavaVersion])
quickMatrix.add([task: "partest-fastopt", scala: scalaVersion, java: mainJavaVersion])
Expand All @@ -527,7 +547,7 @@ otherScalaVersions.each { scalaVersion ->
}
mainScalaVersions.each { scalaVersion ->
otherJavaVersions.each { javaVersion ->
quickMatrix.add([task: "test-suite-default-esversion", scala: scalaVersion, java: javaVersion, testSuite: "testSuite"])
quickMatrix.add([task: "test-suite-default-esversion", scala: scalaVersion, java: javaVersion, testMinify: "false", testSuite: "testSuite"])
}
fullMatrix.add([task: "partest-noopt", scala: scalaVersion, java: mainJavaVersion])
fullMatrix.add([task: "partest-fullopt", scala: scalaVersion, java: mainJavaVersion])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,19 @@ final class StandardConfig private (
val relativizeSourceMapBase: Option[URI],
/** Name patterns for output. */
val outputPatterns: OutputPatterns,
/** Apply Scala.js-specific minification of the produced .js files.
*
* When enabled, the linker more aggressively reduces the size of the
* generated code, at the cost of readability and debuggability. It does
* not perform size optimizations that would negatively impact run-time
* performance.
*
* The focus is on optimizations that general-purpose JavaScript minifiers
* cannot do on their own. For the best results, we expect the Scala.js
* minifier to be used in conjunction with a general-purpose JavaScript
* minifier.
*/
val minify: Boolean,
/** Whether to use the Google Closure Compiler pass, if it is available.
* On the JavaScript platform, this does not have any effect.
*/
Expand Down Expand Up @@ -80,6 +93,7 @@ final class StandardConfig private (
sourceMap = true,
relativizeSourceMapBase = None,
outputPatterns = OutputPatterns.Defaults,
minify = false,
closureCompilerIfAvailable = false,
prettyPrint = false,
batchMode = false,
Expand Down Expand Up @@ -148,6 +162,9 @@ final class StandardConfig private (
def withOutputPatterns(f: OutputPatterns => OutputPatterns): StandardConfig =
copy(outputPatterns = f(outputPatterns))

def withMinify(minify: Boolean): StandardConfig =
copy(minify = minify)

def withClosureCompilerIfAvailable(closureCompilerIfAvailable: Boolean): StandardConfig =
copy(closureCompilerIfAvailable = closureCompilerIfAvailable)

Expand All @@ -173,6 +190,7 @@ final class StandardConfig private (
| sourceMap = $sourceMap,
| relativizeSourceMapBase = $relativizeSourceMapBase,
| outputPatterns = $outputPatterns,
| minify = $minify,
| closureCompilerIfAvailable = $closureCompilerIfAvailable,
| prettyPrint = $prettyPrint,
| batchMode = $batchMode,
Expand All @@ -192,6 +210,7 @@ final class StandardConfig private (
sourceMap: Boolean = sourceMap,
outputPatterns: OutputPatterns = outputPatterns,
relativizeSourceMapBase: Option[URI] = relativizeSourceMapBase,
minify: Boolean = minify,
closureCompilerIfAvailable: Boolean = closureCompilerIfAvailable,
prettyPrint: Boolean = prettyPrint,
batchMode: Boolean = batchMode,
Expand All @@ -209,6 +228,7 @@ final class StandardConfig private (
sourceMap,
relativizeSourceMapBase,
outputPatterns,
minify,
closureCompilerIfAvailable,
prettyPrint,
batchMode,
Expand Down Expand Up @@ -237,6 +257,7 @@ object StandardConfig {
.addField("relativizeSourceMapBase",
config.relativizeSourceMapBase.map(_.toASCIIString()))
.addField("outputPatterns", config.outputPatterns)
.addField("minify", config.minify)
.addField("closureCompilerIfAvailable",
config.closureCompilerIfAvailable)
.addField("prettyPrint", config.prettyPrint)
Expand Down Expand Up @@ -264,6 +285,7 @@ object StandardConfig {
* - `sourceMap`: `true`
* - `relativizeSourceMapBase`: `None`
* - `outputPatterns`: [[OutputPatterns.Defaults]]
* - `minify`: `false`
* - `closureCompilerIfAvailable`: `false`
* - `prettyPrint`: `false`
* - `batchMode`: `false`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -210,9 +210,9 @@ private class ClosureAstTransformer(featureSet: FeatureSet,
private def transformClassMember(member: Tree): Node = {
implicit val pos = member.pos

def newFixedPropNode(token: Token, static: Boolean, name: Ident,
def newFixedPropNode(token: Token, static: Boolean, name: MaybeDelayedIdent,
function: Node): Node = {
val node = Node.newString(token, name.name)
val node = Node.newString(token, name.resolveName())
node.addChildToBack(function)
node.setStaticMember(static)
node
Expand Down Expand Up @@ -258,7 +258,7 @@ private class ClosureAstTransformer(featureSet: FeatureSet,
val node = newComputedPropNode(static, nameExpr, function)
node.putBooleanProp(Node.COMPUTED_PROP_METHOD, true)
node
case name: Ident =>
case name: MaybeDelayedIdent =>
newFixedPropNode(Token.MEMBER_FUNCTION_DEF, static, name, function)
}

Expand All @@ -274,7 +274,7 @@ private class ClosureAstTransformer(featureSet: FeatureSet,
val node = newComputedPropNode(static, nameExpr, function)
node.putBooleanProp(Node.COMPUTED_PROP_GETTER, true)
node
case name: Ident =>
case name: MaybeDelayedIdent =>
newFixedPropNode(Token.GETTER_DEF, static, name, function)
}

Expand All @@ -290,7 +290,7 @@ private class ClosureAstTransformer(featureSet: FeatureSet,
val node = newComputedPropNode(static, nameExpr, function)
node.putBooleanProp(Node.COMPUTED_PROP_SETTER, true)
node
case name: Ident =>
case name: MaybeDelayedIdent =>
newFixedPropNode(Token.SETTER_DEF, static, name, function)
}

Expand Down Expand Up @@ -321,7 +321,7 @@ private class ClosureAstTransformer(featureSet: FeatureSet,
args.foreach(arg => node.addChildToBack(transformExpr(arg)))
node
case DotSelect(qualifier, item) =>
val node = Node.newString(Token.GETPROP, item.name)
val node = Node.newString(Token.GETPROP, item.resolveName())
node.addChildToBack(transformExpr(qualifier))
setNodePosition(node, item.pos.orElse(pos))
case BracketSelect(qualifier, item) =>
Expand Down Expand Up @@ -435,8 +435,8 @@ private class ClosureAstTransformer(featureSet: FeatureSet,
val transformedValue = transformExpr(value)

val node = name match {
case Ident(name, _) =>
Node.newString(Token.STRING_KEY, name)
case name: MaybeDelayedIdent =>
Node.newString(Token.STRING_KEY, name.resolveName())

case StringLiteral(name) =>
val node = Node.newString(Token.STRING_KEY, name)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,19 @@ final class ClosureLinkerBackend(config: LinkerBackendImpl.Config)
s"Cannot use module kind $moduleKind with the Closure Compiler")

private[this] val emitter = {
// Note that we do not transfer `minify` -- Closure will do its own thing anyway
val emitterConfig = Emitter.Config(config.commonConfig.coreSpec)
.withJSHeader(config.jsHeader)
.withOptimizeBracketSelects(false)
.withTrackAllGlobalRefs(true)
.withInternalModulePattern(m => OutputPatternsImpl.moduleName(config.outputPatterns, m.id))

new Emitter(emitterConfig, ClosureLinkerBackend.PostTransformer)
// Do not apply ClosureAstTransformer eagerly:
// The ASTs used by closure are highly mutable, so re-using them is non-trivial.
// Since closure is slow anyways, we haven't built the optimization.
val postTransformer = Emitter.PostTransformer.Identity

new Emitter(emitterConfig, postTransformer)
}

val symbolRequirements: SymbolRequirement = emitter.symbolRequirements
Expand Down Expand Up @@ -296,11 +302,4 @@ private object ClosureLinkerBackend {
Function.prototype.apply;
var NaN = 0.0/0.0, Infinity = 1.0/0.0, undefined = void 0;
"""

private object PostTransformer extends Emitter.PostTransformer[js.Tree] {
// Do not apply ClosureAstTransformer eagerly:
// The ASTs used by closure are highly mutable, so re-using them is non-trivial.
// Since closure is slow anyways, we haven't built the optimization.
def transformStats(trees: List[js.Tree], indent: Int): List[js.Tree] = trees
}
}
Loading