Skip to content

Commit

Permalink
JS: improve variable use counting
Browse files Browse the repository at this point in the history
  • Loading branch information
tdewolff committed Apr 5, 2022
1 parent cc66302 commit 4532c88
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 2 deletions.
11 changes: 11 additions & 0 deletions js/js.go
Original file line number Diff line number Diff line change
Expand Up @@ -584,6 +584,17 @@ func (m *jsMinifier) minifyFuncDecl(decl *js.FuncDecl, inExpr bool) {
if decl.Generator {
m.write(starBytes)
}

// TODO: remove function name, really necessary?
//if decl.Name != nil && decl.Name.Uses == 1 {
// scope := decl.Body.Scope
// for i, vorig := range scope.Declared {
// if decl.Name == vorig {
// scope.Declared = append(scope.Declared[:i], scope.Declared[i+1:]...)
// }
// }
//}

if inExpr {
m.renamer.renameScope(decl.Body.Scope)
}
Expand Down
5 changes: 3 additions & 2 deletions js/js_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,7 @@ func TestJS(t *testing.T) {
{`var a=[];f();var b;f();var c;f();var e=f`, `var b,c,e,a=[];f(),f(),f(),e=f`},
{`var {...a}=c;for(var {...b}=d;b;b++);`, `for(var{...a}=c,{...b}=d;b;b++);`},
{`var o=8,p=9,x=0,y=1;x=x+2;y=y+3;var b=1,c=2,d=3`, `var o=8,p=9,x=0,y=1,x=x+2,y=y+3,b=1,c=2,d=3`},
//{`var name=function name(){name()}`, `var name=function(){name()}`}, // TODO

// TODO: test for variables renaming (first rename, then merge vars)

Expand Down Expand Up @@ -768,8 +769,8 @@ func TestJSVarRenaming(t *testing.T) {
{`!function(){var x=function(){return y};const y=5;x,y}`, `!function(){var b=function(){return a};const a=5;b,a}`},
{`!function(){if(1){const x=5;x;5}var y=function(){return x};y}`, `!function(){if(1){const a=5;a,5}var a=function(){return x};a}`},
{`!function(){var x=function(){return y};x;if(1){const y=5;y;5}}`, `!function(){var a=function(){return y};if(a,1){const a=5;a,5}}`},
{`!function(){var x=function(){return y};x;if(z)var y=5}`, `!function(){var b,a=function(){return b};a,z&&(b=5)}`},
{`!function(){var x=function(){return y};x;if(z){var y=5;5}}`, `!function(){var b,a=function(){return b};a,z&&(b=5,5)}`},
{`!function(){var x=function(){return y};x;if(z)var y=5}`, `!function(){var a,b=function(){return a};b,z&&(a=5)}`},
{`!function(){var x=function(){return y};x;if(z){var y=5;5}}`, `!function(){var a,b=function(){return a};b,z&&(a=5,5)}`},
{`!function(){var x,y,z=(x,y)=>x+y;x,y,z}`, `!function(){var a,b,c=(a,b)=>a+b;a,b,c}`},
{`!function(){var await;print({await});}`, `!function(){var a;print({await:a})}`},
{`function a(){var name; return {name}}`, `function a(){var a;return{name:a}}`},
Expand Down
18 changes: 18 additions & 0 deletions js/stmtlist.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,24 @@ func optimizeStmt(i js.IStmt) js.IStmt {
}
}
} else if decl, ok := i.(*js.VarDecl); ok {
// TODO: remove function name in var name=function name(){}
//for _, item := range decl.List {
// if v, ok := item.Binding.(*js.Var); ok && item.Default != nil {
// if fun, ok := item.Default.(*js.FuncDecl); ok && fun.Name != nil && bytes.Equal(v.Data, fun.Name.Data) {
// scope := fun.Body.Scope
// for i, vorig := range scope.Declared {
// if fun.Name == vorig {
// scope.Declared = append(scope.Declared[:i], scope.Declared[i+1:]...)
// }
// }
// scope.AddUndeclared(v)
// v.Uses += fun.Name.Uses - 1
// fun.Name.Link = v
// fun.Name = nil
// }
// }
//}

if decl.TokenType == js.ErrorToken {
// convert hoisted var declaration to expression or empty (if there are no defines) statement
for _, item := range decl.List {
Expand Down
5 changes: 5 additions & 0 deletions js/vars.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ RemoveVarsLoop:
for _, vbind := range vars {
for i, item := range decl.List {
if v, ok := item.Binding.(*js.Var); ok && item.Default == nil && v == vbind {
v.Uses--
decl.List = append(decl.List[:i], decl.List[i+1:]...)
continue RemoveVarsLoop
}
Expand All @@ -198,6 +199,7 @@ RemoveVarsLoop:
for _, decl2 := range decl.Scope.Func.VarDecls {
for i, item := range decl2.List {
if v, ok := item.Binding.(*js.Var); ok && item.Default == nil && v == vbind {
v.Uses--
decl2.List = append(decl2.List[:i], decl2.List[i+1:]...)
continue RemoveVarsLoop
}
Expand Down Expand Up @@ -393,6 +395,9 @@ func (m *jsMinifier) hoistVars(body *js.BlockStmt) {
s.AddUndeclared(ref)
s = s.Parent
}
if item.Default != nil {
ref.Uses++
}
}
if i < best {
// prepend
Expand Down

0 comments on commit 4532c88

Please sign in to comment.