@@ -3,6 +3,7 @@ package js
33
44import (
55 "bytes"
6+ "fmt"
67 "io"
78 "sort"
89
@@ -627,6 +628,14 @@ func (m *jsMinifier) minifyFuncDecl(decl *js.FuncDecl, inExpr bool) {
627628 m .renamer .rename = parentRename
628629}
629630
631+ func (m * jsMinifier ) minifyClassElementName (name js.ClassElementName ) {
632+ if name .Private != nil {
633+ m .write (name .Private .Data )
634+ } else {
635+ m .minifyPropertyName (name .PropertyName )
636+ }
637+ }
638+
630639func (m * jsMinifier ) minifyMethodDecl (decl * js.MethodDecl ) {
631640 parentRename := m .renamer .rename
632641 m .renamer .rename = ! decl .Body .Scope .HasWith && ! m .o .KeepVarNames
@@ -653,7 +662,7 @@ func (m *jsMinifier) minifyMethodDecl(decl *js.MethodDecl) {
653662 m .write (setBytes )
654663 m .writeSpaceBeforeIdent ()
655664 }
656- m .minifyPropertyName (decl .Name )
665+ m .minifyClassElementName (decl .Name )
657666 m .renamer .renameScope (decl .Body .Scope )
658667 m .minifyParams (decl .Params , ! decl .Set )
659668 m .minifyBlockStmt (& decl .Body )
@@ -744,6 +753,7 @@ func (m *jsMinifier) minifyClassDecl(decl *js.ClassDecl) {
744753 m .writeSpaceBeforeIdent ()
745754 m .minifyExpr (decl .Extends , js .OpLHS )
746755 }
756+ m .renamer .renameClassScope (decl .Scope )
747757 m .write (openBraceBytes )
748758 m .needsSemicolon = false
749759 for _ , item := range decl .List {
@@ -760,7 +770,7 @@ func (m *jsMinifier) minifyClassDecl(decl *js.ClassDecl) {
760770 m .write (spaceBytes )
761771 }
762772 }
763- m .minifyPropertyName (item .Name )
773+ m .minifyClassElementName (item .Name )
764774 if item .Init != nil {
765775 m .write (equalBytes )
766776 m .minifyExpr (item .Init , js .OpAssign )
@@ -1092,6 +1102,18 @@ func (m *jsMinifier) minifyExpr(i js.IExpr, prec js.OpPrec) {
10921102 m .minifyExpr (expr .X , unaryPrecMap [expr .Op ])
10931103 }
10941104 case * js.DotExpr :
1105+ var yData []byte
1106+ if lit , ok := expr .Y .(js.LiteralExpr ); ok {
1107+ yData = lit .Data
1108+ } else if v , ok := expr .Y .(* js.Var ); ok {
1109+ for v .Link != nil {
1110+ v = v .Link
1111+ }
1112+ yData = v .Data
1113+ } else {
1114+ panic (fmt .Sprintf ("bad type: %T!=(js.LiteralExpr,*js.Var)" , expr .Y )) // should never happen
1115+ }
1116+
10951117 optionalLeft := false
10961118 if group , ok := expr .X .(* js.GroupExpr ); ok {
10971119 if lit , ok := group .X .(* js.LiteralExpr ); ok && (lit .TokenType == js .DecimalToken || lit .TokenType == js .IntegerToken ) {
@@ -1102,7 +1124,7 @@ func (m *jsMinifier) minifyExpr(i js.IExpr, prec js.OpPrec) {
11021124 m .write (dotBytes )
11031125 }
11041126 m .write (dotBytes )
1105- m .write (expr . Y . Data )
1127+ m .write (yData )
11061128 break
11071129 } else if dot , ok := group .X .(* js.DotExpr ); ok {
11081130 optionalLeft = dot .Optional
@@ -1132,7 +1154,7 @@ func (m *jsMinifier) minifyExpr(i js.IExpr, prec js.OpPrec) {
11321154 }
11331155 }
11341156 m .write (dotBytes )
1135- m .write (expr . Y . Data )
1157+ m .write (yData )
11361158 case * js.GroupExpr :
11371159 if cond , ok := expr .X .(* js.CondExpr ); ok {
11381160 expr .X = m .optimizeCondExpr (cond , js .OpExpr )
@@ -1282,69 +1304,71 @@ func (m *jsMinifier) minifyExpr(i js.IExpr, prec js.OpPrec) {
12821304 }
12831305 }
12841306 } else if dot , ok := expr .X .(* js.DotExpr ); ok {
1285- if v , ok := dot .X .(* js.Var ); ok && v .Decl == js .NoDecl && bytes .Equal (v .Data , MathBytes ) {
1286- if bytes .Equal (dot .Y .Data , []byte ("pow" )) {
1287- // Math.pow(a,b) => a**b
1288- if len (expr .Args .List ) == 2 {
1289- if js .OpExp < prec {
1290- m .write (openParenBytes )
1291- }
1292- m .minifyExpr (& js.GroupExpr {expr .Args .List [0 ].Value }, js .OpUpdate )
1293- m .write (expBytes )
1294- m .minifyExpr (& js.GroupExpr {expr .Args .List [1 ].Value }, js .OpExp )
1295- if js .OpExp < prec {
1296- m .write (closeParenBytes )
1297- }
1298- break
1299- }
1300- } else if bytes .Equal (dot .Y .Data , []byte ("trunc" )) {
1301- // Math.trunc(x) => x|0
1302- if len (expr .Args .List ) == 1 {
1303- if js .OpBitOr < prec {
1304- m .write (openParenBytes )
1305- }
1306- m .minifyExpr (& js.GroupExpr {expr .Args .List [0 ].Value }, js .OpBitOr )
1307- m .write (bitOrBytes )
1308- m .write (zeroBytes )
1309- if js .OpBitOr < prec {
1310- m .write (closeParenBytes )
1311- }
1312- break
1313- }
1314- } else if bytes .Equal (dot .Y .Data , []byte ("abs" )) {
1315- // Math.abs(x) => x<0?-x:x
1316- if len (expr .Args .List ) == 1 {
1317- groupLen := 0
1318- if js .OpAssign < prec {
1319- groupLen = 2
1307+ if x , ok := dot .X .(* js.Var ); ok && x .Decl == js .NoDecl && bytes .Equal (x .Data , MathBytes ) {
1308+ if y , ok := dot .Y .(js.LiteralExpr ); ok {
1309+ if bytes .Equal (y .Data , []byte ("pow" )) {
1310+ // Math.pow(a,b) => a**b
1311+ if len (expr .Args .List ) == 2 {
1312+ if js .OpExp < prec {
1313+ m .write (openParenBytes )
1314+ }
1315+ m .minifyExpr (& js.GroupExpr {expr .Args .List [0 ].Value }, js .OpUpdate )
1316+ m .write (expBytes )
1317+ m .minifyExpr (& js.GroupExpr {expr .Args .List [1 ].Value }, js .OpExp )
1318+ if js .OpExp < prec {
1319+ m .write (closeParenBytes )
1320+ }
1321+ break
13201322 }
1321- if v , ok := expr .Args .List [0 ].Value .(* js.Var ); ok && len (v .Data )* 2 + groupLen + 5 < 10 {
1322- if js .OpAssign < prec {
1323+ } else if bytes .Equal (y .Data , []byte ("trunc" )) {
1324+ // Math.trunc(x) => x|0
1325+ if len (expr .Args .List ) == 1 {
1326+ if js .OpBitOr < prec {
13231327 m .write (openParenBytes )
13241328 }
1325- m .minifyExpr (v , js .OpCoalesce )
1326- m .write ([]byte ("<0?-" ))
1327- m .minifyExpr (v , js .OpAssign )
1328- m .write (colonBytes )
1329- m .minifyExpr (v , js .OpAssign )
1330- if js .OpAssign < prec {
1329+ m .minifyExpr (& js.GroupExpr {expr .Args .List [0 ].Value }, js .OpBitOr )
1330+ m .write (bitOrBytes )
1331+ m .write (zeroBytes )
1332+ if js .OpBitOr < prec {
13311333 m .write (closeParenBytes )
13321334 }
13331335 break
13341336 }
1335- }
1336- } else if bytes .Equal (dot .Y .Data , []byte ("sqrt" )) {
1337- // Math.sqrt(x) => x**.5
1338- if len (expr .Args .List ) == 1 {
1339- if js .OpExp < prec {
1340- m .write (openParenBytes )
1337+ } else if bytes .Equal (y .Data , []byte ("abs" )) {
1338+ // Math.abs(x) => x<0?-x:x
1339+ if len (expr .Args .List ) == 1 {
1340+ groupLen := 0
1341+ if js .OpAssign < prec {
1342+ groupLen = 2
1343+ }
1344+ if v , ok := expr .Args .List [0 ].Value .(* js.Var ); ok && len (v .Data )* 2 + groupLen + 5 < 10 {
1345+ if js .OpAssign < prec {
1346+ m .write (openParenBytes )
1347+ }
1348+ m .minifyExpr (v , js .OpCoalesce )
1349+ m .write ([]byte ("<0?-" ))
1350+ m .minifyExpr (v , js .OpAssign )
1351+ m .write (colonBytes )
1352+ m .minifyExpr (v , js .OpAssign )
1353+ if js .OpAssign < prec {
1354+ m .write (closeParenBytes )
1355+ }
1356+ break
1357+ }
13411358 }
1342- m .minifyExpr (& js.GroupExpr {expr .Args .List [0 ].Value }, js .OpUpdate )
1343- m .write ([]byte ("**.5" ))
1344- if js .OpExp < prec {
1345- m .write (closeParenBytes )
1359+ } else if bytes .Equal (y .Data , []byte ("sqrt" )) {
1360+ // Math.sqrt(x) => x**.5
1361+ if len (expr .Args .List ) == 1 {
1362+ if js .OpExp < prec {
1363+ m .write (openParenBytes )
1364+ }
1365+ m .minifyExpr (& js.GroupExpr {expr .Args .List [0 ].Value }, js .OpUpdate )
1366+ m .write ([]byte ("**.5" ))
1367+ if js .OpExp < prec {
1368+ m .write (closeParenBytes )
1369+ }
1370+ break
13461371 }
1347- break
13481372 }
13491373 }
13501374 }
0 commit comments