summaryrefslogtreecommitdiff
path: root/src/cmd/fix/mapdelete.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/fix/mapdelete.go')
-rw-r--r--src/cmd/fix/mapdelete.go89
1 files changed, 0 insertions, 89 deletions
diff --git a/src/cmd/fix/mapdelete.go b/src/cmd/fix/mapdelete.go
deleted file mode 100644
index db89c7bf4..000000000
--- a/src/cmd/fix/mapdelete.go
+++ /dev/null
@@ -1,89 +0,0 @@
-// 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(mapdeleteFix)
-}
-
-var mapdeleteFix = fix{
- "mapdelete",
- "2011-10-18",
- mapdelete,
- `Use delete(m, k) instead of m[k] = 0, false.
-
-http://codereview.appspot.com/5272045
-`,
-}
-
-func mapdelete(f *ast.File) bool {
- fixed := false
- walk(f, func(n interface{}) {
- stmt, ok := n.(*ast.Stmt)
- if !ok {
- return
- }
- as, ok := (*stmt).(*ast.AssignStmt)
- if !ok || len(as.Lhs) != 1 || len(as.Rhs) != 2 {
- return
- }
- ix, ok := as.Lhs[0].(*ast.IndexExpr)
- if !ok {
- return
- }
- if !isTopName(as.Rhs[1], "false") {
- warn(as.Pos(), "two-element map assignment with non-false second value")
- return
- }
- if !canDrop(as.Rhs[0]) {
- warn(as.Pos(), "two-element map assignment with non-trivial first value")
- return
- }
- *stmt = &ast.ExprStmt{
- X: &ast.CallExpr{
- Fun: &ast.Ident{
- NamePos: as.Pos(),
- Name: "delete",
- },
- Args: []ast.Expr{ix.X, ix.Index},
- },
- }
- fixed = true
- })
- return fixed
-}
-
-// canDrop reports whether it is safe to drop the
-// evaluation of n from the program.
-// It is very conservative.
-func canDrop(n ast.Expr) bool {
- switch n := n.(type) {
- case *ast.Ident, *ast.BasicLit:
- return true
- case *ast.ParenExpr:
- return canDrop(n.X)
- case *ast.SelectorExpr:
- return canDrop(n.X)
- case *ast.CompositeLit:
- if !canDrop(n.Type) {
- return false
- }
- for _, e := range n.Elts {
- if !canDrop(e) {
- return false
- }
- }
- return true
- case *ast.StarExpr:
- // Dropping *x is questionable,
- // but we have to be able to drop (*T)(nil).
- return canDrop(n.X)
- case *ast.ArrayType, *ast.ChanType, *ast.FuncType, *ast.InterfaceType, *ast.MapType, *ast.StructType:
- return true
- }
- return false
-}