diff options
Diffstat (limited to 'src/cmd/gofix/hashsum.go')
-rw-r--r-- | src/cmd/gofix/hashsum.go | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/src/cmd/gofix/hashsum.go b/src/cmd/gofix/hashsum.go new file mode 100644 index 000000000..0df6ad749 --- /dev/null +++ b/src/cmd/gofix/hashsum.go @@ -0,0 +1,94 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "go/ast" +) + +func init() { + register(hashSumFix) +} + +var hashSumFix = fix{ + "hashsum", + "2011-11-30", + hashSumFn, + `Pass a nil argument to calls to hash.Sum + +This fix rewrites code so that it passes a nil argument to hash.Sum. +The additional argument will allow callers to avoid an +allocation in the future. + +http://codereview.appspot.com/5448065 +`, +} + +// Type-checking configuration: tell the type-checker this basic +// information about types, functions, and variables in external packages. +var hashSumTypeConfig = &TypeConfig{ + Var: map[string]string{ + "crypto.MD4": "crypto.Hash", + "crypto.MD5": "crypto.Hash", + "crypto.SHA1": "crypto.Hash", + "crypto.SHA224": "crypto.Hash", + "crypto.SHA256": "crypto.Hash", + "crypto.SHA384": "crypto.Hash", + "crypto.SHA512": "crypto.Hash", + "crypto.MD5SHA1": "crypto.Hash", + "crypto.RIPEMD160": "crypto.Hash", + }, + + Func: map[string]string{ + "adler32.New": "hash.Hash", + "crc32.New": "hash.Hash", + "crc32.NewIEEE": "hash.Hash", + "crc64.New": "hash.Hash", + "fnv.New32a": "hash.Hash", + "fnv.New32": "hash.Hash", + "fnv.New64a": "hash.Hash", + "fnv.New64": "hash.Hash", + "hmac.New": "hash.Hash", + "hmac.NewMD5": "hash.Hash", + "hmac.NewSHA1": "hash.Hash", + "hmac.NewSHA256": "hash.Hash", + "md4.New": "hash.Hash", + "md5.New": "hash.Hash", + "ripemd160.New": "hash.Hash", + "sha1.New224": "hash.Hash", + "sha1.New": "hash.Hash", + "sha256.New224": "hash.Hash", + "sha256.New": "hash.Hash", + "sha512.New384": "hash.Hash", + "sha512.New": "hash.Hash", + }, + + Type: map[string]*Type{ + "crypto.Hash": { + Method: map[string]string{ + "New": "func() hash.Hash", + }, + }, + }, +} + +func hashSumFn(f *ast.File) bool { + typeof, _ := typecheck(hashSumTypeConfig, f) + + fixed := false + + walk(f, func(n interface{}) { + call, ok := n.(*ast.CallExpr) + if ok && len(call.Args) == 0 { + sel, ok := call.Fun.(*ast.SelectorExpr) + if ok && sel.Sel.Name == "Sum" && typeof[sel.X] == "hash.Hash" { + call.Args = append(call.Args, ast.NewIdent("nil")) + fixed = true + } + } + }) + + return fixed +} |